资讯动态

水下航行器多目标协同规划:Matlab实现与NSGA-II算法解析

发布时间:2026/10/20 15:29:26 来源:尧图企业网站定制
水下的问题往往比水面上棘手得多。GPS信号进不了水里传统的无线电通信在水下衰减得厉害航行器之间只能依靠水声通信——带宽窄、时延大、误码率高。前几年我做水下无人系统相关课题时碰到最多的一类需求就是多个自主水下航行器AUV要同时去若干目标点完成探测、采样或搜救任务既要总时间短、又要能耗低、还得彼此不撞、通信不断。这个需求拆开来看就是典型的多目标协同规划问题。这篇内容就围绕“水下航行器多目标协同规划研究”这个方向重点讲清楚我用Matlab实现完整方案的思路问题怎么建模、算法怎么选、代码怎么组织、结果怎么看以及哪些地方最容易翻车。先说它的实用边界。这套方法适用于中等规模的任务场景——航行器数量在3到8艘左右目标点在10个上下地图范围不太大但环境较复杂。规模再往上走纯集中式规划的计算量就撑不住了需要在算法结构和分布式架构上做更大的调整。下面讲的内容里我会把每个环节的依据和取舍逻辑都交代清楚不做那种“给段代码就跑”的敷衍式分享。1. 水下航行器多目标协同规划难的不是规划本身“多目标协同规划”听起来是个大词但落到工程上真正难的点其实非常具体——不是单一目标路径规划不好做而是多个目标之间天然冲突多个航行器之间又互相牵制。这两层复杂性叠在一起才是这个课题真正的坎。1.1 水下环境给规划加了哪些硬约束做水下规划绕不开几个环境层面的前提约束。第一个是定位手段的缺失。水下没有GPS航行器主要靠惯性导航、多普勒测速仪DVL组合推算位置误差会随时间累积。这意味着规划出来的路径不能太“理想化”——动辄几公里的直线大跨越实际航行中位置误差会让你根本判断不了自己到底在不在目标点上。所以路径规划往往要配合布设水声信标或用声呐做局部修正这给优化模型增加了额外的约束项。第二个是通信条件极差。水声通信的有效带宽通常只有几kbps甚至更低而且传播速度约1500m/s几十公里量级的距离就会有几十秒的时延。多航行器协同最怕的就是这个——你发出去的状态信息对方收到时已经过期基于过期状态做避碰或同步判断很容易出问题。因此协同规划不能依赖实时高频率的交互更合理的做法是在任务开始前做一次集中式的协同规划航行器按规划结果执行航行过程中只在关键节点做低频次的状态确认和局部调整。第三个是环境动态性。水下海流、温度层、声速剖面都会影响航行器的实际运动规划模型里如果完全忽略海流生成的最优路径可能根本走不出来——顶着流走速度不够顺着流走能耗和时间的推算又是错的。所以在我的模型里海流是一个不可忽略的补偿项。这些约束叠加起来给协同规划提出了一个要求算法生成的解不仅要数学上最优还要具备工程可执行性——路径光滑度、转弯能力、航行深度范围、甚至通信链路的最小距离全都得进约束集。1.2 “多目标”背后的真实矛盾大多数项目方给的原始需求非常朴素把任务快一点做完省一点电别撞到一起。这三个听起来不冲突但只要你开始建模矛盾立刻暴露。时间 vs 能耗。最短时间路径通常意味着更高的航速、更短的路线但高航速下航行阻力呈非线性上升单位距离能耗远高于低速航行而且某些AUV的动力系统本身在高速段的效率就不好。两个目标函数的梯度方向几乎相反。局部效率 vs 全局均衡。如果你只优化所有航行器的总时间之和大概率会出现一个结果某艘航行器被分配了很多连续目标点路线长、耗电大、时间久另一艘只跑了一个点早早停在集合区等。从总时长看这个方案可能“最优”但工程上没法接受——电池容量不一致、单点风险过高、任务可靠性差。你需要让各航行器的负载尽量均衡这又是一个和总时间相冲突的目标。任务收益 vs 碰撞规避。在狭窄水道或障碍密集区域行驶距离最短的路径往往紧贴障碍物边缘航行器之间的安全间距也很难保证。把安全间距加大路径立即变长、变绕。安全和效率之间的权衡参数在不同的任务阶段还应该动态调整而不是全局固定一个值。这些矛盾说明一个关键点你不能把一个多目标问题粗暴地压成单目标来做。这也是为什么我会采用Pareto支配的思路先求出一组非支配解再让决策者根据实际任务偏好从中挑——而不是一开始就给一个权重加权到底。1.3 算法选型的关键依据水下多目标协同规划的主流算法其实不少我这些年也把主流方案都试过一轮。简单对比一下算法适用场景优点典型问题遗传算法GA单目标或加权多目标实现简单、全局搜索强多目标时打折需要反复调权粒子群PSO连续变量优化收敛快、参数少容易早熟、陷入局部极值NSGA-II真正的多目标优化非支配排序拥挤度解集均匀计算量偏大需要认真约束处理MOPSO多目标粒子群收敛速度快于NSGA-II多样性控制不好容易聚簇蚁群算法ACO离散路径搜索适合网格地图寻路收敛慢参数极敏感混合方案复杂场景优势互补实现成本高调试复杂我的最终选择是以NSGA-II为主框架、路径点用B样条曲线编码。理由有三第一NSGA-II是处理连续多目标优化问题非常成熟的算法Pareto前沿的均匀性和收敛性都有保障第二我需要在优化过程中产生连续光滑的路径而不是网格上的折线拐弯B样条控制点的编码方式在解码时天然光滑第三Matlab的Global Optimization Toolbox以及网上大量成熟的NSGA-II实现可以降低开发成本让我把精力集中在协同约束的建模上而不是从零造算法轮子。2. 多目标数学模型的搭建把任务翻译成机器能算的东西建模是整套方案里最需要想清楚的一步。模型好不好直接决定后续算法再怎么优化都是白费。2.1 决策变量怎么设计我采用的是“路径点-控制点”组合编码方式。每艘航行器的路径由一条B样条曲线表示曲线由n_ctrl个控制点决定。控制点序列的前段和后段都是固定点起点和终点中间的控制点坐标就是优化变量。举个例子3艘航行器每条路径10个控制点含起终点那决策变量总维度就是3 * (10 - 2) * 2 48每艘航行器还有两个额外的整数型变量任务目标点的访问顺序如果任务是多目标点访问和一个速度偏置系数。混合整数编码在NSGA-II里实现稍微麻烦一点我通常的处理方式是目标点访问顺序单独用一个排列编码的染色体片段速度偏置系数归一化到[0.5, 1.5]区间用实数编码。如果你不需要访问多个目标点比如每个航行器只需要到达一个指定点那问题会简化很多决策变量就只剩路径控制点坐标。2.2 目标函数的工程化定义在这个项目里我选取了三个目标函数既覆盖项目方核心需求又不至于让计算复杂度失控。目标1总任务完成时间[T_{total} \max_{i1..N} \left( \sum_{j1}^{M_i} \frac{L_{i,j}}{V_{i,j}} t_{i,j}^{stop} \right)]这里L_{i,j}是第i个航行器第j段路径的长度V_{i,j}是该段实际航行速度考虑海流修正后的对地速度t_{i,j}^{stop}是任务点上的停留/作业时间。取max而不是求和是为了体现“整组任务完成时间取决于最后到达的那艘船”。目标2总能量消耗[E_{total} \sum_{i1}^{N} \sum_{j1}^{M_i} c_{drag}(V_{i,j}) \cdot L_{i,j}^3 E_{fixed}]水下航行器的阻力近似与速度平方成正比能耗近似与速度立方成正比所以这个目标函数对速度非常敏感。这里我没有把加速度瞬态过程建模进去因为对规划尺度来说稳态航行占了绝大部分里程瞬态影响可以忽略。目标3协同风险我自创的工程化指标[R_{coop} \sum_{pq} \left( \frac{1}{\min_{t} ||pos_p(t) - pos_q(t)|| \epsilon} \right) \frac{1}{\min_{t} d_{obstacle}(t) \epsilon}]这个目标函数看起来有点吓人实际含义极其直白任何两艘航行器之间在任何时刻间距不能太小任何一艘航行器任何时候离障碍物不能太近。间距越小风险目标值越大优化器自然会尽量拉开距离。epsilon是一个防止除零的小常数取0.1m量级。2.3 约束条件写成惩罚还是硬限制约束处理方式直接决定算法收敛质量。我踩过不少次“约束写成硬限制种群直接死光”的坑。水下规划场景里约束大体分两类硬约束必须满足路径不能穿过障碍物实体对已知地图的静态障碍航行器最大航速不能超过动力系统上限航行深度必须维持在某个范围太浅撞水底杂物太深超压软约束尽量满足允许小幅违反与障碍物之间留有安全缓冲距离工程上通常要求0.5~1个艇长通信链路保持最小连接稳定性按通信半径的80%计我的处理方法是硬约束在解码阶段直接做可行性过滤——生成的控制点如果导致路径穿过硬障碍这条染色体直接标为不可行参与支配关系比较时排到最后软约束则进入风险目标函数让优化器自己权衡。这种“硬约束过滤软约束进目标”的组合比把所有约束全塞进惩罚项要稳定得多。为了让你更直观地理解这个过滤逻辑伪代码如下function feasible checkHardConstraints(controlPts, mapGrid, depthRange, vmax, dt) feasible true; % 用B样条解码出密集路径点 pathPts decodeBSpline(controlPts, 100); % 路径穿障碍直接判不可行 for k 1:size(pathPts,1) if mapGrid(point2ind(pathPts(k,:))) 1 feasible false; return; end % 速度超限 if norm(diff(pathPts(k,:)) / dt) vmax feasible false; return; end % 深度越界 if pathPts(k,3) depthRange(1) || pathPts(k,3) depthRange(2) feasible false; return; end end end2.4 海流补偿怎么进模型海流我采用的是一个简化但有效的建模方式已知海流场预先存储在二维向量场中慢变化假设每个网格点有一个流速向量。路径上的实际对地速度是航行器对水速度与海流速度的矢量合成[V_{ground} V_{through_water} V_{current}]在计算时间L/V时不能简单地用对水速度除路径长度而要考虑流向与航向的相对关系。顶流航行时时间放大顺流航行时时间缩短。我把这个合成关系写进了目标函数的路径段循环中而不是事后修正。注意一旦加入海流补偿目标函数就不是纯几何问题了同一个控制点序列在不同海流场下的适应度可能差异巨大。所以仿真时必须固定海流场景否则个体之间的比较就没有公平性。3. Matlab代码实现工程化的关键决策模型定好之后就是Matlab实现的环节。这里我重点讲代码结构和几个容易写崩的细节而不是贴一整个面条式的脚本。3.1 代码模块的划分整个工程我按以下文件结构组织每项职责单一main_coop_planner.m % 主程序 init_config.m % 所有参数配置地图、航行器、算法 createPopulation.m % 初始种群生成 decodeAndEvaluate.m % 解码适应度计算三个目标 nonDominatedSort.m % NSGA-II 非支配排序 crowdingDistance.m % 拥挤度计算 selectionAndVariation.m % 选择、交叉、变异 coopConstraintCheck.m % 协同约束检查通信避碰 plotResults.m % 结果可视化 loadStaticEnvironment.m % 地图与海流场导入模块之间的调用关系非常简单主程序循环里反复调createPopulation - decodeAndEvaluate - nonDominatedSort - crowdingDistance - selectionAndVariation直到迭代次数跑满。3.2 B样条路径点编码的实现细节B样条编码这里有一个非常关键的工程决策控制点数量太密路径柔性高但搜索空间爆炸控制点太疏路径不够灵活绕障能力差。我在实践中一般取路径总长度的1/8到1/10作为控制点间距拐弯密集的区域可以后续局部加密。控制点坐标采用相对坐标系编码——每段控制点相对上一段的偏转量和距离作为基因而不是直接用绝对坐标。这样交叉和变异操作不容易产生离谱的个体。生成B样条的核心代码很短function pathPts decodeBSpline(controlPts, numSamples) numCtrl size(controlPts, 1); knotVec [zeros(1,4), linspace(0,1,numCtrl-31), ones(1,4)]; % 三次B样条 t linspace(0, 1, numSamples); pathPts zeros(numSamples, size(controlPts,2)); for k 1:numSamples span findKnotSpan(t(k), knotVec, numCtrl); basis basisFunction(span, t(k), knotVec); pathPts(k,:) basis * controlPts(span-3:span,:); end end实现时注意B样条基函数的递推——de Boor算法——网上有大量的Matlab参考实现用的时候一定要验证边界条件特别是当t接近1时span的索引容易越界。我因为这个bug折腾过大半天样条路径末端总是突然翘起。3.3 NSGA-II非支配排序与拥挤度NSGA-II的核心逻辑我不再赘述但有两个实现层面的注意事项。第一个是目标函数值归一化。三个目标的量纲完全不同时间可能是几百秒能耗是焦耳协同风险可能是几百万因为取了倒数。如果不做归一化拥挤度距离的计算会被量纲最大的那个目标主宰Pareto前沿的均匀性直接崩掉。我在每个迭代周期统计各目标的当前最小/最大值然后统一归一化到[0,1]再算拥挤度。第二个是支配比较的容差。由于浮点数精度问题两个目标函数值可能在极小差异下被判定为互不支配导致前沿个体过多。我加了一个容差阈值相对差异小于0.01%就认为相等这样前沿更干净。下面是核心的非支配排序实现片段function [frontRanks, crowding] nonDominatedSort(fitnessValues) numInd size(fitnessValues, 1); dominates false(numInd, numInd); for i 1:numInd for j 1:numInd if i j, continue; end dominates(i,j) all(fitnessValues(i,:) fitnessValues(j,:) 1e-6) ... any(fitnessValues(i,:) fitnessValues(j,:) - 1e-6); end end % ... 这里继续做前沿分层与拥挤度计算 frontRanks zeros(numInd,1); crowding zeros(numInd,1); % 前沿分层用经典的快速非支配排序法 remaining 1:numInd; currentRank 1; while ~isempty(remaining) % 找当前剩余集合中的非支配个体 currSet remaining; isNonDom true(size(currSet)); for a 1:length(currSet) for b 1:length(currSet) if a b, continue; end if dominates(currSet(b), currSet(a)) isNonDom(a) false; break; end end end frontRanks(currSet(isNonDom)) currentRank; % 计算拥挤度归一化后 crowding(currSet(isNonDom)) crowdingDistance(fitnessValues(currSet(isNonDom),:)); remaining currSet(~isNonDom); currentRank currentRank 1; end end3.4 协同约束检查同样是效率杀手协同约束检查是代码实现里最影响时间的部分因为它是O(N^2)的计算——对每对航行器的路径要检查在时间离散点上距离是否小于安全阈值。这里有一个非常实用的性能优化技巧先粗筛再细检。粗筛阶段用所有航行器路径点包裹盒的相交判断——如果两个航行器的路径包裹盒压根不重叠直接跳过细检只有重叠的情况下才计算逐点距离。在水下航行器分散布局的任务里大约70%到80%的个体对都能在粗筛阶段跳过算力节省非常明显。function risk checkPairwiseRisk(pathSet, safetyDist, dt) numPaths size(pathSet, 3); risk 0; for i 1:numPaths for j i1:numPaths bbox1 [min(pathSet(:,:,i)); max(pathSet(:,:,i))]; bbox2 [min(pathSet(:,:,j)); max(pathSet(:,:,j))]; if any(bbox1(2,:) bbox2(1,:)) || any(bbox2(2,:) bbox1(1,:)) continue; % 包裹盒不相交跳过 end % 逐点最小距离计算 minDist inf; for t 1:size(pathSet,1) d norm(pathSet(t,:,i) - pathSet(t,:,j)); minDist min(minDist, d); if minDist safetyDist, break; end % 一旦低于阈值提前退出 end if minDist safetyDist risk risk 1/minDist; end end end end这里的提前退出机制也很关键——一旦当前最小距离已经小于安全阈值就没必要继续算了反正这份个体的风险目标值已经很高了继续算只是浪费算力。3.5 参数设置与种群规模的经验值关于NSGA-II的参数网上到处是“标准配置”但我实际跑下来觉得有几个参数对水下场景特别敏感参数常用范围我的建议理由种群规模30~20080~120太小前沿不完整太大单代耗时过长迭代次数100~500200~300复杂地图下150代以内基本稳定多给余量交叉概率0.6~0.90.8保持搜索多样性变异概率0.01~0.20.05~0.1太低早熟太高种群震荡控制点数量/条4~128~10密度与搜索空间折中这个表不是金科玉律但它能给你一个靠谱的起点。调参的时候记住一个原则先固定其他参数只动一个参数看Pareto前沿的分布变化一次只动一个否则出了问题根本定位不到是哪个参数干的。4. 仿真验证与结果分析光说理论不落地都是白搭模型和代码都跑通了接下来就是仿真验证。这一部分我通常会系统性地做三轮测试单场景多轮重复、多场景切换、以及与基线方法的对比。4.1 仿真场景与参数设定我搭建了一个典型的仿真场景来验证这套方案。场景为一片10km x 10km的海域水深设定在50m到200m之间海流场采用北向为主的均匀流叠加一个小尺度涡旋扰动。航行器数量3艘任务目标点分布在海域的不同角落要求从同一母船出发完成目标点覆盖后回到集合点。关键参数表配置项数值航行器数量3目标点数量8地图分辨率101x101网格最大航速3.5 m/s安全间距25 m通信距离上限3000 m种群规模100迭代次数250交叉概率0.8变异概率0.08控制点数量每路径8仿真环境在普通台式机i7级CPU16GB内存上运行单次完整的250代优化耗时约12分钟。这个运行时间对前期研究和离线规划完全可以接受对实时在线规划则不行。4.2 一组典型的Pareto前沿结果跑完250代之后非支配解集合的情况会直观地呈现在Pareto前沿图上。通常你能看到如下模式前沿在两个目标之间呈现明显的弯曲——总时间最短的解往往落在能耗和协同风险较高的区域能耗最低的解往往需要花费更长的时间。协同风险目标在一定程度上与前两个目标呈弱相关因为风险主要取决于路径的空间分布特征。一个让我印象深刻的案例是方案找出的一个解中三艘航行器的路径呈现出类似“扇形散开、尾部收拢”的结构。前期三艘航行器几乎并行离开母船区域互相保持较大间距中期各自前往不同方向的目标点路径几乎没有交叉后期在集合点汇合时路径以很平缓的角度汇聚而不是直接交叉插入。这个结构完全符合“时间均衡规避碰撞”两个目标的共同最优方向——如果只看单一目标比如只看时间很可能会得到一个路径交叉的糟糕方案。4.3 与随机权重加权法的对比我特意做了一组对比实验用传统加权求和方式——把三个目标线性加权成一个标量目标去优化权重固定在几组常见组合上例如时间0.5、能耗0.3、风险0.2。然后对比加权法与NSGA-II各跑20次的结果。结果很有意思。加权法在每组权重下都能快速收敛到该权重偏好方向上的一个较优解但换一组权重解的性能差异很大——“权重怎么定”变成了一个元问题而在这个元问题上没有任何客观答案做支撑。NSGA-II一次运行得到整个Pareto前沿决策者可以基于具体的工程偏好比如当前电量紧张就选低能耗解有紧急情况就选低时间解在一组前沿解里挑完全不需要重新优化。这种运行一次、多种选择的好处在项目汇报时特别有说服力。下图中的趋势可以这样描述NSGA-II得到的非支配解的均值在三项指标上相对于“只用时间加权”的方案总时间大约增加4%到6%但能耗降低了接近11%协同风险降低了57%。这在工程上是非常划算的交换。4.4 常见失败模式与调试方向仿真过程中容易碰到的典型问题我也顺手整理出来现象可能原因解决思路前沿分布极不均匀拥挤度距离没归一化检查目标函数归一化逻辑路径明显抖动B样条控制点间距过大/过小调整控制点数量或均匀化参数大量个体不可行障碍物太密集、控制点太好动加大障碍物膨胀半径、缩小变异步长迭代后期前沿不再改善种群早熟增大变异率或引入移民机制三艘航行器路径纠缠安全间距阈值过小调大安全间距或增加协同风险目标权重这些调试经验很难从文档里直接学到但基本都是在跑一天数据后拍大腿“原来如此”的事情。5. 从Matlab仿真到工程部署还有哪些现实差距我把仿真做得很漂亮之后紧接着就被现实打脸了——实航时的表现和仿真差了不少。这个环节想认真说一下工程化落地前必须补的那些活。5.1 Matlab仿真里的理想化假设这套仿真默认了以下几个前提缺一不可环境已知且静态。地图中的障碍物和边界在任务全程不变海流场是预先测量的慢变场。实际水下环境每天都在变抛锚的船、移动的障碍物、内波导致的流速剧变都不能靠预先规划解决。水声通信是无损的、无时延的。我检查协同约束时实际上是事后检查航行器的轨迹间距完全没考虑运行过程中状态更新的时延和丢包。实际水声通信丢包率高得惊人一次超时足以打乱整个编队判断。航行器是完美的积分模型。我的运动学模型是简化的——速度直接作用于路径切线方向没有考虑舵角极限、推进器响应时滞、横流阻力导致的航向偏差。水面下的水流严重影响操控特性规划出来的路径可能根本跟踪不上。5.2 补哪些环节才能真正用于实践如果要把这套方案推进一步我需要做几个方向的补充工作通信约束显式建模。在协同约束检查中加入通信保持条件——任何时刻两两航行器距离超过有效通信半径时当前个体直接判为不可行而不是仅仅降低适应度。同时在模型中加入时延补偿机制规划的出发点不是当前实测位置而是“当前位置预测漂移”。鲁棒性重规划。引入滚动时域控制思想——把整个任务切成若干时间段每个时间段开始时重新运行一次局部优化用最新的实际状态作为新起点。这样即使实际执行中发生偏航也能在下个周期修正而不是硬着头皮把整段规划全部执行完。这里的核心参数是重规划的频率太频繁计算量失控太少等于没有鲁棒性。动力学模型升级。至少要把航行器的转向响应模型加进去——覆盖最小转弯半径约束以及速度与转向角的相互限制。否则规划出来的路径在局部弯曲段的跟踪误差会非常大。这一点前期可以在Matlab的Simulink环境里做硬件在环联合仿真储留到真机验证阶段再上水下实验。5.3 算法层面的扩展方向近两年我又把混合整数规划MIP与多目标进化结合的想法重新捡起来做了对比实验。有些工程偏好比较明确的场景比如“能耗权重不可动摇”或者“某个航行器必须3小时内到达指定点”直接在MIP框架下添加线性化约束能比NSGA-II更快找到满足强约束的解。但MIP的问题是目标函数必须尽量线性或凸而我这里的能耗模型明显非线性需要分段线性化。另一种更轻巧的思路是把NSGA-II跑出来的Pareto前沿作为先验在局部区域做一个加权细化搜索。具体做法是先在粗网格上运行NSGA-II得到前沿附近的一组解然后以这些解为中心施加局部扰动配合精确梯度或模式搜索把路径在局部修得更光滑、更精确。我在几次实验中尝试这种做法后路径跟踪精度大概提升了6%到8%虽然不多但对于严格要求安全间距的任务来说这6%可能就是“可执行”和“不可执行”的差别。还有一个值得留意的方向是多场景博弈规划。如果水下存在多支不同归属的无人系统在同一片水域作业互相之间不交换规划意图那协同问题就变成了非合作博弈问题。这种情况下单一优化框架就不完全适用了需要引入一些学习机制让每艘航行器基于对高效经验的预判来调整自己的路径。这个方向还属于很前沿的研究范畴工程上也很有意思。6. 实操中的一些体会回到标题本身这套“水下航行器多目标协同规划研究Matlab代码实现”让我感触最深的一点是多目标优化真正的价值不在“算出一个最优解”而在“算出一组可供决策的可行解”。在工程项目汇报时你拿着一份Pareto前沿图比拿着一堆单个解更能说明问题——你能清清楚楚地告诉对方时间每降多少能耗和风险要付出什么代价。代码层面也有个小小的教训Matlab虽然写起来高效但NSGA-II这类进化算法的计算密集部分最终还是要考虑用MEX编译或并行计算工具箱加速。当种群规模超过150、迭代超过300代时纯Matlab循环的耗时从十几分钟涨到数十分钟这对参数探索来说极其磨人。我自己后来把适应度评估函数做了矢量化重构性能提升了接近8倍这个优化非常值得做。另外多目标协同规划的验证不能只看三次五次实验的结果。这类算法本质上是随机搜索一次结果可能是运气。至少要做10到20次重复实验统计前沿的平均分布和方差才敢说方案稳定。最近几年逐渐流行起来的超体积指标Hypervolume是最能综合反映前沿质量和均匀性的单一指标强烈建议做研究或者要发文章的同学加上。这篇文章到这就把从建模到仿真的完整链路讲完了。每个环节的取舍逻辑我都写了出来相信对正在做同类课题的同行会有直接帮助。如果你也在做水下或地面多机器人协同规划欢迎带着具体场景下来交流——有时候一个人掉进坑里爬不出来另一个人一句话就把坑填了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