diff --git a/nav2_mppi_controller/include/nav2_mppi_controller/tools/utils.hpp b/nav2_mppi_controller/include/nav2_mppi_controller/tools/utils.hpp index d08b559cb0e..e6c6a9397b2 100644 --- a/nav2_mppi_controller/include/nav2_mppi_controller/tools/utils.hpp +++ b/nav2_mppi_controller/include/nav2_mppi_controller/tools/utils.hpp @@ -418,13 +418,20 @@ inline void setPathCostsIfNotSet( * @param point_y Point to find angle relative to Y axis * @return Angle between two points */ -inline double posePointAngle(const geometry_msgs::msg::Pose & pose, double point_x, double point_y) +inline double posePointAngle( + const geometry_msgs::msg::Pose & pose, double point_x, double point_y, + double point_yaw) { double pose_x = pose.position.x; double pose_y = pose.position.y; double pose_yaw = tf2::getYaw(pose.orientation); double yaw = atan2(point_y - pose_y, point_x - pose_x); + + if (abs(angles::shortest_angular_distance(yaw, point_yaw)) > M_PI_2) { + yaw = angles::normalize_angle(yaw + M_PI); + } + return abs(angles::shortest_angular_distance(yaw, pose_yaw)); } diff --git a/nav2_mppi_controller/src/critics/path_angle_critic.cpp b/nav2_mppi_controller/src/critics/path_angle_critic.cpp index a588bbe2913..ce94153d5f4 100644 --- a/nav2_mppi_controller/src/critics/path_angle_critic.cpp +++ b/nav2_mppi_controller/src/critics/path_angle_critic.cpp @@ -57,16 +57,30 @@ void PathAngleCritic::score(CriticData & data) const float goal_x = xt::view(data.path.x, offseted_idx); const float goal_y = xt::view(data.path.y, offseted_idx); + const float goal_yaw = xt::view(data.path.yaws, offseted_idx); - if (utils::posePointAngle(data.state.pose.pose, goal_x, goal_y) < max_angle_to_furthest_) { + if (utils::posePointAngle( + data.state.pose.pose, goal_x, goal_y, + goal_yaw) < max_angle_to_furthest_) + { return; } const auto yaws_between_points = xt::atan2( goal_y - data.trajectories.y, goal_x - data.trajectories.x); + + const auto yaws_between_points_corrected = xt::eval( + xt::where( + xt::abs(utils::shortest_angular_distance(yaws_between_points, goal_yaw)) <= M_PI_2, + yaws_between_points, + utils::normalize_angles(yaws_between_points + M_PI))); + const auto yaws = - xt::abs(utils::shortest_angular_distance(data.trajectories.yaws, yaws_between_points)); + xt::abs( + utils::shortest_angular_distance( + data.trajectories.yaws, + yaws_between_points_corrected)); data.costs += xt::pow(xt::mean(yaws, {1}, immediate) * weight_, power_); }