diff --git a/src/Algorithms/Libraries/mkt_algorithm/include/mkt_algorithm/diff/diff_predictive_trajectory.h b/src/Algorithms/Libraries/mkt_algorithm/include/mkt_algorithm/diff/diff_predictive_trajectory.h index 6a21147..936d3be 100644 --- a/src/Algorithms/Libraries/mkt_algorithm/include/mkt_algorithm/diff/diff_predictive_trajectory.h +++ b/src/Algorithms/Libraries/mkt_algorithm/include/mkt_algorithm/diff/diff_predictive_trajectory.h @@ -194,11 +194,11 @@ namespace mkt_algorithm /** * @brief Generate Hermite trajectory - * @param pose + * @param path * @param sign_x * @return trajectory */ - robot_nav_2d_msgs::Path2D generateHermiteTrajectory(const robot_nav_2d_msgs::Pose2DStamped &pose, const double &sign_x); + robot_nav_2d_msgs::Path2D generateHermiteTrajectory(const robot_nav_2d_msgs::Path2D &path, const double &sign_x); /** * @brief Generate Hermite quadratic trajectory @@ -206,7 +206,7 @@ namespace mkt_algorithm * @param sign_x * @return trajectory */ - robot_nav_2d_msgs::Path2D generateHermiteQuadraticTrajectory(const robot_nav_2d_msgs::Pose2DStamped &pose, const double &sign_x); + robot_nav_2d_msgs::Path2D generateHermiteQuadraticTrajectory(const robot_nav_2d_msgs::Path2D &path, const double &sign_x); /** * @brief Should rotate to path diff --git a/src/Algorithms/Libraries/mkt_algorithm/src/diff/diff_predictive_trajectory.cpp b/src/Algorithms/Libraries/mkt_algorithm/src/diff/diff_predictive_trajectory.cpp index 1843f90..404f31d 100644 --- a/src/Algorithms/Libraries/mkt_algorithm/src/diff/diff_predictive_trajectory.cpp +++ b/src/Algorithms/Libraries/mkt_algorithm/src/diff/diff_predictive_trajectory.cpp @@ -529,19 +529,19 @@ mkt_msgs::Trajectory2D mkt_algorithm::diff::PredictiveTrajectory::calculator( } else { - // === Final Heading Alignment Check === - double xy_error = 0.0, heading_error = 0.0; - if (shouldAlignToFinalHeading(transformed_plan, carrot_pose, velocity, xy_error, heading_error, sign_x)) - { - // Use Arc Motion controller for final heading alignment - alignToFinalHeading(xy_error, heading_error, velocity, sign_x, dt, drive_cmd); -#ifdef BUILD_WITH_ROS - ROS_INFO("heading_err=%.3f deg, v=%.3f, w_current=%.3f, w_target=%.3f", - heading_error * 180.0 / M_PI, drive_cmd.x, velocity.theta, drive_cmd.theta); -#endif - } - else - { +// // === Final Heading Alignment Check === +// double xy_error = 0.0, heading_error = 0.0; +// if (shouldAlignToFinalHeading(transformed_plan, carrot_pose, velocity, xy_error, heading_error, sign_x)) +// { +// // Use Arc Motion controller for final heading alignment +// alignToFinalHeading(xy_error, heading_error, velocity, sign_x, dt, drive_cmd); +// #ifdef BUILD_WITH_ROS +// ROS_INFO("heading_err=%.3f deg, v=%.3f, w_current=%.3f, w_target=%.3f", +// heading_error * 180.0 / M_PI, drive_cmd.x, velocity.theta, drive_cmd.theta); +// #endif +// } +// else +// { // if(fabs(carrot_pose.pose.y) > 0.2) // { // lookahead_dist = sqrt(carrot_pose.pose.y *carrot_pose.pose.y + lookahead_dist * lookahead_dist); @@ -559,7 +559,7 @@ mkt_msgs::Trajectory2D mkt_algorithm::diff::PredictiveTrajectory::calculator( sign_x, dt, drive_cmd); - } + // } applyDistanceSpeedScaling(compute_plan_, velocity, drive_cmd, sign_x, dt); if (this->nav_stop_) { @@ -1242,13 +1242,13 @@ robot_nav_2d_msgs::Path2D mkt_algorithm::diff::PredictiveTrajectory::generateTra { return generateParallelPath(path, sign_x); } - return generateHermiteTrajectory(path.poses.back(), sign_x); + return generateHermiteTrajectory(path, sign_x); } else // nếu đường cong { if(fabs(drive_cmd.x) < min_speed_xy_) drive_cmd.x = std::copysign(min_speed_xy_, sign_x); - return generateHermiteQuadraticTrajectory(path.poses.back(), sign_x); + return generateHermiteQuadraticTrajectory(path, sign_x); } } @@ -1285,33 +1285,43 @@ robot_nav_2d_msgs::Path2D mkt_algorithm::diff::PredictiveTrajectory::generatePar parallel_path.poses[i].pose.x = x_off; parallel_path.poses[i].pose.y = y_off; - parallel_path.poses[i].pose.theta = theta; // hoặc giữ nguyên p.theta + parallel_path.poses[i].pose.theta = p.theta; parallel_path.poses[i].header = path.poses[i].header; } - return parallel_path; } + + robot_nav_2d_msgs::Path2D mkt_algorithm::diff::PredictiveTrajectory::generateHermiteTrajectory( - const robot_nav_2d_msgs::Pose2DStamped &pose, const double &sign_x) + const robot_nav_2d_msgs::Path2D &path, const double &sign_x) { robot_nav_2d_msgs::Path2D hermite_trajectory; hermite_trajectory.poses.clear(); - hermite_trajectory.header.stamp = pose.header.stamp; - hermite_trajectory.header.frame_id = pose.header.frame_id; + hermite_trajectory.header = path.header; - const double x = pose.pose.x; - const double y = pose.pose.y; - const double theta = pose.pose.theta; + if (path.poses.empty()) + return hermite_trajectory; + + const auto &goal = path.poses.back(); + if (hermite_trajectory.header.frame_id.empty()) + hermite_trajectory.header.frame_id = goal.header.frame_id; + if (hermite_trajectory.header.stamp.isZero()) + hermite_trajectory.header.stamp = goal.header.stamp; + + const double x = goal.pose.x; + const double y = goal.pose.y; + const double theta = goal.pose.theta; + robot::log_debug("x: %f, y: %f, theta: %f", x, y, theta); const double L = std::hypot(x, y); if (L < 1e-6) { robot_nav_2d_msgs::Pose2DStamped pose_stamped; - pose_stamped.pose.x = 0.0; - pose_stamped.pose.y = 0.0; - pose_stamped.pose.theta = 0.0; - pose_stamped.header.stamp = pose.header.stamp; - pose_stamped.header.frame_id = pose.header.frame_id; + pose_stamped.pose.x = x; + pose_stamped.pose.y = y; + pose_stamped.pose.theta = theta; + pose_stamped.header.stamp = hermite_trajectory.header.stamp; + pose_stamped.header.frame_id = hermite_trajectory.header.frame_id; hermite_trajectory.poses.push_back(pose_stamped); return hermite_trajectory; } @@ -1347,28 +1357,35 @@ robot_nav_2d_msgs::Path2D mkt_algorithm::diff::PredictiveTrajectory::generateHer double heading = std::atan2(dy, dx); - robot_nav_2d_msgs::Pose2DStamped pose; - pose.pose.x = px; - pose.pose.y = py; - pose.pose.theta = sign_x < 0 ? angles::normalize_angle(heading + M_PI) : heading; - pose.header.stamp = hermite_trajectory.header.stamp; - pose.header.frame_id = hermite_trajectory.header.frame_id; - hermite_trajectory.poses.push_back(pose); + robot_nav_2d_msgs::Pose2DStamped pose_out; + pose_out.pose.x = px; + pose_out.pose.y = py; + pose_out.pose.theta = sign_x < 0 ? angles::normalize_angle(heading + M_PI) : heading; + pose_out.header.stamp = hermite_trajectory.header.stamp; + pose_out.header.frame_id = hermite_trajectory.header.frame_id; + hermite_trajectory.poses.push_back(pose_out); } return hermite_trajectory; } robot_nav_2d_msgs::Path2D mkt_algorithm::diff::PredictiveTrajectory::generateHermiteQuadraticTrajectory( - const robot_nav_2d_msgs::Pose2DStamped &pose, const double &sign_x) + const robot_nav_2d_msgs::Path2D &path, const double &sign_x) { robot_nav_2d_msgs::Path2D trajectory; trajectory.poses.clear(); - trajectory.header.stamp = pose.header.stamp; - trajectory.header.frame_id = pose.header.frame_id; + trajectory.header = path.header; + if (path.poses.empty()) + return trajectory; - const double x = pose.pose.x; - const double y = pose.pose.y; - const double theta = sign_x < 0 ? angles::normalize_angle(pose.pose.theta + M_PI) : pose.pose.theta; + const auto &goal = path.poses.back(); + if (trajectory.header.frame_id.empty()) + trajectory.header.frame_id = goal.header.frame_id; + if (trajectory.header.stamp.isZero()) + trajectory.header.stamp = goal.header.stamp; + + const double x = goal.pose.x; + const double y = goal.pose.y; + const double theta = sign_x < 0 ? angles::normalize_angle(goal.pose.theta + M_PI) : goal.pose.theta; const double L = std::hypot(x, y); if (L < 1e-6) {