Skip to content

Commit 6f5bb6b

Browse files
allowing costmap to change with new costmap resolutions (#4223)
* allowing costmap to change with new costmap resolutions * add test * fix test
1 parent 0b22bb4 commit 6f5bb6b

File tree

3 files changed

+29
-0
lines changed

3 files changed

+29
-0
lines changed

nav2_smac_planner/include/nav2_smac_planner/smac_planner_hybrid.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ class SmacPlannerHybrid : public nav2_core::GlobalPlanner
133133

134134
// Dynamic parameters handler
135135
rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr _dyn_params_handler;
136+
std::shared_ptr<rclcpp::ParameterEventHandler> _remote_param_subscriber;
137+
std::shared_ptr<rclcpp::ParameterCallbackHandle> _remote_resolution_handler;
136138
};
137139

138140
} // namespace nav2_smac_planner

nav2_smac_planner/src/smac_planner_hybrid.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,16 @@ void SmacPlannerHybrid::activate()
286286
// Add callback for dynamic parameters
287287
_dyn_params_handler = node->add_on_set_parameters_callback(
288288
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");
289299
}
290300

291301
void SmacPlannerHybrid::deactivate()
@@ -560,6 +570,14 @@ SmacPlannerHybrid::dynamicParametersCallback(std::vector<rclcpp::Parameter> para
560570
} else if (name == _name + ".analytic_expansion_max_cost") {
561571
reinit_a_star = true;
562572
_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;
563581
}
564582
} else if (type == ParameterType::PARAMETER_BOOL) {
565583
if (name == _name + ".downsample_costmap") {

nav2_smac_planner/test/test_smac_hybrid.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ TEST(SmacTest, test_smac_se2_reconfigure)
9898
planner->configure(nodeSE2, "test", nullptr, costmap_ros);
9999
planner->activate();
100100

101+
nodeSE2->declare_parameter("resolution", 0.05);
102+
101103
auto rec_param = std::make_shared<rclcpp::AsyncParametersClient>(
102104
nodeSE2->get_node_base_interface(), nodeSE2->get_node_topics_interface(),
103105
nodeSE2->get_node_graph_interface(),
@@ -153,4 +155,11 @@ TEST(SmacTest, test_smac_se2_reconfigure)
153155
EXPECT_EQ(
154156
nodeSE2->get_parameter("test.motion_model_for_search").as_string(),
155157
std::string("REEDS_SHEPP"));
158+
159+
auto results2 = rec_param->set_parameters_atomically(
160+
{rclcpp::Parameter("resolution", 0.2)});
161+
rclcpp::spin_until_future_complete(
162+
nodeSE2->get_node_base_interface(),
163+
results2);
164+
EXPECT_EQ(nodeSE2->get_parameter("resolution").as_double(), 0.2);
156165
}

0 commit comments

Comments
 (0)