☰
多智能体系统:用凸组合统一编队跟踪与协同围捕控制
2026/10/17 9:27:16 网站建设 项目流程

搞控制的人应该都有体会,编队跟踪和协同围捕这两个方向,在文献里基本是两条道走到黑的状态:做编队的论文,默认场景是“我方无人集群保持队形赶路”,目标体不存在;做围捕的论文,默认场景是“发现入侵体了,全员调转枪口”,队形本身马上就无所谓了。但真实任务里这两件事常常是连续发生的——无人机编队在执行巡逻任务的过程中突然发现不明目标,不可能先飞回基地“切换”到围捕模式再折返,也没有操作员在地面手动改控制律。TAC项目(时变编队跟踪与多目标围捕的凸组合框架)就是冲着这个痛点去的:用凸组合这一条数学线,把时变编队跟踪控制器和多目标协同围捕控制器缝进同一个控制律里,按任务阶段平滑过渡,既不需要模式切换,也不破坏稳定性分析。这篇博文会把我在这个项目里的建模思路、公式推导逻辑、仿真参数设计和踩过的坑完整写出来,适合刚接触多智能体系统控制的研究生,以及想在自己的仿真环境里复现“编队—围捕”一体化算法的工程师参考。

我当时立项TAC,起因其实特别朴素:某次模拟推演里,我方三架飞行器先在指定航线附近维持了大约1分钟的“箭头”编队,然后突然收到围捕指令。原计划是先解散编队、各机独立逼近,再根据落位情况临时成圈。结果在“解散—重组”的空档里,目标已经穿过了拦截面。之后我花了整整两个晚上把所有相关论文翻了一遍,发现这个问题不好解决是普遍现象,核心症结就在于“模式拆分”:编队模式和围捕模式各做各最优,但两者交班的时候没有数学上干净利落的连续过渡。

1.1 传统编队控制的痛点

常规的时变编队跟踪问题,数学上是这么描述的:根据邻接矩阵拓扑,让每个个体和自己的邻居保持期望的相对位移偏移量,同时让整个编队质心沿着期望轨迹运动。在设计分布式控制器时,经典做法是构造编队跟踪误差的线性组合,利用李雅普诺夫函数证明误差收敛。这套方法很成熟,在空地协同、水面无人艇编队上都有大量应用,问题只有一个:它假设“队形期望值”是预先给定的,完全不考虑外部目标进来之后要不要切换行为。一旦任务里插入“围捕”这种新目标,原有的控制器就得让位,拓扑和目标偏移量全部重设置,等于系统要在运行中“换代码”,动力学上必然产生瞬态响应甚至短时失稳。

1.2 TAC要解决的两类核心问题

TAC把问题压缩成两个连贯的子问题:第一个,编队阶段多智能体系统在时变编队参考下完成有限时间跟踪,队形可以是旋转、伸缩、平滑变形等动态类型;第二个,探测到多个目标进入警戒区域之后,各智能体要能在保持通信约束的情况下动态分配围捕对象、生成围捕编队,然后把目标“锁”在包围圈内。理论上,如果把“编队跟踪”和“围捕”看作同一个控制目标的两种极端约束,那它们之间的任何中间态都可以表示为两个子控制律的凸组合。这就是TAC的底层逻辑:不需要模式切换,只需要一个权重系数λ在0到1之间按任务态势连续变化。

2. 凸组合的想法是怎么落地的

2.1 为什么一定是凸组合,而不是时变增益或者切换控制

先解释一下“凸组合”这个概念,控制领域的老手应该很熟悉,但对刚入门的人我得说清楚:所谓凸组合,就是几个向量的加权平均,权重不小于0且加起来等于1。如果把编队子控制器记作\(u_i^f\),围捕子控制器记作\(u_i^e\),凸组合后的总控制律就是:

\[u_i = \lambda_i u_i^f + (1-\lambda_i)u_i^e, \quad \lambda_i\in[0,1]\]

其中\(\lambda_i\)是每个智能体自己的模式权重。注意这里是每个智能体单独一个权重,不是全系统共用一个,这个细节在后面影响很大。为什么不用时变增益?因为时变增益调节的是同一个控制律内部的参数,本质上还是同一个目标函数;为什么不用切换控制?因为切换控制需要判断条件、触发器、滞环设计,切换瞬间很容易产生抖振,对物理执行器非常不友好。凸组合的天然好处在于它把“模式选择”变成了“权重连续变化”,系统每时每刻都在同时执行编队逻辑和围捕逻辑,只是占比不同,这样从理论上就避免了切换跳变。

2.2 时变编队子控制器的建模

