.. _program_listing_file_include_rclcpp_copy_all_parameter_values.hpp: Program Listing for File copy_all_parameter_values.hpp ====================================================== |exhale_lsh| :ref:`Return to documentation for file ` (``include/rclcpp/copy_all_parameter_values.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp // Copyright 2023 Open Navigation LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef RCLCPP__COPY_ALL_PARAMETER_VALUES_HPP_ #define RCLCPP__COPY_ALL_PARAMETER_VALUES_HPP_ #include #include #include "rcl_interfaces/srv/list_parameters.hpp" #include "rcl_interfaces/msg/parameter_descriptor.hpp" #include "rcl_interfaces/msg/set_parameters_result.hpp" #include "rclcpp/parameter.hpp" #include "rclcpp/logger.hpp" #include "rclcpp/logging.hpp" namespace rclcpp { template void copy_all_parameter_values( const NodeT1 & source, const NodeT2 & destination, const bool override_existing_params = false) { using Parameters = std::vector; using Descriptions = std::vector; auto source_params = source->get_node_parameters_interface(); auto dest_params = destination->get_node_parameters_interface(); rclcpp::Logger logger = destination->get_node_logging_interface()->get_logger(); std::vector param_names = source_params->list_parameters({}, 0).names; Parameters params = source_params->get_parameters(param_names); Descriptions descriptions = source_params->describe_parameters(param_names); for (unsigned int idx = 0; idx != params.size(); idx++) { if (!dest_params->has_parameter(params[idx].get_name())) { dest_params->declare_parameter( params[idx].get_name(), params[idx].get_parameter_value(), descriptions[idx]); } else if (override_existing_params) { try { rcl_interfaces::msg::SetParametersResult result = dest_params->set_parameters_atomically({params[idx]}); if (!result.successful) { // Parameter update rejected or read-only RCLCPP_WARN( logger, "Unable to set parameter (%s): %s!", params[idx].get_name().c_str(), result.reason.c_str()); } } catch (const rclcpp::exceptions::InvalidParameterTypeException & e) { RCLCPP_WARN( logger, "Unable to set parameter (%s): incompatable parameter type (%s)!", params[idx].get_name().c_str(), e.what()); } } } } } // namespace rclcpp #endif // RCLCPP__COPY_ALL_PARAMETER_VALUES_HPP_