共计 1418 个字符,预计需要花费 4 分钟才能阅读完成。
1. 控制算法对比:为什么选择 MPC?
传统 PID 控制在车辆轨迹跟踪中面临三个主要挑战:

- 难以处理系统非线性(如轮胎力饱和)
- 无法显式考虑执行器约束(转向角速率限制)
- 多变量耦合时参数整定困难
相比而言,MPC 具有以下优势:
- 前馈补偿能力 :通过预测模型提前计算控制量
- 约束处理 :直接将物理限制写入优化问题
- 多目标优化 :通过权重矩阵协调跟踪误差与控制消耗
2. 车辆模型构建关键步骤
2.1 动力学模型线性化
采用自行车模型作为预测模型基础:
\begin{aligned}
\dot{v}_x &= v_y\dot{\psi} + \frac{F_{x}}{m} \\
\dot{v}_y &= -v_x\dot{\psi} + \frac{F_{yf}+F_{yr}}{m} \\
\ddot{\psi} &= \frac{l_fF_{yf}-l_rF_{yr}}{I_z}
\end{aligned}
线性化时注意:
- 工作点选择:典型车速区间(如 30-80km/h)
- 轮胎模型简化:小侧偏角下 $F_y ≈ C_α$
- 离散化方法:优先采用零阶保持器
2.2 CarSim 接口配置
关键配置文件示例(CarSim 的 VS Command):
[SIMULATION]
sample_time = 0.02 ; 必须与 Simulink 步长一致
[VEHICLE]
wheelbase = 2.7 ; 轴距需与模型匹配
max_steer = 0.6 ; 约束条件依据
3. MPC 核心代码实现
3.1 优化问题构建
function [u, cost] = mpc_controller(x0, ref_traj, model)
% 构造预测矩阵
[A, B] = calc_jacobian(x0, model);
% 二次型权重(需现场调试)Q = diag([10, 5, 2, 1]); % 状态误差
R = 0.1; % 控制量惩罚
% 调用 quadprog 求解
options = optimoptions('quadprog','Display','off');
u = quadprog(H, f, A_cons, b_cons, [], [], lb, ub, [], options);
end
3.2 实时性优化技巧
- 热启动 :复用上一周期解作为初值
- 降维处理 :固定部分优化变量
- 代码生成 :使用 MATLAB Coder 加速
4. 参数调试避坑指南
4.1 采样周期选择
- 理论下限:执行器响应延迟的 1 /5(通常≥10ms)
- 经验公式:$T_s ≈ \frac{t_{min}}{N_p}$($t_{min}$ 为最短动态过程)
4.2 权重矩阵调节
建议调试顺序:
- 先调 Q 矩阵确保跟踪收敛
- 再调 R 矩阵避免控制量振荡
- 最后添加终端权重保证稳定性
5. 典型问题解决方案
执行器饱和处理 :
% 在约束条件中添加速率限制
delta_ub = min(last_steer + rate_lim*Ts, max_steer);
delta_lb = max(last_steer - rate_lim*Ts, -max_steer);
结果对比 :
| 指标 | PID | MPC |
|————–|———|———|
| 最大横向误差 | 0.42m | 0.18m |
| 转向波动度 | 15deg/s | 8deg/s |
6. 开放讨论
在实际部署时,我们发现:
– 预测时域 $N_p$=20 时跟踪误差最小
– 但计算延迟会增加 35ms
您会如何权衡精度与延迟? 欢迎在评论区分享:
1. 采用更简化的模型?
2. 减少预测时域?
3. 其他优化方案?
本文代码库已开源:github.com/xxx/mpc_carsim(包含双移线工况测试案例)
正文完
