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 "nav2_theta_star_planner/parameter_handler.hpp"
23 #include "nav2_core/controller_exceptions.hpp"
24 
25 namespace nav2_theta_star_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, const rclcpp::Logger & logger)
34 : nav2_util::ParameterHandler<Parameters>(node, logger)
35 {
36  plugin_name_ = plugin_name;
37 
38  params_.how_many_corners = node->declare_or_get_parameter(
39  plugin_name_ + ".how_many_corners", 8);
40  if (params_.how_many_corners != 8 && params_.how_many_corners != 4) {
41  params_.how_many_corners = 8;
42  RCLCPP_WARN(logger_, "Your value for - .how_many_corners was overridden, and is now set to 8");
43  }
44  params_.allow_unknown = node->declare_or_get_parameter(
45  plugin_name_ + ".allow_unknown", true);
46  params_.w_euc_cost = node->declare_or_get_parameter(
47  plugin_name_ + ".w_euc_cost", 1.0);
48  params_.w_traversal_cost = node->declare_or_get_parameter(
49  plugin_name_ + ".w_traversal_cost", 2.0);
50  params_.w_heuristic_cost = params_.w_euc_cost < 1.0 ? params_.w_euc_cost : 1.0;
51  params_.terminal_checking_interval = node->declare_or_get_parameter(
52  plugin_name_ + ".terminal_checking_interval", 5000);
53  params_.use_final_approach_orientation = node->declare_or_get_parameter(
54  plugin_name_ + ".use_final_approach_orientation", false);
55 }
56 
57 rcl_interfaces::msg::SetParametersResult ParameterHandler::validateParameterUpdatesCallback(
58  const std::vector<rclcpp::Parameter> & parameters)
59 {
60  rcl_interfaces::msg::SetParametersResult result;
61  result.successful = true;
62  for (const auto & parameter : parameters) {
63  const auto & param_type = parameter.get_type();
64  const auto & param_name = parameter.get_name();
65  if (param_name.find(plugin_name_ + ".") != 0) {
66  continue;
67  }
68  if (param_type == ParameterType::PARAMETER_DOUBLE) {
69  if (parameter.as_double() <= 0.0) {
70  RCLCPP_WARN(
71  logger_, "The value of parameter '%s' is incorrectly set to %f, "
72  "it should be >0. Ignoring parameter update.",
73  param_name.c_str(), parameter.as_double());
74  result.successful = false;
75  }
76  } else if (param_type == ParameterType::PARAMETER_INTEGER) {
77  if (param_name == plugin_name_ + ".how_many_corners" &&
78  parameter.as_int() != 4 && parameter.as_int() != 8)
79  {
80  RCLCPP_WARN(
81  logger_, "The value of parameter '%s' is incorrectly set to %ld, "
82  "it should be either 4 or 8. Ignoring parameter update.",
83  param_name.c_str(), parameter.as_int());
84  result.successful = false;
85  }
86  }
87  }
88  return result;
89 }
90 
91 void
93  const std::vector<rclcpp::Parameter> & parameters)
94 {
95  std::lock_guard<std::mutex> lock_reinit(mutex_);
96 
97  for (const auto & parameter : parameters) {
98  const auto & param_type = parameter.get_type();
99  const auto & param_name = parameter.get_name();
100  if (param_name.find(plugin_name_ + ".") != 0) {
101  continue;
102  }
103  if (param_type == ParameterType::PARAMETER_INTEGER) {
104  if (param_name == plugin_name_ + ".how_many_corners") {
105  params_.how_many_corners = parameter.as_int();
106  } else if (param_name == plugin_name_ + ".terminal_checking_interval") {
107  params_.terminal_checking_interval = parameter.as_int();
108  }
109  } else if (param_type == ParameterType::PARAMETER_DOUBLE) {
110  if (param_name == plugin_name_ + ".w_euc_cost") {
111  params_.w_euc_cost = parameter.as_double();
112  } else if (param_name == plugin_name_ + ".w_traversal_cost") {
113  params_.w_traversal_cost = parameter.as_double();
114  }
115  } else if (param_type == ParameterType::PARAMETER_BOOL) {
116  if (param_name == plugin_name_ + ".use_final_approach_orientation") {
117  params_.use_final_approach_orientation = parameter.as_bool();
118  } else if (param_name == plugin_name_ + ".allow_unknown") {
119  params_.allow_unknown = parameter.as_bool();
120  }
121  }
122  }
123 }
124 
125 } // namespace nav2_theta_star_planner
Handles parameters and dynamic parameters for Theta Star.
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...
ParameterHandler(const nav2::LifecycleNode::SharedPtr &node, std::string &plugin_name, const rclcpp::Logger &logger)
Constructor for nav2_theta_star_planner::ParameterHandler.