ros_interface.cpp
Go to the documentation of this file.
1 // Provides a ROS interface for controlling rosmon
2 // Author: Max Schwarz <max.schwarz@uni-bonn.de>
3 
4 #include "ros_interface.h"
5 
6 #include <rosmon_msgs/State.h>
7 
8 #include <algorithm>
9 #include <regex>
10 
11 namespace rosmon
12 {
13 
14 ROSInterface::ROSInterface(monitor::Monitor* monitor, bool enableDiagnostics,
15  const std::string& diagnosticsPrefix)
16  : m_monitor(monitor)
17  , m_nh("~")
18  , m_diagnosticsEnabled(enableDiagnostics)
19 {
21 
22  m_pub_state = m_nh.advertise<rosmon_msgs::State>("state", 10, true);
23 
25 
27  m_diagnosticsPublisher.reset(new DiagnosticsPublisher(diagnosticsPrefix));
28 }
29 
31 {
32  rosmon_msgs::State state;
33  state.header.stamp = ros::Time::now();
34 
37 
38  for(auto& node : m_monitor->nodes())
39  {
40  rosmon_msgs::NodeState nstate;
41  nstate.name = node->name();
42  nstate.ns = node->namespaceString();
43 
44  switch(node->state())
45  {
47  nstate.state = nstate.RUNNING;
48  break;
50  nstate.state = nstate.CRASHED;
51  break;
53  nstate.state = nstate.IDLE;
54  break;
56  nstate.state = nstate.WAITING;
57  break;
58  default:
59  nstate.state = nstate.IDLE;
60  break;
61  }
62 
63  nstate.restart_count = node->restartCount();
64 
65  nstate.user_load = static_cast<float>(node->userLoad());
66  nstate.system_load = static_cast<float>(node->systemLoad());
67 
68  nstate.memory = node->memory();
69 
70  state.nodes.push_back(nstate);
71  }
72 
74 }
75 
76 bool ROSInterface::handleStartStop(rosmon_msgs::StartStopRequest& req, rosmon_msgs::StartStopResponse&)
77 {
78  const auto start_stop = [&](monitor::NodeMonitor& node) {
79  switch (req.action) {
80  case rosmon_msgs::StartStopRequest::START:
81  node.start();
82  break;
83  case rosmon_msgs::StartStopRequest::STOP:
84  node.stop();
85  break;
86  case rosmon_msgs::StartStopRequest::RESTART:
87  node.restart();
88  break;
89  }
90  };
91 
92  // remove all slashes from start and end of string
93  const auto trim = [](std::string& str) {
94  size_t start = str.find_first_not_of('/');
95  size_t end = str.find_last_not_of('/');
96  if(start == std::string::npos || end == std::string::npos || start > end)
97  {
98  str = "";
99  return;
100  }
101  str = str.substr(start, end - start + 1);
102  };
103 
104  trim(req.ns);
105  trim(req.node);
106 
107  if(req.node.empty())
108  {
109  ROS_ERROR("Got a StartStopRequest with empty node field");
110  return false;
111  }
112 
113  std::string strPattern;
114 
115  if(!req.ns.empty())
116  {
117  if(req.ns[0] != '/')
118  strPattern += "/";
119 
120  strPattern += req.ns;
121  }
122 
123  if(req.node[0] != '/')
124  strPattern += "/";
125 
126  strPattern += req.node;
127 
128  std::regex reg;
129  try
130  {
131  reg = std::regex(strPattern);
132  }
133  catch(const std::regex_error& e)
134  {
135  ROS_ERROR("Invalid regular expression: %s", e.what());
136  return false;
137  }
138 
139  bool found = false;
140  for(auto& node : m_monitor->nodes())
141  {
142  const std::string str_name = node->namespaceString() + "/" + node->name();
143  if(std::regex_match(str_name, reg))
144  {
145  found = true;
146  start_stop(*node);
147  }
148  }
149 
150  if(!found)
151  {
152  ROS_ERROR("No node matching '%s' found", strPattern.c_str());
153  return false;
154  }
155 
156  return true;
157 }
158 
160 {
162 
163  // Send empty state packet to clear the GUI
164  rosmon_msgs::State state;
165  state.header.stamp = ros::Time::now();
167 
168  // HACK: Currently there is no way to make sure that we sent a message.
169  usleep(200 * 1000);
170 }
171 
172 }
rosmon::ROSInterface::m_nh
ros::NodeHandle m_nh
Definition: ros_interface.h:31
rosmon
Definition: diagnostics_publisher.cpp:34
rosmon::DiagnosticsPublisher
Definition: diagnostics_publisher.h:15
ros::NodeHandle::advertiseService
ServiceServer advertiseService(AdvertiseServiceOptions &ops)
rosmon::ROSInterface::m_srv_startStop
ros::ServiceServer m_srv_startStop
Definition: ros_interface.h:37
rosmon::ROSInterface::ROSInterface
ROSInterface(monitor::Monitor *monitor, bool enableDiagnostics=false, const std::string &diagnosticsPrefix={})
Definition: ros_interface.cpp:14
ros::Publisher::publish
void publish(const boost::shared_ptr< M > &message) const
ros::NodeHandle::advertise
Publisher advertise(AdvertiseOptions &ops)
rosmon::ROSInterface::m_diagnosticsPublisher
std::unique_ptr< DiagnosticsPublisher > m_diagnosticsPublisher
Definition: ros_interface.h:40
rosmon::monitor::Monitor
Definition: monitor.h:24
rosmon::monitor::Monitor::nodes
const std::vector< NodeMonitor::Ptr > & nodes() const
Definition: monitor.h:41
basic.state
state
Definition: basic.py:202
rosmon::ROSInterface::shutdown
void shutdown()
Definition: ros_interface.cpp:159
rosmon::ROSInterface::m_monitor
monitor::Monitor * m_monitor
Definition: ros_interface.h:29
rosmon::monitor::NodeMonitor::STATE_IDLE
@ STATE_IDLE
Idle (e.g. exited with code 0)
Definition: node_monitor.h:36
rosmon::monitor::NodeMonitor::STATE_RUNNING
@ STATE_RUNNING
Running.
Definition: node_monitor.h:37
start
ROSCPP_DECL void start()
rosmon::ROSInterface::m_updateTimer
ros::WallTimer m_updateTimer
Definition: ros_interface.h:33
ROS_ERROR
#define ROS_ERROR(...)
rosmon::ROSInterface::m_pub_state
ros::Publisher m_pub_state
Definition: ros_interface.h:35
rosmon::ROSInterface::update
void update()
Definition: ros_interface.cpp:30
ros::WallDuration
rosmon::ROSInterface::m_diagnosticsEnabled
bool m_diagnosticsEnabled
Definition: ros_interface.h:39
rosmon::monitor::NodeMonitor::STATE_WAITING
@ STATE_WAITING
Waiting for automatic restart after crash.
Definition: node_monitor.h:39
ros::NodeHandle::createWallTimer
WallTimer createWallTimer(WallDuration period, const WallTimerCallback &callback, bool oneshot=false, bool autostart=true) const
ros_interface.h
ros::WallTimer::stop
void stop()
rosmon::monitor::NodeMonitor::STATE_CRASHED
@ STATE_CRASHED
Crashed (i.e. exited with code != 0)
Definition: node_monitor.h:38
rosmon::ROSInterface::handleStartStop
bool handleStartStop(rosmon_msgs::StartStopRequest &req, rosmon_msgs::StartStopResponse &resp)
Definition: ros_interface.cpp:76
ros::Time::now
static Time now()
rosmon::monitor::NodeMonitor
Monitors a single node process.
Definition: node_monitor.h:27


rosmon_core
Author(s): Max Schwarz
autogenerated on Wed Feb 21 2024 04:01:14