Nav2 Navigation Stack - jazzy  jazzy
ROS 2 Navigation Stack
parameter_handler.cpp
1 // Copyright (c) 2022 Samsung Research America
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 <algorithm>
16 #include <string>
17 #include <limits>
18 #include <memory>
19 #include <vector>
20 #include <utility>
21 
22 #include "opennav_following/parameter_handler.hpp"
23 
24 namespace opennav_following
25 {
26 
27 using rcl_interfaces::msg::ParameterType;
28 
30  const nav2_util::LifecycleNode::SharedPtr & node,
31  const rclcpp::Logger & logger)
32 : node_(node), logger_(logger)
33 {
34  nav2_util::declare_parameter_if_not_declared(
35  node, "controller_frequency", rclcpp::ParameterValue(50.0));
36  nav2_util::declare_parameter_if_not_declared(
37  node, "detection_timeout", rclcpp::ParameterValue(2.0));
38  nav2_util::declare_parameter_if_not_declared(
39  node, "rotate_to_object_timeout", rclcpp::ParameterValue(10.0));
40  nav2_util::declare_parameter_if_not_declared(
41  node, "static_object_timeout", rclcpp::ParameterValue(-1.0));
42  nav2_util::declare_parameter_if_not_declared(
43  node, "linear_tolerance", rclcpp::ParameterValue(0.15));
44  nav2_util::declare_parameter_if_not_declared(
45  node, "angular_tolerance", rclcpp::ParameterValue(0.15));
46  nav2_util::declare_parameter_if_not_declared(
47  node, "max_retries", rclcpp::ParameterValue(3));
48  nav2_util::declare_parameter_if_not_declared(
49  node, "base_frame", rclcpp::ParameterValue(std::string("base_link")));
50  nav2_util::declare_parameter_if_not_declared(
51  node, "fixed_frame", rclcpp::ParameterValue(std::string("odom")));
52  nav2_util::declare_parameter_if_not_declared(
53  node, "desired_distance", rclcpp::ParameterValue(1.0));
54  nav2_util::declare_parameter_if_not_declared(
55  node, "skip_orientation", rclcpp::ParameterValue(true));
56  nav2_util::declare_parameter_if_not_declared(
57  node, "search_by_rotating", rclcpp::ParameterValue(false));
58  nav2_util::declare_parameter_if_not_declared(
59  node, "search_angle", rclcpp::ParameterValue(M_PI_2));
60  nav2_util::declare_parameter_if_not_declared(
61  node, "transform_tolerance", rclcpp::ParameterValue(0.1));
62  nav2_util::declare_parameter_if_not_declared(
63  node, "odom_topic", rclcpp::ParameterValue(std::string("odom")));
64  nav2_util::declare_parameter_if_not_declared(
65  node, "odom_duration", rclcpp::ParameterValue(0.3));
66  nav2_util::declare_parameter_if_not_declared(
67  node, "controller.use_collision_detection", rclcpp::ParameterValue(false));
68  nav2_util::declare_parameter_if_not_declared(
69  node, "filter_coef", rclcpp::ParameterValue(0.1));
70 
71  node->get_parameter("controller_frequency", params_.controller_frequency);
72  node->get_parameter("detection_timeout", params_.detection_timeout);
73  node->get_parameter("rotate_to_object_timeout", params_.rotate_to_object_timeout);
74  node->get_parameter("static_object_timeout", params_.static_object_timeout);
75  node->get_parameter("linear_tolerance", params_.linear_tolerance);
76  node->get_parameter("angular_tolerance", params_.angular_tolerance);
77  node->get_parameter("max_retries", params_.max_retries);
78  node->get_parameter("base_frame", params_.base_frame);
79  node->get_parameter("fixed_frame", params_.fixed_frame);
80  node->get_parameter("desired_distance", params_.desired_distance);
81  node->get_parameter("skip_orientation", params_.skip_orientation);
82  node->get_parameter("search_by_rotating", params_.search_by_rotating);
83  node->get_parameter("search_angle", params_.search_angle);
84  node->get_parameter("transform_tolerance", params_.transform_tolerance);
85  node->get_parameter("odom_topic", params_.odom_topic);
86  node->get_parameter("odom_duration", params_.odom_duration);
87  node->get_parameter("controller.use_collision_detection", params_.use_collision_detection);
88  node->get_parameter("filter_coef", params_.filter_coef);
89 
90  RCLCPP_INFO(logger_, "Controller frequency set to %.4fHz", params_.controller_frequency);
91 }
92 
94 {
95  auto node = node_.lock();
96  dyn_params_handler_ = node->add_on_set_parameters_callback(
97  std::bind(&ParameterHandler::dynamicParametersCallback, this, std::placeholders::_1));
98 }
99 
101 {
102  auto node = node_.lock();
103  if (dyn_params_handler_ && node) {
104  node->remove_on_set_parameters_callback(dyn_params_handler_.get());
105  }
106  dyn_params_handler_.reset();
107 }
108 
109 rcl_interfaces::msg::SetParametersResult ParameterHandler::dynamicParametersCallback(
110  const std::vector<rclcpp::Parameter> & parameters)
111 {
112  std::lock_guard<std::mutex> lock_reinit(mutex_);
113  rcl_interfaces::msg::SetParametersResult result;
114 
115  for (const auto & parameter : parameters) {
116  const auto & param_type = parameter.get_type();
117  const auto & param_name = parameter.get_name();
118 
119  // Skip plugin parameters
120  if (param_name.find('.') != std::string::npos) {
121  continue;
122  }
123 
124  if (param_type == ParameterType::PARAMETER_DOUBLE) {
125  // Validate positive-only parameters
126  if (parameter.as_double() <= 0.0 &&
127  (param_name == "controller_frequency" || param_name == "detection_timeout" ||
128  param_name == "rotate_to_object_timeout"))
129  {
130  RCLCPP_WARN(
131  logger_, "The value of parameter '%s' is incorrectly set to %f, "
132  "it should be >0. Ignoring parameter update.",
133  param_name.c_str(), parameter.as_double());
134  result.successful = false;
135  return result;
136  } else if (parameter.as_double() < 0.0 && param_name != "static_object_timeout") {
137  RCLCPP_WARN(
138  logger_, "The value of parameter '%s' is incorrectly set to %f, "
139  "it should be >=0. Ignoring parameter update.",
140  param_name.c_str(), parameter.as_double());
141  result.successful = false;
142  return result;
143  }
144 
145  if (param_name == "controller_frequency") {
146  params_.controller_frequency = parameter.as_double();
147  } else if (param_name == "detection_timeout") {
148  params_.detection_timeout = parameter.as_double();
149  } else if (param_name == "rotate_to_object_timeout") {
150  params_.rotate_to_object_timeout = parameter.as_double();
151  } else if (param_name == "static_object_timeout") {
152  params_.static_object_timeout = parameter.as_double();
153  } else if (param_name == "linear_tolerance") {
154  params_.linear_tolerance = parameter.as_double();
155  } else if (param_name == "angular_tolerance") {
156  params_.angular_tolerance = parameter.as_double();
157  } else if (param_name == "desired_distance") {
158  params_.desired_distance = parameter.as_double();
159  } else if (param_name == "transform_tolerance") {
160  params_.transform_tolerance = parameter.as_double();
161  } else if (param_name == "search_angle") {
162  params_.search_angle = parameter.as_double();
163  }
164  } else if (param_type == ParameterType::PARAMETER_STRING) {
165  if (param_name == "base_frame") {
166  params_.base_frame = parameter.as_string();
167  } else if (param_name == "fixed_frame") {
168  params_.fixed_frame = parameter.as_string();
169  }
170  } else if (param_type == ParameterType::PARAMETER_BOOL) {
171  if (param_name == "skip_orientation") {
172  params_.skip_orientation = parameter.as_bool();
173  } else if (param_name == "search_by_rotating") {
174  params_.search_by_rotating = parameter.as_bool();
175  }
176  }
177  }
178 
179  result.successful = true;
180  return result;
181 }
182 
183 } // namespace opennav_following
void deactivate()
Resets callbacks for dynamic parameter handling.
void activate()
Registers callbacks for dynamic parameter handling.
rcl_interfaces::msg::SetParametersResult dynamicParametersCallback(const std::vector< rclcpp::Parameter > &parameters)
Callback executed when a parameter change is detected.
ParameterHandler(const nav2_util::LifecycleNode::SharedPtr &node, const rclcpp::Logger &logger)
Constructor for opennav_following::ParameterHandler.