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 "nav2_navfn_planner/parameter_handler.hpp"
23 #include "nav2_core/controller_exceptions.hpp"
24 
25 namespace nav2_navfn_planner
26 {
27 
28 using nav2::declare_parameter_if_not_declared;
29 using rcl_interfaces::msg::ParameterType;
30 
32  const nav2::LifecycleNode::SharedPtr & node,
33  std::string & plugin_name, rclcpp::Logger & logger)
34 : nav2_util::ParameterHandler<Parameters>(node, logger)
35 {
36  plugin_name_ = plugin_name;
37 
38  params_.tolerance = node->declare_or_get_parameter(plugin_name + ".tolerance", 0.5);
39  params_.use_astar = node->declare_or_get_parameter(plugin_name + ".use_astar", false);
40  params_.max_cycles_factor =
41  node->declare_or_get_parameter(plugin_name + ".max_cycles_factor", 4);
42  params_.allow_unknown = node->declare_or_get_parameter(plugin_name + ".allow_unknown", true);
43  params_.use_final_approach_orientation = node->declare_or_get_parameter(plugin_name +
44  ".use_final_approach_orientation", false);
45 }
46 
47 rcl_interfaces::msg::SetParametersResult ParameterHandler::validateParameterUpdatesCallback(
48  const std::vector<rclcpp::Parameter> & parameters)
49 {
50  rcl_interfaces::msg::SetParametersResult result;
51  result.successful = true;
52  for (const auto & parameter : parameters) {
53  const auto & param_type = parameter.get_type();
54  const auto & param_name = parameter.get_name();
55  if (param_name.find(plugin_name_ + ".") != 0) {
56  continue;
57  }
58  if (param_type == ParameterType::PARAMETER_DOUBLE) {
59  if (parameter.as_double() <= 0.0) {
60  RCLCPP_WARN(
61  logger_, "The value of parameter '%s' is incorrectly set to %f, "
62  "it should be >0. Ignoring parameter update.",
63  param_name.c_str(), parameter.as_double());
64  result.successful = false;
65  }
66  } else if (param_type == ParameterType::PARAMETER_INTEGER) {
67  if (param_name == plugin_name_ + ".max_cycles_factor" && parameter.as_int() <= 0) {
68  RCLCPP_WARN(
69  logger_, "The value of parameter '%s' is incorrectly set to %ld, "
70  "it should be >0. Ignoring parameter update.",
71  param_name.c_str(), parameter.as_int());
72  result.successful = false;
73  }
74  }
75  }
76  return result;
77 }
78 
79 void
81  const std::vector<rclcpp::Parameter> & parameters)
82 {
83  std::lock_guard<std::mutex> lock_reinit(mutex_);
84 
85  for (const auto & parameter : parameters) {
86  const auto & param_type = parameter.get_type();
87  const auto & param_name = parameter.get_name();
88  if (param_name.find(plugin_name_ + ".") != 0) {
89  continue;
90  }
91  if (param_type == ParameterType::PARAMETER_DOUBLE) {
92  if (param_name == plugin_name_ + ".tolerance") {
93  params_.tolerance = parameter.as_double();
94  }
95  } else if (param_type == ParameterType::PARAMETER_INTEGER) {
96  if (param_name == plugin_name_ + ".max_cycles_factor") {
97  params_.max_cycles_factor = parameter.as_int();
98  }
99  } else if (param_type == ParameterType::PARAMETER_BOOL) {
100  if (param_name == plugin_name_ + ".use_astar") {
101  params_.use_astar = parameter.as_bool();
102  } else if (param_name == plugin_name_ + ".allow_unknown") {
103  params_.allow_unknown = parameter.as_bool();
104  } else if (param_name == plugin_name_ + ".use_final_approach_orientation") {
105  params_.use_final_approach_orientation = parameter.as_bool();
106  }
107  }
108  }
109 }
110 
111 } // namespace nav2_navfn_planner
Handles parameters and dynamic parameters for Navfn.
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...
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, std::string &plugin_name, rclcpp::Logger &logger)
Constructor for nav2_navfn_planner::ParameterHandler.