☰
多无人机三维路径规划:CELSMA黏菌算法与多约束目标函数实战
2026/10/21 6:38:08 网站建设 项目流程

做过多无人机路径规划的人大概都有过这种经历:单机避障跑得好好的,一上集群协同,算法收敛曲线照样漂亮,但把路径拉到三维场景里一看,有的贴着障碍物外缘擦过去,有的飞行高度忽上忽下像过山车,更别提机群之间在航段中段差点“撞个满怀”。这些问题的根源往往不在无人机动力学模型,而在路径规划那一层的目标函数设计和优化算法选择。这段时间我在做多无人机协同集群避障的三维路径规划项目,用的是混沌增强领导者黏菌算法(CELSMA,Chaotic Enhanced Leader Slime Mould Algorithm),目标函数从路径长度、飞行高度、威胁代价、转角平滑四个维度综合考虑最低成本。整个项目从算法改进、目标函数设计到Matlab仿真代码实现,踩了不少坑,也把几个关键模块重新捋了一遍。这篇就把完整思路、代码框架和调参经验整理出来,给正在做同类课题的同行一个可以直接参考的“作业底稿”。

1. 先把问题说清楚:多无人机三维路径规划到底难在哪

1.1 三维路径规划的本质:搜索空间与多约束

无人机三维路径规划,本质上是在一个包含障碍物、禁飞区、地形起伏的三维空间里,找到一条从起点到目标点、满足飞行性能约束和周遭安全约束的最优航迹。注意这里强调的是“三维”——不是二维地图加上高度字段那么简单,高度方向的自由度会带来两个额外麻烦:一是搜索空间从二维平面直接膨胀到三维体空间,决策变量的枚举和优化难度成倍增长;二是高度约束与无人机动力学耦合,比如最大爬升率、最小转弯半径、续航高度限制,这些在二维场景里都不用考虑。

把问题翻译成数学语言就是:设无人机飞行路径由N个离散路径点P1, P2, …, PN构成(P1为起点,PN为目标点),每个路径点是一个三维坐标(x, y, z),那整个路径的寻优就变成了在3×(N-2)维的连续参数空间中搜索一组坐标序列。这个空间有多大呢?假如每个维度取值范围划分成100个网格,N=10个路径点,搜索空间就是100^(3×8) = 10^48量级,穷举是完全不现实的。这也正是元启发式算法在这个领域被广泛采用的根本原因——它不需要遍历所有组合,而是通过群体智能在连续空间里做有向搜索。

1.2 多无人机协同带来的额外难点

单机路径规划已经够复杂,多机协同又叠加上去几个新约束:第一,机间避碰。多架无人机共享同一空域,任意两机在任意时刻的间距都必须大于安全距离,这一条是硬约束,不满足就可能导致安全事故。第二,任务协同。集群可能需要以特定队形到达目标区域,或者要在时间上同步到达,这对路径规划的同步性提出了要求。第三,计算复杂度。如果单机路径规划需要评估上万次适应度,多机场景下每评估一次就要同时计算所有无人机的路径质量和相互影响,计算量随无人机数量线性甚至二次增长。

我之前在一个模拟项目中试过先把每架无人机的路径单独优化好,再把结果拼在一起做碰撞检测,结果发现大量路径在中途对冲,只能反复调整,效率极低。后来改成“整体编码、整体评估”——把集群所有无人机的路径点拼成一个大的决策向量,适应度函数同时计算路径成本和机间冲突惩罚,效果好了很多。这也是后续算法设计的基础思路。

2. CELSMA的算法逻辑:混沌初始化、领导者机制和邻域扰动的组合效果

2.1 黏菌算法SMA基线原理回顾