编队子控制器沿用了经典的一致性框架。假设系统里有\(N\)个智能体,第\(i\)个智能体在二维平面上的位置是\(p_i=[x_i,y_i]^T\),速度为\(v_i\)。时变编队偏移量记为\(d_i(t)\),它刻画的是智能体在期望队形里的相对位置,比如一个三角形编队,每个顶点对应的\(d_i(t)\)各不相同。当时变编队发生时,\(d_i(t)\)是时间的函数,比如编队整体旋转时,\(d_i(t)\)会像刚体一样绕质心转动。写成控制律:

\[u_i^f = k_p \sum_{j\in\mathcal{N}i} a{ij}\left[(p_i-p_j)-(d_i-d_j)\right] + k_v \sum_{j\in\mathcal{N}i} a{ij}(v_i-v_j-\dot{d}_i+\dot{d}_j) - k_e(p_i-p_c-d_i)\]

最后一项是质心矫正项,\(p_c\)是期望编队几何中心轨迹,\(k_e\)把整个编队“拉”到期望路径上。注意\(\dot{d}(t)\)不能忽略,很多人第一次做时变编队就跑飞了,就是只补偿位置没补偿速度。

2.3 围捕子控制器的设计

围捕部分我参考了市场上做包围控制比较成熟的做法,但做了两处改动:第一处是目标估计,不能假设每个智能体都能直接测到目标全局位置,只能通过相对距离和方位角估计,所以我加了一个分布式观测器,每个智能体都跑一个目标运动状态估计器,通过邻居间交换估计值来收敛到一致的目标位置和速度;第二处是围捕点的动态分配,多目标场景下每个目标周围要有几个智能体围成圈,分配问题用匈牙利算法的竞拍版本在线求解,代价矩阵取“智能体到目标当前预测位置的欧氏距离+预估到达时间”。围捕控制律本身是反步法设计,内环控制距离收敛到期望围捕半径,外环控制方位角间距均匀分布。围捕半径\(R\)按智能体数量的不同自适应缩放,当数量多时适当扩大半径避免内圈拥挤。

2.4 凸组合权重怎么设才是关键

\(\lambda_i(t)\)的设计是TAC最核心也最容易翻车的地方。我一开始用最简单的阈值触发:探测距离小于警戒值就把λ直接赋0,结果和切换控制没什么区别,照样抖振。后来改成S形函数平滑过渡:

\[\lambda_i(t) = \frac{1}{1+e^{\mu (r_i(t)-R_w)}}\]

\(r_i(t)\)是智能体到目标估计位置的距离,\(R_w\)是警戒半径,\(\mu\)控制过渡带宽度。\(\mu\)太小过渡太平,围捕效果迟迟不出来;太大又近似硬切换。我实测下来,\(\mu R_w \approx 5\)时效果比较均衡,过渡时间大概在2到3秒,既不会让围捕决策太迟钝,也不会因为λ跳变产生加速度突变。如果你希望围捕优先级随目标危险等级变化,也可以让\(R_w\)从固定值改成随目标类型自适应调整,这在思路上完全兼容。

3. 算法流程与仿真参数配置

3.1 完整流程拆分

TAC的每个控制周期内执行以下步骤:第一步,通过通信接口接收邻居状态,更新本机对目标的估计;第二步,基于目标和本机位置计算围捕子控制器输出;第三步,基于编队参考轨迹计算编队子控制器输出;第四步,根据当前态势计算每个智能体的凸组合权重;第五步,把两个子控制器加权叠加,输出到执行机构。此外,多目标分配模块不需要每个周期都跑,目标位置变化不大时可以采用较低频率,比如每20个控制周期重算一次分配,节省算力。

3.2 一个可以直接上手的仿真框架

我在项目里用了Matlab/Simulink搭环境,核心是分布式控制律的离散实现。控制周期设20ms,这比实际飞控的一般控制频率低,但仿真验证阶段够用。你可以按下面这个案例初始化:4个智能体,2个运动目标,通信拓扑选环状结构,每个智能体与其前后节点有向通信。期望编队是正方形,边长6m,编队中心沿一条正弦轨迹运动,\(d_i(t)\)随时间做周期变形。目标运动初始位置在警戒区外,速度恒定。跑出来编队误差曲线在3.2秒左右收敛到0.2m以内,围捕触发后大约8秒四个智能体在目标周围形成半径5m的等间距圆。

这里给出一个简化的分布式控制律片段,方便你理解整个组合逻辑的实现:

function u = tac_controller(pos, vel, neighbors, d_ref, target_est, params) % 编队子控制器 u_f = zeros(2,1); for j = neighbors dist_pos = (pos - neighbors(j).pos) - (d_ref - neighbors(j).d_ref); dist_vel = vel - neighbors(j).vel - (d_ref_deriv - neighbors(j).d_ref_deriv); u_f = u_f + params.kp*dist_pos + params.kv*dist_vel; end u_f = u_f - params.ke*(pos - pos_center_ref - d_ref); % 围捕子控制器 u_e = params.k_r*(target_est.pos - pos) * (norm(target_est.pos - pos) - params.R_form); u_e = u_e + params.k_phi*(angle_desired - current_angle); % 凸组合权重 r = norm(target_est.pos - pos); lambda = 1 / (1 + exp(params.mu * (r - params.R_w))); % 叠加 u = lambda*u_f + (1-lambda)*u_e; end

