ROS 2 rclcpp + rcl - lyrical  lyrical
ROS 2 C++ Client Library with ROS Client Library
parameter_service.cpp
1 // Copyright 2015 Open Source Robotics Foundation, Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "rclcpp/parameter_service.hpp"
16 
17 #include <algorithm>
18 #include <memory>
19 #include <stdexcept>
20 #include <string>
21 #include <vector>
22 
23 #include "rclcpp/logging.hpp"
24 
25 #include "./parameter_service_names.hpp"
26 
28 
29 ParameterService::ParameterService(
30  const std::shared_ptr<rclcpp::node_interfaces::NodeBaseInterface> & node_base,
31  const std::shared_ptr<rclcpp::node_interfaces::NodeServicesInterface> & node_services,
33  const rclcpp::QoS & qos_profile)
34 {
35  const std::string node_name = node_base->get_name();
36 
37  get_parameters_service_ = create_service<rcl_interfaces::srv::GetParameters>(
38  node_base, node_services,
39  node_name + "/" + parameter_service_names::get_parameters,
40  [node_params](
41  const std::shared_ptr<rmw_request_id_t> &,
42  const std::shared_ptr<rcl_interfaces::srv::GetParameters::Request> & request,
43  std::shared_ptr<rcl_interfaces::srv::GetParameters::Response> response)
44  {
45  try {
46  auto parameters = node_params->get_parameters(request->names);
47  for (const auto & param : parameters) {
48  response->values.push_back(param.get_value_message());
49  }
51  RCLCPP_WARN(rclcpp::get_logger("rclcpp"), "Failed to get parameters: %s", ex.what());
53  RCLCPP_WARN(rclcpp::get_logger("rclcpp"), "Failed to get parameters: %s", ex.what());
54  }
55  },
56  qos_profile, nullptr);
57 
58  get_parameter_types_service_ = create_service<rcl_interfaces::srv::GetParameterTypes>(
59  node_base, node_services,
60  node_name + "/" + parameter_service_names::get_parameter_types,
61  [node_params](
62  const std::shared_ptr<rmw_request_id_t> &,
63  const std::shared_ptr<rcl_interfaces::srv::GetParameterTypes::Request> & request,
64  std::shared_ptr<rcl_interfaces::srv::GetParameterTypes::Response> response)
65  {
66  try {
67  auto types = node_params->get_parameter_types(request->names);
68  std::transform(
69  types.cbegin(), types.cend(),
70  std::back_inserter(response->types), [](const uint8_t & type) {
71  return static_cast<rclcpp::ParameterType>(type);
72  });
74  RCLCPP_WARN(rclcpp::get_logger("rclcpp"), "Failed to get parameter types: %s", ex.what());
75  }
76  },
77  qos_profile, nullptr);
78 
79  set_parameters_service_ = create_service<rcl_interfaces::srv::SetParameters>(
80  node_base, node_services,
81  node_name + "/" + parameter_service_names::set_parameters,
82  [node_params](
83  const std::shared_ptr<rmw_request_id_t> &,
84  const std::shared_ptr<rcl_interfaces::srv::SetParameters::Request> & request,
85  std::shared_ptr<rcl_interfaces::srv::SetParameters::Response> response)
86  {
87  // Set parameters one-by-one, since there's no way to return a partial result if
88  // set_parameters() fails.
89  auto result = rcl_interfaces::msg::SetParametersResult();
90  for (auto & p : request->parameters) {
91  try {
92  result = node_params->set_parameters_atomically(
95  RCLCPP_WARN(rclcpp::get_logger("rclcpp"), "Failed to set parameter: %s", ex.what());
96  result.successful = false;
97  result.reason = ex.what();
98  } catch (const std::runtime_error & ex) {
99  RCLCPP_WARN(rclcpp::get_logger("rclcpp"), "Failed to set parameter: %s", ex.what());
100  result.successful = false;
101  result.reason = ex.what();
102  }
103  response->results.push_back(result);
104  }
105  },
106  qos_profile, nullptr);
107 
108  set_parameters_atomically_service_ = create_service<rcl_interfaces::srv::SetParametersAtomically>(
109  node_base, node_services,
110  node_name + "/" + parameter_service_names::set_parameters_atomically,
111  [node_params](
112  const std::shared_ptr<rmw_request_id_t> &,
113  const std::shared_ptr<rcl_interfaces::srv::SetParametersAtomically::Request> & request,
114  std::shared_ptr<rcl_interfaces::srv::SetParametersAtomically::Response> response)
115  {
116  try {
117  std::vector<rclcpp::Parameter> pvariants;
118  std::transform(
119  request->parameters.cbegin(), request->parameters.cend(),
120  std::back_inserter(pvariants),
121  [](const rcl_interfaces::msg::Parameter & p) {
122  return rclcpp::Parameter::from_parameter_msg(p);
123  });
124  auto result = node_params->set_parameters_atomically(pvariants);
125  response->result = result;
127  RCLCPP_WARN(
128  rclcpp::get_logger("rclcpp"), "Failed to set parameters atomically: %s", ex.what());
129  response->result.successful = false;
130  response->result.reason = "One or more parameters were not declared before setting";
131  } catch (const std::runtime_error & ex) {
132  RCLCPP_WARN(
133  rclcpp::get_logger("rclcpp"), "Failed to set parameters atomically: %s", ex.what());
134  response->result.successful = false;
135  response->result.reason = ex.what();
136  }
137  },
138  qos_profile, nullptr);
139 
140  describe_parameters_service_ = create_service<rcl_interfaces::srv::DescribeParameters>(
141  node_base, node_services,
142  node_name + "/" + parameter_service_names::describe_parameters,
143  [node_params](
144  const std::shared_ptr<rmw_request_id_t> &,
145  const std::shared_ptr<rcl_interfaces::srv::DescribeParameters::Request> & request,
146  std::shared_ptr<rcl_interfaces::srv::DescribeParameters::Response> response)
147  {
148  try {
149  auto descriptors = node_params->describe_parameters(request->names);
150  response->descriptors = descriptors;
152  RCLCPP_WARN(rclcpp::get_logger("rclcpp"), "Failed to describe parameters: %s", ex.what());
153  }
154  },
155  qos_profile, nullptr);
156 
157  list_parameters_service_ = create_service<rcl_interfaces::srv::ListParameters>(
158  node_base, node_services,
159  node_name + "/" + parameter_service_names::list_parameters,
160  [node_params](
161  const std::shared_ptr<rmw_request_id_t> &,
162  const std::shared_ptr<rcl_interfaces::srv::ListParameters::Request> & request,
163  std::shared_ptr<rcl_interfaces::srv::ListParameters::Response> response)
164  {
165  auto result = node_params->list_parameters(request->prefixes, request->depth);
166  response->result = result;
167  },
168  qos_profile, nullptr);
169 }
static RCLCPP_PUBLIC Parameter from_parameter_msg(const rcl_interfaces::msg::Parameter &parameter)
Convert a parameter message in a Parameter class object.
Definition: parameter.cpp:145
Encapsulation of Quality of Service settings.
Definition: qos.hpp:116
Thrown if parameter is not declared, e.g. either set or get was called without first declaring.
Definition: exceptions.hpp:310
Thrown when an uninitialized parameter is accessed.
Definition: exceptions.hpp:331
Pure virtual interface class for the NodeParameters part of the Node API.
virtual RCLCPP_PUBLIC std::vector< rclcpp::Parameter > get_parameters(const std::vector< std::string > &names) const =0
Get descriptions of parameters given their names.
virtual RCLCPP_PUBLIC rcl_interfaces::msg::SetParametersResult set_parameters_atomically(const std::vector< rclcpp::Parameter > &parameters)=0
Set one or more parameters, all at once.
RCLCPP_PUBLIC Logger get_logger(const std::string &name)
Return a named logger.
Definition: logger.cpp:34