@@ -86,6 +86,7 @@ LifecycleManager::LifecycleManager(const rclcpp::NodeOptions & options)
8686 0s,
8787 [this ]() -> void {
8888 init_timer_->cancel ();
89+ createLifecyclePublishers ();
8990 createLifecycleServiceClients ();
9091 createLifecycleServiceServers ();
9192 if (autostart_) {
@@ -142,12 +143,29 @@ LifecycleManager::managerCallback(
142143 }
143144}
144145
146+ void
147+ LifecycleManager::setState (const NodeState & state)
148+ {
149+ managed_nodes_state_ = state;
150+ publishIsActiveState ();
151+ }
152+
145153inline bool
146154LifecycleManager::isActive ()
147155{
148156 return managed_nodes_state_ == NodeState::ACTIVE;
149157}
150158
159+ void
160+ LifecycleManager::publishIsActiveState ()
161+ {
162+ if (is_active_pub_ && is_active_pub_->is_activated ()) {
163+ auto message = std::make_unique<std_msgs::msg::Bool>();
164+ message->data = isActive ();
165+ is_active_pub_->publish (std::move (message));
166+ }
167+ }
168+
151169void
152170LifecycleManager::isActiveCallback (
153171 const std::shared_ptr<rmw_request_id_t >/* request_header*/ ,
@@ -217,6 +235,21 @@ LifecycleManager::createLifecycleServiceServers()
217235 callback_group_);
218236}
219237
238+ void
239+ LifecycleManager::createLifecyclePublishers ()
240+ {
241+ message (" Creating and initializing lifecycle publishers" );
242+
243+ is_active_pub_ = nav2::interfaces::create_publisher<std_msgs::msg::Bool>(
244+ shared_from_this (),
245+ get_name () + std::string (" /is_active" ),
246+ nav2::qos::LatchedSubscriptionQoS (),
247+ callback_group_);
248+ is_active_pub_->on_activate ();
249+ // Publish the initial state once at startup
250+ publishIsActiveState ();
251+ }
252+
220253void
221254LifecycleManager::destroyLifecycleServiceClients ()
222255{
@@ -226,6 +259,16 @@ LifecycleManager::destroyLifecycleServiceClients()
226259 }
227260}
228261
262+ void
263+ LifecycleManager::destroyLifecyclePublishers ()
264+ {
265+ message (" Destroying lifecycle publishers" );
266+ if (is_active_pub_) {
267+ is_active_pub_->on_deactivate ();
268+ is_active_pub_.reset ();
269+ }
270+ }
271+
229272bool
230273LifecycleManager::createBondConnection (const std::string & node_name)
231274{
319362LifecycleManager::shutdownAllNodes ()
320363{
321364 message (" Deactivate, cleanup, and shutdown nodes" );
322- managed_nodes_state_ = NodeState::FINALIZED;
365+ setState ( NodeState::FINALIZED) ;
323366 changeStateForAllNodes (Transition::TRANSITION_DEACTIVATE);
324367 changeStateForAllNodes (Transition::TRANSITION_CLEANUP);
325368 changeStateForAllNodes (Transition::TRANSITION_UNCONFIGURED_SHUTDOWN);
@@ -333,11 +376,11 @@ LifecycleManager::startup()
333376 !changeStateForAllNodes (Transition::TRANSITION_ACTIVATE))
334377 {
335378 RCLCPP_ERROR (get_logger (), " Failed to bring up all requested nodes. Aborting bringup." );
336- managed_nodes_state_ = NodeState::UNKNOWN;
379+ setState ( NodeState::UNKNOWN) ;
337380 return false ;
338381 }
339382 message (" Managed nodes are active" );
340- managed_nodes_state_ = NodeState::ACTIVE;
383+ setState ( NodeState::ACTIVE) ;
341384 createBondTimer ();
342385 return true ;
343386}
@@ -348,11 +391,11 @@ LifecycleManager::configure()
348391 message (" Configuring managed nodes..." );
349392 if (!changeStateForAllNodes (Transition::TRANSITION_CONFIGURE)) {
350393 RCLCPP_ERROR (get_logger (), " Failed to configure all requested nodes. Aborting bringup." );
351- managed_nodes_state_ = NodeState::UNKNOWN;
394+ setState ( NodeState::UNKNOWN) ;
352395 return false ;
353396 }
354397 message (" Managed nodes are now configured" );
355- managed_nodes_state_ = NodeState::INACTIVE;
398+ setState ( NodeState::INACTIVE) ;
356399 return true ;
357400}
358401
@@ -362,11 +405,11 @@ LifecycleManager::cleanup()
362405 message (" Cleaning up managed nodes..." );
363406 if (!changeStateForAllNodes (Transition::TRANSITION_CLEANUP)) {
364407 RCLCPP_ERROR (get_logger (), " Failed to cleanup all requested nodes. Aborting cleanup." );
365- managed_nodes_state_ = NodeState::UNKNOWN;
408+ setState ( NodeState::UNKNOWN) ;
366409 return false ;
367410 }
368411 message (" Managed nodes have been cleaned up" );
369- managed_nodes_state_ = NodeState::UNCONFIGURED;
412+ setState ( NodeState::UNCONFIGURED) ;
370413 return true ;
371414}
372415
@@ -378,6 +421,7 @@ LifecycleManager::shutdown()
378421 message (" Shutting down managed nodes..." );
379422 shutdownAllNodes ();
380423 destroyLifecycleServiceClients ();
424+ destroyLifecyclePublishers ();
381425 message (" Managed nodes have been shut down" );
382426 return true ;
383427}
@@ -394,13 +438,13 @@ LifecycleManager::reset(bool hard_reset)
394438 {
395439 if (!hard_reset) {
396440 RCLCPP_ERROR (get_logger (), " Failed to reset nodes: aborting reset" );
397- managed_nodes_state_ = NodeState::UNKNOWN;
441+ setState ( NodeState::UNKNOWN) ;
398442 return false ;
399443 }
400444 }
401445
402446 message (" Managed nodes have been reset" );
403- managed_nodes_state_ = NodeState::UNCONFIGURED;
447+ setState ( NodeState::UNCONFIGURED) ;
404448 return true ;
405449}
406450
@@ -412,12 +456,12 @@ LifecycleManager::pause()
412456 message (" Pausing managed nodes..." );
413457 if (!changeStateForAllNodes (Transition::TRANSITION_DEACTIVATE)) {
414458 RCLCPP_ERROR (get_logger (), " Failed to pause nodes: aborting pause" );
415- managed_nodes_state_ = NodeState::UNKNOWN;
459+ setState ( NodeState::UNKNOWN) ;
416460 return false ;
417461 }
418462
419463 message (" Managed nodes have been paused" );
420- managed_nodes_state_ = NodeState::INACTIVE;
464+ setState ( NodeState::INACTIVE) ;
421465 return true ;
422466}
423467
@@ -427,12 +471,12 @@ LifecycleManager::resume()
427471 message (" Resuming managed nodes..." );
428472 if (!changeStateForAllNodes (Transition::TRANSITION_ACTIVATE)) {
429473 RCLCPP_ERROR (get_logger (), " Failed to resume nodes: aborting resume" );
430- managed_nodes_state_ = NodeState::UNKNOWN;
474+ setState ( NodeState::UNKNOWN) ;
431475 return false ;
432476 }
433477
434478 message (" Managed nodes are active" );
435- managed_nodes_state_ = NodeState::ACTIVE;
479+ setState ( NodeState::ACTIVE) ;
436480 createBondTimer ();
437481 return true ;
438482}
0 commit comments