先简单过一遍黏菌算法(Slime Mould Algorithm, SMA)。这个算法是模拟多头绒泡菌觅食行为的,这种黏菌在寻找食物时会先派出多个“探针”覆盖周围区域,发现食物后释放化学信号,信号浓度越高,周围的原生质流就越向该方向收缩聚集,同时被信号吸引的黏菌还会扩张去包裹食物。SMA把这种“正反馈 + 探索收缩”行为抽象为种群位置更新规则:适应度好的个体相当于“食物源强的区域”,其他个体会向它们靠拢,同时保留一部分随机扰动来探索新区域。

SMA的优势是收敛速度快、局部开发能力强,在单峰问题上表现很好;缺陷也明显——群体容易早熟,一旦被某个局部最优解吸引,黏菌群体整体收缩过去之后很难再跳出来。特别是多无人机路径规划这种高维、多峰、约束密集的问题,直接套用原始SMA,跑出来的路径经常是“局部最优但是不满足威胁约束”或者“路径平滑但绕了远路”。

2.2 混沌增强:从种群初始化到迭代扰动的注入

CELSMA的第一个关键改进是用混沌序列替代随机数生成器。这里用的混沌映射是Tent映射,迭代公式 x_{k+1} = μ(1 - 2|x_k - 0.5|)(μ取接近2的值),或者也可以使用经典的Logistic映射 x_{k+1} = r·x_k·(1 - x_k)。混沌序列的“遍历性”保证初始化种群能比较均匀地覆盖整个搜索空间,不像纯随机初始化那样容易出现大片空白区域。举个直观例子:在三维空间中随机撒30个初始点,纯随机的方式经常出现扎堆;用混沌序列撒出来的30个点,分布更均匀,相当于给后续搜索提供了一个更好的起点。

迭代过程中混沌扰动也被用作跳出局部最优的机制:每隔若干代,对全局最优解施加一个幅度随迭代次数衰减的混沌扰动,生成候选解与当前最优解比较。这个思路有点像模拟退火的“概率接受”,只不过扰动的方向和幅度来自混沌序列。实际操作中,我会把扰动幅度设置为初始搜索范围的20%,随迭代线性递减到5%左右。实测下来,加了混沌扰动确实能明显改善“早熟收敛到威胁区边缘”的问题。

2.3 领导者机制:让“最强黏菌”带动群体搜索

CELSMA的“领导者黏菌”机制,是在标准SMA的位置更新公式上做了修改。标准SMA中,每个个体根据自身的适应度决定权重W,然后向当前最优个体靠拢,同时保持一部分随机探索。CELSMA则是显式维护一个“领导者集合”——不只有一个最优解,而是取适应度排序前20%的个体作为领导者组,位置更新时普通个体随机选择一个领导者作为引导目标,而领导者自身则利用混沌扰动在周围做局部精细化搜索。

这样做的好处是双重的:一方面,多个领导者保留了种群的多样性,不会像单领导者那样把整个群体“拽”向一个点;另一方面,领导者组的局部搜索能力增强,实际上是在多个有希望的区域内同时做精细开发,相当于“团队里几个人分头深耕不同方向”。我在一个70维的路径规划算例中对比过原始SMA和CELSMA的收敛曲线,CELSMA在相同迭代次数下适应度能下降约18%-25%,而且最终路径的威胁代价明显更低。

2.4 CELSMA的算法流程总结

完整的CELSMA流程可以概括为:混沌映射初始化种群 → 计算每个个体的目标函数值 → 筛选领导者集合 → 普通个体向随机领导者靠拢(位置更新) → 领导者局部混沌扰动搜索 → 更新全局最优 → 混沌扰动注入全局最佳解 → 判断终止条件(最大迭代次数或收敛阈值)。这套流程在Matlab里实现时,核心模块就是初始化函数、适应度计算函数、位置更新函数和混沌扰动函数,结构清晰,后续要改成其他算法也很容易——把黏菌位置更新逻辑替换成灰狼或者粒子群更新逻辑就可以了。

