carsim与matlab联合仿真, 三车避障轨迹规划, 采用安全距离与碰撞时间触发

张开发
2026/4/22 10:13:19 15 分钟阅读

分享文章

carsim与matlab联合仿真, 三车避障轨迹规划, 采用安全距离与碰撞时间触发
carsim与matlab联合仿真 三车避障轨迹规划 采用安全距离与碰撞时间触发 通过stateflow触发模块控制路径规划 避障函数实现实时路径规划 carsim2020matlab2013b最近在折腾Carsim和Matlab这对黄金搭档做三车避障实验发现用Stateflow搞状态机控制特别有意思。咱们今天就来聊聊怎么让三辆虚拟小车在仿真里聪明地互相躲避关键点在于既要防撞又要保证路径平滑。先上硬菜——整个系统的核心架构长这样% 主仿真循环结构示意 while sim_time total_time [ego_state, car1_state, car2_state] Carsim_GetVehicleStates(); % 获取三车状态 TTC calculate_ttc(ego_state, car1_state); % 碰撞时间计算 safe_flag (TTC threshold) || (distance safe_distance); % 双重触发条件 if safe_flag new_path path_planner(ego_state, obstacles); % 实时路径规划 control_cmd trajectory_tracker(new_path); % 轨迹跟踪 else control_cmd lane_keeping_controller(); % 车道保持 end Carsim_SendControl(control_cmd); % 控制指令下发 end这个框架里最带劲的就是calculate_ttc函数它决定了什么时候该触发避障。咱们的实现里加了个速度矢量夹角判断避免误触发function ttc calculate_ttc(ego, target) rel_pos target(1:2) - ego(1:2); rel_vel target(3:4) - ego(3:4); closing_speed dot(rel_pos/norm(rel_pos), rel_vel); if closing_speed 0 % 仅处理相向而行的情况 ttc norm(rel_pos) / closing_speed; else ttc inf; % 远离状态不触发 end endStateflow的状态机设计是个技术活我折腾了三个版本才搞定。最终方案用并行状态处理不同方向的威胁注意看状态转移条件里的after(0.5,sec)这个防抖设计能避免传感器噪声导致的误切换!Stateflow状态机示意图路径规划部分用了五次多项式曲线好处是能保证加速度连续。但要注意系数求解时的数值稳定性问题function path quintic_planner(start, goal, T) A [1, 0, 0, 0, 0, 0; 0, 1, 0, 0, 0, 0; 0, 0, 2, 0, 0, 0; 1, T, T^2, T^3, T^4, T^5; 0, 1, 2*T, 3*T^2, 4*T^3, 5*T^4; 0, 0, 2, 6*T, 12*T^2, 20*T^3]; b_x [start.x; start.vx; start.ax; goal.x; goal.vx; goal.ax]; coeff_x A\b_x; % 建议用mldivide代替inv % Y轴同理... end实际调试时发现Carsim2019之后的版本对Simulink接口做了改动在Matlab2013b里需要手动指定数据类型。这里有个坑车辆输出结构体里的GPS信号要转成直角坐标系记得加上地球曲率修正项。carsim与matlab联合仿真 三车避障轨迹规划 采用安全距离与碰撞时间触发 通过stateflow触发模块控制路径规划 避障函数实现实时路径规划 carsim2020matlab2013b测试时遇到最诡异的问题是避障后车辆会蛇形走位后来发现是规划周期与控制周期不同步导致的。解决办法是在Stateflow里加了个缓存队列用线性插值对齐时间戳。最后上个效果对比图蓝色是原始路径红色是避障轨迹可以看到在TTC1.2秒时系统触发了绕行策略同时保证横向加速度不超过2.5m/s²的安全阈值。!避障轨迹对比图建议调试时先把安全距离设大点逐步缩小观察系统反应。下次打算试试把规划算法换成贝塞尔曲线据说对动态障碍物效果更好有试过的朋友欢迎交流心得~

更多文章