47 double getRelativeYaw(
const geometry_msgs::PoseStamped& from,
const geometry_msgs::PoseStamped& to)
49 double dx = to.pose.position.x - from.pose.position.x;
50 double dy = to.pose.position.y - from.pose.position.y;
51 return std::atan2(dy, dx);
54 void setYaw(geometry_msgs::PoseStamped& pose,
double yaw)
56 pose.pose.orientation.z = sin(yaw / 2.0);
57 pose.pose.orientation.w = cos(yaw / 2.0);
60 std::vector<geometry_msgs::PoseStamped>
addOrientations(
const std::vector<geometry_msgs::PoseStamped>& path)
62 std::vector<geometry_msgs::PoseStamped> oriented_path;
63 oriented_path.resize(path.size());
71 oriented_path.back() = path.back();
74 for (
size_t i = 0; i < oriented_path.size() - 1; ++i)
76 oriented_path[i] = path[i];
78 setYaw(oriented_path[i], yaw);
84 std::vector<geometry_msgs::PoseStamped>
applyOrientationFilter(
const std::vector<geometry_msgs::PoseStamped>& path,
85 double yaw_tolerance,
double gap_tolerance)
87 std::vector<geometry_msgs::PoseStamped> filtered_path;
88 filtered_path.reserve(path.size());
96 filtered_path.push_back(path.front());
99 for (
size_t i = 1; i < path.size() - 1; ++i)
103 double yaw_previous =
getRelativeYaw(filtered_path.back(), path[i]);
106 double yaw_this =
tf2::getYaw(path[i].pose.orientation);
109 double yaw_without =
getRelativeYaw(filtered_path.back(), path[i + 1]);
116 setYaw(filtered_path.back(), yaw_previous);
118 filtered_path.push_back(path[i]);
120 else if (std::hypot(path[i].pose.position.x - filtered_path.back().pose.position.x,
121 path[i].pose.position.y - filtered_path.back().pose.position.y) >= gap_tolerance)
123 ROS_DEBUG_NAMED(
"orientation_filter",
"Including pose %lu to meet max_separation_dist", i);
125 setYaw(filtered_path.back(), yaw_previous);
127 filtered_path.push_back(path[i]);
140 filtered_path.push_back(path.back());
142 ROS_DEBUG_NAMED(
"orientation_filter",
"Filtered %lu points from plan", path.size() - filtered_path.size());
143 return filtered_path;