关于算法改进这块,我多说一句:CELSMA这类“基础算法 + 混沌增强 + 精英策略”的组合框架,目前在各类路径规划课题里非常常见,评审人也相对认可,因为它每一步改进都有明确的机理支撑——混沌解决种群多样性、领导者解决开发与探索平衡、扰动解决早熟问题。

3. 目标函数逐个拆解:路径长度、飞行高度、威胁代价与转角平滑怎么量化

3.1 四个成本项的设计思路

多无人机路径规划的“最低成本”目标函数,这里设计了四个维度:路径总长度、飞行高度代价、威胁代价、转角代价。整体目标函数写成加权和形式:

F_total = w1·F_path + w2·F_height + w3·F_threat + w4·F_smooth

四个子函数分别量化不同目标,权重系数w1-w4根据任务侧重调整。设计的关键在于:每个子函数必须做归一化处理,让它们的数值范围大致可比,否则某一路项数值特别大就会直接“淹没”其他项,算法会把所有精力都放在优化这一项上,其他约束形同虚设。

3.2 路径长度代价F_path:最直观的续航指标

路径长度的计算很简单,就是把所有相邻路径点的欧氏距离累加起来。设路径点序列为P1, P2, …, PN,则:

F_path = Σ_{i=1}^{N-1} ||P_{i+1} - P_i||

在Matlab里就是一行sum(sqrt(sum(diff(path).^2, 2)))。路径长度直接关联飞行时间和能耗,是成本函数里最基本的一项。不过这里有个陷阱:如果只用两个端点做直线规划,F_path当然最短,但中间完全没有避障余地。所以实际编码中路径点数量不能太少,理论分析和实测下来,一条路径至少8到12个路径点才够用——太少则避障能力差,太多则决策变量维数过高,算法收敛速度会明显变慢。

3.3 高度代价F_height:兼顾飞行安全与能耗的三维考量

高度代价主要惩罚两类情况:一是无人机飞行高度与期望巡航高度偏差过大,因为长时间低空飞行有地形撞击风险,而且低空气流紊乱、能耗更高;二是高度变化过于剧烈,忽高忽低不仅浪费能量,还可能导致无人机超出最大爬升率限制。高度代价可以设计为:

F_height = Σ_{i=1}^{N} |z_i - z_ref| + Σ_{i=1}^{N-1} |z_{i+1} - z_i|

其中z_ref是参考巡航高度(比如100米),前半项是高度偏差惩罚,后半项是高度变化惩罚。加高度变化惩罚很关键,我见过不少新手目标函数里只写了偏差项,结果算法规划出来的路径在两个路径点之间垂直爬升好几十米,实际飞行根本执行不了。

3.4 威胁代价F_threat:障碍物碰撞惩罚的核心实现

威胁代价是路径规划里最重要的安全项。这里采用常见的“威胁圆(球)模型”:把每个障碍物(高楼、山峰、禁飞区等)抽象成一个圆柱体或球体,给定中心坐标、影响半径R_k和威胁强度(可设为中心强、边缘弱,用高斯型衰减)。当路径点或路径段进入障碍物影响范围时,按侵入深度计算惩罚:

F_threat = Σ_{k} Σ_{segments} penetration_depth_k × intensity_k

更具体一点,如果无人机当前位置到威胁源中心的距离d_k小于威胁半径R_k,惩罚量正比于(R_k - d_k)/R_k的某次幂。为了让算法主动远离障碍物而不是贴着边缘飞行,我通常会在威胁代价里加一点“软化”处理:距离略大于R_k时也施加一个很小的惩罚,相当于设置了一个缓冲带。

还要注意一个关键细节——评估威胁时不能只看路径点,要看路径段。因为路径点可能在障碍物外面,但连接两个路径点的直线段却从障碍物内部穿过去了。正确做法是在每条路径段上均匀采样若干中间点(比如每段采样5到10个点),逐一计算威胁值。这一条在三维路径规划中尤其容易踩坑,我在第5章会再详细说。

