在自动驾驶技术快速发展的今天,局部路径规划作为车辆决策系统的核心模块,直接关系到行车安全性和乘坐舒适性。这个基于Simulink的仿真项目,完整实现了从环境感知到路径跟踪的闭环流程,特别针对城市道路中常见的静态/动态障碍物避让场景。作为一名从事自动驾驶算法开发多年的工程师,我认为这个仿真框架最大的价值在于:它用可视化的方式揭示了人工势场法(APF)在实时避障中的工作原理,同时提供了可直接移植到实际项目的模块化设计模式。
系统采用典型的感知-决策-控制三层架构:
code复制环境感知层 → 决策规划层 → 运动控制层
↑ ↓
车辆状态反馈 ← 执行器
具体实现上包含以下核心模块:
输入信号:
输出信号:
提示:在Simulink中建议使用Bus Signal封装接口,避免信号线杂乱。我通常会创建名为"VehicleBus"和"ObstacleBus"的总线类型来规范数据结构。
采用经典的自行车模型(Bicycle Model)简化车辆动力学:
code复制ẋ = v·cos(θ+β)
ẏ = v·sin(θ+β)
θ̇ = (v·sinβ)/Lr
其中 β = arctan((Lr/(Lf+Lr))·tanδ)
参数说明:
在Simulink中搭建时要注意:
实测中发现,当车速超过5m/s时,离散化误差会显著增大。因此建议在模型配置中选用ode4(Runge-Kutta)求解器,固定步长设置为0.01s。
APF算法的核心是构造两种虚拟力场:
matlab复制% 引力场公式
U_att = 0.5 * k_att * (dx^2 + dy^2)
F_att = -k_att * [dx; dy]
% 斥力场公式
U_rep = 0.5 * k_rep * (1/d_obs - 1/d0)^2 (当d_obs<d0)
F_rep = k_rep * (1/d_obs - 1/d0) * (1/d_obs^3) * [dx; dy]
经过多次测试,推荐参数范围:
避坑指南:斥力增益过大容易导致路径震荡,建议先用MATLAB脚本单独测试势场函数,再移植到Simulink。
当车辆陷入势场局部极小时(如U型障碍),可采用以下策略:
在本次模型中,我采用第一种方法,在检测到车辆停滞时(速度<0.1m/s持续1s),在原始目标点附近添加随机偏移量。
传统Pure Pursuit的lookahead距离固定,在弯道表现不佳。改进方案:
matlab复制Ld = min(Ld_max, max(Ld_min, k*v + Ld0))
其中:
通过调整前馈控制增益可改善跟踪精度:
实测数据显示,改进后的跟踪误差可降低40%以上(90°弯道场景下误差从0.8m降至0.5m内)。
建议使用"Scenario Reader"块导入OpenDRIVE格式道路:
matlab复制scenario = drivingScenario;
road(scenario, [0 0; 100 0], 'Lanes', lanespec(2));
actor(scenario, 'Position',[30 -2], 'Length',4.7, 'Width',1.8);
在MATLAB Function块中编写势场计算:
matlab复制function [F_total, U] = APF(vehiclePos, goalPos, obstacles)
% 计算引力
F_att = k_att * (goalPos - vehiclePos);
% 计算每个障碍物的斥力
F_rep = zeros(2,1);
for i = 1:size(obstacles,1)
dist = norm(vehiclePos - obstacles(i,1:2)');
if dist < d0
F_rep = F_rep + k_rep*(1/dist-1/d0)*...
(vehiclePos-obstacles(i,1:2)')/dist^3;
end
end
F_total = F_att + F_rep;
U = norm(F_att) + norm(F_rep);
end
静态障碍测试:
动态障碍测试:
| 指标 | 数值 |
|---|---|
| 最大计算延迟 | 9.2ms |
| 平均路径曲率 | 0.12m⁻¹ |
| 急动度(Jerk) | <2.5m/s³ |
| 成功率(100次测试) | 92% |
问题1: 车辆轨迹出现锯齿状震荡
问题2: 避障时碰撞障碍物
扩展方案:
将Simulink模型生成C代码后:
我在实际项目中验证过,这种HIL测试能发现约70%的路径规划逻辑缺陷,大幅降低实车测试风险。