基于MPC/模型预测控制的二自由度车辆轨迹跟随与车道保持Simulink模型
·
基于MPC/模型预测控制的轨迹跟随,横向控制模型,车道保持,simulink模型 采用二自由度车辆动力学模型,可以自定义车辆参数,自定义目标轨迹,图中为单移线目标轨迹与实际轨迹偏差

方向盘突然传来一阵细微震动,自动驾驶系统正在和物理极限较劲。咱们今天要聊的模型预测控制(MPC)就像个预判大师,在车辆还没偏离车道前就计算好最优动作——这事儿在Simulink里玩起来特别带感。

先甩个二自由度车辆模型镇楼:
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
这坨方程看着唬人,核心就干两件事:计算质心侧偏角变化率和横摆角速度变化率。注意第14行的u是前轮转角输入,这个才是咱们的控制变量。

MPC控制器要干的就是在每个控制周期解这个优化问题:
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
这里有个骚操作:用kron函数快速构造预测矩阵。权重系数Q比R大一个量级,说明更注重轨迹跟踪精度而非控制量节省——毕竟安全第一。

在Simulink里搭模型时,记得给执行机构加饱和限制。实测发现方向盘转角超过±25度后轮胎就进入非线性区,这时候模型要加个saturation模块:
% 执行器饱和限制
set_param('mpc_lka/SteeringActuator', 'UpperLimit', '25*pi/180');
set_param('mpc_lka/SteeringActuator', 'LowerLimit', '-25*pi/180');
单移线工况跑出来的效果贼有意思——实际轨迹会在目标轨迹两侧蛇形,但偏差不超过0.3米。把预测时域从10步调整到20步,振幅立刻减小,但CPU占用率飙升50%。这时候得在控制精度和计算开销之间找平衡点。
最后给个调参秘籍:先调Q矩阵让车辆别跑偏,再调R矩阵防止方向盘抽风。遇到振荡就加微分项权重,响应慢了就砍预测步长。记住,没有银弹参数,得对着实际路测数据反复摩擦。
更多推荐
所有评论(0)