topic_status.hpp
Go to the documentation of this file.
1 #pragma once
2 
11 #include <limits>
12 #include <memory>
13 #include <string>
14 #include <type_traits>
15 
18 #include <ros/message_event.h>
19 #include <ros/message_traits.h>
20 
24 
25 namespace cras
26 {
27 
33 template <typename Message, typename = ::std::enable_if_t<::ros::message_traits::IsMessage<Message>::value>>
35 {
36 public:
43  template <typename M = Message, ::std::enable_if_t<!::ros::message_traits::HasHeader<M>::value, bool> = true>
44  TopicStatus(const ::std::string& name, const ::cras::TopicStatusParam<Message>& params) :
46  {
47  this->freqTask = ::std::make_unique<::diagnostic_updater::FrequencyStatus>(this->origParams);
48  this->addTask(this->freqTask.get());
49  }
50 
60  template <typename M = Message, ::std::enable_if_t<!::ros::message_traits::HasHeader<M>::value, bool> = true>
61  explicit TopicStatus(const ::std::string& name,
62  const double minRate = 0.0, const double maxRate = ::std::numeric_limits<double>::infinity(),
63  const double rateTolerance = 0.1, const int rateWindowSize = 5) :
64  TopicStatus(name, ::cras::TopicStatusParam<Message>(minRate, maxRate, rateTolerance, rateWindowSize))
65  {
66  }
67 
74  template <typename M = Message, ::std::enable_if_t<::ros::message_traits::HasHeader<M>::value, bool> = true>
75  TopicStatus(const ::std::string& name, const ::cras::TopicStatusParam<Message>& params) :
77  {
78  this->freqTask = ::std::make_unique<::diagnostic_updater::FrequencyStatus>(this->origParams);
79  this->stampTask = ::std::make_unique<::diagnostic_updater::SlowTimeStampStatus>(this->origParams);
80 
81  this->addTask(this->freqTask.get());
82  this->addTask(this->stampTask.get());
83  }
84 
96  template <typename M = Message, ::std::enable_if_t<::ros::message_traits::HasHeader<M>::value, bool> = true>
97  explicit TopicStatus(const ::std::string& name,
98  const double minRate = 0.0, const double maxRate = ::std::numeric_limits<double>::infinity(),
99  const double rateTolerance = 0.1, const int rateWindowSize = 5,
100  const double minDelay = -1.0, const double maxDelay = 5.0) :
101  TopicStatus(name, ::cras::TopicStatusParam<Message>(
102  minRate, maxRate, rateTolerance, rateWindowSize, minDelay, maxDelay))
103  {
104  }
105 
111  TopicStatus(const ::std::string& name, const ::cras::SimpleTopicStatusParam<Message>& params) :
112  TopicStatus(name, ::cras::TopicStatusParam<Message>(params))
113  {
114  }
115 
116  ~TopicStatus() override
117  {
118  }
119 
124  virtual void tick(const ::ros::Time& stamp)
125  {
126  this->freqTask->tick();
127  if (this->stampTask != nullptr)
128  this->stampTask->tick(stamp);
129  }
130 
135  virtual void tick(const Message& message)
136  {
137  this->freqTask->tick();
138  if (this->stampTask != nullptr && ::ros::message_traits::HasHeader<::cras::BaseMessage<Message>>::value)
139  this->stampTask->tick(*::ros::message_traits::TimeStamp<::cras::BaseMessage<Message>>::pointer(message));
140  }
141 
146  virtual void tick(const typename Message::Ptr& message)
147  {
148  this->tick(*message);
149  }
150 
155  virtual void tick(const typename Message::ConstPtr& message)
156  {
157  this->tick(*message);
158  }
159 
164  virtual void tick(const ::ros::MessageEvent<Message>& event)
165  {
166  this->tick(*event.getConstMessage());
167  }
168 
176  {
177  return ::cras::safeRate(this->origParams.getExpectedRate());
178  }
179 
185  {
186  return ::cras::safeRate(*this->origParams.min_freq_);
187  }
188 
194  {
195  return ::cras::safeRate(*this->origParams.max_freq_);
196  }
197 
202  double getRateTolerance() const
203  {
204  return this->origParams.tolerance_;
205  }
206 
211  int getRateWindowSize() const
212  {
213  return this->origParams.window_size_;
214  }
215 
221  template <typename M = Message, typename = ::std::enable_if_t<::ros::message_traits::HasHeader<M>::value>>
223  {
224  return ::ros::Duration(this->origParams.min_acceptable_);
225  }
226 
232  template <typename M = Message, typename = ::std::enable_if_t<::ros::message_traits::HasHeader<M>::value>>
234  {
235  return ::ros::Duration(this->origParams.max_acceptable_);
236  }
237 
238 protected:
240  ::std::unique_ptr<::diagnostic_updater::FrequencyStatus> freqTask;
241 
243  ::std::unique_ptr<::diagnostic_updater::SlowTimeStampStatus> stampTask;
244 
247 };
248 
249 template <typename Message>
250 using TopicStatusPtr = ::std::shared_ptr<::cras::TopicStatus<Message>>;
251 
252 }
TopicStatus(const ::std::string &name, const ::cras::SimpleTopicStatusParam< Message > &params)
Create the diagnostic task checking frequency of messages and timestamp delay (if the message has hea...
::std::shared_ptr<::cras::TopicStatus< Message > > TopicStatusPtr
Utilities for working with ROS message files.
::std::unique_ptr<::diagnostic_updater::SlowTimeStampStatus > stampTask
The delay-checking diagnostic task. It will be non-null only for messages with header.
Definitions of parameters for a TopicStatus diagnostic task.
int getRateWindowSize() const
Number of updates during which the frequency is computed.
virtual void tick(const ::ros::Time &stamp)
Record that a message has arrived now with the given timestamp.
::ros::Rate getMinRate() const
Minimum allowed frequency.
::ros::Rate getMaxRate() const
Maximum allowed frequency.
double getRateTolerance() const
Tolerance of frequency.
Diagnostic task for topic frequency and timestamp delay (combining FrequencyStatus and TimeStampStatu...
::ros::Rate safeRate(double frequency)
Return a rate representing the given frequency. If the frequency is zero or too small, return min/max representable rate.
::cras::TopicStatusParam< Message > origParams
The parameters via which this task has been configured.
virtual void tick(const typename Message::Ptr &message)
Record that a message has arrived.
~TopicStatus() override
::ros::Duration getMaxDelay() const
Max acceptable delay (in s). It can be negative if timestamps in future are expected.
TopicStatus(const ::std::string &name, const double minRate=0.0, const double maxRate=::std::numeric_limits< double >::infinity(), const double rateTolerance=0.1, const int rateWindowSize=5, const double minDelay=-1.0, const double maxDelay=5.0)
Create the diagnostic task for a message with header (checking frequency and timestamp delay)...
::std::conditional_t<::ros::message_traits::HasHeader< Message >::value, ::cras::TopicStatusParamWithHeader, ::cras::FrequencyStatusParam > TopicStatusParam
Helper struct for automatic choosing of the correct topic status parameter object based on whether th...
::ros::Duration getMinDelay() const
Min acceptable delay (in s). It can be negative if timestamps in future are expected.
TopicStatus(const ::std::string &name, const double minRate=0.0, const double maxRate=::std::numeric_limits< double >::infinity(), const double rateTolerance=0.1, const int rateWindowSize=5)
Create the diagnostic task for a header-less message (checking frequency only).
Utilities for working with time.
typename ::ros::ParameterAdapter< M >::Message BaseMessage
Return the base message type of M (i.e. removes MessageEvent, const, &, shared_ptr etc...
::std::unique_ptr<::diagnostic_updater::FrequencyStatus > freqTask
The frequency-checking diagnostic task. This will always be non-null.
TopicStatus(const ::std::string &name, const ::cras::TopicStatusParam< Message > &params)
Create the diagnostic task for a header-less message (checking frequency only).
::ros::Rate getExpectedRate() const
Get the expected/average rate. If min and max are the same, their value will be returned. If min rate is non-positive, the max rate is returned. Otherwise, if max rate is infinite, the min rate will be returned. If min is positive and max is finite, their arithmetic mean is returned.
Definition: any.hpp:15
virtual void tick(const Message &message)
Record that a message has arrived.
virtual void tick(const typename Message::ConstPtr &message)
Record that a message has arrived.
CompositeDiagnosticTask(const std::string name)
virtual void tick(const ::ros::MessageEvent< Message > &event)
Record that a message has arrived.


cras_cpp_common
Author(s): Martin Pecka
autogenerated on Sat Jun 17 2023 02:32:53