Nav2 Navigation Stack - lyrical  lyrical
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 nav2::declare_parameter_if_not_declared;
28 using rcl_interfaces::msg::ParameterType;
29 
31  const nav2::LifecycleNode::SharedPtr & node,
32  const rclcpp::Logger & logger)
33 : nav2_util::ParameterHandler<Parameters>(node, logger)
34 {
35  params_.controller_frequency = node->declare_or_get_parameter(
36  "controller_frequency", 50.0);
37  params_.detection_timeout = node->declare_or_get_parameter(
38  "detection_timeout", 2.0);
39  params_.rotate_to_object_timeout = node->declare_or_get_parameter(
40  "rotate_to_object_timeout", 10.0);
41  params_.static_object_timeout = node->declare_or_get_parameter(
42  "static_object_timeout", -1.0);
43  params_.linear_tolerance = node->declare_or_get_parameter(
44  "linear_tolerance", 0.15);
45  params_.angular_tolerance = node->declare_or_get_parameter(
46  "angular_tolerance", 0.15);
47  params_.max_retries = node->declare_or_get_parameter("max_retries", 3);
48  params_.base_frame = node->declare_or_get_parameter(
49  "base_frame", std::string("base_link"));
50  params_.fixed_frame = node->declare_or_get_parameter(
51  "fixed_frame", std::string("odom"));
52  params_.desired_distance = node->declare_or_get_parameter(
53  "desired_distance", 1.0);
54  params_.skip_orientation = node->declare_or_get_parameter(
55  "skip_orientation", true);
56  params_.search_by_rotating = node->declare_or_get_parameter(
57  "search_by_rotating", false);
58  params_.search_angle = node->declare_or_get_parameter(
59  "search_angle", M_PI_2);
60  params_.transform_tolerance = node->declare_or_get_parameter(
61  "transform_tolerance", 0.1);
62  params_.odom_topic = node->declare_or_get_parameter(
63  "odom_topic", std::string("odom"));
64  params_.odom_duration = node->declare_or_get_parameter(
65  "odom_duration", 0.3);
66  params_.use_collision_detection = node->declare_or_get_parameter(
67  "controller.use_collision_detection", false);
68  params_.filter_coef = node->declare_or_get_parameter("filter_coef", 0.1);
69  RCLCPP_INFO(logger_, "Controller frequency set to %.4fHz", params_.controller_frequency);
70 }
71 
72 rcl_interfaces::msg::SetParametersResult ParameterHandler::validateParameterUpdatesCallback(
73  const std::vector<rclcpp::Parameter> & parameters)
74 {
75  rcl_interfaces::msg::SetParametersResult result;
76  result.successful = true;
77  for (const auto & parameter : parameters) {
78  const auto & param_type = parameter.get_type();
79  const auto & param_name = parameter.get_name();
80  // If we are trying to change the parameter of a plugin we can just skip it at this point
81  // as they handle parameter changes themselves and don't need to lock the mutex
82  if (param_name.find('.') != std::string::npos) {
83  continue;
84  }
85  if (param_type == ParameterType::PARAMETER_DOUBLE) {
86  if (parameter.as_double() <= 0.0 &&
87  (param_name == "controller_frequency" || param_name == "detection_timeout" ||
88  param_name == "rotate_to_object_timeout"))
89  {
90  RCLCPP_WARN(
91  logger_, "The value of parameter '%s' is incorrectly set to %f, "
92  "it should be >0. Ignoring parameter update.",
93  param_name.c_str(), parameter.as_double());
94  result.successful = false;
95  } else if (parameter.as_double() < 0.0 && param_name != "static_object_timeout") {
96  RCLCPP_WARN(
97  logger_, "The value of parameter '%s' is incorrectly set to %f, "
98  "it should be >=0. Ignoring parameter update.",
99  param_name.c_str(), parameter.as_double());
100  result.successful = false;
101  }
102  }
103  }
104  return result;
105 }
106 
107 void
109  const std::vector<rclcpp::Parameter> & parameters)
110 {
111  std::lock_guard<std::mutex> lock_reinit(mutex_);
112 
113  for (const auto & parameter : parameters) {
114  const auto & param_type = parameter.get_type();
115  const auto & param_name = parameter.get_name();
116  if (param_name.find('.') != std::string::npos) {
117  continue;
118  }
119  if (param_type == ParameterType::PARAMETER_DOUBLE) {
120  if (param_name == "controller_frequency") {
121  params_.controller_frequency = parameter.as_double();
122  } else if (param_name == "detection_timeout") {
123  params_.detection_timeout = parameter.as_double();
124  } else if (param_name == "rotate_to_object_timeout") {
125  params_.rotate_to_object_timeout = parameter.as_double();
126  } else if (param_name == "static_object_timeout") {
127  params_.static_object_timeout = parameter.as_double();
128  } else if (param_name == "linear_tolerance") {
129  params_.linear_tolerance = parameter.as_double();
130  } else if (param_name == "angular_tolerance") {
131  params_.angular_tolerance = parameter.as_double();
132  } else if (param_name == "desired_distance") {
133  params_.desired_distance = parameter.as_double();
134  } else if (param_name == "transform_tolerance") {
135  params_.transform_tolerance = parameter.as_double();
136  } else if (param_name == "search_angle") {
137  params_.search_angle = parameter.as_double();
138  }
139  } else if (param_type == ParameterType::PARAMETER_STRING) {
140  if (param_name == "base_frame") {
141  params_.base_frame = parameter.as_string();
142  } else if (param_name == "fixed_frame") {
143  params_.fixed_frame = parameter.as_string();
144  }
145  } else if (param_type == ParameterType::PARAMETER_BOOL) {
146  if (param_name == "skip_orientation") {
147  params_.skip_orientation = parameter.as_bool();
148  } else if (param_name == "search_by_rotating") {
149  params_.search_by_rotating = parameter.as_bool();
150  }
151  }
152  }
153 }
154 
155 } // namespace opennav_following
Handles parameters and dynamic parameters for Planner Server.
void updateParametersCallback(const std::vector< rclcpp::Parameter > &parameters) override
Apply parameter updates after validation This callback is executed when parameters have been successf...
ParameterHandler(const nav2::LifecycleNode::SharedPtr &node, const rclcpp::Logger &logger)
Constructor for opennav_following::ParameterHandler.
rcl_interfaces::msg::SetParametersResult validateParameterUpdatesCallback(const std::vector< rclcpp::Parameter > &parameters) override
Validate incoming parameter updates before applying them. This callback is triggered when one or more...