@@ -286,6 +286,16 @@ void SmacPlannerHybrid::activate()
286
286
// Add callback for dynamic parameters
287
287
_dyn_params_handler = node->add_on_set_parameters_callback (
288
288
std::bind (&SmacPlannerHybrid::dynamicParametersCallback, this , _1));
289
+
290
+ // Special case handling to obtain resolution changes in global costmap
291
+ auto resolution_remote_cb = [this ](const rclcpp::Parameter & p) {
292
+ auto node = _node.lock ();
293
+ dynamicParametersCallback (
294
+ {rclcpp::Parameter (" resolution" , rclcpp::ParameterValue (p.as_double ()))});
295
+ };
296
+ _remote_param_subscriber = std::make_shared<rclcpp::ParameterEventHandler>(_node.lock ());
297
+ _remote_resolution_handler = _remote_param_subscriber->add_parameter_callback (
298
+ " resolution" , resolution_remote_cb, " global_costmap/global_costmap" );
289
299
}
290
300
291
301
void SmacPlannerHybrid::deactivate ()
@@ -560,6 +570,14 @@ SmacPlannerHybrid::dynamicParametersCallback(std::vector<rclcpp::Parameter> para
560
570
} else if (name == _name + " .analytic_expansion_max_cost" ) {
561
571
reinit_a_star = true ;
562
572
_search_info.analytic_expansion_max_cost = static_cast <float >(parameter.as_double ());
573
+ } else if (name == " resolution" ) {
574
+ // Special case: When the costmap's resolution changes, need to reinitialize
575
+ // the controller to have new resolution information
576
+ RCLCPP_INFO (_logger, " Costmap resolution changed. Reinitializing SmacPlannerHybrid." );
577
+ reinit_collision_checker = true ;
578
+ reinit_a_star = true ;
579
+ reinit_downsampler = true ;
580
+ reinit_smoother = true ;
563
581
}
564
582
} else if (type == ParameterType::PARAMETER_BOOL) {
565
583
if (name == _name + " .downsample_costmap" ) {
0 commit comments