1. 项目概述:基于MPC的车辆横向控制
方向盘突然传来一阵细微震动,自动驾驶系统正在和物理极限较劲。作为一名从事车辆控制算法开发多年的工程师,我经常需要解决这样的问题:如何让车辆精准跟随预定轨迹,同时保持行驶稳定性。模型预测控制(MPC)就像个预判大师,能在车辆还没偏离车道前就计算好最优动作。
这个项目采用二自由度车辆动力学模型,在Simulink环境下实现了车道保持和轨迹跟随功能。核心优势在于:
- 可自定义车辆参数(质量、轴距、轮胎特性等)
- 支持任意目标轨迹输入
- 实时计算最优前轮转角控制量
- 内置执行机构饱和限制保护
从图中单移线工况的测试结果来看,实际轨迹与目标轨迹的最大偏差能控制在0.3米以内。这对于高速公路车道保持(标准要求<0.5米)已经完全够用。
2. 核心模型构建
2.1 二自由度车辆模型解析
二自由度模型是车辆横向动力学分析的黄金标准,它保留了最关键的横摆和侧向运动特性。我们使用的模型方程如下:
matlab复制function dx = vehicleModel(t,x,u)
% 参数区
m = 1573; % 整备质量(kg)
lf = 1.4; % 前轴到质心距离
lr = 1.7; % 后轴到质心距离
C_alpha = 80000; % 轮胎侧偏刚度
% 状态分解
beta = x(1); % 质心侧偏角
r = x(2); % 横摆角速度
% 动力学方程
dx = zeros(2,1);
dx(1) = (-(C_alpha*(lf+lr)/(m*(lf+lr)^2)))*beta + ...
((C_alpha*(lr^2 - lf*lr)/(m*(lf+lr)^2)) - 1)*r + ...
(C_alpha*lf/(m*(lf+lr)^2))*u;
dx(2) = (-(C_alpha*(lf+lr)/((lf+lr)^2)))*beta + ...
(-(C_alpha*(lf^2 + lr^2)/((lf+lr)^2)))*r/(Iz) + ...
(C_alpha*lf/((lf+lr)^2))*u/Iz;
end
这个模型的核心是计算两个状态量的变化率:
- 质心侧偏角β:反映车辆实际运动方向与车头指向的夹角
- 横摆角速度r:车辆绕垂直轴的旋转角速度
关键提示:轮胎侧偏刚度C_alpha对模型精度影响极大。普通乘用车轮胎约在80,000N/rad左右,高性能轮胎可达120,000N/rad。实际项目中需要通过试验数据拟合这个参数。
2.2 模型参数化设计
为了让模型适配不同车型,我们设计了可配置参数接口:
matlab复制classdef VehicleParameters
properties
mass = 1573; % 整备质量(kg)
lf = 1.4; % 前轴到质心距离(m)
lr = 1.7; % 后轴到质心距离(m)
C_alpha = 80000; % 轮胎侧偏刚度(N/rad)
Iz = 2873; % 横摆转动惯量(kg·m²)
max_steer = 25; % 最大转向角(deg)
end
end
实测中发现几个参数敏感度排序:
- 轮胎侧偏刚度 > 2. 轴距分配 > 3. 整车质量
建议优先校准这三个参数。
3. MPC控制器设计
3.1 预测模型构建
MPC的核心是在每个控制周期求解优化问题。我们采用离散化后的状态空间模型作为预测模型:
matlab复制function [A_d, B_d] = discreteModel(vx, Ts)
% 连续状态空间矩阵
A_c = [-(Cf+Cr)/(m*vx), (Cr*lr-Cf*lf)/(m*vx^2)-1;
(Cr*lr-Cf*lf)/Iz, -(Cf*lf^2+Cr*lr^2)/(Iz*vx)];
B_c = [Cf/(m*vx); Cf*lf/Iz];
% 离散化
sys = ss(A_c, B_c, eye(2), zeros(2,1));
sysd = c2d(sys, Ts);
A_d = sysd.A;
B_d = sysd.B;
end
注意:车速vx是时变参数,需要实时更新。建议采用一阶低通滤波处理车速信号,避免高频波动导致预测失准。
3.2 优化问题求解
构造并求解二次规划(QP)问题:
matlab复制function delta = MPC_Controller(x0, refTraj)
% 构造预测矩阵
[A, B] = calcAB(x0); % 线性化模型
Q = diag([10, 1]); % 状态权重
R = 0.1; % 控制量权重
N = 10; % 预测步长
% 构造QP问题
H = blkdiag(kron(eye(N), Q), R*eye(N));
f = zeros(size(H,1),1);
Aeq = [kron(eye(N), A) - eye(N*size(A,1)), kron(eye(N), B)];
beq = -A*x0;
% 求解
options = optimoptions('quadprog','Display','off');
sol = quadprog(H, f, [], [], Aeq, beq, [], [], [], options);
delta = sol(end-N+1); % 取第一个控制量
end
这里有几个关键设计点:
- 使用Kronecker积快速构建大矩阵
- 状态权重Q比控制权重R大两个数量级,强调跟踪精度
- 仅应用预测序列的第一个控制量(后退时域策略)
3.3 执行器饱和处理
实际转向系统存在物理限制,必须在Simulink模型中添加饱和限制:
matlab复制set_param('mpc_lka/SteeringActuator', 'UpperLimit', '25*pi/180');
set_param('mpc_lka/SteeringActuator', 'LowerLimit', '-25*pi/180');
实测表明,超过±25°后会出现:
- 轮胎进入非线性区
- 模型预测失准
- 车辆动态响应迟滞
4. Simulink实现技巧
4.1 模型架构设计
推荐采用分层式架构:
- 上层:轨迹生成模块
- 中层:MPC控制器
- 底层:车辆动力学模型
matlab复制mpc_lka/
├── TrajectoryGenerator % 参考轨迹生成
├── MPC_Controller % 核心算法
├── VehicleDynamics % 二自由度模型
└── ActuatorLimits % 执行器饱和限制
4.2 实时性优化
通过以下手段提升运行效率:
- 代码生成:将MATLAB Function转换为C代码
- 固定步长:建议选择0.02-0.05s步长
- 简化预测时域:通常10-20步足够
性能实测数据:
- 预测时域10步:单步计算0.8ms
- 预测时域20步:单步计算1.5ms
(测试环境:i7-1185G7 @ 3.0GHz)
4.3 参数调试方法
采用分阶段调试策略:
-
第一阶段:基础跟踪
- Q = diag([1, 0.1])
- R = 1
- N = 5
-
第二阶段:抑制超调
- 增加Q(1,1)到10
- 加入速度前馈补偿
-
第三阶段:优化控制量
- 逐步减小R值
- 添加控制量变化率权重
调试口诀:"先保跟踪再抑抖,最后优化控制量"
5. 典型问题排查
5.1 轨迹跟踪振荡
症状:车辆轨迹呈明显正弦波动
可能原因:
- 预测时域过短
- 控制权重太小
- 车速估计不准
解决方案:
- 逐步增加预测步长N
- 适当增大R值
- 检查车速信号滤波参数
5.2 响应迟滞
症状:车辆转向动作明显滞后
可能原因:
- 执行器延迟未补偿
- 模型参数不准
- Q矩阵权重分配不合理
解决方案:
- 在MPC模型中添加延迟补偿
- 重新标定轮胎刚度参数
- 增大Q(2,2)横摆角速度权重
5.3 计算超时
症状:控制周期无法完成计算
可能原因:
- 预测时域过长
- 求解器配置不当
- 代码未优化
解决方案:
- 减少预测步长到10步以内
- 使用'active-set'求解器
- 启用代码生成功能
6. 进阶优化方向
6.1 考虑路面附着系数
改进模型加入μ参数:
matlab复制C_alpha_actual = C_alpha * mu; % mu∈[0.1,1]
可通过以下方式估计μ:
- 基于IMU的横向加速度监测
- 轮胎力观测器
- 视觉路面检测
6.2 多速率控制
采用分层控制策略:
- 上层MPC:50Hz(计算最优路径)
- 底层PID:200Hz(精确转向控制)
6.3 硬件在环测试
推荐配置:
- dSPACE SCALEXIO实时系统
- CarSim车辆模型
- 真实EPS转向器
测试用例设计:
- 单移线测试(50-100km/h)
- 双移线测试
- 正弦停滞测试
在实车测试中我们发现,早晨和下午的转向特性会有微妙差异(温度影响轮胎特性)。因此最终方案增加了在线参数估计模块,每5分钟自动更新一次关键参数。这种细节处理让我们的控制系统在全天候条件下都保持了稳定表现。