39 #include <gtest/gtest.h>
42 #include <nav_msgs/OccupancyGrid.h>
43 #include <nav_msgs/Odometry.h>
45 #include <std_msgs/Float32.h>
57 loader_(
"nav_core",
"nav_core::BaseLocalPlanner"),
64 bool setup(
bool intialize =
true)
88 ROS_FATAL(
"Failed to create the controller. Exception: %s", ex.what());
128 map_.header.frame_id =
"map";
129 map_.info.resolution = 0.05;
130 map_.info.width = 100;
131 map_.info.height = 100;
132 map_.info.origin.position.x = -2.5;
133 map_.info.origin.position.y = -2.5;
135 map_.data.resize(100 * 100);
136 for (
size_t i = 0; i <
map_.data.size(); ++i)
142 bool markMap(
double x,
double y)
144 int ix = (x -
map_.info.origin.position.x) /
map_.info.resolution;
145 int iy = (y -
map_.info.origin.position.y) /
map_.info.resolution;
147 if (ix < 0 || ix >=
static_cast<int>(
map_.info.width) ||
148 iy < 0 || iy >=
static_cast<int>(
map_.info.height))
153 map_.data[ix + (iy *
map_.info.width)] = 100;
160 odom_.header.frame_id =
"odom";
161 odom_.child_frame_id =
"base_link";
163 odom_.pose.pose.position.y = 0.0;
164 odom_.pose.pose.orientation.w = 1.0;
167 void setPose(
double x,
double y,
double yaw)
169 odom_.header.frame_id =
"odom";
170 odom_.child_frame_id =
"base_link";
171 odom_.pose.pose.position.x = x;
172 odom_.pose.pose.position.y = y;
173 odom_.pose.pose.orientation.z = sin(yaw / 2.0);
174 odom_.pose.pose.orientation.w = cos(yaw / 2.0);
179 std_msgs::Float32 msg;
186 odom_.twist.twist.linear.x = x;
187 odom_.twist.twist.angular.z = th;
205 odom_.pose.pose.position.x += 0.05 *
command_.linear.x * cos(yaw);
206 odom_.pose.pose.position.y += 0.05 *
command_.linear.x * sin(yaw);
208 odom_.pose.pose.orientation.z = sin(yaw / 2.0);
209 odom_.pose.pose.orientation.w = cos(yaw / 2.0);
216 geometry_msgs::TransformStamped transform;
218 transform.header.frame_id =
"map";
219 transform.child_frame_id =
odom_.header.frame_id;
220 transform.transform.rotation.w = 1.0;
224 transform.header.frame_id =
odom_.header.frame_id;
225 transform.child_frame_id =
odom_.child_frame_id;
226 transform.transform.translation.x =
odom_.pose.pose.position.x;
227 transform.transform.translation.y =
odom_.pose.pose.position.y;
228 transform.transform.rotation =
odom_.pose.pose.orientation;
243 nav_msgs::OccupancyGrid
map_;
244 nav_msgs::Odometry
odom_;
250 TEST(ControllerTests, test_basic_plan)
253 ASSERT_TRUE(fixture.
setup(
false ));
256 std::vector<geometry_msgs::PoseStamped> plan;
257 geometry_msgs::PoseStamped pose;
258 pose.header.frame_id =
"map";
259 pose.pose.orientation.w = 1.0;
260 pose.pose.position.x = 1.0;
261 pose.pose.position.y = 0.0;
262 plan.push_back(pose);
263 pose.pose.position.x = 1.5;
264 pose.pose.position.y = 0.0;
265 plan.push_back(pose);
268 EXPECT_FALSE(controller->setPlan(plan));
270 EXPECT_FALSE(controller->computeVelocityCommands(
command));
271 EXPECT_FALSE(controller->isGoalReached());
278 EXPECT_TRUE(controller->setPlan(plan));
285 EXPECT_TRUE(controller->computeVelocityCommands(command));
286 EXPECT_EQ(
command.linear.x, 0.25);
287 EXPECT_EQ(
command.angular.z, 0.0);
288 EXPECT_FALSE(controller->isGoalReached());
295 EXPECT_TRUE(controller->computeVelocityCommands(command));
296 EXPECT_EQ(
command.linear.x, 0.25);
297 EXPECT_EQ(
command.angular.z, 0.0);
304 EXPECT_TRUE(controller->computeVelocityCommands(command));
305 EXPECT_EQ(
command.linear.x, 0.875);
306 EXPECT_EQ(
command.angular.z, 0.0);
314 EXPECT_TRUE(controller->computeVelocityCommands(command));
315 EXPECT_EQ(
command.linear.x, 1.0);
316 EXPECT_EQ(
command.angular.z, 0.0);
323 EXPECT_TRUE(controller->computeVelocityCommands(command));
324 EXPECT_EQ(
command.linear.x, 1.0);
325 EXPECT_EQ(
command.angular.z, 0.0);
328 TEST(ControllerTests, test_out_of_range)
331 ASSERT_TRUE(fixture.
setup());
334 std::vector<geometry_msgs::PoseStamped> plan;
335 geometry_msgs::PoseStamped pose;
336 pose.header.frame_id =
"map";
337 pose.pose.orientation.w = 1.0;
338 pose.pose.position.x = 1.5;
339 pose.pose.position.y = 0.0;
340 plan.push_back(pose);
341 EXPECT_TRUE(controller->setPlan(plan));
345 EXPECT_FALSE(controller->computeVelocityCommands(
command));
348 TEST(ControllerTests, test_initial_rotate_in_place)
351 ASSERT_TRUE(fixture.
setup());
354 std::vector<geometry_msgs::PoseStamped> plan;
355 geometry_msgs::PoseStamped pose;
356 pose.header.frame_id =
"map";
357 pose.pose.orientation.w = 1.0;
358 pose.pose.position.x = -0.5;
359 pose.pose.position.y = 0.0;
360 plan.push_back(pose);
361 pose.pose.position.x = -1.0;
362 pose.pose.position.y = 0.0;
363 plan.push_back(pose);
364 EXPECT_TRUE(controller->setPlan(plan));
372 EXPECT_TRUE(controller->computeVelocityCommands(
command));
373 EXPECT_EQ(
command.linear.x, 0.0);
374 EXPECT_EQ(
command.angular.z, 0.6);
381 EXPECT_TRUE(controller->computeVelocityCommands(
command));
382 EXPECT_EQ(
command.linear.x, 0.0);
383 EXPECT_EQ(
command.angular.z, 1.25);
390 EXPECT_TRUE(controller->computeVelocityCommands(
command));
391 EXPECT_EQ(
command.linear.x, 0.0);
392 EXPECT_EQ(
command.angular.z, 2.5);
395 TEST(ControllerTests, test_final_rotate_in_place)
398 ASSERT_TRUE(fixture.
setup());
401 std::vector<geometry_msgs::PoseStamped> plan;
402 geometry_msgs::PoseStamped pose;
403 pose.header.frame_id =
"map";
404 pose.pose.orientation.w = 1.0;
405 pose.pose.position.x = 0.5;
406 pose.pose.position.y = 0.0;
407 plan.push_back(pose);
408 EXPECT_TRUE(controller->setPlan(plan));
411 fixture.
setPose(0.1, 0.0, 0.0);
416 EXPECT_TRUE(controller->computeVelocityCommands(
command));
417 EXPECT_EQ(
command.linear.x, 0.25);
418 EXPECT_EQ(
command.angular.z, 0.0);
421 fixture.
setPose(0.5, 0.0, 1.57);
425 EXPECT_TRUE(controller->computeVelocityCommands(
command));
426 EXPECT_EQ(
command.linear.x, 0.0);
427 EXPECT_EQ(
command.angular.z, -0.6);
428 EXPECT_FALSE(controller->isGoalReached());
431 TEST(ControllerTests, test_collision_check)
434 ASSERT_TRUE(fixture.
setup());
440 std::vector<geometry_msgs::PoseStamped> plan;
441 geometry_msgs::PoseStamped pose;
442 pose.header.frame_id =
"map";
443 pose.pose.orientation.w = 1.0;
444 pose.pose.position.x = 0.5;
445 pose.pose.position.y = 0.0;
446 plan.push_back(pose);
447 EXPECT_TRUE(controller->setPlan(plan));
451 EXPECT_FALSE(controller->computeVelocityCommands(
command));
454 TEST(ControllerTests, test_compute_distance_along_path)
456 std::vector<geometry_msgs::PoseStamped> poses;
457 std::vector<double> distances;
460 for (
int i = 0; i < 5; ++i)
462 geometry_msgs::PoseStamped pose;
463 pose.pose.position.x = (i - 2);
464 pose.pose.position.y = 0;
465 poses.push_back(pose);
470 EXPECT_EQ(distances[0], 2);
471 EXPECT_EQ(distances[1], 1);
472 EXPECT_EQ(distances[2], 0);
473 EXPECT_EQ(distances[3], 1);
474 EXPECT_EQ(distances[4], 2);
479 geometry_msgs::PoseStamped pose;
480 pose.pose.position.x = 2;
481 pose.pose.position.y = 1;
482 poses.push_back(pose);
483 pose.pose.position.x = 1;
484 pose.pose.position.y = 1;
485 poses.push_back(pose);
486 pose.pose.position.x = 0;
487 pose.pose.position.y = 1;
488 poses.push_back(pose);
493 EXPECT_EQ(distances[0], 2);
494 EXPECT_EQ(distances[1], 1);
495 EXPECT_EQ(distances[2], 0);
496 EXPECT_EQ(distances[3], 1);
497 EXPECT_EQ(distances[4], 2);
498 EXPECT_EQ(distances[5], 3);
499 EXPECT_EQ(distances[6], 4);
500 EXPECT_EQ(distances[7], 5);
503 int main(
int argc,
char** argv)
505 ros::init(argc, argv,
"graceful_controller_tests");
506 testing::InitGoogleTest(&argc, argv);
507 return RUN_ALL_TESTS();