37 #include "nav_2d_utils/path_ops.hpp"
38 #include "tf2/convert.hpp"
39 #include "tf2/utils.hpp"
40 #include "nav2_util/geometry_utils.hpp"
44 namespace nav_2d_utils
46 nav_msgs::msg::Path adjustPlanResolution(
47 const nav_msgs::msg::Path & global_plan_in,
50 nav_msgs::msg::Path global_plan_out;
51 if (global_plan_in.poses.size() == 0) {
52 return global_plan_out;
55 geometry_msgs::msg::PoseStamped last = global_plan_in.poses[0];
56 global_plan_out.poses.push_back(last);
59 double min_sq_resolution = resolution * resolution * 4.0;
61 for (
unsigned int i = 1; i < global_plan_in.poses.size(); ++i) {
62 geometry_msgs::msg::PoseStamped loop = global_plan_in.poses[i];
63 double sq_dist = (loop.pose.position.x - last.pose.position.x) *
64 (loop.pose.position.x - last.pose.position.x) +
65 (loop.pose.position.y - last.pose.position.y) *
66 (loop.pose.position.y - last.pose.position.y);
67 if (sq_dist > min_sq_resolution) {
69 double diff = sqrt(sq_dist) - sqrt(min_sq_resolution);
70 int steps =
static_cast<int>(diff / resolution) - 1;
71 double steps_double =
static_cast<double>(steps);
73 double theta_last = tf2::getYaw(last.pose.orientation);
74 double theta_loop = tf2::getYaw(loop.pose.orientation);
75 double delta_x = (loop.pose.position.x - last.pose.position.x) / steps_double;
76 double delta_y = (loop.pose.position.y - last.pose.position.y) / steps_double;
77 double delta_t = (theta_loop - theta_last) / steps_double;
79 for (
int j = 1; j < steps; ++j) {
80 geometry_msgs::msg::PoseStamped pose;
81 pose.pose.position.x = last.pose.position.x + j * delta_x;
82 pose.pose.position.y = last.pose.position.y + j * delta_y;
83 pose.pose.orientation = nav2_util::geometry_utils::orientationAroundZAxis(
84 theta_last + j * delta_t);
85 global_plan_out.poses.push_back(pose);
88 global_plan_out.poses.push_back(global_plan_in.poses[i]);
89 last.pose.position.x = loop.pose.position.x;
90 last.pose.position.y = loop.pose.position.y;
92 return global_plan_out;