共计 1461 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点:为什么需要 MPC
在 CarSim 仿真中尝试用传统 PID 控制车辆轨迹时,我发现三个典型问题:

- 弯道滞后明显 :车速超过 60km/ h 时,方向盘响应延迟导致轨迹偏差超过 0.5 米
- 超调震荡 :紧急变道场景下,PID 参数调优困难,车身横摆角会出现持续振荡
- 约束处理缺失 :无法天然地整合执行器饱和限制(如最大转向角限制)
这些问题本质上源于 PID 的 ” 短视 ” 特性——它只根据当前误差计算控制量,而车辆是一个具有惯性的复杂动力学系统。
技术方案对比
PID 控制
- 优点:实现简单、计算量小
- 缺点:难以处理多输入多输出耦合、无法显式处理约束
LQR 控制
- 优点:全局最优、计算效率高
- 缺点:固定反馈增益、无法处理时变参考轨迹
MPC 控制
- 核心优势:
- 滚动优化机制能提前预见未来轨迹变化
- 可显式处理状态和控制量的约束
- 天然适合多目标优化(如同时考虑跟踪精度和乘坐舒适性)
工程实现全流程
1. 搭建联合仿真环境
CarSim 2020 + MATLAB R2021a 配置要点:
- 在 CarSim 中导出车辆参数文件(.par)
- 通过 S -Function 接口建立数据通路
- 关键配置参数:
- 仿真步长:0.02s(对应 50Hz 控制器频率)
- 通信延迟补偿:添加 1 个步长的预测补偿
2. 车辆建模
采用经典自行车模型,状态方程:
% 状态变量: [横向误差 e; 航向误差 Δψ; 横摆角速度 r]
A = [0, vx, vx;
0, 0, 1;
0, 0, -(Cf+Cr)/(m*vx)];
B = [0; 0; Cf/(m*vx)]; % 控制输入为前轮转角
模型线性化时注意:
– 纵向速度 vx 视为时变参数
– 小角度假设下忽略高阶项
3. MPC 控制器设计
代价函数采用二次型形式:
J = ∑(e'Qe + Δu'RΔu) + e_N'P e_N
参数选择经验:
– Q 矩阵:横向误差权重 > 航向误差权重(建议 5:1)
– R 矩阵:避免控制量剧烈变化(典型值 0.1~1)
4. 代码实现关键点
%% QP 问题构建(使用 quadprog)H = blkdiag(kron(eye(N),Q), kron(eye(N-1),R)); % 块对角矩阵构造
f = []; % 无线性项
% 等式约束(状态方程)Aeq = [kron(eye(N),A) - eye(N*nx), zeros(N*nx, (N-1)*nu)];
beq = -B(:,1)*u_prev; % 初始控制量影响
% 调用求解器
[U_opt,~,exitflag] = quadprog(H,f,Aineq,bineq,Aeq,beq,lb,ub);
完整代码需处理:
– 参考轨迹插值
– 前馈补偿项计算
– 求解失败时的降级策略
性能调优实战
参数影响规律
| 参数 | 跟踪精度 | 计算耗时 | 建议范围 |
|---|---|---|---|
| 预测时域 (N) | ↑ | ↑↑ | 10~20 步 |
| 采样周期 (Ts) | ↓ | ↓ | 0.02~0.05s |
| 权重比 (Q/R) | ↑ | – | 5:1~10:1 |
实时性保障技巧
- 热启动:用上一周期的解作为本次初始猜测
- 提前终止:设置 quadprog 的 MaxIter 限制
- 代码加速:将 QP 矩阵构建改为 C -MEX 实现
常见问题排查
CarSim 接口报错
- 症状 :仿真运行时报 ”VS Solver Error”
- 原因 :MATLAB 与 CarSim 的时钟不同步
- 解决 :检查 S -Function 中的采样时间设置
控制器发散
- 检查模型参数单位(CarSim 用英制单位需转换)
- 验证雅可比矩阵的正确性
- 逐步增大预测时域观察稳定性变化
实车迁移思考
需要额外考虑:
1. 状态估计精度(特别是横摆角速度)
2. 执行器响应延迟补偿
3. 计算平台选择(推荐使用 dSPACE 或 NI 实时系统)
最终测试表明:在 80km/ h 速度下,MPC 控制器的最大横向误差比 PID 降低 62%,且无超调现象。完整的工程代码已开源在 GitHub(示例见附录)。
“`
正文完
