NASA Astrobee Robot Software  0.19.1
Flight software for the Astrobee robots operating inside the International Space Station.
sys_monitor.h
Go to the documentation of this file.
1 /* Copyright (c) 2017, United States Government, as represented by the
2  * Administrator of the National Aeronautics and Space Administration.
3  *
4  * All rights reserved.
5  *
6  * The Astrobee platform is licensed under the Apache License, Version 2.0
7  * (the "License"); you may not use this file except in compliance with the
8  * License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15  * License for the specific language governing permissions and limitations
16  * under the License.
17  */
18 
19 #ifndef SYS_MONITOR_SYS_MONITOR_H_
20 #define SYS_MONITOR_SYS_MONITOR_H_
21 
22 #include <nodelet/NodeletLoad.h>
23 #include <nodelet/NodeletUnload.h>
24 #include <pluginlib/class_list_macros.h>
25 #include <ros/ros.h>
26 #include <ros/package.h>
27 
29 #include <ff_msgs/CommandConstants.h>
30 #include <ff_msgs/CommandStamped.h>
31 #include <ff_msgs/Heartbeat.h>
32 #include <ff_msgs/Fault.h>
33 #include <ff_msgs/FaultConfig.h>
34 #include <ff_msgs/FaultInfo.h>
35 #include <ff_msgs/FaultState.h>
36 #include <ff_msgs/TimeSyncStamped.h>
37 #include <ff_msgs/UnloadLoadNodelet.h>
38 #include <ff_common/ff_names.h>
39 #include <ff_util/ff_faults.h>
40 #include <ff_util/ff_nodelet.h>
41 
42 #include <cmath>
43 #include <map>
44 #include <string>
45 #include <vector>
46 
47 using ff_msgs::CommandArg;
48 
49 namespace sys_monitor {
51  public:
52  SysMonitor();
53  ~SysMonitor();
54 
61  void AddFault(unsigned int fault_id, std::string const& fault_msg = "",
62  ros::Time time_occurred = ros::Time::now());
63 
64  void AddFault(ff_msgs::Fault const& fault, bool check_added = false);
65 
66  void ChangeFaultErrMsg(unsigned int fault_id, std::string err_msg);
67 
68  void RemoveFault(unsigned int fault_id);
69 
70  protected:
71  class Watchdog {
72  public:
74  std::string const& node_name,
75  ros::Duration const& timeout,
76  uint const allowed_misses,
77  uint const fault_id);
78  uint fault_id();
79  uint misses_allowed();
80  ff_msgs::HeartbeatConstPtr previous_hb();
81  bool hb_fault_occurring();
82  bool heartbeat_started();
83  bool unloaded();
84  std::string nodelet_manager();
85  std::string nodelet_name();
86  std::string nodelet_type();
87  void hb_fault_occurring(bool occurring);
88  void nodelet_manager(std::string manager_name);
89  void nodelet_name(std::string name);
90  void nodelet_type(std::string type);
91  void unloaded(bool is_unloaded);
92  void ResetTimer();
93  void StopTimer();
94  void previous_hb(ff_msgs::HeartbeatConstPtr hb);
95  void TimerCallBack(ros::TimerEvent const& te);
96 
97  private:
98  ros::Timer timer_;
99  SysMonitor *const monitor_;
100  uint missed_count_;
101  uint const misses_allowed_;
102  uint const fault_id_;
103  bool hb_fault_occurring_;
104  bool heartbeat_started_;
105  bool unloaded_;
106  std::string nodelet_manager_;
107  std::string nodelet_name_;
108  std::string nodelet_type_;
109  ff_msgs::HeartbeatConstPtr previous_hb_;
110  };
111  typedef std::shared_ptr<Watchdog> WatchdogPtr;
112 
113  struct Fault {
114  Fault(std::string const& node_name_in,
115  bool const blocking_in,
116  bool const warning_in,
117  ff_msgs::CommandStampedPtr response_in);
118  std::string const node_name;
119  bool const blocking;
120  bool const warning;
121  ff_msgs::CommandStampedPtr response;
122  };
123 
131  void AddWatchDog(ros::Duration const& timeout, std::string const& node_name,
132  uint const allowed_misses, uint const fault_id);
133 
134  void SetFaultState(unsigned int fault_id, bool adding_fault);
135 
140  void HeartbeatCallback(ff_msgs::HeartbeatConstPtr const& heartbeat);
141 
142  void AssertFault(ff_util::FaultKeys enum_key,
143  std::string const& message,
144  ros::Time time_fault_occurred = ros::Time::now());
145 
146  void ClearFault(ff_util::FaultKeys enum_key);
147 
148  virtual void Initialize(ros::NodeHandle *nh);
149 
150  void OutputFaultTables();
151 
152  void PublishCmd(ff_msgs::CommandStampedPtr cmd);
153 
154  void PublishFaultConfig();
155 
156  void PublishFaultState();
157 
158  void PublishFaultResponse(unsigned int fault_id);
159 
160  void PublishHeartbeatCallback(ros::TimerEvent const& te);
161 
162  void PublishHeartbeat(bool initialization_fault = false);
163 
164  void PublishTimeDiff(float time_diff_sec);
165 
166  void StartupTimerCallback(ros::TimerEvent const& te);
167 
168  void ReloadNodeletTimerCallback(ros::TimerEvent const& te);
174  bool ReadParams();
175 
181  ff_msgs::CommandStampedPtr cmd);
182 
183  bool NodeletService(ff_msgs::UnloadLoadNodelet::Request &req,
184  ff_msgs::UnloadLoadNodelet::Response &res);
185  int LoadNodelet(ff_msgs::UnloadLoadNodelet::Request &req);
186  int UnloadNodelet(std::string const& nodelet, std::string const& manager);
187 
188  ff_msgs::FaultState fault_state_;
189  ff_msgs::FaultConfig fault_config_;
190  ff_msgs::Heartbeat heartbeat_;
191 
192  nodelet::NodeletLoad load_service_;
193  nodelet::NodeletUnload unload_service_;
194 
195  ros::NodeHandle nh_;
196  ros::Publisher pub_cmd_, pub_heartbeat_;
198  ros::Publisher pub_time_sync_;
200  ros::Timer heartbeat_timer_;
201  ros::ServiceServer unload_load_nodelet_service_;
202  ros::Subscriber sub_hb_;
203 
204  std::map<unsigned int, std::shared_ptr<Fault>> all_faults_;
205  std::map<std::string, WatchdogPtr> watch_dogs_;
206 
207  // TODO(Katie) possibly remove this
208  std::vector<std::string> unwatched_heartbeats_;
209  std::vector<std::string> reloaded_nodelets_;
210 
211  std::string time_diff_node_;
212 
214 
221 };
222 } // namespace sys_monitor
223 
224 #endif // SYS_MONITOR_SYS_MONITOR_H_
sys_monitor::SysMonitor::config_params_
config_reader::ConfigReader config_params_
Definition: sys_monitor.h:213
sys_monitor::SysMonitor::Watchdog::TimerCallBack
void TimerCallBack(ros::TimerEvent const &te)
Definition: sys_monitor.cc:1220
sys_monitor::SysMonitor::heartbeat_pub_rate_
unsigned int heartbeat_pub_rate_
Definition: sys_monitor.h:219
sys_monitor::SysMonitor::Fault
Definition: sys_monitor.h:113
sys_monitor::SysMonitor::log_time_llp_
bool log_time_llp_
Definition: sys_monitor.h:216
sys_monitor::SysMonitor::sub_queue_size_
int sub_queue_size_
Definition: sys_monitor.h:217
sys_monitor::SysMonitor::Fault::warning
const bool warning
Definition: sys_monitor.h:120
sys_monitor::SysMonitor::heartbeat_timer_
ros::Timer heartbeat_timer_
Definition: sys_monitor.h:200
sys_monitor::SysMonitor::Watchdog::nodelet_type
std::string nodelet_type()
Definition: sys_monitor.cc:1178
sys_monitor::SysMonitor::ReloadNodeletTimerCallback
void ReloadNodeletTimerCallback(ros::TimerEvent const &te)
Definition: sys_monitor.cc:616
sys_monitor::SysMonitor::Initialize
virtual void Initialize(ros::NodeHandle *nh)
Definition: sys_monitor.cc:331
sys_monitor::SysMonitor::time_drift_thres_sec_
float time_drift_thres_sec_
Definition: sys_monitor.h:220
sys_monitor::SysMonitor::unwatched_heartbeats_
std::vector< std::string > unwatched_heartbeats_
Definition: sys_monitor.h:208
sys_monitor::SysMonitor::PublishFaultState
void PublishFaultState()
Definition: sys_monitor.cc:500
sys_monitor::SysMonitor::time_diff_fault_triggered_
bool time_diff_fault_triggered_
Definition: sys_monitor.h:215
sys_monitor::SysMonitor::heartbeat_
ff_msgs::Heartbeat heartbeat_
Definition: sys_monitor.h:190
sys_monitor::SysMonitor::Watchdog::misses_allowed
uint misses_allowed()
Definition: sys_monitor.cc:1150
sys_monitor::SysMonitor::startup_time_
unsigned int startup_time_
Definition: sys_monitor.h:219
sys_monitor::SysMonitor::PublishFaultConfig
void PublishFaultConfig()
Definition: sys_monitor.cc:495
sys_monitor::SysMonitor::Watchdog::nodelet_manager
std::string nodelet_manager()
Definition: sys_monitor.cc:1170
sys_monitor::SysMonitor::pub_heartbeat_
ros::Publisher pub_heartbeat_
Definition: sys_monitor.h:196
sys_monitor::SysMonitor::Watchdog::previous_hb
ff_msgs::HeartbeatConstPtr previous_hb()
Definition: sys_monitor.cc:1154
ff_nodelet.h
sys_monitor::SysMonitor::all_faults_
std::map< unsigned int, std::shared_ptr< Fault > > all_faults_
Definition: sys_monitor.h:204
sys_monitor::SysMonitor::SetFaultState
void SetFaultState(unsigned int fault_id, bool adding_fault)
Definition: sys_monitor.cc:128
sys_monitor::SysMonitor::num_current_blocking_fault_
int num_current_blocking_fault_
Definition: sys_monitor.h:218
sys_monitor::SysMonitor::NodeletService
bool NodeletService(ff_msgs::UnloadLoadNodelet::Request &req, ff_msgs::UnloadLoadNodelet::Response &res)
Definition: sys_monitor.cc:1022
ff_faults.h
sys_monitor::SysMonitor::WatchdogPtr
std::shared_ptr< Watchdog > WatchdogPtr
Definition: sys_monitor.h:111
sys_monitor::SysMonitor::log_time_hlp_
bool log_time_hlp_
Definition: sys_monitor.h:216
sys_monitor::SysMonitor::Fault::node_name
const std::string node_name
Definition: sys_monitor.h:118
sys_monitor::SysMonitor::PublishCmd
void PublishCmd(ff_msgs::CommandStampedPtr cmd)
Definition: sys_monitor.cc:490
sys_monitor::SysMonitor::OutputFaultTables
void OutputFaultTables()
Definition: sys_monitor.cc:440
sys_monitor::SysMonitor::UnloadNodelet
int UnloadNodelet(std::string const &nodelet, std::string const &manager)
Definition: sys_monitor.cc:1085
sys_monitor::SysMonitor::reload_nodelet_timer_
ros::Timer reload_nodelet_timer_
Definition: sys_monitor.h:199
sys_monitor
Definition: sys_monitor.h:49
sys_monitor::SysMonitor::reload_nodelet_timeout_
unsigned int reload_nodelet_timeout_
Definition: sys_monitor.h:219
sys_monitor::SysMonitor::PublishFaultResponse
void PublishFaultResponse(unsigned int fault_id)
Definition: sys_monitor.cc:505
sys_monitor::SysMonitor::reload_params_timer_
ros::Timer reload_params_timer_
Definition: sys_monitor.h:199
sys_monitor::SysMonitor::Fault::blocking
const bool blocking
Definition: sys_monitor.h:119
sys_monitor::SysMonitor::AddWatchDog
void AddWatchDog(ros::Duration const &timeout, std::string const &node_name, uint const allowed_misses, uint const fault_id)
Definition: sys_monitor.cc:111
sys_monitor::SysMonitor::Watchdog::unloaded
bool unloaded()
Definition: sys_monitor.cc:1166
sys_monitor::SysMonitor::sub_hb_
ros::Subscriber sub_hb_
Definition: sys_monitor.h:202
name
std::string name
Definition: eps_simulator.cc:48
sys_monitor::SysMonitor::pub_cmd_
ros::Publisher pub_cmd_
Definition: sys_monitor.h:196
sys_monitor::SysMonitor::Watchdog::heartbeat_started
bool heartbeat_started()
Definition: sys_monitor.cc:1162
sys_monitor::SysMonitor::Watchdog::ResetTimer
void ResetTimer()
Definition: sys_monitor.cc:1202
ff_util::FreeFlyerNodelet
Definition: ff_nodelet.h:57
ff_names.h
sys_monitor::SysMonitor::~SysMonitor
~SysMonitor()
Definition: sys_monitor.cc:33
sys_monitor::SysMonitor::PublishHeartbeatCallback
void PublishHeartbeatCallback(ros::TimerEvent const &te)
Definition: sys_monitor.cc:531
sys_monitor::SysMonitor::ChangeFaultErrMsg
void ChangeFaultErrMsg(unsigned int fault_id, std::string err_msg)
Definition: sys_monitor.cc:89
sys_monitor::SysMonitor::Watchdog::nodelet_name
std::string nodelet_name()
Definition: sys_monitor.cc:1174
config_reader::ConfigReader
Definition: config_reader.h:48
sys_monitor::SysMonitor::PublishHeartbeat
void PublishHeartbeat(bool initialization_fault=false)
Definition: sys_monitor.cc:535
sys_monitor::SysMonitor::ReadCommand
bool ReadCommand(config_reader::ConfigReader::Table *entry, ff_msgs::CommandStampedPtr cmd)
Definition: sys_monitor.cc:886
sys_monitor::SysMonitor::fault_state_
ff_msgs::FaultState fault_state_
Definition: sys_monitor.h:188
sys_monitor::SysMonitor::reloaded_nodelets_
std::vector< std::string > reloaded_nodelets_
Definition: sys_monitor.h:209
sys_monitor::SysMonitor::ReadParams
bool ReadParams()
Definition: sys_monitor.cc:646
config_reader.h
sys_monitor::SysMonitor::pub_fault_config_
ros::Publisher pub_fault_config_
Definition: sys_monitor.h:197
sys_monitor::SysMonitor::Watchdog
Definition: sys_monitor.h:71
sys_monitor::SysMonitor::load_service_
nodelet::NodeletLoad load_service_
Definition: sys_monitor.h:192
sys_monitor::SysMonitor::pub_queue_size_
int pub_queue_size_
Definition: sys_monitor.h:217
config_reader::ConfigReader::Table
Definition: config_reader.h:54
sys_monitor::SysMonitor::fault_config_
ff_msgs::FaultConfig fault_config_
Definition: sys_monitor.h:189
sys_monitor::SysMonitor::LoadNodelet
int LoadNodelet(ff_msgs::UnloadLoadNodelet::Request &req)
Definition: sys_monitor.cc:1033
sys_monitor::SysMonitor::StartupTimerCallback
void StartupTimerCallback(ros::TimerEvent const &te)
Definition: sys_monitor.cc:560
sys_monitor::SysMonitor::Watchdog::hb_fault_occurring
bool hb_fault_occurring()
Definition: sys_monitor.cc:1158
sys_monitor::SysMonitor::Watchdog::StopTimer
void StopTimer()
Definition: sys_monitor.cc:1212
sys_monitor::SysMonitor::unload_service_
nodelet::NodeletUnload unload_service_
Definition: sys_monitor.h:193
sys_monitor::SysMonitor::time_diff_node_
std::string time_diff_node_
Definition: sys_monitor.h:211
sys_monitor::SysMonitor::SysMonitor
SysMonitor()
Definition: sys_monitor.cc:22
sys_monitor::SysMonitor::nh_
ros::NodeHandle nh_
Definition: sys_monitor.h:195
sys_monitor::SysMonitor::RemoveFault
void RemoveFault(unsigned int fault_id)
Definition: sys_monitor.cc:98
sys_monitor::SysMonitor::pub_fault_state_
ros::Publisher pub_fault_state_
Definition: sys_monitor.h:197
sys_monitor::SysMonitor::pub_time_sync_
ros::Publisher pub_time_sync_
Definition: sys_monitor.h:198
sys_monitor::SysMonitor::unload_load_nodelet_service_
ros::ServiceServer unload_load_nodelet_service_
Definition: sys_monitor.h:201
sys_monitor::SysMonitor::AddFault
void AddFault(unsigned int fault_id, std::string const &fault_msg="", ros::Time time_occurred=ros::Time::now())
Definition: sys_monitor.cc:38
sys_monitor::SysMonitor::Watchdog::Watchdog
Watchdog(SysMonitor *const sys_monitor, std::string const &node_name, ros::Duration const &timeout, uint const allowed_misses, uint const fault_id)
Definition: sys_monitor.cc:1126
sys_monitor::SysMonitor::AssertFault
void AssertFault(ff_util::FaultKeys enum_key, std::string const &message, ros::Time time_fault_occurred=ros::Time::now())
sys_monitor::SysMonitor::Fault::response
ff_msgs::CommandStampedPtr response
Definition: sys_monitor.h:121
sys_monitor::SysMonitor::HeartbeatCallback
void HeartbeatCallback(ff_msgs::HeartbeatConstPtr const &heartbeat)
Definition: sys_monitor.cc:164
localization_common::Time
double Time
Definition: time.h:23
sys_monitor::SysMonitor::Watchdog::fault_id
uint fault_id()
Definition: sys_monitor.cc:1146
sys_monitor::SysMonitor
Definition: sys_monitor.h:50
sys_monitor::SysMonitor::PublishTimeDiff
void PublishTimeDiff(float time_diff_sec)
sys_monitor::SysMonitor::startup_timer_
ros::Timer startup_timer_
Definition: sys_monitor.h:199
ff_util::FaultKeys
FaultKeys
Definition: ff_faults.h:28
sys_monitor::SysMonitor::ClearFault
void ClearFault(ff_util::FaultKeys enum_key)
sys_monitor::SysMonitor::watch_dogs_
std::map< std::string, WatchdogPtr > watch_dogs_
Definition: sys_monitor.h:205
sys_monitor::SysMonitor::Fault::Fault
Fault(std::string const &node_name_in, bool const blocking_in, bool const warning_in, ff_msgs::CommandStampedPtr response_in)
Definition: sys_monitor.cc:1232