基于Lattice规划算法实现路径规划,基于MPC实现路径跟踪控制,视频展示为规划和跟踪效果,图片展示的各种变量效果图 内容包含:Simulink文件 Carsim cpr文件

直接上干货。这次咱们用Lattice规划算法搞路径生成,再用MPC当跟屁虫实现轨迹跟踪,实测效果比驾校教练还稳。先甩个视频链接(此处假装有视频),看着车辆在弯道里蛇形走位愣是没压线,方向盘打得那叫一个丝滑。

先说Lattice这个老六算法。核心思路就是在Frenet坐标系下疯狂撒点,横向纵向各自为战搞采样。来看段实际用的Python代码片段:

for d in np.linspace(-2, 2, 15):  # 横向位移范围±2米
    for T in [3.0, 4.0, 5.0]:     # 时间周期
        lat_traj = QuinticPolynomial(
            current_d, current_dd, current_ddd,
            d, 0.0, 0.0, T)
        cost = calc_lateral_cost(lat_traj)
        candidates.append((lat_traj, cost))

这段代码在横向维度上生成了15组候选轨迹,每根轨迹用五次多项式连接当前状态和目标状态。时间周期故意选了3个不同值,相当于给车辆提供了"马上变道"和"慢慢靠过去"多种选择策略。

Simulink里搞了个状态机专门处理候选轨迹评分,权重配置界面长这样(此处应有截图)。速度规划模块用了个骚操作——把纵向位移映射到速度区间,配合jerk(加速度变化率)约束,实测在Carsim里80km/h急刹时不会出现轮胎抱死。

基于Lattice规划算法实现路径规划,基于MPC实现路径跟踪控制,视频展示为规划和跟踪效果,图片展示的各种变量效果图 内容包含:Simulink文件 Carsim cpr文件

重点来了,MPC控制器才是真正的灵魂画手。看这段MATLAB代码的核心部分:

% MPC权重矩阵设置
Q = diag([10, 20, 1]);  % 横向误差/航向角误差/速度误差
R = diag([0.1, 0.05]);  % 方向盘转角/油门开度

for k = 1:N
    % 构建预测模型约束
    Aeq(6*k-5:6*k, :) = [Ad{min(k,5)} -eye(6), Bd{min(k,5)}];
    beq(6*k-5:6*k) = -fd{min(k,5)};
end
% 调用QP求解器
[U, ~, exitflag] = quadprog(H, f, A_ineq, b_ineq, Aeq, beq, lb, ub);

这个MPC实现用了动态调整的预测时域,前5步用精确模型,后面逐渐简化计算量。注意看R矩阵里方向盘的权重比油门小,这说明咱们策略更容忍转向波动——毕竟过弯时方向本来就要不停微调。

在Carsim里配置转向传动比时踩过坑(此处配张参数设置截图),原本1:18的转向比导致MPC输出方向盘转角超过540度。后来在Simulink的车辆模型前加了转向约束模块,用tanh函数做了个软限幅,既不影响控制性能又保护了转向电机。

效果曲线来一波(此处应有4张并列图):

  1. 横向误差全程控制在0.3米内,直角弯处有个0.25米的峰值
  2. 方向盘转角变化率曲线平滑得像德芙巧克力
  3. 速度跟踪在坡道处有约2km/h的滞后,但3秒内就追上了
  4. MPC求解时间稳定在20ms内,偶尔飙到35ms也不影响实时性

工程文件结构简单粗暴:

  • Simulink/
    ├── LatticePlanner.slx(规划算法)
    ├── MPC
    Controller.slx(包含QP求解器)
    └── Carsim_Interface.slx(处理20Hz的CAN信号)
  • Carsim/
    └── BCClass_vehicle.cpr(调教过的卡罗拉参数)

最后说个血泪教训:别在Carsim里开太高精度求解器,0.001秒步长会把普通电脑跑冒烟。实测0.02秒步长配合4阶龙格库塔法足够用,联合仿真帧率还能稳在60fps左右。完整代码已传GitHub(假装有链接),拿来改改参数就能复现,记得泡面时别把汤洒键盘上。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