3.3 关键参数表

下面这张参数表是仿真最终收敛效果较好的一组,你可以拿它当起点去调。注意环境一变,参数大概率得从头标定,但总体的量级可以参考。

参数数值说明
控制周期0.02s离散控制步长
编队位置增益 kp2.5编队子控制器位置误差权重
编队速度增益 kv1.8编队子控制器速度误差权重
质心矫正增益 ke0.8编队质心轨迹跟踪权重
围捕半径 R5m期望包围圈半径
警戒半径 Rw12m触发围捕权重变化的距离
S形过渡宽度 mu0.4决定λ过渡快慢
观测器增益 L3.0目标状态估计收敛速率

4. 调试实录:TAC最容易翻车的几个地方

4.1 编队发散的根因:凸组合系数变化太快

第一次跑通闭环的时候,编队阶段还没问题,一旦目标进入警戒区,编队误差曲线就突然发散,整个系统震荡接近1分钟才缓慢恢复。我检查了所有增益,甚至怀疑是围捕控制器和目标估计器有冲突。后来把\(\lambda_i(t)\)变化曲线打出来才发现,当目标进入警戒区时λ在1.5秒内从1直接跌到接近0,等效于用近乎阶跃的方式切换控制器。我调整了S函数中\(\mu\)参数,从0.4改到0.15,让过渡时间拉长到4秒以上,发散现象才消失。这是TAC最典型的坑:权重连续不代表变化率连续,λ的导数大小同样受限于系统带宽。

4.2 围捕目标逃逸:观测器收敛速度不够

另一个印象深刻的问题是,当目标做直线运动时一切正常,一旦目标加速拐弯,围捕圈就自动“让路”,有时候内圈成员被直接甩开。排查后发现分布式观测器对加速度的估计滞后了大约0.5秒,等估计器修正过来,目标已经离开预测点了。解决方案不复杂但实用:观测器增益从3.0提高到4.5,同时在围捕子控制器中引入目标加速度的前馈项。把这个改动加进去之后,逃逸场景的围捕成功率从模拟中的61%提升到88%左右。

4.3 多目标分配冲突:代价矩阵千万别只看距离

有次设置了3个目标和5个智能体,程序跑了一段时间后出现了两个围捕子队同时出现在同一个目标周边的死锁。排查发现是分配模块的代价矩阵只算了欧氏距离,忽略了已有围捕圈“占位”的影响。换句话说,第二个目标旁边明明已经有2个成员在围攻,代价矩阵还是把它判成“距离更近”,继续往那一边调兵。后来我把代价项改成“智能体到目标的距离 + 该目标当前被围捕成员数量的惩罚项”,并配合每20个周期重算分配,冲突才彻底解除。

4.4 问题速查表

现象可能原因处理手段
编队跟踪阶段误差不收敛拓扑图不连通或遗漏邻居信息检查邻接矩阵是否符合含生成树的通信条件
λ变化时系统抖动过渡时间过短,等效控制切换减小μ值,拉长过渡带
围捕圈半径不稳目标观测噪声过大提高观测器增益或加滤波;减少对目标位置的直接微分
围捕子队互相挤占分配代价矩阵缺少占用惩罚加入已被围捕成员数量的代价项
编队队形变形后难恢复\(d_i(t)\)速度补偿项缺失确保控制器里有\(\dot{d}_i\)前馈项

5. 经验总结与后续扩展

做这个项目前后花了大约两个半月,从第一天在纸上推凸组合控制律到最终把所有仿真跑完,最深的两点体会:一是凸组合的权值变化率比很多人以为的更容易决定系统稳定性,它完全不亚于控制器增益在系统里的作用。二是所谓的“模式平滑过渡”,不能只做到数学上连续,还要保证一阶导甚至二阶导在物理可实现范围内。这些结论在做Simulink仿真时可能不太明显,但一旦换到真实无人平台,执行机构的响应带宽会立刻把问题暴露出来。

TAC这个框架后续还能往三个方向扩展:一是把平面二维问题提升到三维空间,围捕控制律里加高度约束项;二是结合在线学习,让λ的过渡规则从人工设置的S函数变成根据目标运动模式自适应调整;三是引入通信时延补偿机制,因为当前实现假设通信不存在丢包和时延,这在模拟项目里不算致命,但在真实系统里会直接影响凸组合权重的同步性。如果你准备在你的项目里复现类似思路,建议从最简场景开始:固定通信拓扑全连接、单目标、编队形状不变,先把闭环跑通再逐步加复杂度。相信我,先让凸组合在简单系统里稳定,后面扩展会顺利得多。

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

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

立即咨询