17#ifndef HARDWARE_INTERFACE__TYPES__STATISTICS_TYPES_HPP_
18#define HARDWARE_INTERFACE__TYPES__STATISTICS_TYPES_HPP_
24#include "hardware_interface/introspection.hpp"
25#include "libstatistics_collector/moving_average_statistics/moving_average.hpp"
26#include "libstatistics_collector/moving_average_statistics/types.hpp"
27#if !defined(_WIN32) && !defined(__APPLE__)
28#include "realtime_tools/mutex.hpp"
29#define DEFAULT_MUTEX realtime_tools::prio_inherit_mutex
31#define DEFAULT_MUTEX std::mutex
51 using StatisticData = libstatistics_collector::moving_average_statistics::StatisticData;
64 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
65 return statistics_data_.average;
75 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
76 return statistics_data_.max;
86 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
87 return statistics_data_.min;
103 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
104 return statistics_data_.standard_deviation;
117 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
118 return statistics_data_;
121 StatisticData get_statistics()
const
123 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
124 return statistics_data_;
135 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
136 return current_measurement_;
139 double get_current_measurement()
const
141 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
142 return current_measurement_;
150 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
151 statistics_data_.average = 0.0;
152 statistics_data_.min = std::numeric_limits<double>::max();
153 statistics_data_.max = std::numeric_limits<double>::lowest();
154 statistics_data_.standard_deviation = 0.0;
155 statistics_data_.sample_count = 0;
156 current_measurement_ = std::numeric_limits<double>::quiet_NaN();
157 sum_of_square_diff_from_mean_ = 0;
160 void reset_current_measurement()
162 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
163 current_measurement_ = 0.0;
174 std::lock_guard<DEFAULT_MUTEX> guard{mutex_};
176 current_measurement_ = item;
177 if (std::isfinite(item))
179 statistics_data_.sample_count = statistics_data_.sample_count + 1;
180 const double previous_average = statistics_data_.average;
181 statistics_data_.average =
182 previous_average + (current_measurement_ - previous_average) /
183 static_cast<double>(statistics_data_.sample_count);
184 statistics_data_.min = std::min(statistics_data_.min, current_measurement_);
185 statistics_data_.max = std::max(statistics_data_.max, current_measurement_);
186 sum_of_square_diff_from_mean_ =
187 sum_of_square_diff_from_mean_ + (current_measurement_ - previous_average) *
188 (current_measurement_ - statistics_data_.average);
189 statistics_data_.standard_deviation = std::sqrt(
190 sum_of_square_diff_from_mean_ /
static_cast<double>(statistics_data_.sample_count));
201 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
202 return statistics_data_.sample_count;
206 mutable DEFAULT_MUTEX mutex_;
207 StatisticData statistics_data_;
208 double current_measurement_ = std::numeric_limits<double>::quiet_NaN();
209 double sum_of_square_diff_from_mean_ = 0.0;
218 using StatisticData = libstatistics_collector::moving_average_statistics::StatisticData;
224 reset_statistics_sample_count_ = std::numeric_limits<unsigned int>::max();
233 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
234 if (statistics->get_count() > 0)
236 statistics_data_.average = statistics->get_average();
237 statistics_data_.min = statistics->get_min();
238 statistics_data_.max = statistics->get_max();
239 statistics_data_.standard_deviation = statistics->get_standard_deviation();
240 statistics_data_.sample_count = statistics->get_count();
241 statistics_data_ = statistics->get_statistics();
242 current_data_ = statistics->get_current_measurement();
244 if (statistics->get_count() >= reset_statistics_sample_count_)
256 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
257 reset_statistics_sample_count_ = reset_sample_count;
262 statistics_data_.average = std::numeric_limits<double>::quiet_NaN();
263 statistics_data_.min = std::numeric_limits<double>::quiet_NaN();
264 statistics_data_.max = std::numeric_limits<double>::quiet_NaN();
265 statistics_data_.standard_deviation = std::numeric_limits<double>::quiet_NaN();
266 statistics_data_.sample_count = 0;
275 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
276 return statistics_data_;
279 const double & get_current_data()
const
281 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
282 return current_data_;
287 mutable DEFAULT_MUTEX mutex_;
289 StatisticData statistics_data_;
291 double current_data_ = std::numeric_limits<double>::quiet_NaN();
293 unsigned int reset_statistics_sample_count_ = std::numeric_limits<unsigned int>::max();
303struct HardwareComponentStatisticsCollector
305 HardwareComponentStatisticsCollector()
307 execution_time = std::make_shared<ros2_control::MovingAverageStatistics>();
308 periodicity = std::make_shared<ros2_control::MovingAverageStatistics>();
315 void reset_statistics()
317 execution_time->reset();
318 periodicity->reset();
322 std::shared_ptr<ros2_control::MovingAverageStatistics> execution_time =
nullptr;
324 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:217
const StatisticData & get_statistics() const
Get the statistics data.
Definition statistics_types.hpp:273
void set_reset_statistics_sample_count(unsigned int reset_sample_count)
Set the number of samples to reset the statistics.
Definition statistics_types.hpp:254
void update_statistics(const std::shared_ptr< MovingAverageStatistics > &statistics)
Update the statistics data with the new statistics data.
Definition statistics_types.hpp:231
Definition statistics_types.hpp:49
void reset()
Definition statistics_types.hpp:148
double get_standard_deviation() const
Definition statistics_types.hpp:101
double get_min() const
Definition statistics_types.hpp:84
double get_max() const
Definition statistics_types.hpp:73
virtual void add_measurement(const double item)
Definition statistics_types.hpp:172
const double & get_current_measurement_const_ptr() const
Definition statistics_types.hpp:133
const StatisticData & get_statistics_const_ptr() const
Definition statistics_types.hpp:115
uint64_t get_count() const
Definition statistics_types.hpp:199
double get_average() const
Definition statistics_types.hpp:62
Definition actuator.hpp:22