15 #ifndef RCLCPP__COPY_ALL_PARAMETER_VALUES_HPP_
16 #define RCLCPP__COPY_ALL_PARAMETER_VALUES_HPP_
21 #include "rcl_interfaces/srv/list_parameters.hpp"
22 #include "rcl_interfaces/msg/parameter_descriptor.hpp"
23 #include "rcl_interfaces/msg/set_parameters_result.hpp"
25 #include "rclcpp/parameter.hpp"
26 #include "rclcpp/logger.hpp"
27 #include "rclcpp/logging.hpp"
40 template<
typename NodeT1,
typename NodeT2>
43 const NodeT1 & source,
const NodeT2 & destination,
const bool override_existing_params =
false)
45 using Parameters = std::vector<rclcpp::Parameter>;
46 using Descriptions = std::vector<rcl_interfaces::msg::ParameterDescriptor>;
47 auto source_params = source->get_node_parameters_interface();
48 auto dest_params = destination->get_node_parameters_interface();
49 rclcpp::Logger logger = destination->get_node_logging_interface()->get_logger();
51 std::vector<std::string> param_names = source_params->list_parameters({}, 0).names;
52 Parameters params = source_params->get_parameters(param_names);
53 Descriptions descriptions = source_params->describe_parameters(param_names);
55 for (
unsigned int idx = 0; idx != params.size(); idx++) {
56 if (!dest_params->has_parameter(params[idx].get_name())) {
57 dest_params->declare_parameter(
58 params[idx].get_name(), params[idx].get_parameter_value(), descriptions[idx]);
59 }
else if (override_existing_params) {
61 rcl_interfaces::msg::SetParametersResult result =
62 dest_params->set_parameters_atomically({params[idx]});
63 if (!result.successful) {
67 "Unable to set parameter (%s): %s!",
68 params[idx].get_name().c_str(), result.reason.c_str());
73 "Unable to set parameter (%s): incompatable parameter type (%s)!",
74 params[idx].get_name().c_str(), e.what());
Thrown if requested parameter type is invalid.
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.
void copy_all_parameter_values(const NodeT1 &source, const NodeT2 &destination, const bool override_existing_params=false)