@@ -355,12 +355,15 @@ std::pair<bool, VectorXd> MPC::updateStateForDelayCompensation(
355
355
MatrixXd Wd (DIM_X, 1 );
356
356
MatrixXd Cd (DIM_Y, DIM_X);
357
357
358
+ const double sign_vx = m_is_forward_shift ? 1 : -1 ;
359
+
358
360
MatrixXd x_curr = x0_orig;
359
361
double mpc_curr_time = start_time;
360
362
for (size_t i = 0 ; i < m_input_buffer.size (); ++i) {
361
363
double k, v = 0.0 ;
362
364
try {
363
- k = interpolation::lerp (traj.relative_time , traj.k , mpc_curr_time);
365
+ // NOTE: When driving backward, the curvature's sign should be reversed.
366
+ k = interpolation::lerp (traj.relative_time , traj.k , mpc_curr_time) * sign_vx;
364
367
v = interpolation::lerp (traj.relative_time , traj.vx , mpc_curr_time);
365
368
} catch (const std::exception & e) {
366
369
RCLCPP_ERROR (m_logger, " mpc resample failed at delay compensation, stop mpc: %s" , e.what ());
@@ -446,6 +449,7 @@ MPCMatrix MPC::generateMPCMatrix(
446
449
const double ref_vx = reference_trajectory.vx .at (i);
447
450
const double ref_vx_squared = ref_vx * ref_vx;
448
451
452
+ // NOTE: When driving backward, the curvature's sign should be reversed.
449
453
const double ref_k = reference_trajectory.k .at (i) * sign_vx;
450
454
const double ref_smooth_k = reference_trajectory.smooth_k .at (i) * sign_vx;
451
455
0 commit comments