1. 项目概述
今天要分享的是基于模型预测控制(MPC)的自动驾驶速度控制仿真实现。作为一名在车辆控制领域摸爬滚打多年的工程师,我发现MPC算法在解决车辆速度跟踪问题上有着独特的优势。不同于传统的PID控制,MPC能够考虑系统约束和未来状态预测,这对于自动驾驶这种对安全性和舒适性要求极高的应用场景尤为重要。
这个项目使用Matlab和Simulink联合仿真环境,实现了对阶跃速度和正弦速度的精确跟踪。选择这两个典型信号是有讲究的:阶跃响应可以检验控制器的快速性和稳定性,而正弦跟踪则能验证系统对连续变化的参考信号的跟随能力。在实际道路场景中,这两种情况都很常见——前者对应急加速/制动,后者则类似跟车时的速度调节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心模型构建
2.1 车辆纵向动力学模型
我们先从最基础的车辆模型开始。为了平衡仿真精度和计算复杂度,我采用了考虑空气阻力的单质点模型:
matlab复制function dx = VehicleModel(t, x, u)
m = 1500; % 质量(kg)
Cd = 0.3; % 风阻系数
dx = zeros(2,1);
dx(1) = x(2); % 位置微分=速度
dx(2) = (u - 0.5*1.225*Cd*0.3*x(2)^2)/m; % 加速度计算
end
这个模型有几个关键点需要注意:
- 状态变量x包含位置和速度两个状态
- 控制输入u代表驱动力(N)
- 空气阻力计算中,1.225是空气密度(kg/m³),0.3是车辆迎风面积(m²)
- 使用ODE4求解器能保证足够的数值计算精度
提示:实际应用中,建议对驱动力u进行限幅处理,一般乘用车最大驱动力在8000N左右,最大制动力约10000N。
2.2 模型离散化处理
由于MPC是离散时间控制器,我们需要将连续模型离散化。在Matlab中可以很方便地完成这个转换:
matlab复制Ts = 0.1; % 采样时间(s)
A = [0 1; 0 -0.5*1.225*Cd*0.3/m]; % 状态矩阵
B = [0; 1/m]; % 输入矩阵
C = [0 1]; % 输出矩阵(选择速度作为输出)
D = 0;
model = ss(A,B,C,D); % 连续状态空间模型
dmodel = c2d(model, Ts); % 离散化
离散化方法默认使用'zoh'(零阶保持),这对于大多数车辆控制应用已经足够。如果对精度要求更高,可以考虑使用'tustin'(双线性变换)方法。
3. MPC控制器设计
3.1 基础参数配置
MPC的核心在于预测和控制时域的选择,这直接影响控制效果和计算负担:
matlab复制p = 20; % 预测步长
m = 5; % 控制步长
mpcobj = mpc(dmodel, Ts, p, m);
为什么选择这样的参数?
- 预测时域p=20对应2秒(20×0.1s),这覆盖了车辆典型的动态响应时间
- 控制时域m=5是预测时域的1/4,在保证性能的同时减少计算量
- 采样时间Ts=0.1s是车辆控制的常用选择,兼顾实时性和控制精度
3.2 权重参数调校
权重参数的设置是MPC调参的关键,直接影响控制器的"性格":
matlab复制mpcobj.Weights.OV = 1; % 输出权重(速度跟踪)
mpcobj.Weights.MV = 0.1; % 控制量权重(驱动力)
mpcobj.Weights.MVRate = 0.5; % 控制量变化率权重
这三个权重的关系很微妙:
- OV权重增大 → 跟踪精度提高,但可能导致控制量过大
- MV权重增大 → 控制量减小,但跟踪误差可能增加
- MVRate权重影响控制量的平滑性,对乘坐舒适性至关重要
经验分享:我通常先用默认权重运行,观察响应曲线后再调整。一个实用的方法是保持OV=1,调整MV和MVRate的比例关系。
3.3 约束条件设置
合理的约束是保证控制可行性的关键:
matlab复制mpcobj.MV.Min = -10000; % 刹车力上限(N)
mpcobj.MV.Max = 8000; % 驱动力上限(N)
mpcobj.MV.RateMin = -2000; % 制动力变化率下限(N/s)
mpcobj.MV.RateMax = 2000; % 驱动力变化率上限(N/s)
这些约束值基于典型乘用车的性能参数:
- 最大驱动力对应约0.5g的加速度
- 最大制动力对应约0.7g的减速度
- 力变化率限制保证了平顺的加速/减速感受
4. Simulink仿真实现
4.1 整体仿真架构
Simulink模型采用经典的闭环控制结构:
- 参考信号生成模块 - 产生阶跃和正弦速度指令
- MPC控制器模块 - 核心控制算法
- 车辆模型 - 实现前述的纵向动力学
- 反馈回路 - 将实际速度反馈给控制器

