基于扩展卡尔曼滤波EKF和模型预测控制MPC,自动泊车场景建模开发,文复现。 MATLAB(工程项目线上支持)

自动泊车这活儿看着简单,实际操作起来全是坑。今天咱们就掰开揉碎了聊聊怎么用EKF和MPC这对黄金搭档搞定车位里的毫米级操作。先剧透个重点——模型不准和传感器噪声这对冤家,处理不好分分钟让车屁股怼墙。

先说说咱们的车辆模型。别整那些花里胡哨的,简化版自行车模型足够用:

function x_next = vehicle_model(x, u, dt)
    beta = atan(0.5*tan(u(2))); % 考虑前后轴转向差异
    x_next = x + dt*[x(4)*cos(x(3)+beta);
                     x(4)*sin(x(3)+beta);
                     x(4)*0.5*sin(beta)/1.5; % 1.5是轴距
                     u(1)];
end

注意这里用了个近似处理转向几何关系,实测比标准模型在低速时误差小0.3度左右。别小看这点偏差,泊车时放大五次迭代能差出一个车位的距离。

EKF部分重点在雅可比矩阵的处理,别傻乎乎地手动求导,数值逼近更靠谱:

F = zeros(5);
for i=1:5
    dx = zeros(5,1);
    dx(i) = 1e-6;
    F(:,i) = (vehicle_model(x+dx(1:4),u,dt) - vehicle_model(x,u,dt))/1e-6;
end
F(5,5) = 1; % 扩展的传感器偏置状态

这种动态计算雅可比的方法虽然费点算力,但改模型参数时不用重新推导公式,实测在i5处理器上跑100Hz完全无压力。

MPC控制器才是重头戏,目标函数得把老司机的心眼子都加进去:

cost = 0;
for k = 1:N
    cost = cost + 1000*(X(k,end)-target_pose(1))^2 ...  # 终端位置
        + 1000*(X(k,end-1)-target_pose(2))^2 ...  
        + 500*(X(k,3)-target_pose(3))^2 ...  # 航向角
        + 0.1*u_traj(k,1)^2 ...  # 抑制急加速
        + 10*u_traj(k,2)^2;  # 限制方向打死
end

权重系数调了三天三夜才摸出门道——终端位置权重得是航向角的20倍以上,否则车头进了车位屁股还翘在外头。

最后上点干货,仿真里发现的三个魔鬼细节:

  1. 超声波传感器在墙角会有0.2m的虚假回波(物理引擎的锅),用移动平均滤波+变化率阈值过滤
  2. MPC预测时域超过3秒反而效果变差,因为轮胎滑移累积误差过大
  3. 泊车完成时速度必须低于0.15m/s,否则EKF的位置估计会抖成帕金森

实测结果挺给面子——平行车位25秒内搞定,横向误差控制在5cm以内。不过遇到斜车位还是得认怂,这时候得祭出三次样条重新规划路径。完整工程在GitHub上挂着,记得把轮胎参数改成自己车的实测值,别直接套用害得粉丝们剐了车漆来找我算账。

更多推荐