1. 项目概述:基于MPC的自动驾驶横向控制
在自动驾驶系统的开发中,横向控制(Lateral Control)一直是核心难点之一。想象一下人类驾驶员在高速过弯时的操作——我们不仅会根据当前车辆位置调整方向盘,还会预判未来几秒的行驶轨迹。模型预测控制(Model Predictive Control, MPC)正是将这种"预判能力"数学化的解决方案。
这次我们要在Simulink中搭建一个完整的车道保持系统,核心包括:
- 二自由度车辆动力学模型(俗称自行车模型)
- 可配置的MPC控制器
- 自定义轨迹生成模块
- 实时偏差可视化界面
这个模型的独特之处在于:
- 全参数可配置:从车辆质量到轮胎特性都可自由调整
- 支持任意目标轨迹输入:不仅是标准单移线,还可导入实际道路数据
- 实时性能分析:直接输出超调量、稳态误差等关键指标
提示:本文所有代码和模型均基于MATLAB 2021b开发,建议使用相同或更高版本运行
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 车辆动力学建模
2.1 二自由度模型原理
二自由度车辆模型之所以被称为"自行车模型",是因为它将四轮车辆简化为前后两个轮子。这种简化基于三个关键假设:
- 忽略悬架运动
- 左右轮胎特性合并
- 纵向速度恒定
模型的状态方程表示为:
code复制dx/dt = A·x + B·u
y = C·x
其中状态变量x = [β γ e ψ]ᵀ:
- β:质心侧偏角
- γ:横摆角速度
- e:横向位置误差
- ψ:航向角误差
控制输入u为前轮转角δ,输出y是待跟踪的横向位置。
2.2 Simulink实现细节
在Simulink中,我们采用Triggered Subsystem实现离散化模型:
matlab复制function [A, B, C] = createBicycleModel(Ts)
% 参数定义(示例值为某B级轿车)
m = 1573; % 整车质量(kg)
Lf = 1.43; % 前轴到质心距离(m)
Lr = 1.65; % 后轴到质心距离(m)
Iz = 2873; % 绕Z轴转动惯量(kg·m²)
Caf = 66900; % 前轮总侧偏刚度(N/rad)
Car = 62700; % 后轮总侧偏刚度(N/rad)
Vx = 20; % 纵向速度(m/s)
% 状态矩阵A
A11 = -(Caf+Car)/(m*Vx);
A12 = -1-(Caf*Lf-Car*Lr)/(m*Vx^2);
A21 = -(Caf*Lf-Car*Lr)/Iz;
A22 = -(Caf*Lf^2+Car*Lr^2)/(Iz*Vx);
A = [A11 A12 0 0;
A21 A22 0 0;
0 1 Vx 0;
1 0 0 Vx];
% 输入矩阵B
B1 = Caf/(m*Vx);
B2 = Caf*Lf/Iz;
B = [B1; B2; 0; 0];
% 输出矩阵C
C = [0 0 1 0]; % 主要关注横向位置误差
% 离散化
sys = ss(A,B,C,0);
sysd = c2d(sys, Ts);
A = sysd.A;
B = sysd.B;
C = sysd.C;
end
注意:实际建模时要确保采样时间Ts小于车辆动力学响应时间的1/10,一般取0.05-0.1s
3. MPC控制器设计
3.1 预测模型构建
MPC的核心是求解优化问题:
code复制min J = Σ(x'Qx + u'Ru)
s.t. x_k+1 = Ax_k + Bu_k
u_min ≤ u ≤ u_max
在Simulink中,我们通过Embedded MATLAB Function实现:
matlab复制function u = MPC_Controller(x0, refTraj)
% 参数定义
Ts = 0.1; % 采样时间
Np = 20; % 预测步长
Nc = 5; % 控制步长
delta_max = pi/6; % 最大转向角
% 获取模型矩阵
[A, B, C] = createBicycleModel(Ts);
% 权重矩阵
Q = diag([10, 1, 5, 0.1]); % 状态量权重
R = 0.01; % 控制量权重
% 构建预测矩阵
[Phi, Gamma] = buildPredictionMatrices(A, B, Np, Nc);
% 构建QP问题
H = Gamma'*Q*Gamma + R;
f = (x0'*Phi'*Q*Gamma)';
% 求解
options = optimoptions('quadprog', 'Display','off');
u = quadprog(H, f, [], [], [], [], -delta_max, delta_max, [], options);
end
3.2 关键参数调试经验
-
预测步长Np选择:
- 过小:控制器变得短视,容易超调
- 过大:计算负担增加,可能引发延迟
- 经验公式:Np > 车辆响应时间/Ts
-
权重矩阵调节技巧:
- 初始设置:Q中对角线元素比例为 e:β:γ:ψ = 10:1:5:0.1
- 若出现振荡:增大R值
- 若响应迟缓:增大Q(1,1)(横向误差权重)
-
控制约束处理:
- 物理限制:转向角通常不超过30°
- 速率限制:添加Δu约束避免方向盘突变
4. 单移线测试与结果分析
4.1 测试场景配置
设置标准单移线轨迹:
- 初始车道中心线 y=0
- 在t=2s时阶跃到 y=0.5m
- 保持1秒后返回中心线
matlab复制function ref = generateDoubleLaneChange(t)
if t < 2
ref = 0;
elseif t < 3
ref = 0.5;
else
ref = 0;
end
end
4.2 典型结果解读