3.5 转角代价F_smooth:让轨迹可飞而不是纸上谈兵

转角代价衡量路径的平滑程度。无人机飞行需要限制转弯角速度,路径上如果出现尖锐转角,实际飞控很难跟踪,代价就是路径跟踪误差变大甚至失控。转角代价可以分解为水平偏航角和竖直俯仰角两部分:

F_smooth = w_yaw·Σ|Δψ_i| + w_pitch·Σ|Δθ_i|

Δψ_i是相邻路径段在水平面投影的夹角变化量,Δθ_i是相邻路径段在竖直方向的俯仰角变化量。计算的时候用向量夹角的余弦公式即可:cos Δψ = (v_i · v_{i+1}) / (||v_i||·||v_{i+1}||),其中v_i是路径段向量。然后取反余弦得到角度。为了避免反三角函数的数值精度问题,我实际代码里会直接使用1 - cos Δψ作为代价,效果类似但计算更稳定,梯度特性也更好。

3.6 权重系数的经验取值与归一化处理

权重系数的确定没有绝对标准,完全取决于任务需求。如果任务强调快速到达,路径长度权重就高一些;如果任务在密集城区执行,威胁权重必须拉满。我在模拟项目里常用的一组初始权重是:

成本项权重归一化基准
路径长度0.30起点到目标点直线距离
飞行高度0.20参考高度与最大允许偏差的乘积
威胁代价0.35障碍物数量 × 最大穿透深度
转角代价0.15路径点数 × π(最大转角累计)

关键的归一化做法是:在每次适应度计算时,用当前种群的最差值和最好值做线性缩放,把每项成本映射到[0,1]区间,然后再加权求和。第一版目标函数我没做归一化,直接粗暴加权,结果路径长度项数值太大(几百米甚至上千米),威胁和转角的惩罚量(通常是0到几)完全被淹没,算法跑出来的路径只求短,根本不避障。发现这个问题后加了归一化,所有约束才开始“活”起来。

4. 多无人机协同避障:机间防碰撞、障碍物规避与任务约束的联调方案

4.1 协同规划架构:集中式编码与分布式评估

多无人机协同路径规划,代码实现上有一个架构选择问题:是全集中式(把N架无人机的路径点全部拼成一个超长向量,一次优化出所有路径),还是分布式/分步式(每架无人机独立规划,再统一做碰撞检测调整)?

我用的是集中式编码 + 分层评估。就是说决策向量是三维坐标拼接:X = [x11, y11, z11, x12, y12, z12, … , xn1, yn1, zn1, …],前三维是第1架无人机的第1个路径点,以此类推。适应度评估时,先逐机计算各自的路径、高度、转角、威胁成本,这部分计算相互独立可以并行;然后计算机间约束惩罚——检查任意两架无人机同一时刻(同一路径点索引处)的三维距离,以及路径段之间的最近距离,若低于安全间距则施加惩罚。集中式编码的好处是算法可以在一个优化框架内同时权衡路径质量和机间关系,不会出现“分开都很好、合起来全冲突”的窘境。

4.2 机间防碰撞约束的实现细节

机间防碰撞是集群路径规划最核心的约束,实现时有两处容易遗漏:第一,只检查路径点之间的距离,不检查路径段之间的最近距离。比如两架无人机的路径点错开了安全距离,但其中一架在路径段中点恰好与另一架的路径段交叉,就会发生“近距离交会”。解决方法是把每段路径再稠密采样,用采样点之间的距离做约束检查。第二,时间维度没考虑。如果无人机是不同步出发的,应该检查的是同一时刻的瞬时位置距离,而不是路径点索引对应的距离。我用的是一个简化的同步假设:所有无人机同时出发、速度相近,同一索引处的路径点视为同一时刻位置。对于那些需要异步到达或不同速度的任务,还需要在目标函数中加入时间维度约束,这个扩展实现起来更复杂,但原理一致。

