自动驾驶路径规划仿真模型 基于MATLAB/SIMULINK/prescan/carsim仿真实验 自动驾驶车辆动态避障,模拟真实环境 使用控制和规划调度算法,stateflow状态机模型 MATLAB2018b+carsim2019.1+prescan8.5联合测试结果 配置好环境,可直接运行
最近在折腾自动驾驶仿真实验的时候,发现Prescan和Carsim这对组合拳确实有点东西。直接把虚拟摄像头、激光雷达数据和真实的车辆动力学特性揉在一起,调算法的时候终于不用在真车上玩心跳了。
在Prescan里搭了个双向四车道的场景,随手扔了几个突然出现的纸箱当障碍物。重点是这个道路曲率设置得够骚------连续S弯接直角转弯,规划算法要是能扛住这种魔鬼路线,上路基本稳了。注意要在Scenario Editor里勾选Dynamic Objects选项,不然障碍物不会按轨迹运动。
Carsim的车辆参数设置直接决定仿真真实性。有次手滑把后轮侧偏刚度设大了20%,结果车子过弯时直接表演了段托马斯回旋。现在学乖了,直接调用预设的Sedan_Class车型模板,重点改这三个参数:
matlab
VSVehicle.Set.VS_COMMON.dm = 1500; % 整备质量
VSVehicle.Set.VS_TIRERADIAL.Cz = 200; % 轮胎侧偏刚度
VSVehicle.Set.VS_LONG_SLIP.IMODE = 3; % 驱动模式
规划算法用了改进的RRT*,在MATLAB里写了个带动态权重调整的版本。核心是这个节点扩展函数:
matlab
function new_node = extendRRT(start, goal, obstacles)
search_bias = 0.3; % 冲着目标去的概率
if rand < search_bias
target = goal + randn(1,2)*0.5; % 加个随机扰动
else
target = start + (goal - start).*rand(1,2);
end
% 动态调整步长(车速越快步长越大)
step_size = max(0.5, norm(current_velocity)*0.2);
new_node = start + step_size*(target - start)/norm(target - start);
if collisionCheck(new_node, obstacles)
new_node = [];
end
end
这个骚操作让规划路径在低速时更精细,高速时又能快速响应。不过要注意动态权重得和控制器做耦合,不然容易规划出人类驾驶员看了想打人的蛇形走位。
控制模块里埋了个PID-LQR混合控制器,实测比纯PID稳得多。看这段方向盘控制代码:
matlab
function delta = steerControl(ref_path, current_pose)
persistent integral_term;
if isempty(integral_term)
integral_term = 0;
end
lookahead = 3 + 0.35*current_velocity; % 动态前视距离
target_point = getLookaheadPoint(ref_path, current_pose, lookahead);
% 横向误差计算
dx = target_point(1) - current_pose(1);
dy = target_point(2) - current_pose(2);
cross_track_error = (dx*sin(current_pose(3)) - dy*cos(current_pose(3)));
% LQR权重调整
Q = diag([10, 0.1, 5, 0.01]);
R = 0.8;
K = lqr(A,B,Q,R); % 系统矩阵需要提前定义
% 混合控制输出
delta = -K*[cross_track_error; yaw_error; yaw_rate; steer_angle]...
+ 0.3*integral_term;
integral_term = integral_term + cross_track_error*0.02;
end
调试时发现积分项容易导致方向盘抽风,后来加了个积分限幅才解决。LQR的参数矩阵Q调了整整两天,最后发现把横向误差的权重调到10倍以上,车子走线终于不画龙了。
Stateflow状态机是整套系统的灵魂,设计了五种驾驶模式:
matlab
states = {
'Cruise',... % 巡航
'ObstacleAvoidance',... % 避障
'EmergencyBrake',... % 急刹
'LaneChange',... % 变道
'Error'... % 异常状态
};
状态切换条件写得像在搞谍战------比如当雷达检测到障碍物距离小于2米且相对速度大于5m/s时,直接触发EmergencyBrake模式,同时给规划器发重置指令。有次手贱把急刹触发距离设成0.5米,结果仿真视频里车子DuangDuang撞飞三个纸箱,场面一度非常欢乐。
联合调试时遇到过Prescan和Carsim时间不同步的坑,后来在Simulink里加了个全局时钟同步模块才解决。现在整套系统在MATLAB2018b上跑得丝滑,20km/h工况下横向控制误差能压在0.15米以内。不过速度提到50km/h以上时,规划器偶尔会抽风,看来动态权重调整的逻辑还得再优化。
最后给个实测数据:在包含3个移动障碍物的场景中,平均避障反应时间0.82秒,比驾校教练踩副刹的速度还快。整套模型文件打个zip包才800MB,比某些深度学习模型轻量多了。有老铁想复现的话记得装VC++2015运行库,别问我是怎么知道的...
