共计 1696 个字符,预计需要花费 5 分钟才能阅读完成。
1. 背景与痛点
自动驾驶车辆在轨迹跟踪过程中面临多重挑战。首先,车辆动力学具有显著的非线性特性,尤其是在高速或紧急避障场景下。其次,执行器响应延迟(如转向系统约 100-200ms)会导致相位滞后。此外,路面坡度变化、侧风干扰等外部扰动也会显著影响控制精度。

传统控制方法各有局限:
- PID 控制 :简单易实现但难以处理时延和多约束问题,在非线性区域易出现超调
- LQR 控制 :基于线性化模型,在全局工作点附近表现良好,但无法显式处理约束
- MPC 控制 :通过滚动优化和反馈校正,天然具备处理多约束和时延的能力,特别适合车辆控制
2. 技术实现
2.1 MPC 工作原理
MPC 的核心思想可概括为:
- 在每个控制周期,基于当前状态预测未来 N 步的系统行为
- 求解优化问题得到控制序列
- 仅执行第一步控制量,下一周期重新进行预测优化
在 CarSim 环境中,我们采用如下框架:
%% MPC 主循环示例
while sim_time < T_end
% 从 CarSim 获取当前状态
[yaw_rate, vx, vy] = carsim_get_state();
% 状态重组与坐标系转换
ego_state = local2global([x_pos, y_pos], yaw);
% 求解 MPC 优化问题
[U_opt, cost] = solve_MPC(ego_state, ref_traj);
% 发送控制指令
carsim_send_control(U_opt(1,:));
end
2.2 关键模块实现
车辆模型
采用自行车模型 + 轮胎魔术公式:
dx/dt = v*cos(θ + β)
dy/dt = v*sin(θ + β)
dθ/dt = (v/l_r)*sin(β)
β = arctan((l_r/(l_f+l_r)) * tan(δ) )
优化问题构建
function [U, cost] = solve_MPC(x0, ref)
% 定义代价函数 (跟踪误差 + 控制量变化率)
J = 0;
for k = 1:N
J = J + (x(k)-ref(k))'*Q*(x(k)-ref(k)) ...
+ u(k)'*R*u(k);
end
% 添加约束
constraints = [];
constraints = [constraints; -10 <= diff(u) <= 10]; % 转向速率限制
% 调用求解器
options = optimoptions('fmincon','Algorithm','interior-point');
[U, cost] = fmincon(@(u)cost_function(u,x0), u0,[],[],[],[],lb,ub,@nonlcon,options);
end
3. 工程实践
3.1 参数调优指南
- 预测时域 :通常 3 - 5 秒(高速场景取上限)
- 控制时域 :建议为预测时域的 1 /3~1/2
- 权重矩阵 :
Q = diag([10, 10, 5, 1]); % 位置误差权重大于航向角 R = diag([0.1, 0.01]); % 避免转向角突变
3.2 常见问题排查
坑 1:求解器报『不可行』
– 检查约束是否过紧,特别是轮胎侧偏角约束
– 尝试放宽终端状态约束
坑 2:控制指令振荡
– 增加控制量变化率的惩罚项权重
– 检查 CarSim 仿真步长是否与 MPC 周期匹配
坑 3:实时性不足
– 使用 C 代码生成(MATLAB Coder)
– 采用热启动策略,复用上一周期解作为初始值
4. 验证与评估
4.1 测试场景设计
| 场景类型 | 速度 (km/h) | 曲率变化 | 评估重点 |
|---|---|---|---|
| 双移线 | 60-80 | 连续突变 | 横向误差 |
| 蛇形绕桩 | 30-50 | 高频变化 | 航向跟踪 |
| 圆形跑道 | 恒定速度 | 固定曲率 | 稳态误差 |
4.2 性能指标
% 计算 RMS 误差
err_lat = sqrt(mean((y_actual - y_ref).^2));
err_yaw = sqrt(mean(wrapToPi(theta_actual - theta_ref).^2));
5. 生产建议
- HIL 测试 :
- 在 dSPACE 等平台上验证 ECU 通信延迟
-
注入传感器噪声测试鲁棒性
-
实车迁移 :
- 先以仿真参数的 50% 作为初始值
- 逐步提升车速进行验证
6. 开放性问题
- 如何设计自适应权重策略,使车辆在湿滑路面自动降低横向误差权重?
- 当 GPS 信号丢失时,怎样融合 IMU 数据保持短时轨迹跟踪?
- 针对重型卡车,MPC 模型需要哪些特殊调整?
(全文约 1500 字,完整代码示例见 GitHub 仓库)
正文完
