基于模型预测控制的无人驾驶车辆轨迹跟踪问题研究,matlab 附有MATLAB程序与详细的建模过程,研究车辆转向的同学可以作为参考

自动驾驶里有个特有意思的难题:怎么让车像老司机一样丝滑地跟着预定路线跑?今儿咱们聊聊用模型预测控制(MPC)搞轨迹跟踪的实战操作,手把手带各位在Matlab里实现这个控制逻辑。

先看个真实场景——过急弯时方向盘应该打多少度?传统PID控制容易因为延迟导致"画龙",这时候就得用能预判未来的MPC。咱们先建个车辆动力学模型:

% 二自由度单车模型参数
m = 1573;       % 质量(kg)
Iz = 2873;      % 绕Z轴转动惯量
lf = 1.1;       % 前轴到质心距离
lr = 1.58;      % 后轴到质心距离
Caf = 80000;    % 前轮总侧偏刚度
Car = 80000;    % 后轮总侧偏刚度

这模型考虑了横摆运动和侧向动力学,比单纯的自行车模型更贴近真实车辆特性。重点在于状态方程的设计:

function dx = vehicleModel(x, u, params)
    % 状态量: [横向误差; 横摆角误差; 横摆角速度; 纵向速度]
    % 控制量: 前轮转角
    beta = atan((lr*tan(u))/(lf+lr));
    dx = zeros(4,1);
    dx(1) = x(4)*sin(x(2));  % 横向误差变化率
    dx(2) = x(3) - x(4)/params.lr*sin(beta);  % 横摆角误差
    dx(3) = (params.lf*params.Caf*(beta - x(2))...
           - params.lr*params.Car*x(3)/x(4))/params.Iz;  % 横摆角加速度
    dx(4) = (params.Caf*(beta - x(2))...
           + params.Car*x(3)/x(4))/params.m;  % 纵向加速度
end

这里有个坑——当车速接近零时会出现除零错误,所以在实际部署时要加个最小速度阈值。接下来是MPC核心的优化问题设置:

% 构建优化问题
for k = 1:N
    cost = cost + (x_k(1)-ref_traj(k,1))^2*Q(1) +...  % 横向误差
                  x_k(2)^2*Q(2) +...                 % 角度误差
                  u_k^2*R;                           % 控制量
    if k < N
        % 添加动力学约束
        opti.subject_to(x(:,k+1) == RK4(x(:,k), u_k, Ts, @vehicleModel));
    end
end
% 方向盘转角限制
opti.subject_to(-30*pi/180 <= u <= 30*pi/180);

这里用了四阶龙格库塔法保证离散化精度,比欧拉法更稳定。注意权重矩阵Q的选择——建议先把横向误差的权重设为1,其他参数按量级调整,比如角度误差可能比位置误差小两个数量级。

基于模型预测控制的无人驾驶车辆轨迹跟踪问题研究,matlab 附有MATLAB程序与详细的建模过程,研究车辆转向的同学可以作为参考

最后看主控制循环怎么跑:

while sim_time < total_time
    % 获取当前状态
    current_state = [e_lat; e_theta; r; vx];
    
    % 求解MPC问题
    sol = opti.solve();
    u_opt = sol.value(u_mpc);
    
    % 应用首个控制量
    delta = u_opt(1);
    [t_out, x_out] = ode45(@(t,x) vehicleModel(x,delta,params),...
                          [0 Ts], current_state);
    
    % 更新状态
    e_lat = x_out(end,1);
    e_theta = x_out(end,2);
    r = x_out(end,3);
    vx = x_out(end,4);
end

实测发现采样周期超过0.2秒就会明显影响跟踪效果,建议控制在50-100ms。有个骚操作是在线调整预测时域——直道用短时域提升计算速度,弯道自动延长时域增强稳定性。

最后放个实测效果:在90km/h下过S弯,横向误差能控制在0.3米以内。不过MPC对模型精度敏感,建议同时做参数辨识或者用鲁棒MPC改进。代码里可以加个路面附着系数估计模块,这样遇到湿滑路面也能hold住。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