17#ifndef HARDWARE_INTERFACE__TYPES__STATISTICS_TYPES_HPP_
18#define HARDWARE_INTERFACE__TYPES__STATISTICS_TYPES_HPP_
27#include "hardware_interface/introspection.hpp"
28#include "libstatistics_collector/moving_average_statistics/moving_average.hpp"
29#include "libstatistics_collector/moving_average_statistics/types.hpp"
30#if !defined(_WIN32) && !defined(__APPLE__)
31#include "realtime_tools/mutex.hpp"
32#define DEFAULT_MUTEX realtime_tools::prio_inherit_mutex
34#define DEFAULT_MUTEX std::mutex
54 using StatisticData = libstatistics_collector::moving_average_statistics::StatisticData;
67 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
68 return statistics_data_.average;
78 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
79 return statistics_data_.max;
89 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
90 return statistics_data_.min;
106 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
107 return statistics_data_.standard_deviation;
120 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
121 return statistics_data_;
124 StatisticData get_statistics()
const
126 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
127 return statistics_data_;
138 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
139 return current_measurement_;
142 double get_current_measurement()
const
144 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
145 return current_measurement_;
153 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
154 statistics_data_.average = 0.0;
155 statistics_data_.min = std::numeric_limits<double>::max();
156 statistics_data_.max = std::numeric_limits<double>::lowest();
157 statistics_data_.standard_deviation = 0.0;
158 statistics_data_.sample_count = 0;
159 current_measurement_ = std::numeric_limits<double>::quiet_NaN();
160 sum_of_square_diff_from_mean_ = 0;
163 void reset_current_measurement()
165 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
166 current_measurement_ = 0.0;
177 std::lock_guard<DEFAULT_MUTEX> guard{mutex_};
179 current_measurement_ = item;
180 if (std::isfinite(item))
182 statistics_data_.sample_count = statistics_data_.sample_count + 1;
183 const double previous_average = statistics_data_.average;
184 statistics_data_.average =
185 previous_average + (current_measurement_ - previous_average) /
186 static_cast<double>(statistics_data_.sample_count);
187 statistics_data_.min = std::min(statistics_data_.min, current_measurement_);
188 statistics_data_.max = std::max(statistics_data_.max, current_measurement_);
189 sum_of_square_diff_from_mean_ =
190 sum_of_square_diff_from_mean_ + (current_measurement_ - previous_average) *
191 (current_measurement_ - statistics_data_.average);
192 statistics_data_.standard_deviation = std::sqrt(
193 sum_of_square_diff_from_mean_ /
static_cast<double>(statistics_data_.sample_count));
204 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
205 return statistics_data_.sample_count;
209 mutable DEFAULT_MUTEX mutex_;
210 StatisticData statistics_data_;
211 double current_measurement_ = std::numeric_limits<double>::quiet_NaN();
212 double sum_of_square_diff_from_mean_ = 0.0;
221 using StatisticData = libstatistics_collector::moving_average_statistics::StatisticData;
227 reset_statistics_sample_count_ = std::numeric_limits<unsigned int>::max();
236 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
237 if (statistics->get_count() > 0)
239 statistics_data_.average = statistics->get_average();
240 statistics_data_.min = statistics->get_min();
241 statistics_data_.max = statistics->get_max();
242 statistics_data_.standard_deviation = statistics->get_standard_deviation();
243 statistics_data_.sample_count = statistics->get_count();
244 statistics_data_ = statistics->get_statistics();
245 current_data_ = statistics->get_current_measurement();
247 if (statistics->get_count() >= reset_statistics_sample_count_)
259 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
260 reset_statistics_sample_count_ = reset_sample_count;
265 statistics_data_.average = std::numeric_limits<double>::quiet_NaN();
266 statistics_data_.min = std::numeric_limits<double>::quiet_NaN();
267 statistics_data_.max = std::numeric_limits<double>::quiet_NaN();
268 statistics_data_.standard_deviation = std::numeric_limits<double>::quiet_NaN();
269 statistics_data_.sample_count = 0;
278 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
279 return statistics_data_;
282 const double & get_current_data()
const
284 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
285 return current_data_;
290 mutable DEFAULT_MUTEX mutex_;
292 StatisticData statistics_data_;
294 double current_data_ = std::numeric_limits<double>::quiet_NaN();
296 unsigned int reset_statistics_sample_count_ = std::numeric_limits<unsigned int>::max();
306struct HardwareComponentStatisticsCollector
308 HardwareComponentStatisticsCollector()
310 execution_time = std::make_shared<ros2_control::MovingAverageStatistics>();
311 periodicity = std::make_shared<ros2_control::MovingAverageStatistics>();
318 void reset_statistics()
320 execution_time->reset();
321 periodicity->reset();
325 std::shared_ptr<ros2_control::MovingAverageStatistics> execution_time =
nullptr;
327 std::shared_ptr<ros2_control::MovingAverageStatistics> periodicity =
nullptr;
Data structure to store the statistics of a moving average. The data is protected by a mutex and the ...
Definition statistics_types.hpp:220
const StatisticData & get_statistics() const
Get the statistics data.
Definition statistics_types.hpp:276
void set_reset_statistics_sample_count(unsigned int reset_sample_count)
Set the number of samples to reset the statistics.
Definition statistics_types.hpp:257
void update_statistics(const std::shared_ptr< MovingAverageStatistics > &statistics)
Update the statistics data with the new statistics data.
Definition statistics_types.hpp:234
Definition statistics_types.hpp:52
void reset()
Definition statistics_types.hpp:151
double get_standard_deviation() const
Definition statistics_types.hpp:104
double get_min() const
Definition statistics_types.hpp:87
double get_max() const
Definition statistics_types.hpp:76
const double & get_current_measurement_const_ptr() const
Definition statistics_types.hpp:136
const StatisticData & get_statistics_const_ptr() const
Definition statistics_types.hpp:118
uint64_t get_count() const
Definition statistics_types.hpp:202
double get_average() const
Definition statistics_types.hpp:65
void add_measurement(const double item)
Definition statistics_types.hpp:175
Definition mujoco_system_interface.hpp:57