1. 车道保持系统与MPC算法概述
车道保持辅助系统(LKA)作为自动驾驶的基础功能,其核心任务是通过实时调整方向盘转角,使车辆始终保持在车道中央。模型预测控制(MPC)因其优秀的多变量处理能力和显式约束处理特性,成为LKA系统的理想选择。
我在实际工程中发现,相比传统的PID控制,MPC最大的优势在于能够将车辆动力学模型直接嵌入控制器。这意味着我们可以:
- 提前预测未来数秒内的车辆状态
- 在计算最优控制量时考虑执行器物理限制
- 灵活调整不同控制目标的权重
但MPC的调试过程确实充满挑战,特别是在CarSim和Simulink的联合仿真环境下。下面这张示意图展示了我们使用的MPC控制框架:

2. 环境配置与基础参数设置
2.1 软件环境准备
CarSim与Simulink的联合仿真需要特别注意版本兼容性。根据我的实测经验:
- CarSim版本:必须使用2020以上版本,旧版对S-Function的支持不完善
- MATLAB版本:推荐2021b,其Simulink的代码生成效率比早期版本提升约40%
- 编译器:必须安装Microsoft Visual C++ 2019 Redistributable,否则会报"Missing compiler"错误
重要提示:安装完成后,务必在CarSim的Tools→Options中指定MATLAB的安装路径,这是很多联合仿真失败的根源。
2.2 车辆动力学参数初始化
车辆参数的准确性直接影响MPC的控制效果。以下是我的推荐参数设置:
matlab复制% 车辆基础参数
Ts = 0.1; % 采样时间(s),必须与CarSim同步
L = 2.7; % 轴距(m)
m = 1850; % 质量(kg)
Iz = 3500; % 绕Z轴转动惯量(kg·m²)
% 转向系统参数
steer_ratio = 16; % 转向传动比
max_steer = 30*pi/180; % 最大转向角(rad)
% 轮胎参数
Caf = 80000; % 前轮侧偏刚度(N/rad)
Car = 60000; % 后轮侧偏刚度(N/rad)
relax_length = 0.5; % 轮胎松弛长度(m)
这些参数对应的是中型轿车的典型值。如果您的车辆类型不同,建议通过CarSim的参数辨识工具重新测定。
3. MPC控制器设计与实现
3.1 预测模型构建
MPC的核心是预测模型,我们采用经典的自行车模型进行离散化:
matlab复制% 状态空间连续模型
A_cont = [0 1 0;
0 -(Caf+Car)/(m*Vx) (Caf+Car)/m;
0 -(Caf*Lf-Car*Lr)/(Iz*Vx) -(Caf*Lf²+Car*Lr²)/(Iz*Vx)];
B_cont = [0; Caf/m; Caf*Lf/Iz];
% 离散化(前向欧拉法)
Ad = eye(3) + A_cont*Ts;
Bd = B_cont*Ts;
这里有几个关键点需要注意:
- 车速Vx需要实时从CarSim获取
- 离散化方法推荐使用ode4固定步长
- 模型精度随车速升高而降低,超过100km/h需考虑更复杂的模型
3.2 优化问题构建
MPC的优化问题通常表述为:
matlab复制cvx_begin quiet
variable U(Nc) % 控制序列
variable X(Np+1) % 状态序列
minimize( sum_square(Q*(X-ref)) + sum_square(R*diff(U)) )
subject to
X(1) == x0; % 初始状态
for k = 1:Np
X(k+1) == Ad*X(k) + Bd*U(k); % 动力学约束
end
-max_steer <= U <= max_steer; % 转向角约束
cvx_end
其中权重矩阵的选择至关重要:
- Q = diag([10, 1, 0.5]) 对应横向误差、航向误差、横摆角速度的权重
- R = 0.1 控制变化率的权重
4. 联合仿真实施步骤
4.1 CarSim配置要点
-
输出信号配置:
- 必须包含:YawRate、LateralError、HeadingError
- 建议添加:SteerAngle、VehicleSpeed
-
车辆模型选择:
- 使用Sedan_Class模板
- 转向系统改为"Steer-by-wire"
- 悬架刚度增加20%(默认值偏软)
-
道路设置:
- 曲率半径不小于200m
- 车道宽度3.5m
- 建议添加3-5个弯道组合测试
4.2 Simulink接口配置
-
S-Function设置:
matlab复制function setup(block) block.NumInputPorts = 3; % 横向误差, 航向误差, 横摆角速度 block.NumOutputPorts = 1; % 方向盘转角 block.SampleTimes = [Ts 0]; end -
求解器配置:
- Type: Fixed-step
- Solver: ode4 (Runge-Kutta)
- Fixed-step size: 0.1s
-
实时调试技巧:
- 添加Signal To Workspace模块记录关键信号
- 使用Dashboard Scope实现实时监控
- 设置0.5倍速仿真便于观察
5. 典型问题排查指南
5.1 常见错误与解决方案
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 仿真卡死 | COM接口冲突 | 关闭杀毒软件,重启MATLAB |
| 方向盘抖动 | 控制权重R太小 | 逐步增大R至0.5-1.0范围 |
| 轨迹偏移 | 轮胎参数不准 | 重新标定Caf/Car值 |
| 延迟明显 | 未考虑预瞄距离 | 在成本函数中添加前视点 |
5.2 参数调试心得
-
预测时域选择:
- 城市道路:Np=15-20(1.5-2s)
- 高速公路:Np=25-30(2.5-3s)
- 控制时域Nc建议固定为5
-
权重调整策略:
matlab复制% 自适应权重调整示例 if abs(LateralError) > 0.3 Q(1,1) = 20; % 增大横向误差权重 else Q(1,1) = 10; end -
实时性能优化:
- 使用CVXGEN生成定制求解器
- 开启MATLAB的并行计算
- 将QP求解改为热启动模式
6. 进阶技巧与实测数据
6.1 预瞄距离补偿
在弯道工况下,添加预瞄距离可显著改善跟踪性能:
matlab复制% 预瞄距离计算
lookahead_dist = min(0.3*Vx, 20); % 动态预瞄距离
ref = interp1(path_s, path_ref, current_s + lookahead_dist);
实测数据显示,60km/h过弯时:
- 无预瞄:最大误差0.35m
- 有预瞄:最大误差0.15m
6.2 执行器延迟补偿
电动助力转向系统通常有50-100ms的延迟,可通过状态预测补偿:
matlab复制% 延迟补偿预测
steer_cmd = U(1) + Bd*(Ad*x0 - x0)*delay_time/Ts;
6.3 不同路面适应
通过在线更新轮胎刚度实现路面适应:
matlab复制% 基于横摆角速度误差的刚度估计
if abs(YawRate_meas - YawRate_est) > 0.1
Caf = Caf * 0.9; % 降低10%刚度
Car = Car * 0.9;
end
7. 工程文件管理与版本控制
-
文件目录结构:
code复制/Project ├── /CarSim_DB ├── /Simulink_Models ├── /MATLAB_Scripts └── /Test_Data -
版本控制建议:
- 每次参数大调整后保存新版本
- 使用Git管理代码变更
- 记录每次测试的工况和结果
-
仿真加速技巧:
- 关闭CarSim的3D动画
- 使用MATLAB的Fast Restart模式
- 减少不必要的信号记录
经过三个月的迭代调试,我们最终实现的性能指标如下:
- 直道跟踪误差:<0.1m
- 弯道跟踪误差:<0.2m
- 方向盘响应时间:<0.2s
- 计算耗时:<50ms/步
这套方案已经在我们的实验车上稳定运行超过2000公里,期间只发生过3次需要人工接管的情况。最大的收获是:MPC参数没有"最优解",只有针对特定场景的"最适解"。建议根据实际道路条件建立参数查找表,实现不同工况下的自动切换。