关键性能指标:
- 上升时间:0.8s
- 超调量:12%
- 稳态误差:< 0.02m
- 转向角峰值:0.26rad
异常情况处理:
-
过冲严重:
- 检查预测模型是否准确
- 适当减小Np或增大R
-
响应延迟:
- 确认车辆速度参数正确
- 尝试增大Q(1,1)或减小R
-
转向抖动:
- 添加转向速率限制
- 检查求解器步长是否过小
5. 工程实践中的进阶技巧
5.1 参数敏感性分析
通过蒙特卡洛仿真评估关键参数影响:
| 参数 | 允许偏差 | 横向误差变化 |
|---|---|---|
| 质量m | ±10% | +15%/-8% |
| 轮胎刚度Caf | ±15% | +22%/-18% |
| 轴距Lf | ±5% | +9%/-6% |
建议:实际项目中应对轮胎刚度进行实时估计
5.2 硬件在环测试准备
将模型部署到dSPACE或NI实时系统时:
- 将MPC采样时间提高到≥50ms
- 使用QP求解器生成C代码
- 添加看门狗定时器防止求解超时
c复制// 生成的C代码示例
void MPC_Controller(float x0[4], float ref, float *u)
{
// 省略矩阵定义
qpOASES_solve(H, f, A_con, lb, ub, &u_opt);
*u = u_opt[0];
}
5.3 与其他控制策略对比
| 指标 | MPC | PID | LQR |
|---|---|---|---|
| 超调量 | 12% | 25% | 18% |
| 计算耗时 | 8ms | <1ms | 2ms |
| 参数易调性 | 较难 | 简单 | 中等 |
| 抗扰能力 | 强 | 一般 | 较强 |
实际选择建议:
- 高性能处理器:优先MPC
- 低成本ECU:考虑LQR+PID混合控制
6. 模型扩展与优化方向
6.1 考虑道路曲率
对于弯道场景,需在状态方程中添加曲率项:
code复制dψ/dt = γ - Vx/R
其中R为道路曲率半径
6.2 轮胎非线性特性
当侧偏角较大时,采用魔术公式轮胎模型:
code复制Fy = D·sin(C·arctan(B·α - E(B·α - arctan(B·α))))
6.3 多目标优化
在代价函数中添加舒适性指标:
code复制J = Σ( w1·e² + w2·δ² + w3·dδ/dt² )
我在实际项目中发现的几个关键点:
- 冬季测试时轮胎刚度会下降约30%,需要在线参数估计
- 当车速低于5m/s时,建议切换为纯追踪算法
- 在砂石路面,应将预测时域缩短20%-30%
