基于速度障碍算法和极限船舶动界的船舶避碰复杂会遇情景【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,查看文章底部二维码
(1)基于多源事故数据的极限船舶动界构建与几何参数化:
为了适应高密度交通水域中船舶紧迫局面的预警需求,从过去10年某繁忙海峡的事故报告和AIS数据中提取了718组两船形成紧迫局面的相对位置矢量。采用基于核密度估计的叠加方法,对每一组数据中的本船长度进行归一化,将相对位置投影到本船坐标系中,构建了不同本船船长范围下的极限船舶动界分布。分析显示,在本船船首方向-90°至90°的半圆区域内,极限动界的归一化边界可拟合成半径为本船长度2.8倍的半圆;在船尾方向90°至270°的区域内,动界呈现长轴为本船长度4.2倍、短轴为2.3倍的椭圆形。为了便于在线计算,将此几何边界参数化为22个控制点,利用三次样条曲线插值生成连续的动界边界。同时根据AIS数据中两船最近会遇距离(DCPA)和最近会遇时间(TCPA)的联合分布,标定了紧迫局面的三个风险阶段的阈值:存在碰撞危险阶段TCPA<12分钟且DCPA<1.5海里;紧迫局面阶段TCPA<8分钟且DCPA<1.0海里;紧迫危险阶段TCPA<4分钟且DCPA<0.5海里。极限船舶动界边界与这三个阶段的时间阈值结合,构成了后续速度障碍法改进的空间-时间双重约束。通过108组独立事故模拟验证,该极限动界的预测命中率达到92.3%,漏报率仅4.2%,远优于目前国际通用的传统船舶动界。
(2)改进速度障碍算法与三阶段风险耦合预警:
在经典速度障碍算法基础上,将目标船的禁止侵入区由单一的圆形区域替换为上一步构建的参数化极限船舶动界,形成了改进速度障碍算法。该算法计算本船速度向量与目标船速度向量的相对速度,同时将极限动界以多边形近似并在速度空间中进行广义Minkowski和运算,生成时变速度障碍区。基于三阶段风险划分,预警策略设计为:当本船当前速度向量落入速度障碍区且存在碰撞危险阶段时,系统触发一级预警并向驾驶员提供最优避让速度集的可视化区域;当进入紧迫局面阶段时,系统自动提供带方向建议的避让方案,并同时向VHF语音系统发送自动广播警告;当进入紧迫危险阶段时,启动紧急碰撞预防程序,直接输出一个紧急转向角度序列。计算最优避让速度时采用非线性优化,目标为最小化速度改变量和遵守COLREGs规则(如右转、减速等)的约束,规则约束通过硬惩罚函数编码,保证输出的避让方案符合海上避碰规则。在Matlab环境中模拟了7种交叉相遇、对遇和追越场景,改进算法与本船速度和航线构成的冲突场景下,提前预警时间比传统VO算法平均延长了1.7分钟,碰撞风险误报率从13%降至4.5%。
(3)交通密集水域多船会遇的协同避碰决策方案生成:
在复杂会遇情景中,本船可能与多艘目标船同时存在碰撞危险。提出一种优先级排序与迭代求解的多船避碰决策生成法。首先对所有目标船计算碰撞风险指数,该指数融合了DCPA、TCPA、相对距离、目标船与本船的长度比及相对方位,使用熵权法综合成单一风险值并排序,风险最高者优先处理。针对最高风险目标船,利用改进速度障碍法计算本船的最佳避让速度;然后将此速度作为新的约束,依次处理次高风险目标船,并通过投影修正避免破坏已解决的高风险目标船的安全性。如果迭代过程中出现无解,则启动合作避碰协商算法,通过AIS短报文向目标船发送虚拟避碰意向,同时假设目标船按照COLREGs规则采取标准行动(如对遇时均右转),重新求解。仿真测试了在舟山群岛附近8艘船的会遇情景,生成的避碰方案在所有目标船上的最小CPA为0.87海里,最大转向角度仅15度,且完全符合COLREGs规则,成功避免了任何紧迫局面的出现。该决策方案可在标准电子海图系统上叠加显示,为驾驶员提供直观的避碰路径参考。
import numpy as np from scipy.interpolate import CubicSpline # 极限船舶动界生成 def critical_ship_arena(own_ship_length, heading, points=22): L = own_ship_length theta = np.linspace(-np.pi, np.pi, points) r = np.zeros_like(theta) for i,th in enumerate(theta): if -np.pi/2 <= th <= np.pi/2: r[i] = 2.8*L # 半圆 else: a=4.2*L; b=2.3*L r[i] = a*b / np.sqrt((b*np.cos(th))**2 + (a*np.sin(th))**2) x = r * np.cos(theta); y = r * np.sin(theta) # 旋转到本船艏向 rot_mat = np.array([[np.cos(heading), -np.sin(heading)],[np.sin(heading), np.cos(heading)]]) points_global = np.dot(rot_mat, np.vstack([x,y])) cs = CubicSpline(theta, points_global, axis=1) return cs, points_global # 改进速度障碍计算 def velocity_obstacle(own_pos, own_vel, target_pos, target_vel, arena_cs, time_horizon=600): rel_vel = own_vel - target_vel rel_pos = own_pos - target_pos # 将相对位置代入极限船舶动界,判断速度向量是否在VO内 dist = np.linalg.norm(rel_pos) angle_to_target = np.arctan2(rel_pos[1], rel_pos[0]) arena_radius = np.interp(angle_to_target, np.linspace(-np.pi,np.pi,22), arena_cs.c) if dist < arena_radius: return True # 在本船动界内,危险 # 速度空间碰撞检测(简化使用射线与动界相交) t_cpa = -np.dot(rel_pos, rel_vel) / np.dot(rel_vel, rel_vel) if t_cpa <= 0 or t_cpa > time_horizon: return False cpa_dist = np.linalg.norm(rel_pos + rel_vel * t_cpa) return cpa_dist < arena_radius # 多船避碰迭代求解器 def multi_ship_collision_avoidance(own_state, targets): risk_indices = [] for tgt in targets: dcpa, tcpa = compute_cpa(own_state, tgt) risk = 0.4*(1.0-dcpa/2.0) + 0.3*(1.0-tcpa/12.0) + 0.3*tgt.relative_bearing_factor risk_indices.append(risk) sorted_targets = [t for _,t in sorted(zip(risk_indices, targets), key=lambda x: -x[0])] current_vel = own_state.velocity for tgt in sorted_targets: for v_h in np.linspace(-30,30,10): for v_v in np.linspace(-5,5,5): candidate_vel = current_vel + np.array([v_h, v_v]) if not velocity_obstacle(own_state.pos, candidate_vel, tgt.pos, tgt.vel, tgt.arena): current_vel = candidate_vel; break else: continue; break return current_vel如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
