【AUV任务分配】自组织映射SOM+Dubins曲线水下机器人多目标任务分配MATLAB仿真(含洋流、障碍物约束)
发布时间:2026/10/27 0:10:42 锦皓数字建站
`)
✅作者简介热爱科研的Matlab仿真开发者擅长数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 往期回顾关注个人主页Matlab科研工作室 关注我领取海量matlab电子书和数学建模资料个人信条格物致知,完整Matlab代码获取及仿真咨询内容私信。 内容介绍大家好今天给大家带来一套面向水下 AUV自主水下航行器的多目标任务分配 MATLAB 仿真代码。这套方案采用SOM 自组织映射神经网络作为任务分配核心区别于传统匈牙利算法、遗传算法等优化方法属于自组织、分布式的任务指派思路同时结合 Dubins 曲线实现带航向约束的轨迹生成支持圆形障碍物避障、洋流扰动、单机器人负载上限约束非常适合水下集群协同作业方向的课程设计、毕设和算法基线验证。很多做 AUV 协同的同学容易踩一个坑只做静态任务点的距离最优分配忽略水下航行器本身的运动特性。AUV 不是可以瞬间转向的质点它存在最小转弯半径出发和到达都带有航向角约束两点之间不能直接用欧氏距离评价代价。这份代码最大的亮点就是把任务分配和运动轨迹代价Dubins 路径长度绑定在一起同时引入障碍物、洋流、单机任务上限多重约束更贴近真实水下作业场景。一、项目整体概述这套仿真系统解决的问题给定多台 AUV 机器人、多个水下任务目标点在存在障碍物、洋流干扰、AUV 最小转弯半径限制、单机任务数量上限的条件下自动把目标任务分配给合适的 AUV并且生成满足航向约束的 Dubins 航行轨迹。核心实现模块SOM 自组织映射神经网络作为任务分配主体竞争获胜神经元机制完成目标指派Dubins 曲线轨迹生成适配 AUV 非完整约束起点、终点都携带航向角障碍物代价判断函数分配时规避障碍物不生成穿过障碍的路径洋流扰动模型可开启洋流对 AUV 位置更新的偏移影响负载约束机制限制单台 AUV 最多承接任务数量避免任务过载任务监控模块记录每台 AUV 承接任务数量、累计航行里程可视化绘图初始位置分布图、任务分配连线图、轨迹实时绘制。参数模式可选lineFlag0两点之间直线距离适合理想质点模型对比lineFlag1Dubins 曲线机器人和目标都带航向角最贴合 AUV 场景lineFlag2仅机器人带航向角目标点无航向约束洋流开关 currentFlag0 关闭洋流1 启用洋流偏移ObstacleFlag障碍物显示开关圆形障碍物模型。✅ 已实现功能多 AUV、多任务点初始化支持自由增减机器人与目标数量SOM 竞争机制每个任务点寻找代价最小的 AUV 作为获胜单元邻域权值更新完成自组织映射迭代Dubins 路径计算输出路径实际长度作为分配代价而不是简单欧氏距离障碍物检测如果 Dubins 路径穿过障碍物会抬高代价优先避开障碍负载上限约束防止某一台 AUV 被分配过多任务洋流扰动叠加到 AUV 位置更新过程实时绘图输出分配连线与航行轨迹。⚠️ 方案本身存在的局限适合写论文研究缺口SOM 用于任务分配属于启发式自组织方法有它固有的短板SOM 是竞争学习机制不能保证全局最优分配更容易收敛到局部较优解邻域参数 r、学习率 B 需要人工调参参数敏感不同地图场景适配性差障碍物仅做代价惩罚没有在线重规划任务分配完成后路径固定没有动态目标、动态障碍物当前所有任务点、障碍物都是静态没有考虑 AUV 能耗、通信距离、作业时间等更多水下约束未加入 AUV 之间的互避只检测任务路径和环境障碍物冲突。这些局限不是代码 bug而是 SOM 任务分配方法本身的特性也是后续改进创新的切入点。二、代码整体结构与变量说明这是单脚本一体化仿真没有拆分成多个 m 文件内部通过子函数调用实现模块化包含主脚本参数初始化、地图、机器人、目标、障碍物、洋流、SOM 参数distanceFunction基础距离计算基线版本obstacleFunction带障碍物判断的代价函数是整个分配逻辑的核心neighborFunctionSOM 邻域函数计算获胜神经元的邻域范围updateCurrentFunctionSOM 权值更新函数可叠加洋流扰动printerLineFunction直线轨迹绘制返回直线长度printerDubinsFunctionDubins 曲线绘制返回 Dubins 路径长度。关键变量含义梳理RobotAUV 二维坐标矩阵每一列是一台机器人的 (x,y)RobotVAUV 速度与航向角第二行是和 X 轴正方向的夹角Target任务目标点坐标TargetV目标点期望到达航向角Obstacle、ObstacleR圆形障碍物中心坐标与半径RobortMonitor监控矩阵第一行记录每台 AUV 承接任务数第二行记录累计航行距离taskMax单台 AUV 最大任务上限由总任务数除以机器人数量向上取整得到maxDis单台 AUV 允许的最大航行里程阈值turnRDubins 曲线最小转弯半径AUV 运动核心约束B、rSOM 超参数B 为学习率r 为邻域半径vc、ai洋流速度大小、洋流流向角WeightSOM 神经元权重这里直接映射 AUV 的位置WeightV保存每台 AUV 当前航向角。这个 SOM 的设计思路很巧妙把每一台 AUV 直接当成 SOM 的一个神经元。每一个任务点输入网络所有 AUV 互相竞争代价最小的那台 AUV 成为获胜神经元之后更新获胜神经元及其邻域的权值也就是 AUV 虚拟位置逐步完成任务点的映射分配。三、运行流程拆解第一步环境与实体初始化脚本开头先清空画布、设置仿真区域然后依次定义任务目标点坐标、目标到达航向AUV 初始坐标、初始航向圆形障碍物位置与半径校验维度目标数量和目标航向数量一致机器人数量和机器人航向数量一致初始化监控数组 RobortMonitor用来约束负载、统计里程设置 Dubins 转弯半径、洋流开关、轨迹模式开关 lineFlag。然后绘制两张初始图第一张是初始位置分布图菱形标记 AUV大圆点标记任务叉号标记障碍物第二张用于绘制任务分配连线与轨迹。第二步SOM 竞争分配主循环循环遍历每一个任务目标点依次执行下面这套逻辑调用 obstacleFunction对当前任务点计算所有 AUV 到该目标的代价 代价不再是简单欧氏距离而是 Dubins 路径长度同时检测路径是否穿过障碍物如果穿过障碍代价会显著变大该 AUV 不会优先被选中选出代价最小的 AUV也就是获胜神经元 winnerR对应的目标点 winnerT更新监控表这台 AUV 承接任务数量 1判断该目标是否已经被分配避免重复指派未分配的目标进入 SOM 邻域更新neighborFunction根据邻域半径 r找到获胜神经元附近的神经元updateCurrentFunction更新 AUV神经元的位置如果开启洋流位置更新时叠加洋流带来的偏移根据 lineFlag 选择轨迹生成方式直线模式调用 printerLineFunction画直线返回直线长度Dubins 模式调用 printerDubinsFunction生成带起点航向、终点航向的 Dubins 曲线绘制曲线并返回路径长度更新获胜 AUV 的航向角任务完成后航向对齐目标的期望航向累加航行里程到 RobortMonitor用于里程上限约束。重点为什么用 Dubins 代价而不是欧氏距离 AUV 属于非完整约束机器人它不能侧向平移运动受最小转弯半径限制。同样两个点不同的起点航向、终点航向Dubins 路径长度差异很大。如果只用欧氏距离分配会出现 “距离很近但 AUV 很难掉头到达、路径很长” 的不合理分配结果这也是水下任务分配和地面机器人分配最大的区别。第三步障碍物与负载约束逻辑obstacleFunction 是整套代码的约束核心输入目标坐标、所有 AUV 位置、航向、障碍物信息、任务监控信息内部判断两条①当前 AUV 任务数量是否已经达到 taskMax 上限②候选 Dubins 路径是否与圆形障碍物相交只要触发负载超限或者路径撞障碍代价 Dist 就会被拉高该 AUV 在本次竞争中落败只有负载充足、路径无碰撞的 AUV才会以真实 Dubins 路径长度作为竞争代价。这就实现了任务分配阶段就同时考虑避障 负载均衡而不是分配完成之后再去检查是否冲突。第四步洋流扰动机制洋流是水下环境不可忽略的干扰。开启 currentFlag1 之后在 SOM 权值AUV 位置更新的时候叠加洋流带来的位移偏移。 ai 是洋流流向角vc 是洋流流速对应的偏移量。这个模型是简化的定常洋流模型适合验证洋流对分配结果的影响洋流会改变 AUV 等效到达代价SOM 会倾向于把任务分配给顺着洋流方向航行的机器人减少航行消耗。四、核心算法原理SOM 自组织映射用于任务分配SOM 自组织映射是一种无监督竞争型神经网络常规 SOM 用来做降维、聚类。而在这个 AUV 任务分配场景里做了改造神经元集合 AUV 集群输入样本 待分配的水下任务点竞争规则输入一个任务点所有神经元计算代价Dubins 路径代价 障碍物惩罚 负载惩罚代价最小的获胜学习规则获胜神经元和它邻域内的神经元向任务点方向更新自身位置自组织的结果任务点会自发映射到最合适的 AUV 附近形成任务指派。对比其他经典任务分配算法匈牙利算法求全局最优适合小规模、静态、无复杂约束场景维度大的时候计算量爆炸遗传算法、粒子群群智能优化迭代寻优计算开销大SOM分布式竞争计算速度快天然适合动态逐步分配缺点是很难保证全局最优。所以这套方案非常适合作为分布式集群任务分配的基线用来和集中式最优算法做对比。⛳️ 运行结果 部分代码function currentDistance printerLineFunction(x1,x2,y1,y2,color,width)line([x1,x2],[y1,y2],Color,color,LineWidth,width);currentDistance((x1-x2)^2(y1-y2)^2)^0.5;end 参考文献往期回顾扫扫下方二维码
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。