自动驾驶,自适应巡航+prescan联合仿真模型教程资料
自动驾驶开发者手记:用Prescan玩转自适应巡航
最近在工作室折腾ACC(自适应巡航)的联合仿真,发现用Prescan做场景模拟确实能省不少实车测试成本。今天咱们直接上干货,聊聊怎么在Prescan里搭个ACC仿真环境,再配合Simulink整点控制逻辑。
先丢个经典场景:假设前方有辆慢车,自车得自动调整速度保持安全距离。Prescan负责生成传感器数据(雷达/摄像头),Simulink负责控制算法,中间靠TCP/IP通信传数据。
第一步:Prescan场景搭建
打开Prescan,拖个Straight Road场景,放两辆车——前车用DemoCar,自车用ACCVehicle(自带雷达传感器)。重点在雷达参数设置:
Radar: - Range: 150m - Horizontal FOV: 15deg - Update rate: 20Hz这里别开太高分辨率,否则仿真速度感人。建议先用低精度跑通逻辑,再逐步调参。
第二步:Simulink控制器
Prescan导出的模型里会有一个VehicleDynamic模块,咱们需要自己写控制逻辑。核心是PID速度控制+安全距离计算。
function [throttle, brake] = ACC_Controller(v_ego, v_target, distance, gap) % PID参数(随便调的,实际得用Ziegler-Nichols法) Kp = 0.8; Ki = 0.01; Kd = 0.05; % 安全距离模型(时间间隔取2s) safe_distance = v_ego * 2 + 5; % 误差计算 if distance < safe_distance error = (safe_distance - distance) + (v_target - v_ego); else error = v_target - v_ego; end % PID输出 throttle = Kp*error + Ki*error*dt + Kd*(error - prev_error)/dt; brake = (throttle < 0) ? abs(throttle) : 0; % 负油门视为刹车 end这段代码的坑点:
dt要用Simulink的时钟模块获取,别手写固定值;- 实际项目中得加抗积分饱和逻辑,否则长下坡油门能给你积分到爆表;
- 安全距离模型可以换成TTC(Time to Collision)更靠谱。
联合仿真翻车实录
第一次跑的时候自车直接追尾——原因是Prescan的坐标系和Simulink的转向角符号相反(Prescan用右手系,Simulink默认左手)。解决办法:在数据接口层加个符号转换模块,或者直接改控制算法的输出符号。
调试技巧
- 用Prescan的
Experiment Manager实时修改变量,比如前车速度; - Simulink里加个
Scope模块盯住油门/刹车信号,避免控制量突变; - 如果通信丢包,检查Prescan的
IPGDriver版本是否匹配,必要时重装C++运行库。
最后说两句
联合仿真最大的乐趣在于“虚拟翻车”——代码写错顶多崩个进程,比真车撞墙便宜多了。不过也别太依赖仿真,雷达噪声、路面摩擦系数这些参数一旦不准,仿真结果能把你骗得团团转。
(代码和模型已传Github,评论区自取。下期讲讲怎么用CARLA玩强化学习控车,有人想看吗?)
(注:实际开发需根据Prescan 2022.4和Matlab 2023a版本调整接口)