35 #include <dwb_core/trajectory_utils.hpp>
39 #include "rclcpp/duration.hpp"
41 #include "dwb_core/exceptions.hpp"
45 const geometry_msgs::msg::Pose2D & getClosestPose(
46 const dwb_msgs::msg::Trajectory2D & trajectory,
47 const double time_offset)
49 rclcpp::Duration goal_time = rclcpp::Duration::from_seconds(time_offset);
50 const unsigned int num_poses = trajectory.poses.size();
54 unsigned int closest_index = num_poses;
55 double closest_diff = 0.0;
56 for (
unsigned int i = 0; i < num_poses; ++i) {
57 double diff = std::fabs((rclcpp::Duration(trajectory.time_offsets[i]) - goal_time).seconds());
58 if (closest_index == num_poses || diff < closest_diff) {
62 if (goal_time < rclcpp::Duration(trajectory.time_offsets[i])) {
66 return trajectory.poses[closest_index];
69 geometry_msgs::msg::Pose2D projectPose(
70 const dwb_msgs::msg::Trajectory2D & trajectory,
71 const double time_offset)
73 rclcpp::Duration goal_time = rclcpp::Duration::from_seconds(time_offset);
74 const unsigned int num_poses = trajectory.poses.size();
78 if (goal_time <= (trajectory.time_offsets[0])) {
79 return trajectory.poses[0];
80 }
else if (goal_time >= rclcpp::Duration(trajectory.time_offsets[num_poses - 1])) {
81 return trajectory.poses[num_poses - 1];
84 for (
unsigned int i = 0; i < num_poses - 1; ++i) {
85 if (goal_time >= rclcpp::Duration(trajectory.time_offsets[i]) &&
86 goal_time < rclcpp::Duration(trajectory.time_offsets[i + 1]))
89 (rclcpp::Duration(trajectory.time_offsets[i + 1]) -
90 rclcpp::Duration(trajectory.time_offsets[i])).seconds();
91 double ratio = (goal_time - rclcpp::Duration(trajectory.time_offsets[i])).seconds() /
93 double inv_ratio = 1.0 - ratio;
94 const geometry_msgs::msg::Pose2D & pose_a = trajectory.poses[i];
95 const geometry_msgs::msg::Pose2D & pose_b = trajectory.poses[i + 1];
96 geometry_msgs::msg::Pose2D projected;
97 projected.x = pose_a.x * inv_ratio + pose_b.x * ratio;
98 projected.y = pose_a.y * inv_ratio + pose_b.y * ratio;
99 projected.theta = pose_a.theta * inv_ratio + pose_b.theta * ratio;
105 return trajectory.poses[num_poses - 1];