ros2_control - kilted
Loading...
Searching...
No Matches
statistics_types.hpp
1// Copyright 2025 PAL Robotics S.L.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
16
17#ifndef HARDWARE_INTERFACE__TYPES__STATISTICS_TYPES_HPP_
18#define HARDWARE_INTERFACE__TYPES__STATISTICS_TYPES_HPP_
19
20#include <algorithm>
21#include <limits>
22#include <memory>
23
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
30#else
31#define DEFAULT_MUTEX std::mutex
32#endif
33
34namespace ros2_control
35{
49{
50public:
51 using StatisticData = libstatistics_collector::moving_average_statistics::StatisticData;
52 MovingAverageStatistics() = default;
53
54 ~MovingAverageStatistics() = default;
55
62 double get_average() const
63 {
64 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
65 return statistics_data_.average;
66 }
67
73 double get_max() const
74 {
75 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
76 return statistics_data_.max;
77 }
78
84 double get_min() const
85 {
86 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
87 return statistics_data_.min;
88 }
89
102 {
103 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
104 return statistics_data_.standard_deviation;
105 }
106
115 const StatisticData & get_statistics_const_ptr() const
116 {
117 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
118 return statistics_data_;
119 }
120
121 StatisticData get_statistics() const
122 {
123 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
124 return statistics_data_;
125 }
126
134 {
135 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
136 return current_measurement_;
137 }
138
139 double get_current_measurement() const
140 {
141 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
142 return current_measurement_;
143 }
144
148 void reset()
149 {
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;
158 }
159
160 void reset_current_measurement()
161 {
162 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
163 current_measurement_ = 0.0;
164 }
165
172 virtual void add_measurement(const double item)
173 {
174 std::lock_guard<DEFAULT_MUTEX> guard{mutex_};
175
176 current_measurement_ = item;
177 if (std::isfinite(item))
178 {
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));
191 }
192 }
193
199 uint64_t get_count() const
200 {
201 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
202 return statistics_data_.sample_count;
203 }
204
205private:
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;
210};
211
217{
218 using StatisticData = libstatistics_collector::moving_average_statistics::StatisticData;
219
220public:
222 {
223 reset();
224 reset_statistics_sample_count_ = std::numeric_limits<unsigned int>::max();
225 }
226
231 void update_statistics(const std::shared_ptr<MovingAverageStatistics> & statistics)
232 {
233 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
234 if (statistics->get_count() > 0)
235 {
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();
243 }
244 if (statistics->get_count() >= reset_statistics_sample_count_)
245 {
246 statistics->reset();
247 }
248 }
249
254 void set_reset_statistics_sample_count(unsigned int reset_sample_count)
255 {
256 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
257 reset_statistics_sample_count_ = reset_sample_count;
258 }
259
260 void reset()
261 {
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;
267 }
268
273 const StatisticData & get_statistics() const
274 {
275 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
276 return statistics_data_;
277 }
278
279 const double & get_current_data() const
280 {
281 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
282 return current_data_;
283 }
284
285private:
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();
294};
295} // namespace ros2_control
296
297namespace hardware_interface
298{
303struct HardwareComponentStatisticsCollector
304{
305 HardwareComponentStatisticsCollector()
306 {
307 execution_time = std::make_shared<ros2_control::MovingAverageStatistics>();
308 periodicity = std::make_shared<ros2_control::MovingAverageStatistics>();
309 }
310
315 void reset_statistics()
316 {
317 execution_time->reset();
318 periodicity->reset();
319 }
320
322 std::shared_ptr<ros2_control::MovingAverageStatistics> execution_time = nullptr;
324 std::shared_ptr<ros2_control::MovingAverageStatistics> periodicity = nullptr;
325};
326} // namespace hardware_interface
327
328#endif // HARDWARE_INTERFACE__TYPES__STATISTICS_TYPES_HPP_
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