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  if (params_.w_euc_cost <= 0.0) {
49  params_.w_euc_cost = 1.0;
50  RCLCPP_WARN(logger_, "Your value for - .w_euc_cost was overridden, and is now set to 1.0");
51  }
52  params_.w_traversal_cost = node->declare_or_get_parameter(
53  plugin_name_ + ".w_traversal_cost", 2.0);
54  if (params_.w_traversal_cost <= 0.0) {
55  params_.w_traversal_cost = 2.0;
56  RCLCPP_WARN(
57  logger_, "Your value for - .w_traversal_cost was overridden, and is now set to 2.0");
58  }
59  params_.w_heuristic_cost = params_.w_euc_cost < 1.0 ? params_.w_euc_cost : 1.0;
60  params_.terminal_checking_interval = node->declare_or_get_parameter(
61  plugin_name_ + ".terminal_checking_interval", 5000);
62  params_.use_final_approach_orientation = node->declare_or_get_parameter(
63  plugin_name_ + ".use_final_approach_orientation", false);
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 (param_name.find(plugin_name_ + ".") != 0) {
75  continue;
76  }
77  if (param_type == ParameterType::PARAMETER_DOUBLE) {
78  if (parameter.as_double() <= 0.0) {
79  RCLCPP_WARN(
80  logger_, "The value of parameter '%s' is incorrectly set to %f, "
81  "it should be >0. Ignoring parameter update.",
82  param_name.c_str(), parameter.as_double());
83  result.successful = false;
84  }
85  } else if (param_type == ParameterType::PARAMETER_INTEGER) {
86  if (param_name == plugin_name_ + ".how_many_corners" &&
87  parameter.as_int() != 4 && parameter.as_int() != 8)
88  {
89  RCLCPP_WARN(
90  logger_, "The value of parameter '%s' is incorrectly set to %ld, "
91  "it should be either 4 or 8. Ignoring parameter update.",
92  param_name.c_str(), parameter.as_int());
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 
106  for (const auto & parameter : parameters) {
107  const auto & param_type = parameter.get_type();
108  const auto & param_name = parameter.get_name();
109  if (param_name.find(plugin_name_ + ".") != 0) {
110  continue;
111  }
112  if (param_type == ParameterType::PARAMETER_INTEGER) {
113  if (param_name == plugin_name_ + ".how_many_corners") {
114  params_.how_many_corners = parameter.as_int();
115  } else if (param_name == plugin_name_ + ".terminal_checking_interval") {
116  params_.terminal_checking_interval = parameter.as_int();
117  }
118  } else if (param_type == ParameterType::PARAMETER_DOUBLE) {
119  if (param_name == plugin_name_ + ".w_euc_cost") {
120  params_.w_euc_cost = parameter.as_double();
121  params_.w_heuristic_cost = params_.w_euc_cost < 1.0 ? params_.w_euc_cost : 1.0;
122  } else if (param_name == plugin_name_ + ".w_traversal_cost") {
123  params_.w_traversal_cost = parameter.as_double();
124  }
125  } else if (param_type == ParameterType::PARAMETER_BOOL) {
126  if (param_name == plugin_name_ + ".use_final_approach_orientation") {
127  params_.use_final_approach_orientation = parameter.as_bool();
128  } else if (param_name == plugin_name_ + ".allow_unknown") {
129  params_.allow_unknown = parameter.as_bool();
130  }
131  }
132  }
133 }
134 
135 } // 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.