基于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矩阵防止方向盘抽风。遇到振荡就加微分项权重,响应慢了就砍预测步长。记住,没有银弹参数,得对着实际路测数据反复摩擦。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