Skip to content

Commit e683c98

Browse files
committed
tf prefix helper update
- enable flag removed from args - tilde substitution with ns added - tests updated - verbose comments
1 parent 0f564ff commit e683c98

File tree

2 files changed

+21
-78
lines changed

2 files changed

+21
-78
lines changed

diff_drive_controller/src/diff_drive_controller.cpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#include <utility>
2323
#include <vector>
2424

25-
#include "control_toolbox/tf_utils.hpp"
25+
#include "controller_interface/helpers.hpp"
2626
#include "diff_drive_controller/diff_drive_controller.hpp"
2727
#include "hardware_interface/types/hardware_interface_type_values.hpp"
2828
#include "lifecycle_msgs/msg/state.hpp"
@@ -412,17 +412,13 @@ controller_interface::CallbackReturn DiffDriveController::on_configure(
412412
std::make_shared<realtime_tools::RealtimePublisher<nav_msgs::msg::Odometry>>(
413413
odometry_publisher_);
414414

415-
// apply the TF prefix if not empty, otherwise use the node namespace
416-
const auto odom_frame_id =
417-
params_.tf_frame_prefix_enable
418-
? control_toolbox::apply_tf_prefix(
419-
params_.tf_frame_prefix, get_node()->get_namespace(), params_.odom_frame_id)
420-
: params_.odom_frame_id;
421-
const auto base_frame_id =
422-
params_.tf_frame_prefix_enable
423-
? control_toolbox::apply_tf_prefix(
424-
params_.tf_frame_prefix, get_node()->get_namespace(), params_.base_frame_id)
425-
: params_.base_frame_id;
415+
// resolve prefix: substitute tilde (~) with the namespace if contains and normalize slashes (/)
416+
const auto tf_prefix =
417+
controller_interface::resolve_tf_prefix(params_.tf_frame_prefix, get_node()->get_namespace());
418+
419+
// prepend resolved TF prefix to frame ids
420+
const auto odom_frame_id = tf_prefix + params_.odom_frame_id;
421+
const auto base_frame_id = tf_prefix + params_.base_frame_id;
426422

427423
odometry_message_.header.frame_id = odom_frame_id;
428424
odometry_message_.child_frame_id = base_frame_id;

diff_drive_controller/test/test_diff_drive_controller.cpp

Lines changed: 13 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,10 @@ class TestableDiffDriveController : public diff_drive_controller::DiffDriveContr
7474
return realtime_odometry_publisher_;
7575
}
7676
// Declare these tests as friends so we can access odometry_message_
77-
FRIEND_TEST(TestDiffDriveController, configure_succeeds_tf_test_prefix_false_no_namespace);
78-
FRIEND_TEST(TestDiffDriveController, configure_succeeds_tf_test_prefix_true_no_namespace);
79-
FRIEND_TEST(TestDiffDriveController, configure_succeeds_tf_blank_prefix_true_no_namespace);
80-
FRIEND_TEST(TestDiffDriveController, configure_succeeds_tf_test_prefix_false_set_namespace);
81-
FRIEND_TEST(TestDiffDriveController, configure_succeeds_tf_test_prefix_true_set_namespace);
82-
FRIEND_TEST(TestDiffDriveController, configure_succeeds_tf_blank_prefix_true_set_namespace);
77+
FRIEND_TEST(TestDiffDriveController, configure_succeeds_tf_prefix_no_namespace);
78+
FRIEND_TEST(TestDiffDriveController, configure_succeeds_tf_blank_prefix_no_namespace);
79+
FRIEND_TEST(TestDiffDriveController, configure_succeeds_tf_prefix_set_namespace);
80+
FRIEND_TEST(TestDiffDriveController, configure_succeeds_tf_tilde_prefix_set_namespace);
8381
// Declare these tests as friends so we can access controller_->reference_interfaces_
8482
FRIEND_TEST(TestDiffDriveController, chainable_controller_unchained_mode);
8583
FRIEND_TEST(TestDiffDriveController, chainable_controller_chained_mode);
@@ -310,29 +308,7 @@ TEST_F(
310308
EXPECT_EQ(cmd_if_conf.type, controller_interface::interface_configuration_type::INDIVIDUAL);
311309
}
312310

