Nav2 Navigation Stack - rolling  main
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_docking/parameter_handler.hpp"
23 
24 namespace opennav_docking
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("controller_frequency", 50.0);
36  params_.initial_perception_timeout = node->declare_or_get_parameter("initial_perception_timeout",
37  5.0);
38  params_.wait_charge_timeout = node->declare_or_get_parameter("wait_charge_timeout", 5.0);
39  params_.dock_approach_timeout = node->declare_or_get_parameter("dock_approach_timeout", 30.0);
40  params_.rotate_to_dock_timeout = node->declare_or_get_parameter("rotate_to_dock_timeout", 10.0);
41  params_.undock_linear_tolerance = node->declare_or_get_parameter("undock_linear_tolerance", 0.05);
42  params_.undock_angular_tolerance = node->declare_or_get_parameter("undock_angular_tolerance",
43  0.05);
44  params_.max_retries = node->declare_or_get_parameter("max_retries", 3);
45  params_.base_frame = node->declare_or_get_parameter("base_frame", std::string("base_link"));
46  params_.fixed_frame = node->declare_or_get_parameter("fixed_frame", std::string("odom"));
47  params_.transform_staleness_threshold =
48  node->declare_or_get_parameter("transform_staleness_threshold", 0.0);
49  params_.dock_prestaging_tolerance = node->declare_or_get_parameter("dock_prestaging_tolerance",
50  0.5);
51  params_.rotation_angular_tolerance = node->declare_or_get_parameter("rotation_angular_tolerance",
52  0.05);
53 
54  RCLCPP_INFO(logger_, "Controller frequency set to %.4fHz", params_.controller_frequency);
55 
56  // Check the dock_backwards deprecated parameter
57  try {
58  params_.dock_backwards = node->declare_or_get_parameter<bool>("dock_backwards");
59  RCLCPP_WARN(
60  logger_, "Parameter dock_backwards is deprecated. "
61  "Please use the dock_direction parameter in your dock plugin instead.");
62  } catch (...) {
63  }
64  params_.odom_topic = node->declare_or_get_parameter("odom_topic", std::string("odom"));
65  params_.odom_duration = node->declare_or_get_parameter("odom_duration", 0.3);
66 }
67 
68 rcl_interfaces::msg::SetParametersResult ParameterHandler::validateParameterUpdatesCallback(
69  const std::vector<rclcpp::Parameter> & parameters)
70 {
71  rcl_interfaces::msg::SetParametersResult result;
72  result.successful = true;
73  for (const auto & parameter : parameters) {
74  const auto & param_type = parameter.get_type();
75  const auto & param_name = parameter.get_name();
76  // If we are trying to change the parameter of a plugin we can just skip it at this point
77  // as they handle parameter changes themselves and don't need to lock the mutex
78  if (param_name.find('.') != std::string::npos) {
79  continue;
80  }
81  if (param_type == ParameterType::PARAMETER_DOUBLE) {
82  if (param_name == "controller_frequency" && parameter.as_double() <= 0.0) {
83  RCLCPP_WARN(
84  logger_, "The value of parameter '%s' is incorrectly set to %f, "
85  "it should be >0. Ignoring parameter update.",
86  param_name.c_str(), parameter.as_double());
87  result.successful = false;
88  } else if (parameter.as_double() < 0.0) {
89  RCLCPP_WARN(
90  logger_, "The value of parameter '%s' is incorrectly set to %f, "
91  "it should be >=0. Ignoring parameter update.",
92  param_name.c_str(), parameter.as_double());
93  result.successful = false;
94  }
95  }
96  }
97  return result;
98 }
99 
100 void
102  const std::vector<rclcpp::Parameter> & parameters)
103 {
104  std::lock_guard<std::mutex> lock_reinit(mutex_);
105  for (const auto & parameter : parameters) {
106  const auto & param_type = parameter.get_type();
107  const auto & param_name = parameter.get_name();
108  if (param_name.find('.') != std::string::npos) {
109  continue;
110  }
111 
112  if (param_type == ParameterType::PARAMETER_DOUBLE) {
113  if (param_name == "controller_frequency") {
114  params_.controller_frequency = parameter.as_double();
115  } else if (param_name == "initial_perception_timeout") {
116  params_.initial_perception_timeout = parameter.as_double();
117  } else if (param_name == "wait_charge_timeout") {
118  params_.wait_charge_timeout = parameter.as_double();
119  } else if (param_name == "undock_linear_tolerance") {
120  params_.undock_linear_tolerance = parameter.as_double();
121  } else if (param_name == "undock_angular_tolerance") {
122  params_.undock_angular_tolerance = parameter.as_double();
123  } else if (param_name == "rotation_angular_tolerance") {
124  params_.rotation_angular_tolerance = parameter.as_double();
125  } else if (param_name == "transform_staleness_threshold") {
126  params_.transform_staleness_threshold = parameter.as_double();
127  }
128  } else if (param_type == ParameterType::PARAMETER_STRING) {
129  if (param_name == "base_frame") {
130  params_.base_frame = parameter.as_string();
131  } else if (param_name == "fixed_frame") {
132  params_.fixed_frame = parameter.as_string();
133  }
134  } else if (param_type == ParameterType::PARAMETER_INTEGER) {
135  if (param_name == "max_retries") {
136  params_.max_retries = parameter.as_int();
137  }
138  }
139  }
140 }
141 
142 } // namespace opennav_docking
Handles parameters and dynamic parameters for Controller Server.
ParameterHandler(const nav2::LifecycleNode::SharedPtr &node, const rclcpp::Logger &logger)
Constructor for opennav_docking::ParameterHandler.
void updateParametersCallback(const std::vector< rclcpp::Parameter > &parameters) override
Apply parameter updates after validation This callback is executed when parameters have been successf...
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...