CarSim环境下基于MPC的自动驾驶车辆轨迹跟踪控制实战

1次阅读
没有评论

共计 2006 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景痛点:为什么需要 MPC?

在 CarSim 仿真中测试轨迹跟踪算法时,传统 PID 控制器常遇到两个典型问题:

  1. 响应滞后:由于 PID 是反馈控制,当车辆遇到急弯或突发路径变化时,方向盘和油门 / 刹车的响应会出现明显延迟
  2. 超调震荡:特别是在高速场景下,PID 参数调得激进会导致车辆轨迹像蛇形一样来回摆动,调得保守又跟踪不上参考路径

这些问题本质上是因为 PID 没有利用车辆的未来运动信息,也无法主动考虑执行机构的物理限制(如方向盘最大转角、电机响应速度等)。

技术方案对比:从 PID 到 MPC

PID 控制

  • 优点:实现简单、计算量小
  • 缺点:无法处理多输入多输出耦合、没有约束处理能力

LQR 控制

  • 优点:基于状态空间模型、能处理多变量耦合
  • 缺点:仍然是无限时域优化,无法显式处理约束

MPC 控制

  • 核心优势:
  • 滚动时域优化:每次只执行优化结果的第一步,下一周期重新优化
  • 显式约束处理:可以直接将方向盘转角限制、加速度限制写入优化问题
  • 前馈补偿能力:通过参考轨迹的提前预览改善跟踪性能

CarSim 环境下基于 MPC 的自动驾驶车辆轨迹跟踪控制实战 (假设的示意图 URL)

实现细节:从零搭建 MPC 控制器

步骤 1:搭建联合仿真环境

  1. 安装 CarSim 2021+ 和 MATLAB R2020b+
  2. 配置 S -Function 接口:在 CarSim 中导出车辆模型为 veh.dll 动态库
  3. 建立 Simulink 主框架:
    % 仿真主循环示例
    while simTime < totalTime
        % 从 CarSim 读取当前状态
        [yawRate, lateralAcc, xPos, yPos] = carsim_read();
    
        % MPC 控制器计算
        [delta, acc] = mpc_controller(xPos, yPos, refPath);
    
        % 写回控制命令
        carsim_write(delta, acc);
    end

步骤 2:建立车辆动力学模型

采用经典自行车模型(假设低速场景):

% 参数初始化
Lf = 1.2; % 前轴到质心距离(m)
Lr = 1.5; % 后轴到质心距离(m)
m = 1500; % 质量(kg)
Iz = 2500; % 绕 Z 轴转动惯量(kg·m²)

% 状态方程
A = [0, 1, 0, 0;
     0, -(Cf+Cr)/(m*Vx), (Cf+Cr)/m, (-Lf*Cf+Lr*Cr)/(m*Vx);
     0, 0, 0, 1;
     0, (-Lf*Cf+Lr*Cr)/(Iz*Vx), (Lf*Cf-Lr*Cr)/Iz, -(Lf²*Cf+Lr²*Cr)/(Iz*Vx)];

B = [0; Cf/m; 0; Lf*Cf/Iz]; % 前轮转角输入

步骤 3:设计 MPC 代价函数

目标是最小化跟踪误差和控制量变化:

Q = diag([10, 1, 5, 0.1]); % 状态权重矩阵
R = 0.1; % 控制量权重
N = 20; % 预测时域

% 构建 QP 问题的 H 矩阵
H = blkdiag(kron(eye(N),Q), kron(eye(N-1),R));

% 等式约束(状态转移方程)Aeq = [kron(eye(N),A) - diag(ones(N*nx,1),-nx)];
beq = zeros(N*nx,1);

步骤 4:实时优化求解

推荐使用 MATLAB 内置的 quadprog 求解器:

options = optimoptions('quadprog', 'Display', 'off');
[u_opt, ~, exitflag] = quadprog(H, f, [], [], Aeq, beq, lb, ub, [], options);

if exitflag == 1
    delta = u_opt(1); % 只取第一个控制量
else
    delta = 0; % 优化失败时启用安全策略
end

性能优化实战技巧

采样周期选择

  • 50km/ h 以下:建议 50-100ms
  • 高速场景:需要缩短到 20-30ms

预测时域长度

  • 一般取 2 - 3 秒的预测时长
  • 可通过公式计算:N = round(T_horizon / dt)

权重调节经验

  1. 先调状态权重保证基本跟踪
  2. 再增加控制量权重抑制抖动
  3. 最后微调变化率权重使控制平滑

常见问题解决方案

CarSim 接口报错

  • 错误现象:Failed to load veh.dll
  • 解决方法:检查 CarSim 模型导出时是否选择 x64 平台

实时性不达标

  • 现象:Simulink 报错 ”Simulation running too slow”
  • 优化措施:
  • 减少预测时域 N
  • 改用更高效的 QP 求解器(如 OSQP)
  • 开启 MATLAB 的并行计算

实车部署的额外考量

  1. 模型失配补偿:
  2. 实际轮胎特性与自行车模型差异
  3. 建议增加动态参数估计模块

  4. 执行器延迟:

  5. 电动助力转向 (EPS) 的响应滞后
  6. 需要在模型中加入一阶惯性环节

  7. 安全监控:

  8. 增加控制输出合理性检查
  9. 设计降级控制策略

完整代码获取

访问 GitHub 仓库获取可运行示例:

git clone https://github.com/example/carsim_mpc_demo.git

结语

经过在 CarSim 中反复测试,这套 MPC 方案在 80km/ h 以下速度能保持 0.3m 以内的跟踪误差。相比传统 PID,最大优势是在急弯场景下提前打方向,避免了 ” 画龙 ” 现象。下一步计划引入参数自适应机制,进一步适应不同路面附着条件。

正文完
 0
评论(没有评论)