机间距离惩罚函数设计为分段形式:当两机距离d < d_safe时,惩罚量正比于(1 - d/d_safe)^2,惩罚强度系数取较大的值(比如50);当d ≥ d_safe时惩罚为0。这样的设计形成“硬约束软实现”——不会直接淘汰违反约束的解,但会给它很高成本,迫使算法在进化过程中逐渐淘汰掉不安全路径。我实际测试过,惩罚系数太低(比如小于5)时算法会无视安全距离,产生大量近距离交会路径;系数太高(比如大于200)时容易导致适应度函数过于陡峭,收敛稳定性变差。

4.3 集群编队保持与任务点协同

除了避障,集群协同任务往往还要求保持编队形状,比如三角形、楔形编队。编队保持的实现方法可以在目标函数里加入编队偏差项:在路径规划的每个路径点处,计算无人机实际相对位置与期望编队位置的偏差,累加后作为额外惩罚。不过编队约束和避障约束经常存在矛盾——遇到障碍物时编队必须临时散开,过去之后再收拢。我在项目中采用的是动态权重的思路:障碍物威胁越大时,威胁代价权重自动升高,编队保持权重自动降低;通过检测障碍物密度来切换“编队模式”和“避障模式”。这种方法比较粗糙但很有效,适合工程快速落地。

另外,多机协同还有一个容易忽略的点:地图信息共享。所有无人机的威胁代价计算必须基于同一张障碍物地图,否则算法会“各自为政”——A避开了一个障碍物,B的路径却正好穿过同一个障碍物。我的做法是构建一个全局威胁场矩阵,所有无人机的适应度计算都读取这个共享矩阵,确保每一架“看到”的环境是一致的。这个逻辑听着简单,但在代码翻车率高,因为很容易在某个子函数里不小心用了局部的地图副本。

5. Matlab代码实战:框架设计、参数整定与运行结果判读

5.1 代码整体框架与模块划分

Matlab实现CELSMA多无人机路径规划,我建议按下面几个模块组织文件,每个模块独立测试,避免一锅乱炖:

  • main.m:主脚本,负责参数设置、初始化、循环调用和结果绘图
  • CELSMA_Init.m:混沌种群初始化,生成初始无人机路径点集
  • Fitness.m:适应度计算,实现路径、高度、威胁、转角、机间距离五个子函数的加权求和
  • PositionUpdate.m:黏菌位置更新 + 领导者筛选 + 混沌扰动
  • PlotPaths.m:三维路径可视化,绘制地形、障碍物、所有无人机路径
% main.m 核心循环框架示例 for iter = 1:MaxIter % 计算适应度 for i = 1:Npop fitness(i) = Fitness(positions(i,:), map, obs, params); end % 筛选领导者集合 [sortedFit, idx] = sort(fitness); leaderSet = positions(idx(1:LeaderNum), :); % 位置更新 positions = PositionUpdate(positions, leaderSet, iter, params); % 领导者局部混沌扰动 positions = ChaoticPerturb(positions, leaderSet, iter, params); % 记录收敛曲线 bestFitness(iter) = sortedFit(1); end

5.2 关键参数的整定建议

参数整定是“调参一时爽,乱调火葬场”的经典环节。我给出我实测比较稳定的参数范围,供参考起步,具体还要结合任务场景微调:

参数推荐范围说明
种群规模Npop30-50太小易早熟,太大计算量高
最大迭代次数MaxIter200-500三维路径规划通常300代左右收敛
无人机数量3-5大于5时建议分群规划
路径点数(每机)8-12决策变量维度=点数×3
混沌映射系数μ1.9-2.0Tent映射参数
领导者比例20%领导者集合占种群比例
混沌扰动初始幅度搜索范围的20%随迭代线性递减到5%
安全距离d_safe5-10米取决于无人机物理尺寸
障碍物影响半径15-30米与环境尺度相关

