From 54a9c82299f30932bc0248b9e64c7d7c2a9c609d Mon Sep 17 00:00:00 2001 From: "Peter Mitrano (AR)" Date: Thu, 7 Aug 2025 16:55:21 +0200 Subject: [PATCH 1/3] change misleading warning message, making it more correct and informative Signed-off-by: Peter Mitrano (AR) --- .../src/lifecycle_node_interface_impl.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp b/rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp index 1681976d42..988e084e52 100644 --- a/rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp +++ b/rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp @@ -405,6 +405,10 @@ LifecycleNode::LifecycleNodeInterfaceImpl::change_state( // keep the initial state to pass to a transition callback initial_state = State(state_machine_.current_state); + const rcl_lifecycle_transition_t * const original_transition = + rcl_lifecycle_get_transition_by_id(state_machine_.current_state, transition_id); + + if ( rcl_lifecycle_trigger_transition_by_id( &state_machine_, transition_id, publish_update) != RCL_RET_OK) @@ -459,12 +463,15 @@ LifecycleNode::LifecycleNodeInterfaceImpl::change_state( // Update the internal current_state_ current_state_ = State(state_machine_.current_state); - // error handling ?! + // error handling // TODO(karsten1987): iterate over possible ret value if (cb_return_code == node_interfaces::LifecycleNodeInterface::CallbackReturn::ERROR) { - RCLCPP_WARN( - node_logging_interface_->get_logger(), - "Error occurred while doing error handling."); + if (original_transition) { + RCLCPP_WARN( + node_logging_interface_->get_logger(), + "Callback returned ERROR during the transition: %s", original_transition->label); + } + auto error_cb_code = execute_callback(current_state_id, initial_state); auto error_cb_label = get_label_for_return_code(error_cb_code); From bf76f5b8fca0ca26714bd555d4cc467fb5886170 Mon Sep 17 00:00:00 2001 From: "Peter Mitrano (AR)" Date: Fri, 8 Aug 2025 09:41:33 +0200 Subject: [PATCH 2/3] Fix compile error. Needed to also build rcl from source. Signed-off-by: Peter Mitrano (AR) --- rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp b/rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp index 988e084e52..4528b39b93 100644 --- a/rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp +++ b/rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp @@ -390,6 +390,7 @@ LifecycleNode::LifecycleNodeInterfaceImpl::change_state( constexpr bool publish_update = true; State initial_state; unsigned int current_state_id; + const rcl_lifecycle_transition_t * original_transition; { std::lock_guard lock(state_machine_mutex_); @@ -405,8 +406,8 @@ LifecycleNode::LifecycleNodeInterfaceImpl::change_state( // keep the initial state to pass to a transition callback initial_state = State(state_machine_.current_state); - const rcl_lifecycle_transition_t * const original_transition = - rcl_lifecycle_get_transition_by_id(state_machine_.current_state, transition_id); + original_transition = + rcl_lifecycle_get_transition_by_id(state_machine_.current_state, transition_id); if ( From 2d3372799705a5a317746ea89dfde92d56bd4a1d Mon Sep 17 00:00:00 2001 From: "Peter Mitrano (AR)" Date: Fri, 8 Aug 2025 09:45:41 +0200 Subject: [PATCH 3/3] explicitely initialize pointer as null, to adhere to best practice Signed-off-by: Peter Mitrano (AR) --- rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp b/rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp index 4528b39b93..1e8030b4d3 100644 --- a/rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp +++ b/rclcpp_lifecycle/src/lifecycle_node_interface_impl.cpp @@ -390,7 +390,7 @@ LifecycleNode::LifecycleNodeInterfaceImpl::change_state( constexpr bool publish_update = true; State initial_state; unsigned int current_state_id; - const rcl_lifecycle_transition_t * original_transition; + const rcl_lifecycle_transition_t * original_transition{nullptr}; { std::lock_guard lock(state_machine_mutex_);