fix gentrajectory
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user