
在三维地形下做无人机路径规划这几年我试过A*、RRT、人工势场也试过纯蚁群算法最后在某个模拟巡检项目里被逼着把ACO和MLP叠到了一起用MATLAB撸了一整套带GUI的演示系统。这套方案的核心思路很直白蚁群算法负责在全局找一条足够好的三维轨迹多层感知机则负责在蚂蚁每走一步之前先“预测”一下这一步值不值得走避免蚂蚁被短视的欧氏距离误导。整套代码跑通之后我一直觉得这是三维路径规划里性价比很高的组合。这篇就把完整项目拆开讲从建模、ACO主体、MLP训练到GUI设计把能落地的细节都摆出来适合正在做无人机自主避障路径规划、想用MATLAB做算法仿真验证的工程师和学生参考。1. 为什么我最终选定ACO-MLP而不是纯A*或RRT先说场景无人机要从一个点飞到另一个点中间是一片起伏山地山地里面还有若干凸起的山包和不可飞越的障碍区飞行高度被限制在一个范围内。三维栅格地图如果按1米分辨率切一个500米乘500米乘100米的空间就是2500万个栅格A*直接就是灾难RRT虽然快但路径极其毛糙后期平滑和优化工作量很大。纯蚁群算法能很好处理这种离散组合优化问题有一个致命弱点它的启发函数通常只依赖几何距离对地形起伏、障碍物分布完全不敏感蚂蚁经常扎堆往一个“看起来近、实际要绕大圈”的山沟里钻。MLP进来就是解决这个短板。它不是用来直接生成路径的而是训练成一个“地形代价预测器”给蚂蚁一个候选节点MLP根据该点附近的局部地形高度、障碍距离、当前指向目标的方向等信息输出一个风险或代价评估值。蚂蚁在计算转移概率时把MLP的输出和传统启发信息加权融合相当于给蚂蚁装了一个“对三维环境有预判”的导航员。这样一来全局搜索能力还是ACO的局部地形常识则是MLP的二者各干各擅长的活。选型对比如下方案全局最优能力对地形敏感度计算开销实现复杂度适合场景A*强但受限于启发函数低随栅格数暴涨低二维、低分辨率RRT/RRT*概率完备中较低中快速规划后处理成本高纯ACO强依赖信息素正反馈低较高中二维/固定环境ACO-MLP强高在线预判前期训练成本高搜索阶段中较高三维复杂地形我在模拟项目里的结论是如果地图固定且离线计算ACO-MLP的优势非常明显如果每次任务地图都变重新训练MLP反而拖慢流程这种情况更适合在已有的历史地图上预训练好模型再复用到同分布的新地图上。下一节先把数学建模讲清楚因为后面所有代码都是围绕这个模型写的。2. 三维路径规划问题的数学建模与代价设计2.1 从连续空间到离散栅格连续三维空间没法直接搜索必须离散化。我采用的做法是把水平面切成二维网格每个网格坐标表示无人机在某个水平位置高度方向不单独做成密集栅格而是预设若干飞行高度层。这样做有两个原因第一三维栅格的状态空间是水平格数乘以高度格数直接做全维离散蚁群算法的蚂蚁数量和信息素矩阵都扛不住第二无人机实际飞行的巡航高度通常是固定的几层没必要按米去细分高度。项目里我用的默认配置是水平网格50乘50高度层4层这样任意节点搜索空间是2500乘4信息素矩阵也控制在1万个元素以内速度完全可接受。节点定义为一个三元组node.x ix; % 水平x索引1 ~ N node.y iy; % 水平y索引1 ~ N node.z iz; % 高度层索引1 ~ 4实际高度 地形高度 zLevelOffset(iz)路径就是一组从起点到终点的有序节点序列。无人机不允许后退所以蚂蚁每一步只向目标方向推进x、y坐标单调递增或保持不动。这个约束会损失极小概率下“绕回去”的解但换来了搜索空间数量级下降工程上非常划算。2.2 代价函数的组成一条路径的总代价我拆成三块每一块都归一化到同一量纲不然优化目标会被量级最大的单项带偏。第一块是路径长度代价。三维空间里相邻两个节点之间直接算欧氏距离把所有边加起来除以外围直线距离得到一个不小于1的归一化系数。第二块是高度波动代价。无人机频繁上上下下既耗电又影响稳定性所以相邻两点高度差的绝对值要计入总代价。高度层平移造成的单位距离和长度代价不是同一个含义我会用高度差除以允许最大升降速度对应的可爬升距离把它折算成等效长度。第三块是障碍风险代价。最直接的处理是如果路径点落在障碍区域内直接判死但地形是连续的节点可能不在障碍里节点之间连线却撞山。所以碰撞检测要看线段不能只看点。我在工程上用的风险标记是对每条线段进行离散采样每段按0.5倍栅格间距插值采样点若落到障碍区或进入碰撞危险距离这一段的代价直接加一个极大惩罚值否则按离障碍最近距离给一个平滑惩罚项。总代价函数表示为costTotal wLen * costLength wSmooth * costHeightSmooth wRisk * costCollisionRisk;默认权重为 wLen 1.0、wSmooth 0.3、wRisk 0.8。实际调参时发现wRisk 设得太大蚂蚁会畏手畏脚最后全部绕着地图边缘走路径虽然安全但长度冗余严重设得太小又容易擦着山体飞。0.8是我在多个随机地形上试下来比较稳定的值。3. ACO-MLP分工机制蚁群负责全局搜索MLP负责“事前评价”3.1 蚁群算法原有转移概率的局限性基本蚁群算法中蚂蚁在节点i选择下一节点j的转移概率是P(j) (tau(i,j)^alpha) * (eta(i,j)^beta) / sum((tau(i,k)^alpha) * (eta(i,k)^beta))其中tau是信息素eta是启发信息。传统做法里eta通常写成欧氏距离的倒数也就是“越近越好”。这在平整地形的二维路径规划里没问题到了三维山地场景就暴露了严重的短视问题一条路虽然下一步很近但前边是陡峭山体另一条路下一步稍远但整体地形平缓。蚂蚁只看瞬时距离很容易被带进死胡同。3.2 MLP输出的“地形启发值”如何嵌入ACO我训练的MLP模型输入9个特征输出一个0到1之间的标量表示“这个候选节点在当前地形下是否为优质下一步”。输出越接近0表示越推荐越接近1表示越危险或绕路。嵌入方式不是替代eta而是和传统几何启发度并行eta_total(j) (1 - lambda) * (1 / (d(i,j) eps)) lambda * (1 - mlp_out(j) eps)lambda默认取0.4。当lambda为0时就是纯ACOlambda为1时完全靠MLP判断。训练完成后我扫了一遍lambda发现0.3到0.5之间效果都还不错低于0.2时MLP的影响过弱高于0.6时蚂蚁又会因为过分相信模型而丧失探索性。这个参数我最后留成GUI里的可调项方便现场实验。3.3 整体流程设计项目运行分“训练-搜索”两个阶段虽然GUI里可以一键跑完但内部顺序很明确加载或生成三维地形构建障碍区和高度层。用随机路径采样生成训练样本或者用上一轮ACO搜索的路径增强样本。离线训练MLP保存网络结构、权重到模型文件。主程序启动ACO初始化信息素矩阵。每轮迭代中每只蚂蚁按带MLP启发度的转移概率逐步前进。检查路径合法性并计算总代价更新全局最优。所有蚂蚁完成本轮后统一做信息素挥发和增量更新。收敛后输出最优三维路径并叠加到地形图上展示。这套机制的关键在于MLP的输出不是训练完就固定不变的裁判而是环境感知器。地形一旦换上同一分布新的随机地图MLP依然能迁移这是我在项目里最看重的价值。4. 三维环境建模与障碍物检测的MATLAB实现4.1 生成可复现的随机地形环境部分我写了一个createEnvironment函数用meshgrid生成网格坐标叠加上正弦谐波和随机噪声模拟起伏地形再手动放置几个椭球形禁飞区作为障碍。为了让实验可复现随机种子作为输入参数这样跑100次也能定位问题。function [terrain, obstacles, heightLevels] createEnvironment(nGrid, seed) rng(seed); [xx, yy] meshgrid(1:nGrid, 1:nGrid); terrain 8 * sin(0.08 * xx) 6 * cos(0.12 * yy) ... 4 * sin(0.3 * sqrt((xx - nGrid/2).^2 (yy - nGrid/3).^2)) ... 2 * randn(nGrid); terrain max(terrain, 0); obstacles zeros(nGrid, nGrid); centers [20, 20; 35, 15; 25, 38; 40, 40]; radii [6, 5, 8, 7]; for k 1:size(centers, 1) distMat sqrt((xx - centers(k, 1)).^2 (yy - centers(k, 2)).^2); obstacles(distMat radii(k)) 1; end baseHeight floor(max(terrain(:))); heightLevels baseHeight [5, 10, 15, 25]; end这里的障碍物是柱状体垂直贯穿所有高度层对应不可飞越的禁飞区。如果想生成半山腰的障碍可以按高度范围做截断但测试初期用贯穿柱更便于调试碰撞逻辑。4.2 线段级碰撞检测节点位置合法不代表两个节点之间的直线合法尤其是在地形起伏的区域。所以我在碰撞检测函数里对每一段路径做了细粒度采样function [risk, minDist] checkSegmentCollision(p1, p2, terrain, obstacles, safeRadius) dist3d norm(p2 - p1); nSample max(3, ceil(dist3d / 0.8)); minDist inf; risk 0; for k 1:nSample ratio (k - 1) / (nSample - 1); p p1 ratio * (p2 - p1); ix round(p(1)); iy round(p(2)); if ix 1 || iy 1 || ix size(terrain, 1) || iy size(terrain, 2) risk risk 1e6; continue; end if obstacles(ix, iy) 0 risk risk 1e6; continue; end % 无人机离地高度检查飞行高度必须高于地形一个安全距离 groundH terrain(ix, iy); heightAbove p(3) - groundH; if heightAbove safeRadius risk risk 1000 * (safeRadius - heightAbove 1); end d abs(heightAbove); % 简化用离地高度衡量风险 if d minDist minDist d; end end endsafeRadius我设成2个单位代表至少离地2米的净空。这个函数调用频率极高所以写成独立函数并且只处理标量输入不搞向量化因为蚁群搜索时每只蚂蚁的路径判断是串行的过早向量化反而让代码难读。4.3 三维可视化辅助调试环境生成后一定要先可视化我习惯把地形画成mesh再把障碍区域用scatter3画成突出的小球或柱状。一开始做这个项目时我跳过了可视化直接跑算法结果路径在山体内部穿行了半天没发现。后来在GUI里加了一个“地形预览”按钮每次点击都能先看到环境长什么样路径规划结果叠上去后是否有穿模一眼就能看出来。5. 蚁群算法搜索主体信息素更新与节点选择5.1 候选节点扩展规则节点扩展时只往目标方向推进。假设当前节点索引是(ix, iy, iz_plane)那么下一节点的水平索引只能满足nx ix 且 ny iy且不能同时等于当前节点。对每个水平候选点再根据高度层集合选择非障碍层的节点。起点到终点的方向不一定都在NE方向我会根据起点终点的相对位置做坐标旋转映射保证算法里永远处理“从左上到右下”的问题这样代码统一且不容易出边界错误。候选高度层的选择不能全部铺开那样每步要算几十个节点的MLP输出拖慢速度。实测中我只取当前高度层以及相邻两层共三到四层除非下一格直接是障碍否则不作全层展开。这个限制对路径质量影响很小因为最优路径的高度变化本来就应该是缓变的。扩展函数示意function candidates genCandidates(node, terrain, obstacles, heightLevels, goal) cList []; for dx 0:1 for dy 0:1 if dx 0 dy 0 continue; end nx node.x dx; ny node.y dy; if nx size(terrain, 1) || ny size(terrain, 2) continue; end if obstacles(nx, ny) 0 continue; end for dz -1:1 nz node.z dz; if nz 1 || nz length(heightLevels) continue; end if obstacles(nx, ny) 0 cList [cList; nx, ny, nz]; end end end end candidates cList; end5.2 信息素初始化和更新策略信息素矩阵大小是maxNode * maxLevel实际由于水平栅格是50乘50高度4层所以矩阵是10000乘1的一维展开索引映射用sub2ind做。初始信息素我设置为1而不是0。挥发系数rho默认0.4信息素重要性alpha默认1.0启发重要性beta默认2.0。蚂蚁构建完路径后只对成功到达终点的路径更新信息素这样避免无效路径残留信息素干扰后续搜索。同时为了防止所有蚂蚁都挤到同一条次优路径上我加入了信息素上下限tauMin 0.8tauMax 8超出则截断。这是从仿真里悟出来的没有上下限的ACO约第30轮就开始陷入局部解之后再怎么迭代都不会动加了限制后至少能保持一定的探索压力。更新迭代的代码function pheromone updatePheromone(pheromone, allPaths, allCosts, rho, Q, tauMin, tauMax) pheromone pheromone * (1 - rho); for k 1:length(allPaths) if isempty(allPaths{k}) continue; end deltaQ Q / allCosts(k); for j 1:size(allPaths{k}, 1) - 1 idx sub2ind(sizePheromone, ...); pheromone(idx) pheromone(idx) deltaQ; end end pheromone min(max(pheromone, tauMin), tauMax); endQ是常数表示信息素释放总量默认取100。deltaQ与路径代价成反比代价越低释放越多这个设计保证蚁群每次迭代都有一定概率朝更优解偏移。5.3 蚂蚁路径构建与代价评估每只蚂蚁从起点出发循环调用genCandidates生成候选集然后按转移概率随机选下一个节点。转移概率需要实时算tau和etaeta里包括MLP输出这个部分我单独拉出来function p transitionProb(node, candidate, pheromone, mlpHeuristic, lambda, alpha, beta, goal) tau pheromone(sub2ind(sizePheromone, candidate.x, candidate.y, candidate.z)); d norm(posOf(candidate) - posOf(node)) 1e-6; geoEta 1 / d; mlpEta 1 / (0.1 mlpHeuristic(node, candidate)); eta (1 - lambda) * geoEta lambda * mlpEta; p (tau ^ alpha) * (eta ^ beta); end这里mlpHeuristic是一个函数句柄内部调用训练好的net对象。如果MLP模型文件不存在或没有训练函数会自动退化为纯lambda等于0的ACO这在调GUI时非常有用保证程序不会因为缺少模型而崩溃。每只蚂蚁生成完整路径后马上调用总代价函数判断。判断时会遇到大量长度为无穷大或撞障碍的路径这些路径直接标记为空不参与信息素更新。6. MLP训练样本构造与离线学习流程6.1 训练样本怎么来MLP不能凭空学需要监督数据。我用了两种样本来源第一种是随机路径采样第二种是ACO历史优秀路径增强样本。随机路径采样在栅格范围内随机生成几百条符合单调性约束的路径。由于完全随机大多数路径会穿越障碍但这正是训练需要的负样本。MLP要学的不是“哪条路最优”而是“给一个候选节点下一步往这个方向走的期望代价高不高”。所以负样本和正样本混杂是有益的。ACO历史路径增强先用纯ACO跑几轮保留每轮最优的20条路径把这些路径上的节点都标记为低风险标签并重采样加入训练集。这样训练集里就包含了蚁群算法实际搜索中认为靠谱的节点特征MLP相当于把搜索经验离线蒸馏到自己内部。6.2 输入特征和标签定义每个训练样本对应一个(当前节点候选节点)对特征向量我定为9维当前节点的归一化x当前节点的归一化y当前节点的归一化高度层候选节点的归一化x候选节点的归一化y候选节点的归一化高度层候选节点周围5乘5窗口的地形高度平均值候选节点离最近障碍物的距离超过感知半径按感知半径截断当前节点指向候选节点方向与候选节点指向目标方向的夹角余弦值标签是0到1之间的代价归一化值。对于碰撞路径上的节点对标签直接取0.95以上对于安全路径标签取该路段的局部代价归一化结果。归一化通常用max-min缩放但我在实际项目里发现用sigmoid映射更稳定因为局部代价有极端值线性归一化会被几个巨值压扁。6.3 网络结构和训练代码MLP结构用9-15-1中间层用tansig激活函数输出层用logsig这样输出天然落在0到1区间。训练函数用trainlmLevenberg-Marquardt收敛快适合这种小规模数据数据量大时再换trainbr防过拟合。function net trainMLP(XTrain, yTrain) net feedforwardnet([15], trainlm); net.layers{1}.transferFcn tansig; net.layers{2}.transferFcn logsig; net.trainParam.showWindow false; net.trainParam.max_fail 8; net.trainParam.epochs 500; net.divideParam.trainRatio 0.8; net.divideParam.valRatio 0.1; net.divideParam.testRatio 0.1; net train(net, XTrain, yTrain); end训练完成后我把net对象保存到mlpModel.mat后续ACO加载模型时只用net作为函数句柄传进去。每次输入候选节点特征时网络输出一个标量直接作为启发度的一部分。训练集规模我建议至少5000对以上否则MLP学出来的规律不稳定。在我的随机地形项目里8000对样本训练时间大约35秒左右完全可接受。训练完一定要检查混淆矩阵或者回归R值如果R低于0.85说明特征构造有问题不要硬着头皮去跑ACO。7. 一键串联全流程的GUI设计7.1 App Designer布局与组件GUI我用了MATLAB的App Designer比GUIDE维护起来舒服尤其回调函数写起来更像现代语言。整体布局分三块左侧是三维坐标轴占大头右侧上方是参数设置面板右边下方是一只蚂蚁逐步走的可视化进度区底部是状态栏和按钮行。组件清单如下组件类型作用UIAxesMainUIAxes显示地形、障碍、规划出的三维路径UIAxesConvergenceUIAxes显示每轮迭代的最优代价收敛曲线EditP0数值编辑框起点坐标EditGoal数值编辑框目标点坐标EditAntCount数值编辑框蚂蚁数量默认50EditIterNum数值编辑框最大迭代次数默认80EditAlpha, EditBeta, EditRho数值编辑框ACO参数EditLambda数值编辑框MLP启发度融合系数BtnLoadMap按钮加载或生成地图BtnTrainMLP按钮训练MLP模型BtnRunACO按钮跑ACO搜索BtnShowPath按钮在三维坐标轴中叠加显示结果路径LabelStatus文本标签显示当前状态7.2 回调逻辑与数据传递App Designer里各按钮之间共享数据我习惯用一个struct存放在app.UserData里避免把一堆变量塞进app的每一个properties里。比如点击“加载地图”后生成terrain、obstacles、heightLevels三个量都存在app.UserData.environment中。点击“训练MLP”后net存在app.UserData.mlp.net状态栏显示训练用时。点击“开始ACO”后从app.UserData中读取环境与模型没模型时自动降级为纯ACO并把所有路径结果写入app.UserData.result最后刷新UIAxesMain。回调片段function BtnRunACOPushed(app, event) opts.antCount app.EditAntCount.Value; opts.maxIter app.EditIterNum.Value; opts.alpha app.EditAlpha.Value; opts.beta app.EditBeta.Value; opts.rho app.EditRho.Value; opts.lambda app.EditLambda.Value; app.LabelStatus.Text ACO搜索进行中...; drawnow; [bestPath, bestCost, convergeCurve] runACOSearch(app.UserData.environment, ... opts, app.UserData.mlp, progressCallback); app.UserData.result.bestPath bestPath; app.UserData.result.bestCost bestCost; showPath(app); plotConvergence(app, convergeCurve); app.LabelStatus.Text sprintf(规划完成最优代价 %.2f, bestCost); end这里有个关键细节ACO每一轮迭代都要更新坐标轴的话UI会极度卡顿。所以我没把每只蚂蚁都绘制而是每隔5轮迭代刷新一次路径曲线其余时间只更新收敛曲线。需要看蚂蚁逐步走的效果时用“单步调试”模式一次只跑一只蚂蚁画完当前路径后停在现场方便检查转移策略是否合理。7.3 三维坐标轴中的路径渲染在UIAxes里同时画地形、障碍和路径要兼顾可见性。地形用surf透明化FaceAlpha设为0.55障碍区域用scatter3Z坐标设为对应高度层的中间值MarkerSize小一点路径用plot3加粗红色线条并配上起终点的小球标记。function showPath(app) res app.UserData.result; if isempty(res.bestPath) return; end pathMat cell2mat(res.bestPath); cla(app.UIAxesMain); surf(app.UIAxesMain, xx, yy, terrain, FaceAlpha, 0.55, EdgeColor, none); scatter3(app.UIAxesMain, ox, oy, oz, 30, MarkerFaceColor, red); hold(app.UIAxesMain, on); plot3(app.UIAxesMain, pathMat(:, 1), pathMat(:, 2), pathMat(:, 3), ... r-, LineWidth, 2.5); hold(app.UIAxesMain, off); view(app.UIAxesMain, [-37.5, 30]); grid(app.UIAxesMain, on); end三维视角一定要手动设好不然路径可能被地形挡住。默认视角我选仰角30度、方位角-37.5度基本能同时看到地形全貌和路径走势。8. 参数调优与实测中的常见坑含完整程序结构清单8.1 关键参数经验表这套系统参数很多我在不同随机地形上反复试过比较稳的参数范围如下参数含义推荐范围我用的默认值备注antCount蚂蚁数量30-8050太少搜索不充分太多迭代慢maxIter最大迭代次数50-12080收敛后可以提前停止alpha信息素重要性0.8-1.51.0太大容易早熟beta启发重要性1.0-3.02.0与alpha平衡rho信息素挥发系数0.2-0.60.4太大容易丢记忆lambdaMLP融合系数0.3-0.50.4无模型时自动置0Q信息素总量50-200100影响收敛速度tauMin最小信息素0.5-1.00.8防早熟关键tauMax最大信息素5-158防个别路径霸占从调试经验看lambda的交互作用最强lambda偏大时即使beta很高蚂蚁也会更依赖地形预判路径倾向于平坦但可能略长lambda偏小时蚂蚁更趋于直线飞行地形好时效率高地形差时会频繁碰撞。8.2 三个最容易踩的坑第一个坑是信息素矩阵和候选节点坐标的索引错位。三维索引展开成一维后sub2ind的参数顺序必须和初始化时保持一致我折腾了两个小时发现蚂蚁一直沿一条无效边跑最后把索引映射函数单独调试才解决。现在我在代码里只用封装函数pheroGet(node)和pheroSet(node, val)不在业务代码里直接出现sub2ind。第二个坑是MLP输出尺度不可控。刚开始我用线性输出层预测值有时会跑到几十导致eta_total被MLP项主导蚂蚁行为完全紊乱。改成logsig输出层后输出强制压在0到1之间配合1/(0.1out)的转换公式相对稳定很多。第三个坑是GUI里跑长循环时界面假死。MATLAB的App Designer和普通脚本不一样如果在回调里执行长时间循环而不主动刷新窗口会一直转圈而且无法中途停止。我的解决方案是每5轮迭代调用一次drawnow limitrate同时检查app的“停止”标志即使如此也建议用户在跑大图前先用较小的蚂蚁数量和迭代次数做验证。8.3 完整程序结构清单项目最终文件结构如下第8章-工程文件结构/ |-- main_script.m % 命令行版本主入口不用GUI时直接跑 |-- createEnvironment.m % 随机地形障碍物生成 |-- checkSegmentCollision.m % 线段级碰撞检测 |-- genCandidates.m % 候选节点扩展 |-- runACOSearch.m % ACO主循环 |-- transitionProb.m % 转移概率计算 |-- updatePheromone.m % 信息素更新 |-- trainMLPHeuristic.m % MLP训练脚本 |-- buildFeatures.m % 特征向量构造 |-- computePathCost.m % 总代价计算 |-- showPath.m % 三维可视化 |-- guiACO_MLP.mlapp % App Designer GUImy 的main_script.m依次调用createEnvironment、trainMLPHeuristic、runACOSearch和showPath纯命令行也能完整复现全过程。GUI版本则是把这些函数串联到按钮回调里。两者共用相同的核心函数所以命令行验证通过的算法在GUI里结果一致不容易出现两套行为。8.4 实测效果参考我用同一份随机地形对比了纯ACO和ACO-MLP各跑20次统计成功率指最终路径未碰撞并且到达终点的比例和平均规划代价。纯ACO因为启发项太几何化在崎岖地形上成功率只有70%左右ACO-MLP的成功率稳定在90%以上且最优代价平均低了约12%。最好的一次运行中80轮迭代在第46轮就已经稳定收敛全程规划时间约37秒MLP推理耗时只占整个搜索过程的18%。当然这个数字是在随机模拟地形上得到的真实地形还有更多不确定因素但至少能够证明ACO和MLP的组合在三维路径规划里是有可复制价值的。做完这个项目我最大的体会是混合算法的成败不在于“用了两种高级方法”而在于两者之间到底以什么接口协作。ACO和MLP的接口就一个启发度函数但这个函数把地形的高维特征浓缩成了一维判断蚂蚁的行为立刻就不一样了。这套工程框架也很容易继续扩展把MLP换成更复杂的时序模型把ACO的信息素更新改成自适应挥发或者把单无人机路径规划推演成多机协同路径规划都是现成的演进方向。等项目稳定跑一段时间后我正在尝试把真实地形测量数据接入环境生成部分让仿真结果能更贴近实际飞行任务。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。