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_rotation_shim_controller/parameter_handler.hpp"
23 #include "nav2_core/controller_exceptions.hpp"
24 #include "nav2_costmap_2d/cost_values.hpp"
25 
26 namespace nav2_rotation_shim_controller
27 {
28 
29 using nav2::declare_parameter_if_not_declared;
30 using rcl_interfaces::msg::ParameterType;
31 
33  const nav2::LifecycleNode::SharedPtr & node,
34  std::string & plugin_name, rclcpp::Logger & logger)
35 : nav2_util::ParameterHandler<Parameters>(node, logger)
36 {
37  plugin_name_ = plugin_name;
38 
39  params_.angular_dist_threshold = node->declare_or_get_parameter(plugin_name_ +
40  ".angular_dist_threshold", 0.785); // 45 deg
41  params_.angular_disengage_threshold = node->declare_or_get_parameter(plugin_name_ +
42  ".angular_disengage_threshold", 0.785 / 2.0);
43  params_.forward_sampling_distance = node->declare_or_get_parameter(plugin_name_ +
44  ".forward_sampling_distance", 0.5);
45  params_.rotate_to_heading_angular_vel = node->declare_or_get_parameter(plugin_name_ +
46  ".rotate_to_heading_angular_vel", 1.8);
47  params_.max_angular_accel = node->declare_or_get_parameter(plugin_name_ + ".max_angular_accel",
48  3.2);
49  params_.max_cost_threshold = node->declare_or_get_parameter(plugin_name_ + ".max_cost_threshold",
50  static_cast<double>(nav2_costmap_2d::LETHAL_OBSTACLE));
51  params_.simulate_ahead_time = node->declare_or_get_parameter(plugin_name_ +
52  ".simulate_ahead_time", 1.0);
53  try {
54  params_.primary_controller = node->declare_or_get_parameter<std::string>(plugin_name_ +
55  ".primary_controller.plugin");
56  } catch (const rclcpp::exceptions::InvalidParameterValueException & e) {
57  RCLCPP_WARN(logger_, "the primary controller must be defined in a namespace:\n"
58  " primary_controller:\n"
59  " plugin: <controller_plugin_name>\n"
60  " ... other parameters ...\n"
61  "Please update your YAML configuration. "
62  "See the migration guide: "
63  // NOLINTNEXTLINE
64  "https://docs.nav2.org/migration/Kilted.html#namespace-added-for-primary-controller-parameters-in-rotation-shim-controller"
65  );
67  "Failed to get 'primary_controller.plugin' parameter");
68  }
69  params_.rotate_to_goal_heading = node->declare_or_get_parameter(plugin_name_ +
70  ".rotate_to_goal_heading", false);
71  params_.rotate_to_heading_once = node->declare_or_get_parameter(plugin_name_ +
72  ".rotate_to_heading_once", false);
73  params_.closed_loop = node->declare_or_get_parameter(plugin_name_ + ".closed_loop", true);
74  params_.use_path_orientations = node->declare_or_get_parameter(plugin_name_ +
75  ".use_path_orientations", false);
76  double control_frequency = 20.0;
77  node->get_parameter("controller_frequency", control_frequency);
78  params_.control_duration = 1.0 / control_frequency;
79 }
80 
81 rcl_interfaces::msg::SetParametersResult ParameterHandler::validateParameterUpdatesCallback(
82  const std::vector<rclcpp::Parameter> & parameters)
83 {
84  rcl_interfaces::msg::SetParametersResult result;
85  result.successful = true;
86  for (const auto & parameter : parameters) {
87  const auto & param_type = parameter.get_type();
88  const auto & param_name = parameter.get_name();
89  if (param_name.find(plugin_name_ + ".") != 0) {
90  continue;
91  }
92  if (param_type == ParameterType::PARAMETER_DOUBLE) {
93  if (param_name == plugin_name_ + ".simulate_ahead_time" &&
94  parameter.as_double() < 0.0)
95  {
96  RCLCPP_WARN(
97  logger_, "The value of simulate_ahead_time is incorrectly set, "
98  "it should be >=0. Ignoring parameter update.");
99  result.successful = false;
100  } else if (parameter.as_double() <= 0.0) {
101  RCLCPP_WARN(
102  logger_, "The value of parameter '%s' is incorrectly set to %f, "
103  "it should be >0. Ignoring parameter update.",
104  param_name.c_str(), parameter.as_double());
105  result.successful = false;
106  }
107  }
108  }
109  return result;
110 }
111 void
113  const std::vector<rclcpp::Parameter> & parameters)
114 {
115  std::lock_guard<std::mutex> lock_reinit(mutex_);
116 
117  for (const auto & parameter : parameters) {
118  const auto & param_type = parameter.get_type();
119  const auto & param_name = parameter.get_name();
120  if (param_name.find(plugin_name_ + ".") != 0) {
121  continue;
122  }
123  if (param_type == ParameterType::PARAMETER_DOUBLE) {
124  if (param_name == plugin_name_ + ".angular_dist_threshold") {
125  params_.angular_dist_threshold = parameter.as_double();
126  } else if (param_name == plugin_name_ + ".forward_sampling_distance") {
127  params_.forward_sampling_distance = parameter.as_double();
128  } else if (param_name == plugin_name_ + ".rotate_to_heading_angular_vel") {
129  params_.rotate_to_heading_angular_vel = parameter.as_double();
130  } else if (param_name == plugin_name_ + ".max_angular_accel") {
131  params_.max_angular_accel = parameter.as_double();
132  } else if (param_name == plugin_name_ + ".max_cost_threshold") {
133  params_.max_cost_threshold = parameter.as_double();
134  } else if (param_name == plugin_name_ + ".simulate_ahead_time") {
135  params_.simulate_ahead_time = parameter.as_double();
136  }
137  } else if (param_type == ParameterType::PARAMETER_BOOL) {
138  if (param_name == plugin_name_ + ".rotate_to_goal_heading") {
139  params_.rotate_to_goal_heading = parameter.as_bool();
140  } else if (param_name == plugin_name_ + ".rotate_to_heading_once") {
141  params_.rotate_to_heading_once = parameter.as_bool();
142  } else if (param_name == plugin_name_ + ".closed_loop") {
143  params_.closed_loop = parameter.as_bool();
144  } else if (param_name == plugin_name_ + ".use_path_orientations") {
145  params_.use_path_orientations = parameter.as_bool();
146  }
147  }
148  }
149 }
150 
151 } // namespace nav2_rotation_shim_controller
Handles parameters and dynamic parameters for Rotation Shim.
ParameterHandler(const nav2::LifecycleNode::SharedPtr &node, std::string &plugin_name, rclcpp::Logger &logger)
Constructor for nav2_rotation_shim_controller::ParameterHandler.
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...