Skip to content

Commit 2946371

Browse files
authored
[costmap2d] make robot_base_frame param dynamic (#2782)
* make costmap2d robot_base_frame_param dynamic * add test * add rejecting logic and test
1 parent b598a38 commit 2946371

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

‎nav2_costmap_2d/src/costmap_2d_ros.cpp‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,26 @@ Costmap2DROS::dynamicParametersCallback(std::vector<rclcpp::Parameter> parameter
650650
if (makeFootprintFromString(footprint_, new_footprint)) {
651651
setRobotFootprint(new_footprint);
652652
}
653+
} else if (name == "robot_base_frame") {
654+
// First, make sure that the transform between the robot base frame
655+
// and the global frame is available
656+
std::string tf_error;
657+
RCLCPP_INFO(get_logger(), "Checking transform");
658+
if (!tf_buffer_->canTransform(
659+
global_frame_, parameter.as_string(), tf2::TimePointZero,
660+
tf2::durationFromSec(1.0), &tf_error))
661+
{
662+
RCLCPP_WARN(
663+
get_logger(), "Timed out waiting for transform from %s to %s"
664+
" to become available, tf error: %s",
665+
parameter.as_string().c_str(), global_frame_.c_str(), tf_error.c_str());
666+
RCLCPP_WARN(
667+
get_logger(), "Rejecting robot_base_frame change to %s , leaving it to its original"
668+
" value of %s", parameter.as_string().c_str(), robot_base_frame_.c_str());
669+
result.successful = false;
670+
return result;
671+
}
672+
robot_base_frame_ = parameter.as_string();
653673
}
654674
}
655675
}

‎nav2_costmap_2d/test/integration/dyn_params_tests.cpp‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,17 @@ TEST(DynParamTestNode, testDynParamsSet)
5050
t.header.frame_id = "map";
5151
t.child_frame_id = "base_link";
5252
tf_broadcaster_->sendTransform(t);
53+
t.header.frame_id = "map";
54+
t.child_frame_id = "test_frame";
55+
tf_broadcaster_->sendTransform(t);
5356

5457
costmap->on_activate(rclcpp_lifecycle::State());
5558

5659
auto parameter_client = std::make_shared<rclcpp::AsyncParametersClient>(
5760
node->shared_from_this(),
5861
"/test_costmap/test_costmap",
5962
rmw_qos_profile_parameters);
60-
auto results = parameter_client->set_parameters_atomically(
63+
auto results1 = parameter_client->set_parameters_atomically(
6164
{
6265
rclcpp::Parameter("robot_radius", 1.234),
6366
rclcpp::Parameter("footprint_padding", 2.345),
@@ -71,6 +74,13 @@ TEST(DynParamTestNode, testDynParamsSet)
7174
rclcpp::Parameter(
7275
"footprint",
7376
"[[-0.325, -0.325], [-0.325, 0.325], [0.325, 0.325], [0.46, 0.0], [0.325, -0.325]]"),
77+
rclcpp::Parameter("robot_base_frame", "test_frame"),
78+
});
79+
80+
// Try setting robot_base_frame to an invalid frame, should be rejected
81+
auto results2 = parameter_client->set_parameters_atomically(
82+
{
83+
rclcpp::Parameter("robot_base_frame", "wrong_test_frame"),
7484
});
7585

7686
rclcpp::spin_some(costmap->get_node_base_interface());
@@ -87,6 +97,7 @@ TEST(DynParamTestNode, testDynParamsSet)
8797
EXPECT_EQ(
8898
costmap->get_parameter("footprint").as_string(),
8999
"[[-0.325, -0.325], [-0.325, 0.325], [0.325, 0.325], [0.46, 0.0], [0.325, -0.325]]");
100+
EXPECT_EQ(costmap->get_parameter("robot_base_frame").as_string(), "test_frame");
90101

91102
costmap->on_deactivate(rclcpp_lifecycle::State());
92103
costmap->on_cleanup(rclcpp_lifecycle::State());

0 commit comments

Comments
 (0)