@@ -189,40 +189,75 @@ ParameterHandler::ParameterHandler(
189189 params_.use_cost_regulated_linear_velocity_scaling = false ;
190190 }
191191
192- dyn_params_handler_ = node->add_on_set_parameters_callback (
192+ post_set_params_handler_ = node->add_post_set_parameters_callback (
193193 std::bind (
194- &ParameterHandler::dynamicParametersCallback,
194+ &ParameterHandler::updateParametersCallback,
195+ this , std::placeholders::_1));
196+ on_set_params_handler_ = node->add_on_set_parameters_callback (
197+ std::bind (
198+ &ParameterHandler::validateParameterUpdatesCallback,
195199 this , std::placeholders::_1));
196200}
197201
198202ParameterHandler::~ParameterHandler ()
199203{
200204 auto node = node_.lock ();
201- if (dyn_params_handler_ && node) {
202- node->remove_on_set_parameters_callback (dyn_params_handler_.get ());
205+ if (post_set_params_handler_ && node) {
206+ node->remove_post_set_parameters_callback (post_set_params_handler_.get ());
207+ }
208+ post_set_params_handler_.reset ();
209+ if (on_set_params_handler_ && node) {
210+ node->remove_on_set_parameters_callback (on_set_params_handler_.get ());
203211 }
204- dyn_params_handler_ .reset ();
212+ on_set_params_handler_ .reset ();
205213}
206-
207- rcl_interfaces::msg::SetParametersResult
208- ParameterHandler::dynamicParametersCallback (
214+ rcl_interfaces::msg::SetParametersResult ParameterHandler::validateParameterUpdatesCallback (
209215 std::vector<rclcpp::Parameter> parameters)
210216{
211217 rcl_interfaces::msg::SetParametersResult result;
212- std::lock_guard<std::mutex> lock_reinit (mutex_);
213-
218+ result.successful = true ;
214219 for (auto parameter : parameters) {
215220 const auto & type = parameter.get_type ();
216221 const auto & name = parameter.get_name ();
217222
218223 if (type == ParameterType::PARAMETER_DOUBLE) {
219- if (name == plugin_name_ + " .inflation_cost_scaling_factor" ) {
220- if (parameter.as_double () <= 0.0 ) {
224+ if (name == plugin_name_ + " .inflation_cost_scaling_factor" && parameter.as_double () <= 0.0 ) {
225+ RCLCPP_WARN (
226+ logger_, " The value inflation_cost_scaling_factor is incorrectly set, "
227+ " it should be >0. Ignoring parameter update." );
228+ result.successful = false ;
229+ } else if (parameter.as_double () < 0.0 ) {
230+ RCLCPP_WARN (
231+ logger_, " The value of parameter '%s' is incorrectly set to %f, "
232+ " it should be >=0. Ignoring parameter update." ,
233+ name.c_str (), parameter.as_double ());
234+ result.successful = false ;
235+ }
236+ } else if (type == ParameterType::PARAMETER_BOOL) {
237+ if (name == plugin_name_ + " .allow_reversing" ) {
238+ if (params_.use_rotate_to_heading && parameter.as_bool ()) {
221239 RCLCPP_WARN (
222- logger_, " The value inflation_cost_scaling_factor is incorrectly set, "
223- " it should be >0. Ignoring parameter update." );
224- continue ;
240+ logger_, " Both use_rotate_to_heading and allow_reversing "
241+ " parameter cannot be set to true. Rejecting parameter update." );
242+ result. successful = false ;
225243 }
244+ }
245+ }
246+ }
247+ return result;
248+ }
249+ void
250+ ParameterHandler::updateParametersCallback (
251+ std::vector<rclcpp::Parameter> parameters)
252+ {
253+ std::lock_guard<std::mutex> lock_reinit (mutex_);
254+
255+ for (const auto & parameter : parameters) {
256+ const auto & type = parameter.get_type ();
257+ const auto & name = parameter.get_name ();
258+
259+ if (type == ParameterType::PARAMETER_DOUBLE) {
260+ if (name == plugin_name_ + " .inflation_cost_scaling_factor" ) {
226261 params_.inflation_cost_scaling_factor = parameter.as_double ();
227262 } else if (name == plugin_name_ + " .desired_linear_vel" ) {
228263 params_.desired_linear_vel = parameter.as_double ();
@@ -257,6 +292,10 @@ ParameterHandler::dynamicParametersCallback(
257292 params_.cancel_deceleration = parameter.as_double ();
258293 } else if (name == plugin_name_ + " .rotate_to_heading_min_angle" ) {
259294 params_.rotate_to_heading_min_angle = parameter.as_double ();
295+ } else if (name == plugin_name_ + " .transform_tolerance" ) {
296+ params_.transform_tolerance = parameter.as_double ();
297+ } else if (name == plugin_name_ + " .max_robot_pose_search_dist" ) {
298+ params_.max_robot_pose_search_dist = parameter.as_double ();
260299 }
261300 } else if (type == ParameterType::PARAMETER_BOOL) {
262301 if (name == plugin_name_ + " .use_velocity_scaled_lookahead_dist" ) {
@@ -274,19 +313,12 @@ ParameterHandler::dynamicParametersCallback(
274313 } else if (name == plugin_name_ + " .use_cancel_deceleration" ) {
275314 params_.use_cancel_deceleration = parameter.as_bool ();
276315 } else if (name == plugin_name_ + " .allow_reversing" ) {
277- if (params_.use_rotate_to_heading && parameter.as_bool ()) {
278- RCLCPP_WARN (
279- logger_, " Both use_rotate_to_heading and allow_reversing "
280- " parameter cannot be set to true. Rejecting parameter update." );
281- continue ;
282- }
283316 params_.allow_reversing = parameter.as_bool ();
317+ } else if (name == plugin_name_ + " .interpolate_curvature_after_goal" ) {
318+ params_.interpolate_curvature_after_goal = parameter.as_bool ();
284319 }
285320 }
286321 }
287-
288- result.successful = true ;
289- return result;
290322}
291323
292324} // namespace nav2_regulated_pure_pursuit_controller
0 commit comments