diff --git a/rclcpp/include/rclcpp/parameter_event_handler.hpp b/rclcpp/include/rclcpp/parameter_event_handler.hpp index c2ee55a540..52a0233966 100644 --- a/rclcpp/include/rclcpp/parameter_event_handler.hpp +++ b/rclcpp/include/rclcpp/parameter_event_handler.hpp @@ -268,6 +268,7 @@ class ParameterEventHandler * \param[in] parameter_name Name of parameter. * \param[in] node_name Name of node which hosts the parameter. * \returns The resultant rclcpp::Parameter from the event. + * \throws std::runtime_error if input node name doesn't match the node name in parameter event. */ RCLCPP_PUBLIC static rclcpp::Parameter diff --git a/rclcpp/src/rclcpp/parameter_event_handler.cpp b/rclcpp/src/rclcpp/parameter_event_handler.cpp index 6ba5266809..b1b36b663e 100644 --- a/rclcpp/src/rclcpp/parameter_event_handler.cpp +++ b/rclcpp/src/rclcpp/parameter_event_handler.cpp @@ -133,9 +133,13 @@ ParameterEventHandler::get_parameter_from_event( { rclcpp::Parameter p; if (!get_parameter_from_event(event, p, parameter_name, node_name)) { - throw std::runtime_error( - "Parameter '" + parameter_name + "' of node '" + node_name + - "' is not part of parameter event"); + if (event.node == node_name) { + return rclcpp::Parameter(parameter_name, rclcpp::PARAMETER_NOT_SET); + } else { + throw std::runtime_error( + "The node name '" + node_name + "' of parameter '" + parameter_name + + +"' doesn't match the node name '" + event.node + "' in parameter event"); + } } return p; } diff --git a/rclcpp/test/rclcpp/test_parameter_event_handler.cpp b/rclcpp/test/rclcpp/test_parameter_event_handler.cpp index 9bdd96eab4..c80ca2f6d5 100644 --- a/rclcpp/test/rclcpp/test_parameter_event_handler.cpp +++ b/rclcpp/test/rclcpp/test_parameter_event_handler.cpp @@ -202,9 +202,17 @@ TEST_F(TestNode, GetParameterFromEvent) EXPECT_THROW( ParameterEventHandler::get_parameter_from_event(*multiple, "my_int", wrong_name), std::runtime_error); - // Throws if parameter not part of event + + // Parameter not part of event + // with correct node + rclcpp::Parameter expect_notset_ret("my_notset", rclcpp::PARAMETER_NOT_SET); + rclcpp::Parameter ret; + EXPECT_NO_THROW( + ret = ParameterEventHandler::get_parameter_from_event(*multiple, "my_notset", node_name);); + EXPECT_EQ(ret, expect_notset_ret); + // with incorrect node EXPECT_THROW( - ParameterEventHandler::get_parameter_from_event(*diff_ns_bool, "my_int", node_name), + ParameterEventHandler::get_parameter_from_event(*multiple, "my_notset", wrong_name), std::runtime_error); }