Nav2 Navigation Stack - rolling  main
ROS 2 Navigation Stack
lifecycle_manager.hpp
1 // Copyright (c) 2019 Intel Corporation
2 // Copyright (c) 2022 Samsung Research America
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 
16 #ifndef NAV2_LIFECYCLE_MANAGER__LIFECYCLE_MANAGER_HPP_
17 #define NAV2_LIFECYCLE_MANAGER__LIFECYCLE_MANAGER_HPP_
18 
19 #include <map>
20 #include <memory>
21 #include <string>
22 #include <thread>
23 #include <unordered_map>
24 #include <vector>
25 
26 #include "nav2_util/lifecycle_service_client.hpp"
27 #include "nav2_ros_common/node_thread.hpp"
28 #include "nav2_ros_common/publisher.hpp"
29 #include "nav2_ros_common/service_server.hpp"
30 #include "rclcpp/rclcpp.hpp"
31 #include "std_msgs/msg/bool.hpp"
32 #include "std_srvs/srv/empty.hpp"
33 #include "nav2_msgs/srv/manage_lifecycle_nodes.hpp"
34 #include "std_srvs/srv/trigger.hpp"
35 #include "bondcpp/bond.hpp"
36 #include "diagnostic_updater/diagnostic_updater.hpp"
37 #include "nav2_ros_common/lifecycle_node.hpp"
38 
39 
40 namespace nav2_lifecycle_manager
41 {
42 using namespace std::chrono_literals; // NOLINT
43 
44 using nav2_msgs::srv::ManageLifecycleNodes;
45 
47 enum NodeState
48 {
49  UNCONFIGURED,
50  ACTIVE,
51  INACTIVE,
52  FINALIZED,
53  UNKNOWN,
54 };
55 
62 class LifecycleManager : public rclcpp::Node
63 {
64 public:
69  explicit LifecycleManager(const rclcpp::NodeOptions & options = rclcpp::NodeOptions());
74 
75 protected:
76  // Callback group used by services and timers
77  rclcpp::CallbackGroup::SharedPtr callback_group_;
78  std::unique_ptr<nav2::NodeThread> service_thread_;
79 
80  // The services provided by this node
81  nav2::ServiceServer<ManageLifecycleNodes>::SharedPtr manager_srv_;
82  nav2::ServiceServer<std_srvs::srv::Trigger>::SharedPtr is_active_srv_;
83 
84  // Latched publisher for is_active status
85  nav2::Publisher<std_msgs::msg::Bool>::SharedPtr is_active_pub_;
86 
93  void managerCallback(
94  const std::shared_ptr<rmw_request_id_t> request_header,
95  const std::shared_ptr<ManageLifecycleNodes::Request> request,
96  std::shared_ptr<ManageLifecycleNodes::Response> response);
104  void isActiveCallback(
105  const std::shared_ptr<rmw_request_id_t> request_header,
106  const std::shared_ptr<std_srvs::srv::Trigger::Request> request,
107  std::shared_ptr<std_srvs::srv::Trigger::Response> response);
108 
109  // Support functions for the service calls
114  bool startup();
119  bool configure();
124  bool cleanup();
129  bool shutdown();
134  bool reset(bool hard_reset = false);
139  bool pause();
144  bool resume();
145 
151  void onRclPreshutdown();
152 
153  // Support function for creating service clients
157  void createLifecycleServiceClients();
158 
159  // Support function for creating service servers
163  void createLifecycleServiceServers();
164 
165  // Support function for creating publishers
169  void createLifecyclePublishers();
170 
171  // Support functions for shutdown
175  void shutdownAllNodes();
179  void destroyLifecycleServiceClients();
183  void destroyLifecyclePublishers();
184 
185  // Support function for creating bond timer
189  void createBondTimer();
190 
191  // Support function for creating bond connection
195  bool createBondConnection(const std::string & node_name);
196 
197  // Support function for killing bond connections
201  void destroyBondTimer();
202 
203  // Support function for checking on bond connections
208  void checkBondConnections();
209 
210  // Support function for checking if bond connections come back after respawn
215  void checkBondRespawnConnection();
216 
220  bool changeStateForNode(
221  const std::string & node_name,
222  std::uint8_t transition);
223 
227  bool changeStateForAllNodes(std::uint8_t transition, bool hard_change = false);
228 
229  // Convenience function to highlight the output on the console
233  void message(const std::string & msg);
234 
235  // Diagnostics functions
239  void CreateDiagnostic(diagnostic_updater::DiagnosticStatusWrapper & stat);
240 
247  void registerRclPreshutdownCallback();
248 
252  void setState(const NodeState & state);
253 
257  bool isActive();
258 
262  void publishIsActiveState();
263 
264  // Timer thread to look at bond connections
265  rclcpp::TimerBase::SharedPtr init_timer_;
266  rclcpp::TimerBase::SharedPtr bond_timer_;
267  rclcpp::TimerBase::SharedPtr bond_respawn_timer_;
268  std::chrono::milliseconds bond_timeout_;
269  std::chrono::milliseconds service_timeout_;
270 
271  // A map of all nodes to check bond connection
272  std::map<std::string, std::shared_ptr<bond::Bond>> bond_map_;
273 
274  // A map of all nodes to be controlled
275  std::map<std::string, std::shared_ptr<nav2_util::LifecycleServiceClient>> node_map_;
276 
277  std::map<std::uint8_t, std::string> transition_label_map_;
278 
279  // A map of the expected transitions to primary states
280  std::unordered_map<std::uint8_t, std::uint8_t> transition_state_map_;
281 
282  // The names of the nodes to be managed, in the order of desired bring-up
283  std::vector<std::string> node_names_;
284 
285  // Whether to automatically start up the system
286  bool autostart_;
287  bool attempt_respawn_reconnection_;
288 
289  NodeState managed_nodes_state_{NodeState::UNCONFIGURED};
290  diagnostic_updater::Updater diagnostics_updater_;
291 
292  rclcpp::Time bond_respawn_start_time_{0};
293  rclcpp::Duration bond_respawn_max_duration_{10s};
294 };
295 
296 } // namespace nav2_lifecycle_manager
297 
298 #endif // NAV2_LIFECYCLE_MANAGER__LIFECYCLE_MANAGER_HPP_
Implements service interface to transition the lifecycle nodes of Nav2 stack. It receives transition ...