313-
TEST_F(TestDiffDriveController, configure_succeeds_tf_test_prefix_false_no_namespace)
314-
{
315-
std::string odom_id = "odom";
316-
std::string base_link_id = "base_link";
317-
std::string frame_prefix = "test_prefix";
318-
319-
ASSERT_EQ(
320-
InitController(
321-
left_wheel_names, right_wheel_names,
322-
{rclcpp::Parameter("tf_frame_prefix_enable", rclcpp::ParameterValue(false)),
323-
rclcpp::Parameter("tf_frame_prefix", rclcpp::ParameterValue(frame_prefix)),
324-
rclcpp::Parameter("odom_frame_id", rclcpp::ParameterValue(odom_id)),
325-
rclcpp::Parameter("base_frame_id", rclcpp::ParameterValue(base_link_id))}),
326-
controller_interface::return_type::OK);
327-
328-
ASSERT_EQ(controller_->on_configure(rclcpp_lifecycle::State()), CallbackReturn::SUCCESS);
329-
330-
/* tf_frame_prefix_enable is false so no modifications to the frame id's */
331-
ASSERT_EQ(controller_->odometry_message_.header.frame_id, odom_id);
332-
ASSERT_EQ(controller_->odometry_message_.child_frame_id, base_link_id);
333-
}
334-
335-
TEST_F(TestDiffDriveController, configure_succeeds_tf_test_prefix_true_no_namespace)
311+
TEST_F(TestDiffDriveController, configure_succeeds_tf_prefix_no_namespace)
336312
{
337313
std::string odom_id = "odom";
338314
std::string base_link_id = "base_link";
@@ -349,13 +325,12 @@ TEST_F(TestDiffDriveController, configure_succeeds_tf_test_prefix_true_no_namesp
349325

350326
ASSERT_EQ(controller_->on_configure(rclcpp_lifecycle::State()), CallbackReturn::SUCCESS);
351327

352-
/* tf_frame_prefix_enable is true and frame_prefix is not blank so should be appended to the frame
353-
* id's */
328+
// frame_prefix is not blank so should be prepended to the frame id's
354329
ASSERT_EQ(controller_->odometry_message_.header.frame_id, frame_prefix + "/" + odom_id);
355330
ASSERT_EQ(controller_->odometry_message_.child_frame_id, frame_prefix + "/" + base_link_id);
356331
}
357332

358-
TEST_F(TestDiffDriveController, configure_succeeds_tf_blank_prefix_true_no_namespace)
333+
TEST_F(TestDiffDriveController, configure_succeeds_tf_blank_prefix_no_namespace)
359334
{
360335
std::string odom_id = "odom";
361336
std::string base_link_id = "base_link";
@@ -372,38 +347,12 @@ TEST_F(TestDiffDriveController, configure_succeeds_tf_blank_prefix_true_no_names
372347

373348
ASSERT_EQ(controller_->on_configure(rclcpp_lifecycle::State()), CallbackReturn::SUCCESS);
374349

375-
/* tf_frame_prefix_enable is true but frame_prefix is blank so should not be appended to the frame
376-
* id's */
377-
ASSERT_EQ(controller_->odometry_message_.header.frame_id, odom_id);
378-
ASSERT_EQ(controller_->odometry_message_.child_frame_id, base_link_id);
379-
}
380-
381-
TEST_F(TestDiffDriveController, configure_succeeds_tf_test_prefix_false_set_namespace)
382-
{
383-
std::string test_namespace = "/test_namespace";
384-
385-
std::string odom_id = "odom";
386-
std::string base_link_id = "base_link";
387-
std::string frame_prefix = "test_prefix";
388-
389-
ASSERT_EQ(
390-
InitController(
391-
left_wheel_names, right_wheel_names,
392-
{rclcpp::Parameter("tf_frame_prefix_enable", rclcpp::ParameterValue(false)),
393-
rclcpp::Parameter("tf_frame_prefix", rclcpp::ParameterValue(frame_prefix)),
394-
rclcpp::Parameter("odom_frame_id", rclcpp::ParameterValue(odom_id)),
395-
rclcpp::Parameter("base_frame_id", rclcpp::ParameterValue(base_link_id))},
396-
test_namespace),
397-
controller_interface::return_type::OK);
398-
399-
ASSERT_EQ(controller_->on_configure(rclcpp_lifecycle::State()), CallbackReturn::SUCCESS);
400-
401-
/* tf_frame_prefix_enable is false so no modifications to the frame id's */
350+
// frame_prefix is blank so nothing added to the frame id's
402351
ASSERT_EQ(controller_->odometry_message_.header.frame_id, odom_id);
403352
ASSERT_EQ(controller_->odometry_message_.child_frame_id, base_link_id);
404353
}
405354

406-
TEST_F(TestDiffDriveController, configure_succeeds_tf_test_prefix_true_set_namespace)
355+
TEST_F(TestDiffDriveController, configure_succeeds_tf_prefix_set_namespace)
407356
{
408357
std::string test_namespace = "/test_namespace";
409358

@@ -423,18 +372,17 @@ TEST_F(TestDiffDriveController, configure_succeeds_tf_test_prefix_true_set_names
423372

424373
ASSERT_EQ(controller_->on_configure(rclcpp_lifecycle::State()), CallbackReturn::SUCCESS);
425374

426-
/* tf_frame_prefix_enable is true and frame_prefix is not blank so should be appended to the frame
427-
* id's instead of the namespace*/
375+
// frame_prefix is not blank so should be prepended to the frame id's instead of the namespace
428376
ASSERT_EQ(controller_->odometry_message_.header.frame_id, frame_prefix + "/" + odom_id);
429377
ASSERT_EQ(controller_->odometry_message_.child_frame_id, frame_prefix + "/" + base_link_id);
430378
}
431379

432-
TEST_F(TestDiffDriveController, configure_succeeds_tf_blank_prefix_true_set_namespace)
380+
TEST_F(TestDiffDriveController, configure_succeeds_tf_tilde_prefix_set_namespace)
433381
{
434382
std::string test_namespace = "/test_namespace";
435383
std::string odom_id = "odom";
436384
std::string base_link_id = "base_link";
437-
std::string frame_prefix = "";
385+
std::string frame_prefix = "~";
438386

439387
ASSERT_EQ(
440388
InitController(
@@ -448,9 +396,8 @@ TEST_F(TestDiffDriveController, configure_succeeds_tf_blank_prefix_true_set_name
448396

449397
ASSERT_EQ(controller_->on_configure(rclcpp_lifecycle::State()), CallbackReturn::SUCCESS);
450398

399+
// frame_prefix has tilde (~) character so node namespace should be prepended to the frame id's
451400
std::string ns_prefix = test_namespace.erase(0, 1) + "/";
452-
/* tf_frame_prefix_enable is true but frame_prefix is blank so namespace should be appended to the
453-
* frame id's */
454401
ASSERT_EQ(controller_->odometry_message_.header.frame_id, ns_prefix + odom_id);
455402
ASSERT_EQ(controller_->odometry_message_.child_frame_id, ns_prefix + base_link_id);
456403
}

0 commit comments

Comments
 (0)