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_planner/parameter_handler.hpp"
23 
24 namespace nav2_planner
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_.planner_ids = node->declare_or_get_parameter("planner_plugins", default_ids_);
36  double expected_planner_frequency = node->declare_or_get_parameter(
37  "expected_planner_frequency", 1.0);
38  if (expected_planner_frequency > 0) {
39  params_.max_planner_duration = 1 / expected_planner_frequency;
40  } else {
41  RCLCPP_WARN(
42  logger_,
43  "The expected planner frequency parameter is %.4f Hz. The value should to be greater"
44  " than 0.0 to turn on duration overrun warning messages", expected_planner_frequency);
45  params_.max_planner_duration = 0.0;
46  }
47  double costmap_update_timeout_dbl = node->declare_or_get_parameter(
48  "costmap_update_timeout", 1.0);
49  params_.costmap_update_timeout = rclcpp::Duration::from_seconds(costmap_update_timeout_dbl);
50  params_.partial_plan_allowed = node->declare_or_get_parameter("allow_partial_planning", false);
51 
52  if (params_.planner_ids == default_ids_) {
53  for (size_t i = 0; i < default_ids_.size(); ++i) {
54  nav2::declare_parameter_if_not_declared(
55  node, default_ids_[i] + ".plugin", rclcpp::ParameterValue(default_types_[i]));
56  }
57  }
58 
59  params_.planner_types.resize(params_.planner_ids.size());
60 
61  for (size_t i = 0; i != params_.planner_ids.size(); i++) {
62  try {
63  params_.planner_types[i] = nav2::get_plugin_type_param(
64  node, params_.planner_ids[i]);
65  } catch (const std::exception & ex) {
66  throw std::runtime_error(
67  "Failed to get plugin type for planner " + params_.planner_ids[i] + ". Exception: " +
68  ex.what());
69  }
70  }
71 }
72 
73 rcl_interfaces::msg::SetParametersResult ParameterHandler::validateParameterUpdatesCallback(
74  const std::vector<rclcpp::Parameter> & parameters)
75 {
76  rcl_interfaces::msg::SetParametersResult result;
77  result.successful = true;
78  for (const auto & parameter : parameters) {
79  const auto & param_type = parameter.get_type();
80  const auto & param_name = parameter.get_name();
81  // If we are trying to change the parameter of a plugin we can just skip it at this point
82  // as they handle parameter changes themselves and don't need to lock the mutex
83  if (param_name.find('.') != std::string::npos) {
84  continue;
85  }
86  if (param_type == ParameterType::PARAMETER_DOUBLE) {
87  if (parameter.as_double() <= 0.0) {
88  RCLCPP_WARN(
89  logger_, "The value of parameter '%s' is incorrectly set to %f, "
90  "it should be >0. Ignoring parameter update.",
91  param_name.c_str(), parameter.as_double());
92  result.successful = false;
93  }
94  }
95  }
96  return result;
97 }
98 
99 void
101  const std::vector<rclcpp::Parameter> & parameters)
102 {
103  std::lock_guard<std::mutex> lock_reinit(mutex_);
104 
105  for (const auto & parameter : parameters) {
106  const auto & param_type = parameter.get_type();
107  const auto & param_name = parameter.get_name();
108  if (param_name.find('.') != std::string::npos) {
109  continue;
110  }
111 
112  if (param_type == ParameterType::PARAMETER_DOUBLE) {
113  if (param_name == "expected_planner_frequency") {
114  if (parameter.as_double() > 0) {
115  params_.max_planner_duration = 1 / parameter.as_double();
116  }
117  }
118  } else if (param_type == ParameterType::PARAMETER_BOOL) {
119  if (param_name == "allow_partial_planning") {
120  params_.partial_plan_allowed = parameter.as_bool();
121  }
122  }
123  }
124 }
125 
126 } // namespace nav2_planner
Handles parameters and dynamic parameters for Planner Server.
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, const rclcpp::Logger &logger)
Constructor for nav2_planner::ParameterHandler.
void updateParametersCallback(const std::vector< rclcpp::Parameter > &parameters) override
Apply parameter updates after validation This callback is executed when parameters have been successf...