22 #include "nav2_graceful_controller/parameter_handler.hpp"
24 namespace nav2_graceful_controller
27 using nav2::declare_parameter_if_not_declared;
28 using rcl_interfaces::msg::ParameterType;
31 nav2::LifecycleNode::SharedPtr node, std::string & plugin_name,
32 rclcpp::Logger & logger,
const double costmap_size_x)
35 plugin_name_ = plugin_name;
38 declare_parameter_if_not_declared(
39 node, plugin_name_ +
".transform_tolerance", rclcpp::ParameterValue(0.1));
40 declare_parameter_if_not_declared(
41 node, plugin_name_ +
".min_lookahead", rclcpp::ParameterValue(0.25));
42 declare_parameter_if_not_declared(
43 node, plugin_name_ +
".max_lookahead", rclcpp::ParameterValue(1.0));
44 declare_parameter_if_not_declared(
45 node, plugin_name_ +
".max_robot_pose_search_dist",
46 rclcpp::ParameterValue(costmap_size_x / 2.0));
47 declare_parameter_if_not_declared(node, plugin_name_ +
".k_phi", rclcpp::ParameterValue(2.0));
48 declare_parameter_if_not_declared(node, plugin_name_ +
".k_delta", rclcpp::ParameterValue(1.0));
49 declare_parameter_if_not_declared(node, plugin_name_ +
".beta", rclcpp::ParameterValue(0.4));
50 declare_parameter_if_not_declared(node, plugin_name_ +
".lambda", rclcpp::ParameterValue(2.0));
51 declare_parameter_if_not_declared(
52 node, plugin_name_ +
".v_linear_min", rclcpp::ParameterValue(0.1));
53 declare_parameter_if_not_declared(
54 node, plugin_name_ +
".v_linear_max", rclcpp::ParameterValue(0.5));
55 declare_parameter_if_not_declared(
56 node, plugin_name_ +
".v_angular_max", rclcpp::ParameterValue(1.0));
57 declare_parameter_if_not_declared(
58 node, plugin_name_ +
".v_angular_min_in_place", rclcpp::ParameterValue(0.25));
59 declare_parameter_if_not_declared(
60 node, plugin_name_ +
".slowdown_radius", rclcpp::ParameterValue(1.5));
61 declare_parameter_if_not_declared(
62 node, plugin_name_ +
".initial_rotation", rclcpp::ParameterValue(
true));
63 declare_parameter_if_not_declared(
64 node, plugin_name_ +
".initial_rotation_tolerance", rclcpp::ParameterValue(0.75));
65 declare_parameter_if_not_declared(
66 node, plugin_name_ +
".prefer_final_rotation", rclcpp::ParameterValue(
true));
67 declare_parameter_if_not_declared(
68 node, plugin_name_ +
".rotation_scaling_factor", rclcpp::ParameterValue(0.5));
69 declare_parameter_if_not_declared(
70 node, plugin_name_ +
".allow_backward", rclcpp::ParameterValue(
false));
71 declare_parameter_if_not_declared(
72 node, plugin_name_ +
".in_place_collision_resolution", rclcpp::ParameterValue(0.1));
73 declare_parameter_if_not_declared(
74 node, plugin_name_ +
".use_collision_detection", rclcpp::ParameterValue(
true));
76 node->get_parameter(plugin_name_ +
".transform_tolerance", params_.transform_tolerance);
77 node->get_parameter(plugin_name_ +
".min_lookahead", params_.min_lookahead);
78 node->get_parameter(plugin_name_ +
".max_lookahead", params_.max_lookahead);
80 plugin_name_ +
".max_robot_pose_search_dist", params_.max_robot_pose_search_dist);
81 if (params_.max_robot_pose_search_dist < 0.0) {
83 logger_,
"Max robot search distance is negative, setting to max to search"
84 " every point on path for the closest value.");
85 params_.max_robot_pose_search_dist = std::numeric_limits<double>::max();
88 node->get_parameter(plugin_name_ +
".k_phi", params_.k_phi);
89 node->get_parameter(plugin_name_ +
".k_delta", params_.k_delta);
90 node->get_parameter(plugin_name_ +
".beta", params_.beta);
91 node->get_parameter(plugin_name_ +
".lambda", params_.lambda);
92 node->get_parameter(plugin_name_ +
".v_linear_min", params_.v_linear_min);
93 node->get_parameter(plugin_name_ +
".v_linear_max", params_.v_linear_max);
94 params_.v_linear_max_initial = params_.v_linear_max;
95 node->get_parameter(plugin_name_ +
".v_angular_max", params_.v_angular_max);
96 params_.v_angular_max_initial = params_.v_angular_max;
98 plugin_name_ +
".v_angular_min_in_place", params_.v_angular_min_in_place);
99 node->get_parameter(plugin_name_ +
".slowdown_radius", params_.slowdown_radius);
100 node->get_parameter(plugin_name_ +
".initial_rotation", params_.initial_rotation);
102 plugin_name_ +
".initial_rotation_tolerance", params_.initial_rotation_tolerance);
103 node->get_parameter(plugin_name_ +
".prefer_final_rotation", params_.prefer_final_rotation);
104 node->get_parameter(plugin_name_ +
".rotation_scaling_factor", params_.rotation_scaling_factor);
105 node->get_parameter(plugin_name_ +
".allow_backward", params_.allow_backward);
107 plugin_name_ +
".in_place_collision_resolution", params_.in_place_collision_resolution);
109 plugin_name_ +
".use_collision_detection", params_.use_collision_detection);
111 if (params_.initial_rotation && params_.allow_backward) {
113 logger_,
"Initial rotation and allow backward parameters are both true, "
114 "setting allow backward to false.");
115 params_.allow_backward =
false;
121 auto node = node_.lock();
122 post_set_params_handler_ = node->add_post_set_parameters_callback(
125 this, std::placeholders::_1));
126 on_set_params_handler_ = node->add_on_set_parameters_callback(
129 this, std::placeholders::_1));
134 auto node = node_.lock();
135 if (post_set_params_handler_ && node) {
136 node->remove_post_set_parameters_callback(post_set_params_handler_.get());
138 post_set_params_handler_.reset();
139 if (on_set_params_handler_ && node) {
140 node->remove_on_set_parameters_callback(on_set_params_handler_.get());
142 on_set_params_handler_.reset();
150 std::vector<rclcpp::Parameter> parameters)
152 rcl_interfaces::msg::SetParametersResult result;
153 result.successful =
true;
154 for (
auto parameter : parameters) {
155 const auto & param_type = parameter.get_type();
156 const auto & param_name = parameter.get_name();
157 if (param_name.find(plugin_name_ +
".") != 0) {
160 if (param_type == ParameterType::PARAMETER_DOUBLE) {
161 if (parameter.as_double() < 0.0) {
163 logger_,
"The value of parameter '%s' is incorrectly set to %f, "
164 "it should be >=0. Ignoring parameter update.",
165 param_name.c_str(), parameter.as_double());
166 result.successful =
false;
168 }
else if (param_type == ParameterType::PARAMETER_BOOL) {
169 if (param_name == plugin_name_ +
".allow_backward") {
170 if (params_.initial_rotation && parameter.as_bool()) {
172 logger_,
"Initial rotation and allow backward parameters are both true, "
173 "rejecting parameter change.");
174 result.successful =
false;
176 }
else if(param_name == plugin_name_ +
".initial_rotation") {
177 if (parameter.as_bool() && params_.allow_backward) {
179 logger_,
"Initial rotation and allow backward parameters are both true, "
180 "rejecting parameter change.");
181 result.successful =
false;
190 std::vector<rclcpp::Parameter> parameters)
192 std::lock_guard<std::mutex> lock_reinit(mutex_);
194 for (
const auto & parameter : parameters) {
195 const auto & param_type = parameter.get_type();
196 const auto & param_name = parameter.get_name();
197 if (param_name.find(plugin_name_ +
".") != 0) {
200 if (param_type == ParameterType::PARAMETER_DOUBLE) {
201 if (param_name == plugin_name_ +
".transform_tolerance") {
202 params_.transform_tolerance = parameter.as_double();
203 }
else if (param_name == plugin_name_ +
".min_lookahead") {
204 params_.min_lookahead = parameter.as_double();
205 }
else if (param_name == plugin_name_ +
".max_lookahead") {
206 params_.max_lookahead = parameter.as_double();
207 }
else if (param_name == plugin_name_ +
".k_phi") {
208 params_.k_phi = parameter.as_double();
209 }
else if (param_name == plugin_name_ +
".k_delta") {
210 params_.k_delta = parameter.as_double();
211 }
else if (param_name == plugin_name_ +
".beta") {
212 params_.beta = parameter.as_double();
213 }
else if (param_name == plugin_name_ +
".lambda") {
214 params_.lambda = parameter.as_double();
215 }
else if (param_name == plugin_name_ +
".v_linear_min") {
216 params_.v_linear_min = parameter.as_double();
217 }
else if (param_name == plugin_name_ +
".v_linear_max") {
218 params_.v_linear_max = parameter.as_double();
219 params_.v_linear_max_initial = params_.v_linear_max;
220 }
else if (param_name == plugin_name_ +
".v_angular_max") {
221 params_.v_angular_max = parameter.as_double();
222 params_.v_angular_max_initial = params_.v_angular_max;
223 }
else if (param_name == plugin_name_ +
".v_angular_min_in_place") {
224 params_.v_angular_min_in_place = parameter.as_double();
225 }
else if (param_name == plugin_name_ +
".slowdown_radius") {
226 params_.slowdown_radius = parameter.as_double();
227 }
else if (param_name == plugin_name_ +
".initial_rotation_tolerance") {
228 params_.initial_rotation_tolerance = parameter.as_double();
229 }
else if (param_name == plugin_name_ +
".rotation_scaling_factor") {
230 params_.rotation_scaling_factor = parameter.as_double();
231 }
else if (param_name == plugin_name_ +
".in_place_collision_resolution") {
232 params_.in_place_collision_resolution = parameter.as_double();
234 }
else if (param_type == ParameterType::PARAMETER_BOOL) {
235 if (param_name == plugin_name_ +
".initial_rotation") {
236 params_.initial_rotation = parameter.as_bool();
237 }
else if (param_name == plugin_name_ +
".prefer_final_rotation") {
238 params_.prefer_final_rotation = parameter.as_bool();
239 }
else if (param_name == plugin_name_ +
".allow_backward") {
240 params_.allow_backward = parameter.as_bool();
241 }
else if (param_name == plugin_name_ +
".use_collision_detection") {
242 params_.use_collision_detection = parameter.as_bool();
void activate()
Registers callbacks for dynamic parameter handling.
void updateParametersCallback(std::vector< rclcpp::Parameter > parameters)
Apply parameter updates after validation This callback is executed when parameters have been successf...
~ParameterHandler()
Destructor for nav2_graceful_controller::ParameterHandler.
void deactivate()
Resets callbacks for dynamic parameter handling.
ParameterHandler(nav2::LifecycleNode::SharedPtr node, std::string &plugin_name, rclcpp::Logger &logger, const double costmap_size_x)
Constructor for nav2_graceful_controller::ParameterHandler.
rcl_interfaces::msg::SetParametersResult validateParameterUpdatesCallback(std::vector< rclcpp::Parameter > parameters)
Validate incoming parameter updates before applying them. This callback is triggered when one or more...