这里要特别说一下路径点数:路径点数不只是避障精度的决定因素,它直接决定了优化问题的维数。每增加一个路径点,决策变量就增加3维,算法搜索难度呈指数上升。所以路径点数量要“够用而不浪费”——先跑一次,看路径段有没有明显穿越障碍或转角是否过大会暴露路径点数不足,然后再按需增加。

5.3 结果判读:收敛曲线、路径图与指标复盘

运行完算法,除了盯着最终适应度值,我强烈建议把两个图打出来:收敛曲线和三维路径图。收敛曲线能直观反映算法状态:如果曲线前100代快速下降然后平缓,说明算法收敛正常;如果曲线持续剧烈震荡,多半是混沌扰动幅度过大或者惩罚系数太陡峭;如果曲线早期就几乎不变,说明种群多样性不够,可以加大混沌扰动或提高领导者比例。

三维路径图则要重点看:路径是否贴着障碍物边缘飞行、高度是否维持在参考线附近、转角是否圆滑、多机之间安全距离是否足够。我习惯在路径图上叠加绘制障碍物球体范围(用半透明球体)和参考高度平面,这样路径占用一目了然。一个常见的问题是路径看起来“安全”但实际上障碍物半径数值设小了——比如障碍物实际直径10米,我只设了2米影响半径,路径直接穿过真实障碍物但图上看不出来。所以障碍物参数的设定必须以真实场景尺寸为基准,而不是拍脑袋。

5.4 实测踩过的坑与排错思路

我把自己在这个项目里踩过的最典型的几个坑按排查难度排序写出来,供参考:

坑一:威胁代价评估只算路径点不算路径段。症状是路径点全部避开障碍物,但连线穿越障碍物。排查方法:在绘图时把路径段加密采样后高亮,肉眼就能看出穿模。修复方法:路径段上均匀取5-10个采样点,逐一计算威胁值。

坑二:适应度函数量纲不匹配。症状是最优路径特别短但不避障,或者完全绕开障碍物但路径里包含大量锯齿。排查方法:把四个子函数值分别打印出来,观察它们各自的数量级。修复方法:每个子函数做种群内归一化,或者用固定基准值归一化。

坑三:机间距离约束检查漏掉路径段。症状是两机路径点间距都大于安全距离,但路径都在中段发生交汇。修复方法:统一用“路径段加密采样点”做机间距离检查,不要只查路径点。

坑四:混沌扰动幅度不衰减导致后期收敛差。症状是收敛曲线尾部反复起伏,最后几十代适应度还在上下跳动。修复方法:让扰动幅度随迭代次数线性或指数衰减,后期只在最优解附近做精细搜索即可。

还有一点很重要但很少被提起:多目标函数的惩罚项和约束项要保持“平滑”。像“小于安全距离就惩罚、大于就不罚”这类阶跃式约束会让适应度场产生陡峭的悬崖,黏菌算法在悬崖边界容易被卡住。建议所有惩罚项都用连续可导的平方函数或衰减函数过渡。这也是为什么我习惯把机间距离惩罚设计为(1 - d/d_safe)^2而非if-else硬切换——前者给算法一个平滑的“越靠近越危险”信号,后者是“瞬间变危险”,搜索效率差别很大。

最后分享一个调参的小体会

这个项目的CELSMA我前后调了两个多星期,最终发现提升最明显的不是算法改动,而是把目标函数里的路径段威胁采样加上去——单这一项,就让最优路径的安全裕度大幅提升。很多时候我们热衷于把元启发式算法的机制改得复杂,却忽略了问题本身约束建模的精细度。目标函数没有准确反映真实物理约束,算法再精巧也只是在一个错误的评分标准上“瞎优化”。所以在动手改进算法之前,先把适应度函数设计对、把约束边界量化好,往往比换算法、调权重更值得。如果你也在做多无人机路径规划,这个顺序值得参考:先细化问题建模,再谈算法增强,最后才是参数微调。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询