35 #include "nav_2d_utils/path_ops.hpp"
40 namespace nav_2d_utils
42 nav_2d_msgs::msg::Path2D adjustPlanResolution(
43 const nav_2d_msgs::msg::Path2D & global_plan_in,
46 nav_2d_msgs::msg::Path2D global_plan_out;
47 if (global_plan_in.poses.size() == 0) {
48 return global_plan_out;
51 geometry_msgs::msg::Pose2D last = global_plan_in.poses[0];
52 global_plan_out.poses.push_back(last);
55 double min_sq_resolution = resolution * resolution * 4.0;
57 for (
unsigned int i = 1; i < global_plan_in.poses.size(); ++i) {
58 geometry_msgs::msg::Pose2D loop = global_plan_in.poses[i];
59 double sq_dist = (loop.x - last.x) * (loop.x - last.x) + (loop.y - last.y) * (loop.y - last.y);
60 if (sq_dist > min_sq_resolution) {
62 double diff = sqrt(sq_dist) - sqrt(min_sq_resolution);
63 int steps =
static_cast<int>(diff / resolution) - 1;
64 double steps_double =
static_cast<double>(steps);
66 double delta_x = (loop.x - last.x) / steps_double;
67 double delta_y = (loop.y - last.y) / steps_double;
68 double delta_t = (loop.theta - last.theta) / steps_double;
70 for (
int j = 1; j < steps; ++j) {
71 geometry_msgs::msg::Pose2D pose;
72 pose.x = last.x + j * delta_x;
73 pose.y = last.y + j * delta_y;
74 pose.theta = last.theta + j * delta_t;
75 global_plan_out.poses.push_back(pose);
78 global_plan_out.poses.push_back(global_plan_in.poses[i]);
82 return global_plan_out;