Skip to content

Commit c92ea2f

Browse files
Throw ControllerTFError when end pose cannot be transformed inside isGoalReached (ros-navigation#6285)
Signed-off-by: Alireza Moayyedi <alireza.moayyedi@nobleo.nl>
1 parent 2b3d622 commit c92ea2f

3 files changed

Lines changed: 51 additions & 8 deletions

File tree

nav2_controller/src/controller_server.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -811,9 +811,12 @@ bool ControllerServer::isGoalReached()
811811

812812
geometry_msgs::msg::PoseStamped transformed_end_pose;
813813
rclcpp::Duration tolerance(rclcpp::Duration::from_seconds(costmap_ros_->getTransformTolerance()));
814-
nav_2d_utils::transformPose(
814+
if(!nav_2d_utils::transformPose(
815815
costmap_ros_->getTfBuffer(), costmap_ros_->getGlobalFrameID(),
816-
end_pose_, transformed_end_pose, tolerance);
816+
end_pose_, transformed_end_pose, tolerance))
817+
{
818+
throw nav2_core::ControllerTFError("Failed to transform end pose to global frame");
819+
}
817820

818821
return goal_checkers_[current_goal_checker_]->isGoalReached(
819822
pose.pose, transformed_end_pose.pose,
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# Test dynamic parameters
2-
ament_add_gtest(test_dynamic_parameters
3-
test_dynamic_parameters.cpp
2+
ament_add_gtest(test_controller_server
3+
test_controller_server.cpp
44
)
5-
ament_target_dependencies(test_dynamic_parameters
5+
ament_target_dependencies(test_controller_server
66
${dependencies}
77
)
8-
target_link_libraries(test_dynamic_parameters
8+
target_link_libraries(test_controller_server
99
${library_name}
1010
)

nav2_controller/test/test_dynamic_parameters.cpp renamed to nav2_controller/test/test_controller_server.cpp

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,14 @@
1818
#include <string>
1919
#include <vector>
2020

21+
#include "geometry_msgs/msg/transform_stamped.hpp"
2122
#include "gtest/gtest.h"
22-
#include "nav2_util/lifecycle_node.hpp"
23+
#include "lifecycle_msgs/msg/state.hpp"
2324
#include "nav2_controller/controller_server.hpp"
25+
#include "nav2_core/controller_exceptions.hpp"
26+
#include "nav2_util/lifecycle_node.hpp"
2427
#include "rclcpp/rclcpp.hpp"
28+
#include "tf2_ros/buffer.hpp"
2529

2630
class ControllerShim : public nav2_controller::ControllerServer
2731
{
@@ -59,7 +63,7 @@ class RclCppFixture
5963
};
6064
RclCppFixture g_rclcppfixture;
6165

62-
TEST(WPTest, test_dynamic_parameters)
66+
TEST(ControllerServerTest, test_dynamic_parameters)
6367
{
6468
auto controller = std::make_shared<ControllerShim>();
6569
controller->setDynamicCallback();
@@ -86,3 +90,39 @@ TEST(WPTest, test_dynamic_parameters)
8690
EXPECT_EQ(controller->get_parameter("min_theta_velocity_threshold").as_double(), 100.0);
8791
EXPECT_EQ(controller->get_parameter("failure_tolerance").as_double(), 5.0);
8892
}
93+
94+
class GoalReachTestController : public nav2_controller::ControllerServer
95+
{
96+
public:
97+
using nav2_controller::ControllerServer::ControllerServer;
98+
99+
void setEndPoseFrame(const std::string & frame) {end_pose_.header.frame_id = frame;}
100+
bool callIsGoalReached() {return isGoalReached();}
101+
tf2_ros::Buffer & getTfBuffer() {return *costmap_ros_->getTfBuffer();}
102+
};
103+
104+
TEST(ControllerServerTest, IsGoalReachedThrowsOnTfFailure)
105+
{
106+
rclcpp::NodeOptions options;
107+
options.parameter_overrides({
108+
rclcpp::Parameter("progress_checker_plugins", std::vector<std::string>{}),
109+
rclcpp::Parameter("goal_checker_plugins", std::vector<std::string>{}),
110+
rclcpp::Parameter("controller_plugins", std::vector<std::string>{}),
111+
});
112+
113+
auto server = std::make_shared<GoalReachTestController>(options);
114+
ASSERT_EQ(
115+
server->configure().id(),
116+
lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE);
117+
118+
geometry_msgs::msg::TransformStamped tf_msg;
119+
tf_msg.header.stamp = server->now();
120+
tf_msg.header.frame_id = "map";
121+
tf_msg.child_frame_id = "base_link";
122+
tf_msg.transform.rotation.w = 1.0;
123+
server->getTfBuffer().setTransform(tf_msg, "test", true);
124+
125+
server->setEndPoseFrame("nonexistent_frame_xyz");
126+
EXPECT_THROW(server->callIsGoalReached(), nav2_core::ControllerTFError);
127+
server->cleanup();
128+
}

0 commit comments

Comments
 (0)