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_.dock_prestaging_tolerance = node->declare_or_get_parameter("dock_prestaging_tolerance",
48  0.5);
49  params_.rotation_angular_tolerance = node->declare_or_get_parameter("rotation_angular_tolerance",
50  0.05);
51 
52  RCLCPP_INFO(logger_, "Controller frequency set to %.4fHz", params_.controller_frequency);
53 
54  // Check the dock_backwards deprecated parameter
55  try {
56  params_.dock_backwards = node->declare_or_get_parameter<bool>("dock_backwards");
57  RCLCPP_WARN(
58  logger_, "Parameter dock_backwards is deprecated. "
59  "Please use the dock_direction parameter in your dock plugin instead.");
60  } catch (...) {
61  }
62  params_.odom_topic = node->declare_or_get_parameter("odom_topic", std::string("odom"));
63  params_.odom_duration = node->declare_or_get_parameter("odom_duration", 0.3);
64 }
65 
66 rcl_interfaces::msg::SetParametersResult ParameterHandler::validateParameterUpdatesCallback(
67  const std::vector<rclcpp::Parameter> & parameters)
68 {
69  rcl_interfaces::msg::SetParametersResult result;
70  result.successful = true;
71  for (const auto & parameter : parameters) {
72  const auto & param_type = parameter.get_type();
73  const auto & param_name = parameter.get_name();
74  // If we are trying to change the parameter of a plugin we can just skip it at this point
75  // as they handle parameter changes themselves and don't need to lock the mutex
76  if (param_name.find('.') != std::string::npos) {
77  continue;
78  }
79  if (param_type == ParameterType::PARAMETER_DOUBLE) {
80  if (param_name == "controller_frequency" && parameter.as_double() <= 0.0) {
81  RCLCPP_WARN(
82  logger_, "The value of parameter '%s' is incorrectly set to %f, "
83  "it should be >0. Ignoring parameter update.",
84  param_name.c_str(), parameter.as_double());
85  result.successful = false;
86  } else if (parameter.as_double() < 0.0) {
87  RCLCPP_WARN(
88  logger_, "The value of parameter '%s' is incorrectly set to %f, "
89  "it should be >=0. Ignoring parameter update.",
90  param_name.c_str(), parameter.as_double());
91  result.successful = false;
92  }
93  }
94  }
95  return result;
96 }
97 
98 void
100  const std::vector<rclcpp::Parameter> & parameters)
101 {
102  std::lock_guard<std::mutex> lock_reinit(mutex_);
103  for (const auto & parameter : parameters) {
104  const auto & param_type = parameter.get_type();
105  const auto & param_name = parameter.get_name();
106  if (param_name.find('.') != std::string::npos) {
107  continue;
108  }
109 
110  if (param_type == ParameterType::PARAMETER_DOUBLE) {
111  if (param_name == "controller_frequency") {
112  params_.controller_frequency = parameter.as_double();
113  } else if (param_name == "initial_perception_timeout") {
114  params_.initial_perception_timeout = parameter.as_double();
115  } else if (param_name == "wait_charge_timeout") {
116  params_.wait_charge_timeout = parameter.as_double();
117  } else if (param_name == "undock_linear_tolerance") {
118  params_.undock_linear_tolerance = parameter.as_double();
119  } else if (param_name == "undock_angular_tolerance") {
120  params_.undock_angular_tolerance = parameter.as_double();
121  } else if (param_name == "rotation_angular_tolerance") {
122  params_.rotation_angular_tolerance = parameter.as_double();
123  }
124  } else if (param_type == ParameterType::PARAMETER_STRING) {
125  if (param_name == "base_frame") {
126  params_.base_frame = parameter.as_string();
127  } else if (param_name == "fixed_frame") {
128  params_.fixed_frame = parameter.as_string();
129  }
130  } else if (param_type == ParameterType::PARAMETER_INTEGER) {
131  if (param_name == "max_retries") {
132  params_.max_retries = parameter.as_int();
133  }
134  }
135  }
136 }
137 
138 } // 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...