ros2_control - rolling
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 <cmath>
22#include <cstdint>
23#include <limits>
24#include <memory>
25#include <mutex>
26
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
33#else
34#define DEFAULT_MUTEX std::mutex
35#endif
36
37namespace ros2_control
38{
52{
53public:
54 using StatisticData = libstatistics_collector::moving_average_statistics::StatisticData;
55 MovingAverageStatistics() = default;
56
57 ~MovingAverageStatistics() = default;
58
65 double get_average() const
66 {
67 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
68 return statistics_data_.average;
69 }
70
76 double get_max() const
77 {
78 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
79 return statistics_data_.max;
80 }
81
87 double get_min() const
88 {
89 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
90 return statistics_data_.min;
91 }
92
105 {
106 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
107 return statistics_data_.standard_deviation;
108 }
109
118 const StatisticData & get_statistics_const_ptr() const
119 {
120 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
121 return statistics_data_;
122 }
123
124 StatisticData get_statistics() const
125 {
126 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
127 return statistics_data_;
128 }
129
137 {
138 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
139 return current_measurement_;
140 }
141
142 double get_current_measurement() const
143 {
144 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
145 return current_measurement_;
146 }
147
151 void reset()
152 {
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;
161 }
162
163 void reset_current_measurement()
164 {
165 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
166 current_measurement_ = 0.0;
167 }
168
175 void add_measurement(const double item)
176 {
177 std::lock_guard<DEFAULT_MUTEX> guard{mutex_};
178
179 current_measurement_ = item;
180 if (std::isfinite(item))
181 {
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));
194 }
195 }
196
202 uint64_t get_count() const
203 {
204 std::lock_guard<DEFAULT_MUTEX> lock(mutex_);
205 return statistics_data_.sample_count;
206 }
207
208private:
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;
213};
214
220{
221 using StatisticData = libstatistics_collector::moving_average_statistics::StatisticData;
222
223public:
225 {
226 reset();
227 reset_statistics_sample_count_ = std::numeric_limits<unsigned int>::max();
228 }
229
234 void update_statistics(const std::shared_ptr<MovingAverageStatistics> & statistics)
235 {
236 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
237 if (statistics->get_count() > 0)
238 {
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();
246 }
247 if (statistics->get_count() >= reset_statistics_sample_count_)
248 {
249 statistics->reset();
250 }
251 }
252
257 void set_reset_statistics_sample_count(unsigned int reset_sample_count)
258 {
259 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
260 reset_statistics_sample_count_ = reset_sample_count;
261 }
262
263 void reset()
264 {
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;
270 }
271
276 const StatisticData & get_statistics() const
277 {
278 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
279 return statistics_data_;
280 }
281
282 const double & get_current_data() const
283 {
284 std::unique_lock<DEFAULT_MUTEX> lock(mutex_);
285 return current_data_;
286 }
287
288private:
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();
297};
298} // namespace ros2_control
299
300namespace hardware_interface
301{
306struct HardwareComponentStatisticsCollector
307{
308 HardwareComponentStatisticsCollector()
309 {
310 execution_time = std::make_shared<ros2_control::MovingAverageStatistics>();
311 periodicity = std::make_shared<ros2_control::MovingAverageStatistics>();
312 }
313
318 void reset_statistics()
319 {
320 execution_time->reset();
321 periodicity->reset();
322 }
323
325 std::shared_ptr<ros2_control::MovingAverageStatistics> execution_time = nullptr;
327 std::shared_ptr<ros2_control::MovingAverageStatistics> periodicity = nullptr;
328};
329} // namespace hardware_interface
330
331#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: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