From 5d5315f4cc25bc6b946727c22f25e6d574c0fa45 Mon Sep 17 00:00:00 2001 From: Jasper van Brakel <36795178+SuperJappie08@users.noreply.github.com> Date: Wed, 4 Feb 2026 01:10:35 +0100 Subject: [PATCH 1/7] Populate Transitions in Transition Events (continuation) (#1269) * Populate Transitions Signed-off-by: CursedRock17 * Suspending timestamp until I find an ansewr Signed-off-by: CursedRock17 * Adding timestamp Signed-off-by: CursedRock17 * Simplify lifecycle event publication arguments Signed-off-by: SuperJappie08 <36795178+SuperJappie08@users.noreply.github.com> * Add clock to rcl_lifecycle_com_interface Signed-off-by: SuperJappie08 <36795178+SuperJappie08@users.noreply.github.com> * Update lifecycle transition event to use builtin_interfaces/Time Adds compatibility with ros2/rcl_interfaces#185 Signed-off-by: SuperJappie08 <36795178+SuperJappie08@users.noreply.github.com> * Add explicit conversions Signed-off-by: SuperJappie08 <36795178+SuperJappie08@users.noreply.github.com> --------- Signed-off-by: CursedRock17 Signed-off-by: SuperJappie08 <36795178+SuperJappie08@users.noreply.github.com> Co-authored-by: CursedRock17 Signed-off-by: Rushsahay --- .../include/rcl_lifecycle/data_types.h | 2 + .../include/rcl_lifecycle/rcl_lifecycle.h | 2 + rcl_lifecycle/src/com_interface.c | 32 +++++++++-- rcl_lifecycle/src/com_interface.h | 4 +- rcl_lifecycle/src/rcl_lifecycle.c | 10 +++- rcl_lifecycle/test/test_rcl_lifecycle.cpp | 55 +++++++++++++++---- 6 files changed, 83 insertions(+), 22 deletions(-) diff --git a/rcl_lifecycle/include/rcl_lifecycle/data_types.h b/rcl_lifecycle/include/rcl_lifecycle/data_types.h index 6a00233eb..1ff9e5861 100644 --- a/rcl_lifecycle/include/rcl_lifecycle/data_types.h +++ b/rcl_lifecycle/include/rcl_lifecycle/data_types.h @@ -74,6 +74,8 @@ typedef struct rcl_lifecycle_com_interface_s { /// Handle to the node used to create the publisher and the services rcl_node_t * node_handle; + /// Node clock for timestamping transition event messages + rcl_clock_t * clock; /// Event used to publish the transitions rcl_publisher_t pub_transition_event; /// Service that allows to trigger changes on the state diff --git a/rcl_lifecycle/include/rcl_lifecycle/rcl_lifecycle.h b/rcl_lifecycle/include/rcl_lifecycle/rcl_lifecycle.h index 49febd9a3..6721c2c3e 100644 --- a/rcl_lifecycle/include/rcl_lifecycle/rcl_lifecycle.h +++ b/rcl_lifecycle/include/rcl_lifecycle/rcl_lifecycle.h @@ -225,6 +225,7 @@ rcl_lifecycle_get_zero_initialized_state_machine(void); * \param[inout] state_machine struct to be initialized * \param[in] node_handle a valid (not finalized) handle to the node used to create the publisher * and the services + * \param[in] clock the clock associated with the node used for time stamping transition events * \param[in] ts_pub_notify pointer to transition publisher, it used to publish the transitions * \param[in] ts_srv_change_state pointer to the service that allows to trigger changes on the state * \param[in] ts_srv_get_state pointer to the service that allows to get the current state @@ -244,6 +245,7 @@ rcl_ret_t rcl_lifecycle_state_machine_init( rcl_lifecycle_state_machine_t * state_machine, rcl_node_t * node_handle, + rcl_clock_t * clock, const rosidl_message_type_support_t * ts_pub_notify, const rosidl_service_type_support_t * ts_srv_change_state, const rosidl_service_type_support_t * ts_srv_get_state, diff --git a/rcl_lifecycle/src/com_interface.c b/rcl_lifecycle/src/com_interface.c index 5a2a37349..a895c991e 100644 --- a/rcl_lifecycle/src/com_interface.c +++ b/rcl_lifecycle/src/com_interface.c @@ -49,6 +49,7 @@ rcl_lifecycle_get_zero_initialized_com_interface(void) { rcl_lifecycle_com_interface_t com_interface; com_interface.node_handle = NULL; + com_interface.clock = NULL; com_interface.pub_transition_event = rcl_get_zero_initialized_publisher(); com_interface.srv_change_state = rcl_get_zero_initialized_service(); com_interface.srv_get_state = rcl_get_zero_initialized_service(); @@ -64,6 +65,7 @@ rcl_ret_t rcl_lifecycle_com_interface_init( rcl_lifecycle_com_interface_t * com_interface, rcl_node_t * node_handle, + rcl_clock_t * clock, const rosidl_message_type_support_t * ts_pub_notify, const rosidl_service_type_support_t * ts_srv_change_state, const rosidl_service_type_support_t * ts_srv_get_state, @@ -72,7 +74,7 @@ rcl_lifecycle_com_interface_init( const rosidl_service_type_support_t * ts_srv_get_transition_graph) { rcl_ret_t ret = rcl_lifecycle_com_interface_publisher_init( - com_interface, node_handle, ts_pub_notify); + com_interface, node_handle, clock, ts_pub_notify); if (ret != RCL_RET_OK) { return ret; } @@ -100,12 +102,18 @@ rcl_ret_t rcl_lifecycle_com_interface_publisher_init( rcl_lifecycle_com_interface_t * com_interface, rcl_node_t * node_handle, + rcl_clock_t * clock, const rosidl_message_type_support_t * ts_pub_notify) { RCL_CHECK_ARGUMENT_FOR_NULL(com_interface, RCL_RET_INVALID_ARGUMENT); RCL_CHECK_ARGUMENT_FOR_NULL(node_handle, RCL_RET_INVALID_ARGUMENT); RCL_CHECK_ARGUMENT_FOR_NULL(ts_pub_notify, RCL_RET_INVALID_ARGUMENT); + if (!rcl_clock_valid(clock)) { + RCL_SET_ERROR_MSG("invalid clock"); + return RCL_RET_INVALID_ARGUMENT; + } + // initialize publisher rcl_publisher_options_t publisher_options = rcl_publisher_get_default_options(); rcl_ret_t ret = rcl_publisher_init( @@ -118,6 +126,7 @@ rcl_lifecycle_com_interface_publisher_init( // initialize static message for notification lifecycle_msgs__msg__TransitionEvent__init(&com_interface->msg); + com_interface->clock = clock; return RCL_RET_OK; @@ -325,12 +334,23 @@ rcl_lifecycle_com_interface_fini( rcl_ret_t rcl_lifecycle_com_interface_publish_notification( rcl_lifecycle_com_interface_t * com_interface, - const rcl_lifecycle_state_t * start, const rcl_lifecycle_state_t * goal) + const rcl_lifecycle_transition_t * transition) { - com_interface->msg.start_state.id = start->id; - rosidl_runtime_c__String__assign(&com_interface->msg.start_state.label, start->label); - com_interface->msg.goal_state.id = goal->id; - rosidl_runtime_c__String__assign(&com_interface->msg.goal_state.label, goal->label); + // Get the current time based on the rcl_clock + rcl_time_point_value_t timestamp; + rcl_ret_t time_ret = rcl_clock_get_now(com_interface->clock, ×tamp); + if (time_ret != RCL_RET_OK) { + return time_ret; // rcl error state should already be set. + } + + com_interface->msg.stamp.sec = (int32_t) RCL_NS_TO_S(timestamp); + com_interface->msg.stamp.nanosec = (uint32_t) (timestamp % RCL_S_TO_NS(1)); + com_interface->msg.transition.id = (uint8_t) transition->id; + rosidl_runtime_c__String__assign(&com_interface->msg.transition.label, transition->label); + com_interface->msg.start_state.id = transition->start->id; + rosidl_runtime_c__String__assign(&com_interface->msg.start_state.label, transition->start->label); + com_interface->msg.goal_state.id = transition->goal->id; + rosidl_runtime_c__String__assign(&com_interface->msg.goal_state.label, transition->goal->label); return rcl_publish(&com_interface->pub_transition_event, &com_interface->msg, NULL); } diff --git a/rcl_lifecycle/src/com_interface.h b/rcl_lifecycle/src/com_interface.h index 5916ad100..cc231d24a 100644 --- a/rcl_lifecycle/src/com_interface.h +++ b/rcl_lifecycle/src/com_interface.h @@ -32,6 +32,7 @@ RCL_WARN_UNUSED rcl_lifecycle_com_interface_init( rcl_lifecycle_com_interface_t * com_interface, rcl_node_t * node_handle, + rcl_clock_t * clock, const rosidl_message_type_support_t * ts_pub_notify, const rosidl_service_type_support_t * ts_srv_change_state, const rosidl_service_type_support_t * ts_srv_get_state, @@ -44,6 +45,7 @@ RCL_WARN_UNUSED rcl_lifecycle_com_interface_publisher_init( rcl_lifecycle_com_interface_t * com_interface, rcl_node_t * node_handle, + rcl_clock_t * clock, const rosidl_message_type_support_t * ts_pub_notify); rcl_ret_t @@ -79,7 +81,7 @@ rcl_ret_t RCL_WARN_UNUSED rcl_lifecycle_com_interface_publish_notification( rcl_lifecycle_com_interface_t * com_interface, - const rcl_lifecycle_state_t * start, const rcl_lifecycle_state_t * goal); + const rcl_lifecycle_transition_t * transition); #ifdef __cplusplus } diff --git a/rcl_lifecycle/src/rcl_lifecycle.c b/rcl_lifecycle/src/rcl_lifecycle.c index 6a0f0f2f2..aa35a2730 100644 --- a/rcl_lifecycle/src/rcl_lifecycle.c +++ b/rcl_lifecycle/src/rcl_lifecycle.c @@ -194,6 +194,7 @@ rcl_ret_t rcl_lifecycle_state_machine_init( rcl_lifecycle_state_machine_t * state_machine, rcl_node_t * node_handle, + rcl_clock_t * clock, const rosidl_message_type_support_t * ts_pub_notify, const rosidl_service_type_support_t * ts_srv_change_state, const rosidl_service_type_support_t * ts_srv_get_state, @@ -208,6 +209,9 @@ rcl_lifecycle_state_machine_init( RCL_CHECK_FOR_NULL_WITH_MSG( node_handle, "Node handle is null\n", return RCL_RET_INVALID_ARGUMENT); + RCL_CHECK_FOR_NULL_WITH_MSG( + clock, "Clock is null\n", return RCL_RET_INVALID_ARGUMENT); + RCL_CHECK_ALLOCATOR_WITH_MSG( &state_machine_options->allocator, "can't initialize state machine, no allocator given\n", return RCL_RET_INVALID_ARGUMENT); @@ -218,7 +222,7 @@ rcl_lifecycle_state_machine_init( if (state_machine->options.enable_com_interface) { rcl_ret_t ret = rcl_lifecycle_com_interface_init( &state_machine->com_interface, node_handle, - ts_pub_notify, + clock, ts_pub_notify, ts_srv_change_state, ts_srv_get_state, ts_srv_get_available_states, ts_srv_get_available_transitions, ts_srv_get_transition_graph); if (ret != RCL_RET_OK) { @@ -226,7 +230,7 @@ rcl_lifecycle_state_machine_init( } } else { rcl_ret_t ret = rcl_lifecycle_com_interface_publisher_init( - &state_machine->com_interface, node_handle, ts_pub_notify); + &state_machine->com_interface, node_handle, clock, ts_pub_notify); if (ret != RCL_RET_OK) { return RCL_RET_ERROR; } @@ -379,7 +383,7 @@ _trigger_transition( if (publish_notification) { rcl_ret_t fcn_ret = rcl_lifecycle_com_interface_publish_notification( - &state_machine->com_interface, transition->start, state_machine->current_state); + &state_machine->com_interface, transition); if (fcn_ret != RCL_RET_OK) { rcl_error_string_t error_string = rcl_get_error_string(); rcutils_reset_error(); diff --git a/rcl_lifecycle/test/test_rcl_lifecycle.cpp b/rcl_lifecycle/test/test_rcl_lifecycle.cpp index 3bc56a526..2afe2c2e1 100644 --- a/rcl_lifecycle/test/test_rcl_lifecycle.cpp +++ b/rcl_lifecycle/test/test_rcl_lifecycle.cpp @@ -193,6 +193,7 @@ TEST(TestRclLifecycle, state_machine) { EXPECT_EQ(0u, state_machine.transition_map.transitions_size); rcl_node_t node = rcl_get_zero_initialized_node(); + rcl_clock_t clock; rcl_allocator_t allocator = rcl_get_default_allocator(); rcl_context_t context = rcl_get_zero_initialized_context(); rcl_node_options_t options = rcl_node_get_default_options(); @@ -223,6 +224,13 @@ TEST(TestRclLifecycle, state_machine) { EXPECT_EQ(RCL_RET_OK, rcl_node_fini(&node)) << rcl_get_error_string().str; }); + ret = rcl_clock_init(RCL_SYSTEM_TIME, &clock, &allocator); + ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; + OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( + { + EXPECT_EQ(RCL_RET_OK, rcl_clock_fini(&clock)) << rcl_get_error_string().str; + }); + const rosidl_message_type_support_t * pn = ROSIDL_GET_MSG_TYPE_SUPPORT(lifecycle_msgs, msg, TransitionEvent); const rosidl_service_type_support_t * cs = @@ -242,56 +250,63 @@ TEST(TestRclLifecycle, state_machine) { // Check various arguments are null ret = rcl_lifecycle_state_machine_init( - nullptr, &node, pn, cs, gs, gas, gat, gtg, &state_machine_options); + nullptr, &node, &clock, pn, cs, gs, gas, gat, gtg, &state_machine_options); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); + rcutils_reset_error(); + EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); + rcutils_reset_error(); + + ret = rcl_lifecycle_state_machine_init( + &state_machine, nullptr, &clock, pn, cs, gs, gas, gat, gtg, &state_machine_options); EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( - &state_machine, nullptr, pn, cs, gs, gas, gat, gtg, &state_machine_options); + &state_machine, &node, nullptr, pn, cs, gs, gas, gat, gtg, &state_machine_options); EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, ret); rcutils_reset_error(); EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( - &state_machine, &node, nullptr, cs, gs, gas, gat, gtg, &state_machine_options); + &state_machine, &node, &clock, nullptr, cs, gs, gas, gat, gtg, &state_machine_options); EXPECT_EQ(RCL_RET_ERROR, ret); rcutils_reset_error(); EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( - &state_machine, &node, pn, nullptr, gs, gas, gat, gtg, &state_machine_options); + &state_machine, &node, &clock, pn, nullptr, gs, gas, gat, gtg, &state_machine_options); EXPECT_EQ(RCL_RET_ERROR, ret); rcutils_reset_error(); EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( - &state_machine, &node, pn, cs, nullptr, gas, gat, gtg, &state_machine_options); + &state_machine, &node, &clock, pn, cs, nullptr, gas, gat, gtg, &state_machine_options); EXPECT_EQ(RCL_RET_ERROR, ret); rcutils_reset_error(); EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( - &state_machine, &node, pn, cs, gs, nullptr, gat, gtg, &state_machine_options); + &state_machine, &node, &clock, pn, cs, gs, nullptr, gat, gtg, &state_machine_options); EXPECT_EQ(RCL_RET_ERROR, ret); rcutils_reset_error(); EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( - &state_machine, &node, pn, cs, gs, gas, nullptr, gtg, &state_machine_options); + &state_machine, &node, &clock, pn, cs, gs, gas, nullptr, gtg, &state_machine_options); EXPECT_EQ(RCL_RET_ERROR, ret); rcutils_reset_error(); EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); rcutils_reset_error(); ret = rcl_lifecycle_state_machine_init( - &state_machine, &node, pn, cs, gs, gas, gat, nullptr, &state_machine_options); + &state_machine, &node, &clock, pn, cs, gs, gas, gat, nullptr, &state_machine_options); EXPECT_EQ(RCL_RET_ERROR, ret); rcutils_reset_error(); EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_lifecycle_state_machine_is_initialized(&state_machine)); @@ -304,7 +319,7 @@ TEST(TestRclLifecycle, state_machine) { state_machine_options.enable_com_interface = false; ret = rcl_lifecycle_state_machine_init( - &state_machine, &node, pn, cs, gs, gas, gat, gtg, &state_machine_options); + &state_machine, &node, &clock, pn, cs, gs, gas, gat, gtg, &state_machine_options); EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; EXPECT_NE(nullptr, &state_machine.com_interface); EXPECT_NE(nullptr, &state_machine.com_interface.pub_transition_event.impl); @@ -325,7 +340,7 @@ TEST(TestRclLifecycle, state_machine) { state_machine_options.initialize_default_states = false; ret = rcl_lifecycle_state_machine_init( - &state_machine, &node, pn, cs, gs, gas, gat, gtg, &state_machine_options); + &state_machine, &node, &clock, pn, cs, gs, gas, gat, gtg, &state_machine_options); EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; // Transition_map is not initialized @@ -385,6 +400,7 @@ TEST(TestRclLifecycle, state_transitions) { EXPECT_EQ(0u, state_machine.transition_map.transitions_size); rcl_node_t node = rcl_get_zero_initialized_node(); + rcl_clock_t clock; rcl_allocator_t allocator = rcl_get_default_allocator(); rcl_lifecycle_state_machine_options_t state_machine_options = rcl_lifecycle_get_default_state_machine_options(); @@ -419,6 +435,13 @@ TEST(TestRclLifecycle, state_transitions) { EXPECT_EQ(RCL_RET_OK, rcl_node_fini(&node)); }); + ret = rcl_clock_init(RCL_SYSTEM_TIME, &clock, &allocator); + ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; + OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( + { + EXPECT_EQ(RCL_RET_OK, rcl_clock_fini(&clock)); + }); + const rosidl_message_type_support_t * pn = ROSIDL_GET_MSG_TYPE_SUPPORT(lifecycle_msgs, msg, TransitionEvent); const rosidl_service_type_support_t * cs = @@ -433,7 +456,7 @@ TEST(TestRclLifecycle, state_transitions) { ROSIDL_GET_SRV_TYPE_SUPPORT(lifecycle_msgs, srv, GetAvailableTransitions); ret = rcl_lifecycle_state_machine_init( - &state_machine, &node, pn, cs, gs, gas, gat, gtg, &state_machine_options); + &state_machine, &node, &clock, pn, cs, gs, gas, gat, gtg, &state_machine_options); EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; ret = rcl_lifecycle_state_machine_is_initialized(&state_machine); @@ -491,6 +514,7 @@ TEST(TestRclLifecycle, state_transitions) { TEST(TestRclLifecycle, init_fini_maybe_fail) { rcl_node_t node = rcl_get_zero_initialized_node(); + rcl_clock_t clock; rcl_allocator_t allocator = rcl_get_default_allocator(); rcl_context_t context = rcl_get_zero_initialized_context(); rcl_node_options_t options = rcl_node_get_default_options(); @@ -522,6 +546,13 @@ TEST(TestRclLifecycle, init_fini_maybe_fail) { EXPECT_EQ(RCL_RET_OK, rcl_node_fini(&node)); }); + ret = rcl_clock_init(RCL_SYSTEM_TIME, &clock, &allocator); + ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str; + OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT( + { + EXPECT_EQ(RCL_RET_OK, rcl_clock_fini(&clock)); + }); + const rosidl_message_type_support_t * pn = ROSIDL_GET_MSG_TYPE_SUPPORT(lifecycle_msgs, msg, TransitionEvent); const rosidl_service_type_support_t * cs = @@ -544,7 +575,7 @@ TEST(TestRclLifecycle, init_fini_maybe_fail) { rcl_lifecycle_get_default_state_machine_options(); ret = rcl_lifecycle_state_machine_init( - &sm, &node, pn, cs, gs, gas, gat, gtg, &state_machine_options); + &sm, &node, &clock, pn, cs, gs, gas, gat, gtg, &state_machine_options); if (RCL_RET_OK == ret) { ret = rcl_lifecycle_state_machine_fini(&sm, &node); if (RCL_RET_OK != ret) { From 3db6cc3ce6bb0a0c7ca7a1881452991b9b62b97d Mon Sep 17 00:00:00 2001 From: Alejandro Hernandez Cordero Date: Mon, 9 Feb 2026 13:27:21 +0100 Subject: [PATCH 2/7] Changelog Signed-off-by: Alejandro Hernandez Cordero Signed-off-by: Rushsahay --- rcl/CHANGELOG.rst | 3 +++ rcl_action/CHANGELOG.rst | 3 +++ rcl_lifecycle/CHANGELOG.rst | 5 +++++ rcl_yaml_param_parser/CHANGELOG.rst | 3 +++ 4 files changed, 14 insertions(+) diff --git a/rcl/CHANGELOG.rst b/rcl/CHANGELOG.rst index ef703350d..dd637ee75 100644 --- a/rcl/CHANGELOG.rst +++ b/rcl/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rcl ^^^^^^^^^^^^^^^^^^^^^^^^^ +10.3.1 (2026-02-09) +------------------- + 10.3.0 (2026-01-29) ------------------- * rcl_logging_implementation package support. (`#1276 `_) diff --git a/rcl_action/CHANGELOG.rst b/rcl_action/CHANGELOG.rst index 292176216..2a115a91a 100644 --- a/rcl_action/CHANGELOG.rst +++ b/rcl_action/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rcl_action ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +10.3.1 (2026-02-09) +------------------- + 10.3.0 (2026-01-29) ------------------- diff --git a/rcl_lifecycle/CHANGELOG.rst b/rcl_lifecycle/CHANGELOG.rst index b808bba60..575591892 100644 --- a/rcl_lifecycle/CHANGELOG.rst +++ b/rcl_lifecycle/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package rcl_lifecycle ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +10.3.1 (2026-02-09) +------------------- +* Populate Transitions in Transition Events (continuation) (`#1269 `_) +* Contributors: Jasper van Brakel + 10.3.0 (2026-01-29) ------------------- diff --git a/rcl_yaml_param_parser/CHANGELOG.rst b/rcl_yaml_param_parser/CHANGELOG.rst index 52002cd3b..be4701db8 100644 --- a/rcl_yaml_param_parser/CHANGELOG.rst +++ b/rcl_yaml_param_parser/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rcl_yaml_param_parser ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +10.3.1 (2026-02-09) +------------------- + 10.3.0 (2026-01-29) ------------------- From f3377d9879beafbfd5b632124f1d94ea720fcb74 Mon Sep 17 00:00:00 2001 From: Alejandro Hernandez Cordero Date: Mon, 9 Feb 2026 13:27:25 +0100 Subject: [PATCH 3/7] 10.3.1 Signed-off-by: Rushsahay --- rcl/package.xml | 2 +- rcl_action/package.xml | 2 +- rcl_lifecycle/package.xml | 2 +- rcl_yaml_param_parser/package.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rcl/package.xml b/rcl/package.xml index 995a5062c..5bac0a2d6 100644 --- a/rcl/package.xml +++ b/rcl/package.xml @@ -2,7 +2,7 @@ rcl - 10.3.0 + 10.3.1 The ROS client library common implementation. This package contains an API which builds on the ROS middleware API and is optionally built upon by the other ROS client libraries. diff --git a/rcl_action/package.xml b/rcl_action/package.xml index 1b0cf3122..3244cbfca 100644 --- a/rcl_action/package.xml +++ b/rcl_action/package.xml @@ -2,7 +2,7 @@ rcl_action - 10.3.0 + 10.3.1 Package containing a C-based ROS action implementation Audrow Nash diff --git a/rcl_lifecycle/package.xml b/rcl_lifecycle/package.xml index 1182413ea..f78d57bd2 100644 --- a/rcl_lifecycle/package.xml +++ b/rcl_lifecycle/package.xml @@ -2,7 +2,7 @@ rcl_lifecycle - 10.3.0 + 10.3.1 Package containing a C-based lifecycle implementation Audrow Nash diff --git a/rcl_yaml_param_parser/package.xml b/rcl_yaml_param_parser/package.xml index e23092352..8ee4ae5da 100644 --- a/rcl_yaml_param_parser/package.xml +++ b/rcl_yaml_param_parser/package.xml @@ -2,7 +2,7 @@ rcl_yaml_param_parser - 10.3.0 + 10.3.1 Parse a YAML parameter file and populate the C data structure. Audrow Nash From ab9ef21117fb6163fdd3a51743e9b71bd82ebc6f Mon Sep 17 00:00:00 2001 From: Rushsahay Date: Wed, 11 Feb 2026 18:43:19 -0600 Subject: [PATCH 4/7] Improved documentation of rcl_XYZ_set_on_new_XYZ_callback Signed-off-by: Rushsahay --- rcl/include/rcl/service.h | 8 ++++++++ rcl/include/rcl/subscription.h | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/rcl/include/rcl/service.h b/rcl/include/rcl/service.h index 5538c83eb..7f246f515 100644 --- a/rcl/include/rcl/service.h +++ b/rcl/include/rcl/service.h @@ -507,6 +507,14 @@ rcl_service_response_publisher_get_actual_qos(const rcl_service_t * service); * * \sa rmw_service_set_on_new_request_callback for details about this function. * + * Since this callback is called from the middleware, you should + * aim to make it fast and not blocking. This callback is intended to implement an event driven executor and + * not process data directly. + * + * Using blocking operators, waiting for other syncronized actions, + * or sending responses directly using this callback will result in + * unexpected behavior + * *
* Attribute | Adherence * ------------------ | ------------- diff --git a/rcl/include/rcl/subscription.h b/rcl/include/rcl/subscription.h index 2a097e0d4..a1b167829 100644 --- a/rcl/include/rcl/subscription.h +++ b/rcl/include/rcl/subscription.h @@ -886,6 +886,14 @@ rcl_subscription_can_loan_messages(const rcl_subscription_t * subscription); * \sa rmw_subscription_set_on_new_message_callback for details about this * function. * + * Since this callback is called from the middleware, you should + * aim to make it fast and not blocking. This callback is intended to implement an event driven executor and + * not process data directly. + * + * Using blocking operators, waiting for other syncronized actions, + * or sending responses directly using this callback will result in + * unexpected behavior + * *
* Attribute | Adherence * ------------------ | ------------- From 2a97c5ef0769520b5f69a88601d58f6aa15abaa2 Mon Sep 17 00:00:00 2001 From: Rushsahay Date: Sun, 15 Feb 2026 20:18:49 -0600 Subject: [PATCH 5/7] Added description to rcl_client_set_on_new_response_callback Signed-off-by: Rushsahay --- rcl/include/rcl/client.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rcl/include/rcl/client.h b/rcl/include/rcl/client.h index 1a774da6c..d65e09667 100644 --- a/rcl/include/rcl/client.h +++ b/rcl/include/rcl/client.h @@ -475,6 +475,14 @@ rcl_client_response_subscription_get_actual_qos(const rcl_client_t * client); * * \sa rmw_client_set_on_new_response_callback for details about this function. * + * Since this callback is called from the middleware, you should + * aim to make it fast and not blocking. This callback is intended to implement an event driven executor and + * not process data directly. + * + * Using blocking operators, waiting for other syncronized actions, + * or sending responses directly using this callback will result in + * unexpected behavior + * *
* Attribute | Adherence * ------------------ | ------------- From 4c21ddbd41bed9940227307afe9c102a1415be04 Mon Sep 17 00:00:00 2001 From: Rushsahay Date: Fri, 20 Feb 2026 17:05:09 -0600 Subject: [PATCH 6/7] Specify consequences of blocking Signed-off-by: Rushsahay --- rcl/include/rcl/client.h | 2 +- rcl/include/rcl/service.h | 2 +- rcl/include/rcl/subscription.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rcl/include/rcl/client.h b/rcl/include/rcl/client.h index d65e09667..3956a7542 100644 --- a/rcl/include/rcl/client.h +++ b/rcl/include/rcl/client.h @@ -481,7 +481,7 @@ rcl_client_response_subscription_get_actual_qos(const rcl_client_t * client); * * Using blocking operators, waiting for other syncronized actions, * or sending responses directly using this callback will result in - * unexpected behavior + * the thread being called from an unexpected/different thread context. * *
* Attribute | Adherence diff --git a/rcl/include/rcl/service.h b/rcl/include/rcl/service.h index 7f246f515..91ac0d0ca 100644 --- a/rcl/include/rcl/service.h +++ b/rcl/include/rcl/service.h @@ -513,7 +513,7 @@ rcl_service_response_publisher_get_actual_qos(const rcl_service_t * service); * * Using blocking operators, waiting for other syncronized actions, * or sending responses directly using this callback will result in - * unexpected behavior + * the thread being called from an unexpected/different thread context. * *
* Attribute | Adherence diff --git a/rcl/include/rcl/subscription.h b/rcl/include/rcl/subscription.h index a1b167829..9b328025a 100644 --- a/rcl/include/rcl/subscription.h +++ b/rcl/include/rcl/subscription.h @@ -892,7 +892,7 @@ rcl_subscription_can_loan_messages(const rcl_subscription_t * subscription); * * Using blocking operators, waiting for other syncronized actions, * or sending responses directly using this callback will result in - * unexpected behavior + * the thread being called from an unexpected/different thread context. * *
* Attribute | Adherence From 3c527f04f07db9364856a29ad227f7e577797549 Mon Sep 17 00:00:00 2001 From: Rushsahay Date: Sat, 21 Feb 2026 09:03:41 -0600 Subject: [PATCH 7/7] Refix the message after fixing signing off Signed-off-by: Rushsahay --- rcl/include/rcl/client.h | 6 +++--- rcl/include/rcl/service.h | 6 +++--- rcl/include/rcl/subscription.h | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/rcl/include/rcl/client.h b/rcl/include/rcl/client.h index 3956a7542..1b2578753 100644 --- a/rcl/include/rcl/client.h +++ b/rcl/include/rcl/client.h @@ -479,9 +479,9 @@ rcl_client_response_subscription_get_actual_qos(const rcl_client_t * client); * aim to make it fast and not blocking. This callback is intended to implement an event driven executor and * not process data directly. * - * Using blocking operators, waiting for other syncronized actions, - * or sending responses directly using this callback will result in - * the thread being called from an unexpected/different thread context. + * Blocking or performing synchronous work here may cause subsequent callbacks + * or responses to execute in executor threads different than the current + * middleware thread. * *
* Attribute | Adherence diff --git a/rcl/include/rcl/service.h b/rcl/include/rcl/service.h index 91ac0d0ca..819c1a6ae 100644 --- a/rcl/include/rcl/service.h +++ b/rcl/include/rcl/service.h @@ -511,9 +511,9 @@ rcl_service_response_publisher_get_actual_qos(const rcl_service_t * service); * aim to make it fast and not blocking. This callback is intended to implement an event driven executor and * not process data directly. * - * Using blocking operators, waiting for other syncronized actions, - * or sending responses directly using this callback will result in - * the thread being called from an unexpected/different thread context. + * Blocking or performing synchronous work here may cause subsequent callbacks + * or responses to execute in executor threads different than the current + * middleware thread. * *
* Attribute | Adherence diff --git a/rcl/include/rcl/subscription.h b/rcl/include/rcl/subscription.h index 9b328025a..91adff703 100644 --- a/rcl/include/rcl/subscription.h +++ b/rcl/include/rcl/subscription.h @@ -890,9 +890,9 @@ rcl_subscription_can_loan_messages(const rcl_subscription_t * subscription); * aim to make it fast and not blocking. This callback is intended to implement an event driven executor and * not process data directly. * - * Using blocking operators, waiting for other syncronized actions, - * or sending responses directly using this callback will result in - * the thread being called from an unexpected/different thread context. + * Blocking or performing synchronous work here may cause subsequent callbacks + * or responses to execute in executor threads different than the current + * middleware thread. * *
* Attribute | Adherence