15 #include <benchmark/benchmark.h>
17 #include <Eigen/Dense>
21 #include <geometry_msgs/msg/pose_stamped.hpp>
22 #include <geometry_msgs/msg/twist.hpp>
23 #include <nav_msgs/msg/path.hpp>
25 #include <nav2_costmap_2d/cost_values.hpp>
26 #include <nav2_costmap_2d/costmap_2d.hpp>
27 #include <nav2_costmap_2d/costmap_2d_ros.hpp>
28 #include <nav2_core/goal_checker.hpp>
30 #include "nav2_mppi_controller/motion_models.hpp"
31 #include "nav2_mppi_controller/controller.hpp"
34 #include "nav2_ros_common/tf2_factories.hpp"
45 void prepareAndRunBenchmark(
46 bool consider_footprint, std::string motion_model,
47 std::vector<std::string> critics, benchmark::State & state)
49 bool visualize =
false;
53 unsigned int path_points = 50u;
54 int iteration_count = 2;
55 double lookahead_distance = 10.0;
57 TestCostmapSettings costmap_settings{};
58 auto costmap_ros = getDummyCostmapRos(costmap_settings);
59 auto costmap = costmap_ros->getCostmap();
61 TestPose start_pose = costmap_settings.getCenterPose();
62 double path_step = costmap_settings.resolution;
64 TestPathSettings path_settings{start_pose, path_points, path_step, path_step};
65 TestOptimizerSettings optimizer_settings{batch_size, time_steps, iteration_count,
66 lookahead_distance, motion_model, consider_footprint};
68 unsigned int offset = 4;
69 unsigned int obstacle_size = offset * 2;
71 unsigned char obstacle_cost = 250;
73 auto [obst_x, obst_y] = costmap_settings.getCenterIJ();
75 obst_x = obst_x - offset;
76 obst_y = obst_y - offset;
77 addObstacle(costmap, {obst_x, obst_y, obstacle_size, obstacle_cost});
79 printInfo(optimizer_settings, path_settings, critics);
81 rclcpp::NodeOptions options;
82 std::vector<rclcpp::Parameter> params;
83 setUpControllerParams(visualize, params);
84 setUpOptimizerParams(optimizer_settings, critics, params);
85 options.parameter_overrides(params);
86 auto node = getDummyNode(options);
88 auto tf_buffer = nav2::create_transform_buffer(node);
89 tf_buffer->setUsingDedicatedThread(
true);
91 auto broadcaster = nav2::create_transform_broadcaster(node);
92 auto tf_listener = nav2::create_transform_listener(*tf_buffer, node);
94 auto map_odom_broadcaster = std::async(
95 std::launch::async, sendTf,
"map",
"odom", broadcaster, node,
98 auto odom_base_link_broadcaster = std::async(
99 std::launch::async, sendTf,
"odom",
"base_link", broadcaster, node,
102 auto controller = getDummyController(node, tf_buffer, costmap_ros);
105 auto pose = getDummyPointStamped(node, start_pose);
106 auto velocity = getDummyTwist();
107 auto path = getIncrementalDummyPath(node, path_settings);
109 controller->newPathReceived(path);
112 nav_msgs::msg::Path transformed_global_plan;
113 geometry_msgs::msg::PoseStamped goal;
114 for (
auto _ : state) {
115 controller->computeVelocityCommands(pose, velocity, dummy_goal_checker, transformed_global_plan,
118 map_odom_broadcaster.wait();
119 odom_base_link_broadcaster.wait();
122 static void BM_DiffDrivePointFootprint(benchmark::State & state)
124 bool consider_footprint =
true;
125 std::string motion_model =
"DiffDrive";
126 std::vector<std::string> critics = {{
"GoalCritic"}, {
"GoalAngleCritic"}, {
"ObstaclesCritic"},
127 {
"PathAngleCritic"}, {
"PathFollowCritic"}, {
"PreferForwardCritic"}};
129 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
132 static void BM_DiffDrive(benchmark::State & state)
134 bool consider_footprint =
true;
135 std::string motion_model =
"DiffDrive";
136 std::vector<std::string> critics = {{
"GoalCritic"}, {
"GoalAngleCritic"}, {
"ObstaclesCritic"},
137 {
"PathAngleCritic"}, {
"PathFollowCritic"}, {
"PreferForwardCritic"}};
139 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
143 static void BM_Omni(benchmark::State & state)
145 bool consider_footprint =
true;
146 std::string motion_model =
"Omni";
147 std::vector<std::string> critics = {{
"GoalCritic"}, {
"GoalAngleCritic"}, {
"ObstaclesCritic"},
148 {
"TwirlingCritic"}, {
"PathFollowCritic"}, {
"PreferForwardCritic"}};
150 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
153 static void BM_Ackermann(benchmark::State & state)
155 bool consider_footprint =
true;
156 std::string motion_model =
"Ackermann";
157 std::vector<std::string> critics = {{
"GoalCritic"}, {
"GoalAngleCritic"}, {
"ObstaclesCritic"},
158 {
"PathAngleCritic"}, {
"PathFollowCritic"}, {
"PreferForwardCritic"}};
160 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
163 static void BM_GoalCritic(benchmark::State & state)
165 bool consider_footprint =
true;
166 std::string motion_model =
"Ackermann";
167 std::vector<std::string> critics = {{
"GoalCritic"}};
169 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
172 static void BM_GoalAngleCritic(benchmark::State & state)
174 bool consider_footprint =
true;
175 std::string motion_model =
"Ackermann";
176 std::vector<std::string> critics = {{
"GoalAngleCritic"}};
178 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
181 static void BM_ObstaclesCritic(benchmark::State & state)
183 bool consider_footprint =
true;
184 std::string motion_model =
"Ackermann";
185 std::vector<std::string> critics = {{
"ObstaclesCritic"}};
187 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
190 static void BM_ObstaclesCriticPointFootprint(benchmark::State & state)
192 bool consider_footprint =
false;
193 std::string motion_model =
"Ackermann";
194 std::vector<std::string> critics = {{
"ObstaclesCritic"}};
196 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
199 static void BM_TwilringCritic(benchmark::State & state)
201 bool consider_footprint =
true;
202 std::string motion_model =
"Ackermann";
203 std::vector<std::string> critics = {{
"TwirlingCritic"}};
205 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
208 static void BM_PathFollowCritic(benchmark::State & state)
210 bool consider_footprint =
true;
211 std::string motion_model =
"Ackermann";
212 std::vector<std::string> critics = {{
"PathFollowCritic"}};
214 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
217 static void BM_PathAngleCritic(benchmark::State & state)
219 bool consider_footprint =
true;
220 std::string motion_model =
"Ackermann";
221 std::vector<std::string> critics = {{
"PathAngleCritic"}};
223 prepareAndRunBenchmark(consider_footprint, motion_model, critics, state);
226 BENCHMARK(BM_DiffDrivePointFootprint)->Unit(benchmark::kMillisecond);
227 BENCHMARK(BM_DiffDrive)->Unit(benchmark::kMillisecond);
228 BENCHMARK(BM_Omni)->Unit(benchmark::kMillisecond);
229 BENCHMARK(BM_Ackermann)->Unit(benchmark::kMillisecond);
231 BENCHMARK(BM_GoalCritic)->Unit(benchmark::kMillisecond);
232 BENCHMARK(BM_GoalAngleCritic)->Unit(benchmark::kMillisecond);
233 BENCHMARK(BM_PathAngleCritic)->Unit(benchmark::kMillisecond);
234 BENCHMARK(BM_PathFollowCritic)->Unit(benchmark::kMillisecond);
235 BENCHMARK(BM_ObstaclesCritic)->Unit(benchmark::kMillisecond);
236 BENCHMARK(BM_ObstaclesCriticPointFootprint)->Unit(benchmark::kMillisecond);
237 BENCHMARK(BM_TwilringCritic)->Unit(benchmark::kMillisecond);
Function-object for checking whether a goal has been reached.