15 #include <benchmark/benchmark.h>
17 #include <Eigen/Dense>
22 #include "gtest/gtest.h"
23 #include <geometry_msgs/msg/pose_stamped.hpp>
24 #include <geometry_msgs/msg/twist.hpp>
25 #include <nav_msgs/msg/path.hpp>
27 #include <nav2_costmap_2d/cost_values.hpp>
28 #include <nav2_costmap_2d/costmap_2d.hpp>
29 #include <nav2_costmap_2d/costmap_2d_ros.hpp>
30 #include <nav2_core/goal_checker.hpp>
31 #include "tf2_ros/buffer.hpp"
33 #include "nav2_mppi_controller/optimizer.hpp"
34 #include "nav2_mppi_controller/motion_models.hpp"
36 #include "nav2_mppi_controller/tools/parameters_handler.hpp"
49 void prepareAndRunBenchmark(
50 bool consider_footprint, std::string motion_model,
51 std::vector<std::string> critics, benchmark::State & state)
53 int batch_size = 2000;
55 unsigned int path_points = 50u;
56 int iteration_count = 2;
57 double lookahead_distance = 10.0;
59 TestCostmapSettings costmap_settings{};
60 auto costmap_ros = getDummyCostmapRos(costmap_settings);
61 auto costmap = costmap_ros->getCostmap();
63 TestPose start_pose = costmap_settings.getCenterPose();
64 double path_step = costmap_settings.resolution;
66 TestPathSettings path_settings{start_pose, path_points, path_step, path_step};
67 TestOptimizerSettings optimizer_settings{batch_size, time_steps, iteration_count,
68 lookahead_distance, motion_model, consider_footprint};
70 unsigned int offset = 4;
71 unsigned int obstacle_size = offset * 2;
73 unsigned char obstacle_cost = 250;
75 auto [obst_x, obst_y] = costmap_settings.getCenterIJ();
77 obst_x = obst_x - offset;
78 obst_y = obst_y - offset;
79 addObstacle(costmap, {obst_x, obst_y, obstacle_size, obstacle_cost});
81 printInfo(optimizer_settings, path_settings, critics);
82 auto node = getDummyNode(optimizer_settings, critics);
83 std::string name =
"test";
84 auto parameters_handler = std::make_unique<mppi::ParametersHandler>(node, name);
85 auto tf_buffer = std::make_shared<tf2_ros::Buffer>(node->get_clock());
86 auto optimizer = getDummyOptimizer(node, costmap_ros, tf_buffer, parameters_handler.get());
89 auto pose = getDummyPointStamped(node, start_pose);
90 auto velocity = getDummyTwist();
91 auto path = getIncrementalDummyPath(node, path_settings);
94 for (
auto _ : state) {
95 auto [cmd, trajectory] = optimizer->evalControl(pose, velocity, path, path.poses.back().pose,
100 static void BM_DiffDrivePointFootprint(benchmark::State & state)
102 bool consider_footprint =
true;
103 std::string motion_model =
"DiffDrive";
104 std::vector<std::string> critics = {{
"ConstraintCritic"}, {
"CostCritic"}, {
"GoalCritic"},
105 {
"GoalAngleCritic"}, {
"PathAlignCritic"}, {
"PathFollowCritic"}, {
"PathAngleCritic"},
106 {
"PreferForwardCritic"}};
108 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
111 static void BM_DiffDrive(benchmark::State & state)
113 bool consider_footprint =
true;
114 std::string motion_model =
"DiffDrive";
115 std::vector<std::string> critics = {{
"ConstraintCritic"}, {
"CostCritic"}, {
"GoalCritic"},
116 {
"GoalAngleCritic"}, {
"PathAlignCritic"}, {
"PathFollowCritic"}, {
"PathAngleCritic"},
117 {
"PreferForwardCritic"}};
119 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
122 static void BM_Omni(benchmark::State & state)
124 bool consider_footprint =
true;
125 std::string motion_model =
"Omni";
126 std::vector<std::string> critics = {{
"ConstraintCritic"}, {
"CostCritic"}, {
"GoalCritic"},
127 {
"GoalAngleCritic"}, {
"PathAlignCritic"}, {
"PathFollowCritic"}, {
"PathAngleCritic"},
128 {
"PreferForwardCritic"}};
130 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
133 static void BM_Ackermann(benchmark::State & state)
135 bool consider_footprint =
true;
136 std::string motion_model =
"Ackermann";
137 std::vector<std::string> critics = {{
"ConstraintCritic"}, {
"CostCritic"}, {
"GoalCritic"},
138 {
"GoalAngleCritic"}, {
"PathAlignCritic"}, {
"PathFollowCritic"}, {
"PathAngleCritic"},
139 {
"PreferForwardCritic"}};
141 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
144 static void BM_GoalCritic(benchmark::State & state)
146 bool consider_footprint =
true;
147 std::string motion_model =
"Ackermann";
148 std::vector<std::string> critics = {{
"GoalCritic"}};
150 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
153 static void BM_GoalAngleCritic(benchmark::State & state)
155 bool consider_footprint =
true;
156 std::string motion_model =
"Ackermann";
157 std::vector<std::string> critics = {{
"GoalAngleCritic"}};
159 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
162 static void BM_ObstaclesCritic(benchmark::State & state)
164 bool consider_footprint =
true;
165 std::string motion_model =
"Ackermann";
166 std::vector<std::string> critics = {{
"ObstaclesCritic"}};
168 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
171 static void BM_ObstaclesCriticPointFootprint(benchmark::State & state)
173 bool consider_footprint =
false;
174 std::string motion_model =
"Ackermann";
175 std::vector<std::string> critics = {{
"ObstaclesCritic"}};
177 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
180 static void BM_TwilringCritic(benchmark::State & state)
182 bool consider_footprint =
true;
183 std::string motion_model =
"Ackermann";
184 std::vector<std::string> critics = {{
"TwirlingCritic"}};
186 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
189 static void BM_PathFollowCritic(benchmark::State & state)
191 bool consider_footprint =
true;
192 std::string motion_model =
"Ackermann";
193 std::vector<std::string> critics = {{
"PathFollowCritic"}};
195 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
198 static void BM_PathAngleCritic(benchmark::State & state)
200 bool consider_footprint =
true;
201 std::string motion_model =
"Ackermann";
202 std::vector<std::string> critics = {{
"PathAngleCritic"}};
204 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
207 BENCHMARK(BM_DiffDrivePointFootprint)->Unit(benchmark::kMillisecond);
208 BENCHMARK(BM_DiffDrive)->Unit(benchmark::kMillisecond);
209 BENCHMARK(BM_Omni)->Unit(benchmark::kMillisecond);
210 BENCHMARK(BM_Ackermann)->Unit(benchmark::kMillisecond);
212 BENCHMARK(BM_GoalCritic)->Unit(benchmark::kMillisecond);
213 BENCHMARK(BM_GoalAngleCritic)->Unit(benchmark::kMillisecond);
214 BENCHMARK(BM_PathAngleCritic)->Unit(benchmark::kMillisecond);
215 BENCHMARK(BM_PathFollowCritic)->Unit(benchmark::kMillisecond);
216 BENCHMARK(BM_ObstaclesCritic)->Unit(benchmark::kMillisecond);
217 BENCHMARK(BM_ObstaclesCriticPointFootprint)->Unit(benchmark::kMillisecond);
218 BENCHMARK(BM_TwilringCritic)->Unit(benchmark::kMillisecond);
Function-object for checking whether a goal has been reached.