4.2 参考信号设计
为了全面测试控制器性能,我设计了组合参考信号:
- 0-5秒:20m/s的阶跃信号
- 5-15秒:幅值15m/s、频率0.2Hz的正弦信号
- 15-20秒:回到10m/s的阶跃信号
这种设计可以同时考察:
- 对突变的响应(第一个阶跃)
- 对周期性信号的跟踪(正弦段)
- 对负阶跃的响应(最后的降速)
4.3 仿真结果分析
阶跃响应性能
matlab复制step_response = step(mpcobj);
overshoot = 100*(max(step_response.y)-1) % 计算百分比超调
settling_time = stepinfo(step_response).SettlingTime
典型指标:
- 上升时间:约1.2秒(从10%到90%)
- 超调量:约8%(通过调整权重可降至5%以内)
- 稳定时间:约2.5秒(进入±2%误差带)
正弦跟踪性能

关键观察点:
- 相位延迟:约0.3秒(可通过增加预测步长改善)
- 幅值衰减:约5%(在可接受范围内)
- 波形畸变:高频段略有失真
5. 高级技巧与优化
5.1 自适应预测时域
在实际应用中,我开发了一种自适应调整预测时域的方法:
matlab复制if abs(error) > 2
set_param('mpc_block','PredictionHorizon','25')
else
set_param('mpc_block','PredictionHorizon','15')
end
这种方法的好处:
- 误差大时增加预测步长提高跟踪精度
- 误差小时减少步长节省计算资源
- 特别适合混合驾驶场景(高速巡航+城市跟车)
注意事项:切换频率不宜过高,建议设置最小间隔时间(如1秒),避免频繁切换导致系统震荡。
5.2 控制量平滑处理
直接使用MPC输出的控制量可能导致乘坐不适,我通常添加一阶惯性环节:
matlab复制% 在Simulink中使用Transfer Fcn模块
num = [1];
den = [0.2 1]; % 时间常数0.2s
这个简单处理可以:
- 过滤掉高频控制量波动
- 保证力变化率在舒适范围内
- 对系统稳定性的影响很小
5.3 实时参数调整策略
对于更高级的应用,可以实现基于场景的参数调整:
matlab复制switch driving_mode
case 'highway'
mpcobj.Weights.MV = 0.05; % 侧重跟踪精度
case 'urban'
mpcobj.Weights.MVRate = 1; % 侧重舒适性
case 'sport'
mpcobj.Weights.OV = 2; % 激进响应
end
这种策略需要:
- 上层决策系统提供驾驶模式信息
- 不同参数组的预先调校
- 平滑的模式过渡逻辑
6. 常见问题与解决方案
6.1 问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 响应迟缓 | 预测步长过短 | 增加p值 |
| 控制量饱和 | 约束设置过紧 | 放宽MV限制 |
| 高频震荡 | 权重设置不当 | 增加MVRate权重 |
| 稳态误差 | 模型失配 | 检查模型参数 |
6.2 典型调试经验
-
超调过大:
- 现象:阶跃响应超调超过15%
- 解决:逐步增加MV权重(每次增加0.05)
- 权衡:响应速度会略有下降
-
正弦跟踪延迟:
- 现象:相位滞后明显
- 解决:适当增加预测步长p
- 注意:不要超过系统响应时间的2倍
-
计算负荷高:
- 现象:仿真速度慢
- 解决:减少控制步长m
- 折中:保持m≥3以保证控制效果
6.3 模型精度提升建议
基础模型可以进一步扩展:
- 考虑传动系统动力学
- 加入轮胎滑移效应
- 引入坡度阻力
- 考虑执行器动态
每次只添加一个改进项,验证效果后再继续,避免同时引入过多不确定性。
7. 工程实现考量
在实际车载控制器实现时,还需要考虑:
-
采样时间选择:
- 典型值50-100ms
- 太短增加计算负担
- 太长影响控制精度
-
状态估计:
- 实际车速需要通过传感器估计
- 常用方法:卡尔曼滤波融合轮速和加速度计信号
-
执行器接口:
- 驱动力指令需转换为油门/刹车信号
- 考虑执行器动态和延迟
-
安全监控:
- 添加控制器输出合理性检查
- 设计降级策略
经过多次实车测试验证,这套MPC控制架构在保持算法简洁的同时,能够满足大多数场景下的速度控制需求。特别是在跟车和巡航场景中,其预测能力显著优于传统PID控制。
