ed
loop_usage_status.h
Go to the documentation of this file.
1 #ifndef ED_LOOP_USAGE_STATUS_H_
2 #define ED_LOOP_USAGE_STATUS_H_
3 
4 #include <diagnostic_updater/diagnostic_updater.h>
5 #include <diagnostic_updater/update_functions.h>
6 
7 #include <diagnostic_msgs/DiagnosticStatus.h>
8 
10 #include <tue/profiling/timer.h>
11 
12 #include <math.h>
13 
14 
15 namespace ed
16 {
17 
27 class LoopUsageStatus : public diagnostic_updater::DiagnosticTask
28 {
29 private:
30  const diagnostic_updater::FrequencyStatusParam params_;
31 
37  long double start_;
38  long double duration_;
39 
40  boost::mutex lock_;
41 
42 public:
46  LoopUsageStatus(const diagnostic_updater::FrequencyStatusParam &params, std::string name) :
47  DiagnosticTask(name), params_(params),
48  starts_(params_.window_size_), durations_(params_.window_size_), seq_nums_(params_.window_size_)
49  {
50  clear();
51  }
52 
58  LoopUsageStatus(const diagnostic_updater::FrequencyStatusParam &params) :
59  DiagnosticTask("Loop Usage Status"), params_(params),
60  starts_(params_.window_size_), durations_(params_.window_size_), seq_nums_(params_.window_size_)
61  {
62  clear();
63  }
64 
69  const tue::LoopTimer& getTimer() const { return timer_; }
70 
74  void clear()
75  {
76  boost::mutex::scoped_lock lock(lock_);
77  timer_.reset();
78  long double curtime = tue::Timer::nowMicroSec();
79 
80  std::fill(starts_.begin(), starts_.end(), curtime);
83 
84  hist_indx_ = 0;
85  }
86 
90  void start()
91  {
92  boost::mutex::scoped_lock lock(lock_);
93  timer_.start();
94  }
95 
99  void stop()
100  {
101  boost::mutex::scoped_lock lock(lock_);
102  timer_.stop();
103  }
104 
108  virtual void run(diagnostic_updater::DiagnosticStatusWrapper &stat)
109  {
110  boost::mutex::scoped_lock lock(lock_);
111  long double curtime = tue::Timer::nowMicroSec(); // Micro-seconds
112  long double total_loop_time = timer_.getTotalLoopTime(); // Seconds
113  int curseq = timer_.getIterationCount();
114  int events = curseq - seq_nums_[hist_indx_];
115  double window = (curtime - starts_[hist_indx_]) * 0.000001; // Micro-seconds -> Seconds
116  double loop_time_window = total_loop_time - durations_[hist_indx_]; // Seconds
117  double freq = 0;
118 
119  if (window != 0)
120  {
121  freq = events / window;
122  }
123  seq_nums_[hist_indx_] = curseq;
124  starts_[hist_indx_] = curtime; // Micro-seconds
125  durations_[hist_indx_] = total_loop_time; // Seconds
126  hist_indx_ = (hist_indx_ + 1) % params_.window_size_;
127 
128  if (events == 0)
129  {
130  stat.summary(diagnostic_msgs::DiagnosticStatus::ERROR, "No events recorded.");
131  }
132  else if (window != 0 && freq < *params_.min_freq_ * (1 - params_.tolerance_))
133  {
134  stat.summary(diagnostic_msgs::DiagnosticStatus::WARN, "Frequency too low.");
135  }
136  else if (window != 0 && freq > *params_.max_freq_ * (1 + params_.tolerance_))
137  {
138  stat.summary(diagnostic_msgs::DiagnosticStatus::WARN, "Frequency too high.");
139  }
140  else if (window != 0)
141  {
142  stat.summary(diagnostic_msgs::DiagnosticStatus::OK, "Desired frequency met");
143  }
144 
145  stat.addf("Events in window", "%d", events);
146  stat.addf("Events since startup", "%d", curseq);
147  stat.addf("Duration of window (s)", "%f", window);
148  stat.addf("Total loop time during window (s)", "%f", loop_time_window);
149  if (window != 0)
150  {
151  stat.addf("Loop Usage (%)", "%f", 100*loop_time_window/window);
152  stat.addf("Actual frequency (Hz)", "%f", freq);
153  }
154  if (*params_.min_freq_ == *params_.max_freq_)
155  {
156  stat.addf("Target frequency (Hz)", "%f",*params_.min_freq_);
157  }
158  if (*params_.min_freq_ > 0)
159  {
160  stat.addf("Minimum acceptable frequency (Hz)", "%f", *params_.min_freq_ * (1 - params_.tolerance_));
161  }
162 
163  if (std::isfinite(*params_.max_freq_))
164  {
165  stat.addf("Maximum acceptable frequency (Hz)", "%f", *params_.max_freq_ * (1 + params_.tolerance_));
166  }
167  }
168 };
169 
170 } // end namespace ed
171 
172 #endif
std::string
ed::LoopUsageStatus::lock_
boost::mutex lock_
Definition: loop_usage_status.h:40
ed::LoopUsageStatus::seq_nums_
std::vector< int > seq_nums_
Definition: loop_usage_status.h:35
ed::LoopUsageStatus::hist_indx_
int hist_indx_
Definition: loop_usage_status.h:36
ed::LoopUsageStatus::LoopUsageStatus
LoopUsageStatus(const diagnostic_updater::FrequencyStatusParam &params, std::string name)
Constructs a LoopUsageStatus class with the given parameters.
Definition: loop_usage_status.h:46
std::vector< long double >
tue::Timer::nowMicroSec
static long double nowMicroSec()
ed::LoopUsageStatus::clear
void clear()
Resets the statistics.
Definition: loop_usage_status.h:74
ed::LoopUsageStatus::duration_
long double duration_
Definition: loop_usage_status.h:38
ed::LoopUsageStatus::getTimer
const tue::LoopTimer & getTimer() const
Expose const reference to loop timer. No call to the const timer will be able to influence the behavi...
Definition: loop_usage_status.h:69
tue::LoopTimer::reset
void reset()
ed::LoopUsageStatus::durations_
std::vector< long double > durations_
Definition: loop_usage_status.h:34
tue::LoopTimer::getTotalLoopTime
long double getTotalLoopTime()
std::fill
T fill(T... args)
tue::LoopTimer::getIterationCount
long unsigned int getIterationCount() const
std::isfinite
T isfinite(T... args)
ed::LoopUsageStatus::LoopUsageStatus
LoopUsageStatus(const diagnostic_updater::FrequencyStatusParam &params)
Constructs a LoopUsageStatus class with the given parameters. Uses a default diagnostic task name of ...
Definition: loop_usage_status.h:58
ed::LoopUsageStatus::run
virtual void run(diagnostic_updater::DiagnosticStatusWrapper &stat)
Fills out this Task's DiagnosticStatusWrapper.
Definition: loop_usage_status.h:108
ed::LoopUsageStatus::stop
void stop()
Signals that a stop event has occurred.
Definition: loop_usage_status.h:99
timer.h
ed::LoopUsageStatus::params_
const diagnostic_updater::FrequencyStatusParam params_
Definition: loop_usage_status.h:30
std::vector::begin
T begin(T... args)
ed::LoopUsageStatus
A diagnostic task that monitors the frequency of an event.
Definition: loop_usage_status.h:27
loop_timer.h
tue::LoopTimer::stop
void stop()
ed::LoopUsageStatus::starts_
std::vector< long double > starts_
Definition: loop_usage_status.h:33
ed
Definition: convex_hull.h:8
std::vector::end
T end(T... args)
ed::LoopUsageStatus::start
void start()
Signals that a start event has occurred.
Definition: loop_usage_status.h:90
ed::LoopUsageStatus::timer_
tue::LoopTimer timer_
Definition: loop_usage_status.h:32
tue::LoopTimer
tue::LoopTimer::start
void start()
ed::LoopUsageStatus::start_
long double start_
Definition: loop_usage_status.h:37