8#include <Eigen/Geometry>
16 const std::string& name) :
17 debugObserver(debugObserver), name(name)
35 std::lock_guard g{mtx};
36 timestamps.push_back(
timestamp.toMicroSecondsSinceEpoch());
40 FrequencyReporter::report()
43 std::vector<int64_t> ts;
46 std::lock_guard g{mtx};
49 if (timestamps.size() < 2)
52 debugObserver->setDebugChannel(name,
54 {
"frequency_max",
new armarx::Variant(0.F)},
55 {
"frequency_min",
new armarx::Variant(0.F)},
56 {
"frequency_stddev",
new armarx::Variant(0.F)}});
65 std::adjacent_difference(ts.begin(), ts.end(), ts.begin());
67 using Vector = Eigen::Matrix<std::int64_t, Eigen::Dynamic, 1>;
70 const Vector v = Eigen::Map<Vector>(ts.data() + 1, ts.size() - 1);
71 const Eigen::ArrayXf dts =
v.cast<
float>();
73 const float dtMean = dts.mean();
74 const float dtMin = dts.minCoeff();
75 const float dtMax = dts.maxCoeff();
76 const float dtStddev = std::sqrt((dts - dtMean).square().sum() / (dts.size() - 1));
78 const float frequencyMean = 1.0F / (dtMean / 1'000'000);
79 const float frequencyMax = 1.0F / (dtMin / 1'000'000);
80 const float frequencyMin = 1.0F / (dtMax / 1'000'000);
81 const float frequencyStddev = 1.0F / (dtStddev / 1'000'000);
83 debugObserver->setDebugChannel(
85 {{
"frequency_mean",
new armarx::Variant(frequencyMean)},
86 {
"frequency_max",
new armarx::Variant(frequencyMax)},
87 {
"frequency_min",
new armarx::Variant(frequencyMin)},
88 {
"frequency_stddev",
new armarx::Variant(frequencyStddev)}});
Eigen::Matrix< T, 3, 1 > Vector
void add(armarx::core::time::DateTime timestamp)
Add a new timestamp to the reporter.
FrequencyReporter(DebugObserverInterfacePrx debugObserver, const std::string &name)
Construct a new Frequency Reporter object.
virtual ~FrequencyReporter()
The Variant class is described here: Variants.
Represents a point in time.
double v(double t, double v0, double a0, double j)
This file offers overloads of toIce() and fromIce() functions for STL container types.
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface > DebugObserverInterfacePrx
SimplePeriodicTask(Ts...) -> SimplePeriodicTask< std::function< void(void)> >