第 2 章 共识算法与分布式优化¶
本章性质:✅ 全方向共享——共识(consensus)与 ADMM(交替方向乘子法)是所有分布式多机控制的数学引擎。后续每一章只要出现"多个机器人不靠中央节点、靠彼此通信达成一致",背后都是这两套工具在运转:第 4 章的分布式 MPC 编队用 ADMM 切分联合优化,第 5 章的协同搬运用一致性协调内力,第 12 章的 MARL+规控混合在通信图上跑共识式安全约束。 读者画像:已读完第 1 章(掌握图 \(G\)、Laplacian \(L=D-A\)、代数连通性 \(\lambda_2\)、三大架构),熟悉线性系统稳定性(特征值判据)与凸优化基础(对偶、KKT)的算法工程师。 在 Part 中的位置:本章是 Part 1(多机协作基础)的第二章,把第 1 章"\(\lambda_2\) 决定协调快慢"这个**定性**结论,升级为一整套**定量**的收敛理论与可落地的分布式优化算法。第 1 章告诉你"图越连通协调越快",本章告诉你"到底有多快、要通信几轮、时延多大会失稳、以及当每个机器人要解的不是一个标量而是一整个优化问题时该怎么协调"。
前置自测¶
📋 答不出 \(\ge 2\) 题 → 第 1、2 题回第 1 章 §1.2,第 3、4 题回凸优化与线性系统基础,第 6 题回基础概率统计,再来读本章。本章会大量复用这些前置,但不重新教它们。
- (接第 1 章)Laplacian 矩阵 \(L\) 的**零特征值**对应哪个特征向量?为什么"\(L\) 有且仅有一个零特征值"等价于"图连通"?
- (接第 1 章)代数连通性 \(\lambda_2\) 是 \(L\) 的第几个特征值?第 1 章说它"决定共识收敛速率",那个速率的指数形式 \(e^{-\lambda_2 t}\) 你能复述其含义吗?
- 一个连续时间线性系统 \(\dot x = Mx\) 渐近稳定的充要条件是什么(用 \(M\) 的特征值表述)?离散时间系统 \(x(k+1)=Wx(k)\) 呢?
- 什么是**拉格朗日对偶**?KKT 条件包含哪几组?什么叫一个优化问题的**对偶可行**与**原始可行**?
- (接第 1 章)为什么把 \(N\) 台机器人的轨迹优化拼成一个联合 QP,其求解成本会随 \(N\) 三次方甚至更高地膨胀?这正是本章 ADMM 要解决的痛点。
- 若 \(N\) 个独立、零均值、方差 \(\sigma^2\) 的噪声测量取平均,平均后的方差是多少?(提示:这解释了 §2.5 为什么多机协同感知融合能把噪声方差缩减到 \(1/N\)。)答不出说明要补一点基础统计——本章 §2.5 会用到它来论证分布式估计的精度收益。
本章目标¶
学完本章后,你应该能够:
- **证明**连续时间共识 \(\dot x=-Lx\) 与离散时间共识 \(x(k{+}1)=Wx(k)\) 的收敛性,并推导出收敛速率分别由 \(\lambda_2\) 和 \(W\) 的第二大特征值模 \(|\rho_2(W)|\) 决定。
- **构造**一个满足收敛条件的离散共识权重矩阵 \(W\)(双随机 + 连通),并说明为什么非双随机的 \(W\) 会导致漂移或不收敛。
- **分析**通信时延对共识的影响,推导出无向固定拓扑下的临界时延阈值 \(\tau^\star=\pi/(2\lambda_N)\),并说明它为什么由**最大**特征值 \(\lambda_N\)(而非 \(\lambda_2\))决定。
- **推导并实现**标准 ADMM:从增广拉格朗日出发,导出 \(x\)-更新、\(z\)-更新、\(y\)-更新三步迭代,并用它求解一个分布式 QP。
- 解释 ADMM 罚参数 \(\rho\) 的作用与选取——为什么太大让本地子问题主导、太小收敛慢,以及它与第 1 章"全局协调 vs 局部自主"权衡的对应。
- **区分**编队控制的三种范式(position / displacement / distance-based),写出 displacement-based 控制律,并说明它本质上就是共识协议作用在"相对位置误差"上。
- **设计并实现**动态平均共识估计器,让各 agent 实时跟踪时变输入的瞬时平均,并解释它为何是分布式估计/共识卡尔曼滤波的基础、为何 ADMM 能跨周期 warm-start。
- **辨析**渐近共识与有限时间共识的本质区别(反馈在误差→0 处的增益结构),知道何时必须用非光滑的分数次幂反馈换取"卡点精确同步"。
- **综合**把共识、时延、ADMM、编队、动态共识五件工具组装成一个完整多机任务(协同围捕)的分层数据流,并能判断分层 vs 集中、做层间时间尺度匹配。
本章知识导航¶
一句话定位:本章把第 1 章的图论语言"用起来"——给定一张通信图,如何让图上的 \(N\) 个机器人通过**只和邻居说话**收敛到一致(共识),以及当每个机器人要协调的是一整个优化问题时如何分布式求解(ADMM)。
本章四条主线及其递进关系:
| 主线 | 解决的问题 | 关键工具 | 对应小节 |
|---|---|---|---|
| 线性共识 | 只和邻居通信,如何收敛到一致?多快? | \(\dot x=-Lx\) / \(x(k{+}1)=Wx(k)\)、\(\lambda_2\)、\(\rho_2(W)\) | §2.1 |
| 时延与切换 | 通信有延迟、拓扑在变,共识还成立吗? | 临界时延 \(\tau^\star=\pi/(2\lambda_N)\)、联合连通性 | §2.2 |
| 分布式优化 | 每个 agent 要解一个优化问题,如何协调? | ADMM、增广拉格朗日、\(\rho\) | §2.3 |
| 编队控制 | 如何让机器人保持队形? | 三范式、displacement 控制律 | §2.4 |
| 动态共识/估计 | 要协调的量在变(移动目标、传感读数)怎么实时跟踪? | 动态平均共识、输入增量前馈、共识卡尔曼 | §2.5 |
| 综合实战 | 一个真实多机任务里五件工具如何串成一条流水线? | 分层数据流、协同围捕、时间尺度匹配 | §2.6 |
推荐阅读路径:§2.1 是全章地基(共识收敛证明,必读且需跟着推一遍)→ §2.2 是工程现实(时延/切换,理论方向必读,纯应用可速读阈值结论)→ §2.3 是全 Part 复用最多的算法(ADMM,必读且需动手实现)→ §2.4 把共识落到编队(必读,会发现它就是共识的变体)→ §2.5 把共识推广到时变信号(动态共识/分布式估计,做协同感知/多机 SLAM 的必读,纯编队任务可后置)→ §2.6 综合实战(把五件工具串成一条流水线,综合复盘,建议读完前五节后做一遍)。§2.1 与 §2.3 是两个 ⭐⭐⭐ 及以上的硬核小节,值得花最多时间。
前置知识桥接¶
本章紧接第 1 章,这里把三个最关键的前置点重新激活——你不必翻回去就能跟上:
- 回顾第 1 章:Laplacian \(L=D-A\) 与它的谱。第 1 章我们为通信图构造了邻接矩阵 \(A\)、度矩阵 \(D\)、Laplacian \(L=D-A\),并证明了三条性质:\(L\mathbf 1=\mathbf 0\)(全 1 向量是零特征值的特征向量)、\(L\) 半正定(\(L=BB^\top\),\(B\) 为关联矩阵)、\(\lambda_2>0\iff\) 图连通。本章 §2.1 会让这三条性质**直接变成共识收敛的证明步骤**——你会看到 \(L\mathbf 1=\mathbf 0\) 决定共识收敛到"平均值",\(\lambda_2\) 决定收敛多快。
- 回顾第 1 章:代数连通性 \(\lambda_2\) 的双重含义。第 1 章讲过 \(\lambda_2\) 既度量图的"最难切口"(Fiedler 向量/谱聚类),又给出共识收敛速率 \(e^{-\lambda_2 t}\)。本章把后一个含义**严格证明出来**,并补上它的离散对应、时延修正。
- 回顾第 1 章:集中式联合优化的 \(O(N^3)\) 爆炸。第 1 章 §1.1 用代码演示了把 \(N\) 台机器人拼成一个联合 QP,求解成本随 \(N\) 三次方膨胀。本章 §2.3 的 ADMM 正是这个痛点的解药——它把"一个大优化"切成"\(N\) 个小优化 + 邻居间协调",每个 agent 只解单体规模的子问题。
- 基础统计:独立测量取平均的方差缩减。\(N\) 个独立、零均值、方差 \(\sigma^2\) 的测量取平均,平均值的方差是 \(\sigma^2/N\)(独立随机变量之和的方差等于方差之和,除以 \(N^2\))。这条初等结论是 §2.5 分布式估计精度收益的根:\(N\) 台机器人协同观测、用共识把测量平均掉,等效测量噪声标准差缩到 \(1/\sqrt N\)。本章 §2.5 会用它论证"为什么多机协同感知比单机准"。
如果跳过本章会怎样¶
- 场景一(共识"看起来收敛了"其实是错的):你照着网上的代码写了个离散共识更新 \(x(k{+}1)=Wx(k)\),随手把 \(W\) 设成"每个 agent 取自己和邻居的简单平均"。在某些拓扑下它能收敛,换一个拓扑(尤其是各 agent 度数不同时)结果就慢慢漂移,收敛值也不是你期望的平均。§2.1 会告诉你:\(W\) 必须是**双随机矩阵**,否则平均值不守恒——而朴素的"度归一化"恰恰破坏了这一点。
- 场景二(分布式 MPC 不收敛,你却以为是 bug):你按第 4 章要做的把双 Go2 编队 MPC 用 ADMM 切分,\(\rho\) 随手取了个值,结果迭代要么剧烈震荡要么几百轮才勉强收敛,你在代码里到处找 bug。§2.3 会告诉你:这不是 bug,是 \(\rho\) 没调好——\(\rho\) 控制"本地子问题"与"全局一致性"的相对权重,它的量级直接决定收敛速度与稳定性,而且有自适应调节的标准做法。
- 场景三(多机协同感知,估计越跑越偏):你让一群机器人共同跟踪一个移动目标,想当然地用 §2.1 的静态共识把各自的测量"平均一下"。结果发现:目标一动,各机器人的融合估计就滞后于真值;长时间跑下来,估计还慢慢漂移、各机器人越来越不一致。§2.5 会告诉你:跟踪**时变**的量不能用静态共识(它只会收敛到某个固定值就停),必须用**动态共识**(注入输入增量做前馈)才能实时跟住移动平均;而漂移是因为动态共识是积分型估计器,丢包/噪声会让误差累积——需要鲁棒化。
预计阅读时间¶
| 模式 | 时长 | 适合 |
|---|---|---|
| 精读(跟着推完所有收敛证明、手写 ADMM 求解一个 QP) | 15–21 小时 | 第一次系统学共识/分布式优化的工程师 |
| 速读(读懂结论与算法流程,跳过证明细节) | 5–6 小时 | 已有背景,查漏补缺 |
| 速查(只看共识收敛条件表 + ADMM 三步迭代 + \(\rho\) 选取 + 故障排查) | 40–50 分钟 | 实现分布式 MPC 时回查 |
§2.1 线性共识协议 ⭐⭐⭐¶
这一节解决什么问题:第 1 章给了一句定性结论——"图越连通(\(\lambda_2\) 越大),协调越快"。但"协调"到底是什么数学过程?为什么一群只能和邻居通信的机器人,最终能对某个量(朝向、速度、汇合点)达成全局一致?这一节把这个过程写成微分方程/差分方程,**证明**它收敛、收敛到什么值、以及收敛速率正是 \(\lambda_2\)。这是全章乃至后续所有分布式方法的数学地基。
动机:一群机器人如何就"朝哪走"达成一致¶
设想 \(N\) 台机器人组成一支编队要一起前进,但没有中央指挥,每台机器人也只能和它通信范围内的少数几个邻居交换信息。现在它们要就一件事达成一致——比如"整个编队的前进方向"。每台机器人初始时各有各的想法(各自的传感器估计、各自的偏好),记机器人 \(i\) 的"意见"为标量 \(x_i\)。
问题是:在只能和邻居通信的约束下,这 \(N\) 个各不相同的 \(x_i\) 能不能、以及怎样收敛到同一个值? 这正是**共识(consensus)**问题。它看似抽象,却是多机系统里反复出现的原子操作:编队要对齐朝向(对 \(x_i\)=朝向求共识)、要同步速度(对速度求共识)、分布式估计要让各机器人对同一个量的估计收敛(对估计值求共识)、甚至 §2.3 的 ADMM 协调本质上也是让各 agent 对"全局变量"达成共识。把共识这个原子操作彻底搞懂,后面很多东西就是它的变体。
如果用最朴素的办法会怎样¶
最朴素的想法:让每台机器人不断地"往邻居的方向挪一点"。具体说,机器人 \(i\) 观察它所有邻居的意见,如果邻居的意见整体上比自己大,就把自己的意见调大一点;反之调小。这个朴素直觉其实**就是对的**——它正是连续时间共识协议。但朴素直觉留下三个必须回答的问题,不回答就没法在工程上用:
其一,它真的会收敛吗,还是会震荡甚至发散? 直觉上"向邻居靠拢"应该收敛,但万一拓扑特殊(比如有向、不对称),会不会出现 A 追 B、B 追 C、C 追 A 的循环而永不停止?其二,如果收敛,收敛到什么值? 是所有初始意见的平均,还是被某个"意见领袖"主导,还是别的什么?其三,收敛要多久? 这直接决定工程上"每个控制周期要留多少时间给共识迭代"。这三个问题,朴素直觉一个都答不了——需要把它写成方程来分析。
历史:从 Vicsek 模型到 Olfati-Saber 的形式化¶
共识的思想源头可以追到 1995 年 Vicsek 等人的自驱动粒子模型——一群粒子各自朝"邻居平均朝向"对齐,涌现出群体的一致运动,这是统计物理学家观察鸟群、鱼群时提出的。2003 年 Jadbabaie 等人给 Vicsek 模型做了严格的收敛性分析,首次用图论解释了"为什么对齐会成功"。真正把"共识"这个词和完整理论框架确立下来的,是 Olfati-Saber 与 Murray 在 2004 年的工作——他们系统地分析了固定拓扑、切换拓扑、含时延三种情形下的收敛条件,并建立了"代数连通性 \(\lambda_2\) 决定协商速度"这一核心联系。我们这一节走的就是他们奠定的路线:先连续、再离散,把收敛性和速率都证清楚。
理论¶
一、连续时间共识协议¶
把"向邻居靠拢"写成微分方程。机器人 \(i\) 的意见 \(x_i\) 的变化率,正比于它与每个邻居意见之差的总和:
这里 \(\mathcal N_i\) 是机器人 \(i\) 的邻居集合(回顾第 1 章:谁是邻居由通信拓扑决定),\(a_{ij}\) 是邻接矩阵元素(无权图取 1)。直觉很清楚:\((x_j-x_i)\) 是"邻居 \(j\) 比我高出多少",如果邻居整体比我高,右边为正,我的意见就往上调;反之往下调;当我和所有邻居都一致时,右边为零,停止变化。
关键一步:把 \(N\) 个方程写成矩阵形式。这是把"局部规则"变成"可分析的全局动力学"的转折点。展开式 (2.1) 的右边:
其中 \(d_{ii}=\sum_j a_{ij}\) 正是第 1 章定义的**度**(机器人 \(i\) 的邻居数/权重和)。把所有 \(i\) 叠起来,用向量 \(x=(x_1,\dots,x_N)^\top\):右边第一项是 \(Ax\)(邻接矩阵乘 \(x\)),第二项是 \(Dx\)(度矩阵乘 \(x\))。于是
这就是连续时间共识协议的矩阵形式 \(\dot x = -Lx\)。 第 1 章辛苦构造的 Laplacian \(L=D-A\),在这里以最自然的方式出现了——它不是凭空定义的矩阵,而正是"向邻居靠拢"这条局部规则的全局算子。这一步值得停下来体会:一个纯粹局部的、每个机器人只看自己邻居的规则,叠加起来恰好是 \(-L\) 这个由整张图的拓扑决定的矩阵。
本质洞察:\(\dot x=-Lx\) 把"协调"还原成了一个最简单的线性动力系统,而它的全部行为(收没收敛、敛到哪、多快)都编码在 \(L\) 的**谱**(特征值与特征向量)里。第 1 章我们花大力气研究 \(L\) 的谱不是数学游戏——正是因为共识、编队、分布式优化这些"协调"过程,本质上都是 \(-L\)(或它的变体)驱动的线性系统,\(L\) 的谱就是它们的"DNA"。理解了这一点,你就明白为什么 \(\lambda_2\) 会一遍遍出现在多机系统的每个角落。
二、连续时间共识的收敛性证明¶
现在严格回答前面的三个问题。\(\dot x=-Lx\) 是线性常微分方程,其解为
要分析 \(x(t)\) 的行为,就要分析矩阵指数 \(e^{-Lt}\),而这要用到 \(L\) 的特征值分解。我们先聚焦最常用、也最干净的情形:无向连通图(对称 \(L\))。
回顾第 1 章证明过的 \(L\) 的谱性质(无向图):\(L\) 对称半正定,特征值可排序为
其中(因为图连通)\(\lambda_1=0\) 是**单根**,对应的单位特征向量是 \(v_1=\frac{1}{\sqrt N}\mathbf 1\)(全 1 方向归一化);其余特征值 \(\lambda_2,\dots,\lambda_N\) 全为正,对应特征向量 \(v_2,\dots,v_N\) 与 \(v_1\) 正交、彼此正交(对称矩阵的特征向量可取为标准正交基)。
把初始状态 \(x(0)\) 在这组标准正交基 \(\{v_1,\dots,v_N\}\) 下展开:
由于 \(L v_k = \lambda_k v_k\),矩阵指数作用在每个特征向量上就是标量指数:\(e^{-Lt}v_k = e^{-\lambda_k t}v_k\)。于是解 (2.3) 变为
阶段小结:到这里我们把解写成了 \(N\) 个"模态"的叠加,每个模态 \(v_k\) 以速率 \(\lambda_k\) 指数衰减。接下来只要看 \(t\to\infty\) 时每一项的命运,收敛性、收敛值、收敛速率就全部水落石出。
逐项分析式 (2.4) 当 \(t\to\infty\):
- \(k=1\) 项:\(\lambda_1=0\),所以 \(e^{-\lambda_1 t}=e^0=1\) 永不衰减。这一项是 \(c_1 v_1 = (v_1^\top x(0))\,v_1 = \Big(\tfrac{1}{\sqrt N}\mathbf 1^\top x(0)\Big)\tfrac{1}{\sqrt N}\mathbf 1 = \Big(\tfrac1N\sum_i x_i(0)\Big)\mathbf 1\)。记初始平均值 \(\bar x = \frac1N\sum_i x_i(0)\),这一项就是 \(\bar x\,\mathbf 1\)——所有分量都等于 \(\bar x\) 的向量。
- \(k\ge 2\) 项:\(\lambda_k>0\),所以 \(e^{-\lambda_k t}\to 0\)。这些项全部衰减到零。
因此
三个问题一次性答完:(1) 收敛——是的,只要图连通;(2) 收敛到什么——所有分量收敛到同一个值,即**初始意见的平均** \(\bar x\),这叫**平均共识(average consensus);(3) 多快——由衰减最慢的那个非零模态决定,也就是**最小的非零特征值 \(\lambda_2\)。
把第三点定量化。共识误差定义为 \(x(t)-\bar x\mathbf 1\),它恰好是式 (2.4) 中 \(k\ge 2\) 的所有项之和(因为 \(k=1\) 项就是 \(\bar x\mathbf 1\))。其范数
其中中间一步用了 \(\{v_k\}\) 标准正交(范数平方等于系数平方和),最后一步因为 \(\lambda_k\ge\lambda_2\) 对所有 \(k\ge 2\) 成立,故每个 \(e^{-2\lambda_k t}\le e^{-2\lambda_2 t}\)。开方得
这就严格证明了第 1 章那句话:共识误差以速率 \(\lambda_2\) 指数衰减——\(\lambda_2\) 越大,收敛越快;\(\lambda_2\) 大一倍,达到同样精度的时间减半。式 (2.6) 也叫共识的**指数收敛界**,\(\lambda_2\) 在这里被称为系统的**收敛速率(convergence rate)**或代数连通性,与第 1 章口径完全一致。
这里要主动回答一个**初学者常有的疑问**:"为什么收敛值偏偏是平均值,而不是别的?" 关键在 \(\dot x=-Lx\) 有一个**守恒量**。把式 (2.2) 两边左乘 \(\mathbf 1^\top\):\(\mathbf 1^\top\dot x = -\mathbf 1^\top L x\)。而由第 1 章性质 \(L\) 对称且 \(L\mathbf 1=\mathbf 0\),有 \(\mathbf 1^\top L = (L\mathbf 1)^\top = \mathbf 0^\top\),所以 \(\mathbf 1^\top\dot x = 0\),即 \(\frac{d}{dt}\sum_i x_i = 0\)——所有意见之和(因而平均值)在整个演化过程中恒定不变。既然平均值守恒、又最终收敛到某个一致值,那个一致值必然就是初始平均值。这个"守恒"视角比特征值展开更直观,值得记住:平均共识之所以收敛到平均,是因为协议本身保持了总和不变。
三、离散时间共识协议¶
工程上机器人是按离散控制周期运行的,通信也是一个周期发一次。所以更贴近实现的是**离散时间共识**:每个周期,机器人把自己的新意见设为"自己和邻居意见的加权平均"。
写成矩阵形式
其中 \(W\) 是**权重矩阵**(也叫共识矩阵),\(w_{ij}\) 是机器人 \(i\) 给邻居 \(j\) 的权重,\(w_{ii}\) 是给自己的权重。注意离散情形不再直接用 \(L\),而是用一个新矩阵 \(W\)——这两者的关系马上会讲清楚。
收敛条件:\(W\) 必须双随机(doubly stochastic)且对应图连通。所谓双随机,指 \(W\) 的每一行之和与每一列之和都等于 1:
这两个条件各有深意,必须分开理解(这是一个**双重解读**):
- 行和为 1 → 一致状态是不动点。\(W\mathbf 1=\mathbf 1\) 意味着如果所有机器人已经一致(\(x=c\mathbf 1\)),那么 \(Wx=cW\mathbf 1=c\mathbf 1=x\) 保持不动。换句话说,行和为 1 保证"达成一致后不再乱动"。这等价于"每个机器人的权重(对自己 + 对所有邻居)加起来是 1",即每一步取的是一个真正的**加权平均**而非加权求和。
- 列和为 1 → 平均值守恒。\(\mathbf 1^\top W=\mathbf 1^\top\) 意味着 \(\mathbf 1^\top x(k{+}1)=\mathbf 1^\top Wx(k)=\mathbf 1^\top x(k)\),即总和(平均值)逐周期守恒——这正是离散版的"守恒量",保证收敛到的一致值是初始平均值。
这里就藏着场景一的坑:很多人随手把 \(W\) 设成"度归一化",即机器人 \(i\) 对自己和每个邻居都取权重 \(\frac{1}{d_{ii}+1}\)。这样每行和确实是 1(满足行和条件),但当各机器人度数不同时,列和一般不为 1——平均值不守恒,收敛值会偏离初始平均,甚至在某些拓扑下不收敛。后面陷阱专栏和 §2.1 末尾会给出正确的构造法(Metropolis 权重)。
收敛速率:\(W\) 的第二大特征值模 \(|\rho_2(W)|\)。与连续情形平行地分析。双随机 + 连通的 \(W\)(假设对称,即无向图)其特征值满足:最大特征值是 \(\rho_1=1\)(对应 \(\mathbf 1\),单根),其余特征值的模都严格小于 1,记第二大模为 \(|\rho_2(W)|<1\)。仿照式 (2.4) 的模态展开,\(x(k)=W^kx(0)=\sum_k c_k\rho_k^k v_k\),\(k=1\) 项给出 \(\bar x\mathbf 1\)(因为 \(\rho_1^k=1\)),其余项以 \(|\rho_k|^k\le|\rho_2|^k\to 0\) 衰减。于是离散共识也收敛到平均值,误差以**每步乘以 \(|\rho_2(W)|\)** 的几何速率衰减:
\(|\rho_2(W)|\) 越接近 0 收敛越快、越接近 1 越慢。这是离散情形下与 \(\lambda_2\) 对应的"收敛速率指标"。
这里值得插入一个**双重解读**,它把离散共识和一个你可能更熟悉的对象连起来:双随机矩阵 \(W\) 也是一个马尔可夫链的转移矩阵。如果 \(W\) 行随机(行和为 1、元素非负),它就定义了一个马尔可夫链——状态 \(i\) 以概率 \(w_{ij}\) 转移到 \(j\)。于是离散共识 \(x(k{+}1)=Wx(k)\) 可以从两个角度看:
- 共识视角(我们一直用的):\(W\) 把每个 agent 的值更新为邻居加权平均,各值收敛到一致。
- 马尔可夫/随机游走视角:\(W^k\) 描述一个在图上随机游走 \(k\) 步的概率分布演化。\(W\) 双随机 \(\iff\) 这个随机游走的平稳分布是均匀分布;收敛速率 \(|\rho_2(W)|\) 正是马尔可夫链的**混合速率(mixing rate)**——链多快"忘记"初始状态、趋于平稳分布。
这个对应不只是巧合:它意味着共识收敛快慢 = 随机游走混合快慢 = 谱隙 \(1-|\rho_2(W)|\) 大小,三者是同一件事的三种说法。边界提醒:这个类比在"\(W\) 双随机"时最干净(平稳分布均匀);若 \(W\) 只行随机(马尔可夫链合法,但非双随机),随机游走的平稳分布不再均匀,对应的正是前面说的"度归一化导致收敛值偏离平均"——平稳分布偏向高连接度节点,共识值也被它们拉偏。这从马尔可夫链的角度再次解释了"为什么必须双随机才收敛到正确平均"。如果你学过马尔可夫链的混合时间,可以把这一整套共识理论直接迁移过来。
四、连续与离散的桥梁¶
连续用 \(L\)、离散用 \(W\),两者什么关系?最简单的联系是:对连续协议 \(\dot x=-Lx\) 做**前向欧拉离散化**,步长 \(\varepsilon\):
于是 \(W = I-\varepsilon L\)。检验一下:\(W\mathbf 1=(I-\varepsilon L)\mathbf 1=\mathbf 1-\varepsilon\cdot\mathbf 0=\mathbf 1\)(行和为 1 ✓,因为 \(L\mathbf 1=0\));无向图 \(L\) 对称故 \(W\) 对称,列和也为 1 ✓。所以**\(W=I-\varepsilon L\) 自动双随机**——这是构造合法 \(W\) 的一条捷径。\(W\) 的特征值是 \(1-\varepsilon\lambda_k\),所以 \(\rho_2(W)=1-\varepsilon\lambda_2\)。
但 \(\varepsilon\) 不能随便取:要让所有 \(|1-\varepsilon\lambda_k|<1\)(否则发散),需要 \(0<\varepsilon<2/\lambda_N\)(由最大特征值 \(\lambda_N\) 卡住上界)。这给出一个重要提示——离散步长的稳定上界由 \(\lambda_N\)(最大特征值)决定,而收敛速度由 \(\lambda_2\)(最小非零特征值)决定。\(\lambda_N\) 与 \(\lambda_2\) 的比值 \(\lambda_N/\lambda_2\)(类似条件数)越大,意味着"为了稳定必须用小步长、但小步长又让慢模态收敛更慢",收敛越困难。这个 \(\lambda_N\) 的角色,在 §2.2 的时延分析里还会再次扮演关键角色。
本质洞察:连续与离散共识不是两个独立的东西,而是同一个"图上扩散过程"的两种时间刻度。\(\lambda_2\) 决定"能多快收敛"(慢模态),\(\lambda_N\) 决定"每步能迈多大而不失稳"(快模态)。这一对特征值——最小非零的 \(\lambda_2\) 和最大的 \(\lambda_N\)——几乎主宰了图上一切迭代算法的行为:共识的速度与步长、§2.3 ADMM 的收敛、乃至第 4 章分布式 MPC 的迭代轮数,都逃不开这两个量的支配。
五、有向图共识:收敛到加权平均¶
前面都假设无向图(对称 \(L\)),收敛到的是初始**平均**值。但现实中通信常是单向的——leader 广播但不接收、异构系统里 UAV 把目标发给地面机器人但不反向接收(第 1 章 §1.3 的领导-跟随)。这时拓扑是**有向图**,\(L\) 不再对称,前面"收敛到平均"的结论需要修正。
有向图的共识 \(\dot x=-Lx\) 仍然成立(局部规则没变),关键变化在 \(L\) 的谱结构。回顾第 1 章 §1.2 第六部分:有向图的连通性判据从"无向连通"换成"存在有向生成树"(存在一个根节点,沿有向边能到达所有其它节点)。在含生成树的条件下:
- \(L\) 仍有单重零特征值(\(L\mathbf 1=\mathbf 0\) 对有向图同样成立——每行仍是"度减去邻接",行和为零),对应右特征向量仍是 \(\mathbf 1\);
- 但 \(L\) 的**左**零特征向量不再是 \(\mathbf 1\)(无向时左右特征向量相同,有向时分离)。记 \(L\) 的左零特征向量为 \(\gamma\)(满足 \(\gamma^\top L=\mathbf 0^\top\),归一化使 \(\gamma^\top\mathbf 1=1\),各分量 \(\gamma_i\ge 0\)),它就是有向图共识的"权重"。
仿照式 (2.4) 的模态分析(有向图需用 Jordan 分解,但主导项逻辑相同),可以证明有向共识收敛到
即收敛到一个由 \(\gamma\) 加权的**加权平均**,而非简单平均。这个 \(\gamma\)(左 Perron 特征向量)的物理含义是各 agent 在最终共识值里的"话语权"——根节点/信息源头的权重大,纯接收者(如只听不说的 follower)权重可能为零。
什么时候有向图也收敛到简单平均?当且仅当图是**平衡的(balanced)**——每个节点的入度等于出度。平衡有向图的 \(\gamma=\frac1N\mathbf 1\)(均匀权重),退回平均共识。这解释了第 1 章为什么强调"平衡有向图在平均共识里的特殊地位"。
本质洞察:有向图把共识的"民主"打破了——无向图人人话语权相等(收敛到平均),有向图的话语权由左 Perron 特征向量 \(\gamma\) 决定,信息源头说话更管用。极端情形:有向星型(leader 只广播)的 \(\gamma\) 全部集中在 leader 上,共识值 = leader 的值——这正是 §2.1 末尾思维陷阱里"收敛到 leader 而非平均"的数学根。理解了 \(\gamma\),你就能预测任意有向拓扑会收敛到谁主导的值,这对设计 leader-follower 编队(第 4、6 章)至关重要。
至于收敛速率,有向图不再由实数 \(\lambda_2\) 决定,而由 \(L\) 的非零特征值里**实部最小的那个**决定(有向图特征值可为复数,复数实部为负保证对应模态衰减)。完整的有向共识收敛分析(含复特征值、Jordan 块)属于更深的内容,这里掌握结论即可:含生成树则收敛、收敛到 \(\gamma\) 加权平均、平衡图退回简单平均、速率由最小非零实部定。
六、最优权重设计:把"收敛多快"变成可优化问题¶
前面构造离散共识权重时给了两条现成路子:Metropolis 权重、\(W=I-\varepsilon L\)。它们都是**启发式**——能保证双随机和收敛,但未必收敛**最快**。一个自然的问题:给定一张图,存不存在"最优"的权重,让收敛(即 \(|\rho_2(W)|\) 最小)最快?Xiao 与 Boyd 在 2004 年的工作回答了这个问题,而且答案很漂亮。
回顾收敛率:离散共识误差以 \(|\rho_2(W)|^k\) 衰减,\(\rho_2(W)\) 越小越快。所以"设计最快共识"就是
目标里的 \(\|W-\frac1N\mathbf 1\mathbf 1^\top\|_2\) 正是"去掉一致方向后" \(W\) 的谱范数,等于 \(|\rho_2(W)|\)(对对称 \(W\));约束是双随机 + 只能用图上存在的边。这看着复杂,但 Xiao-Boyd 证明了关键结论:当限定权重对称时,这个"最快分布式线性平均(FDLA)"问题是一个半定规划(SDP),可以高效、全局地求解。也就是说,"哪套权重让这张图上的共识最快"不是只能靠试,而是一个能精确解出来的凸优化。
这个结果有两层教学价值:
- 最优权重常显著快于启发式。Xiao-Boyd 的实验显示,最大度权重、局部度权重这些常见启发式收敛最慢,SDP 解出的最优对称权重明显更快。所以"Metropolis 够用"是工程上的方便,不是最优——对收敛速度极敏感的场合(每周期通信预算很紧),值得花一次离线 SDP 求最优权重。
- 一个深刻的反直觉:最优权重可以是负的。直觉上共识权重应该都是正的(取邻居的"正向"平均),但 Xiao-Boyd 发现,最优对称权重里某些边/节点的权重是**负**的。负权重意味着"反着邻居调一点",这与"向邻居靠拢"的朴素直觉相悖,却能让整体收敛更快——因为它能更有效地压制慢模态。这提醒我们:让单步看起来"最合理"(都正向平均)未必让整体收敛最快;最优是全局谱的性质,不是逐边的直觉。这与第 1 章"加边要加在瓶颈上、而非凭直觉"的洞察一脉相承——共识的最优设计反直觉,得靠谱(SDP/特征值)说话。
本质洞察:从"用启发式权重"到"SDP 求最优权重",体现了共识研究的一条主线——把"图上算得多快"彻底化归为图的谱优化。\(\lambda_2\)、\(|\rho_2(W)|\)、最优权重 SDP、乃至前面提的马尔可夫链混合速率,都是同一个问题的不同切面:如何让一个图上的迭代尽快"抹平"差异。理解了这一点,你看任何分布式迭代算法(共识、gossip、分布式优化)的"快慢",都会本能地去找它的谱隙。值得一提:这个 FDLA 问题与"图上最快混合马尔可夫链(fastest mixing Markov chain)"是对偶的两面——又一次印证了 §2.1 的马尔可夫链视角。
需要注意边界:SDP 最优权重需要**集中地、离线地**求解(要知道整张图),适合拓扑固定、可预先计算的场合;拓扑动态变化时,还是用 Metropolis 这类**局部可算**的权重更实际。这又是"最优 vs 可分布式实现"的一个权衡,呼应第 1 章的架构取舍。
七、加速共识:给迭代加"动量"¶
最优权重(六)是在**静态权重**里挑最好的。还有一条正交的提速路:加历史项(动量)。标准离散共识 \(x(k{+}1)=Wx(k)\) 是"无记忆"的——下一步只看当前步。借鉴优化里的重球法(Heavy-ball)/Nesterov 加速,可以让更新也参考上一步的变化:
其中 \(\beta\in[0,1)\) 是动量系数。多出来的 \(\beta(x(k)-x(k{-}1))\) 项是"惯性"——沿着上一步的方向再冲一点。直觉上,普通共识在接近一致时步子越迈越小(误差按 \(|\rho_2|\) 几何衰减,越接近越慢),动量项让它保持"惯性"冲过去,从而更快。
效果有多大?这里有一个漂亮的定量结论(类比优化里 Nesterov 加速把梯度法的 \(\kappa\) 改善为 \(\sqrt\kappa\)):精心选 \(\beta\) 的动量共识,可以把收敛速率从依赖 \(\rho_2\) 改善到依赖 \(\sqrt{\rho_2}\) 量级——对慢收敛的图(如长链、大环,\(\rho_2\) 接近 1)提速尤其明显。代价是要多存一步历史 \(x(k{-}1)\)(内存翻倍,但仍是局部的)、且 \(\beta\) 要调好(太大会过冲振荡)。
本质洞察:最优权重(六)和动量加速(七)是提速共识的**两条正交路线**——前者优化"每步用什么权重"(静态、靠 SDP),后者优化"是否利用历史"(动态、靠动量)。两者可以叠加。它们与优化算法的对应很深刻:无记忆共识 ↔ 梯度下降,动量共识 ↔ 加速梯度法,最优权重 ↔ 最优预条件。共识本质上就是在图上做"把差异最小化"的迭代优化(回顾 §2.1 一的本质洞察:\(\dot x=-Lx\) 是势能 \(\frac12x^\top Lx\) 的梯度流),所以优化里所有的加速技巧(动量、预条件、重启)都能迁移到共识——这是把共识和优化统一起来看的红利。
实践提醒:动量共识在静态拓扑下提速可观,但在**切换拓扑/有延迟**时要谨慎——动量(惯性)和延迟(滞后)叠加可能加剧振荡,需重新评估稳定性。所以它最适合拓扑稳定、追求快收敛的场合;动态恶劣环境下,朴素共识的鲁棒性可能更值得。
八、有限时间共识:在有界时间内精确达成一致¶
前面所有共识(连续 \(\dot x=-Lx\)、离散、动量、最优权重)有一个共同的"软肋"——它们都是**渐近收敛**:误差以 \(e^{-\lambda_2 t}\) 或 \(|\rho_2(W)|^k\) 衰减,理论上**永远**到不了精确一致,只能无限逼近。对很多任务这够用(逼近到足够精度就行),但有些场景**不行**:比如多机器人要在一个确定的时刻同步触发某个动作(同时起跳、同时合拢抓取),或编队要在进入危险区**之前**精确对齐——这些都需要"在一个**事先知道、且与初值无关**的有限时间内**精确**达成一致",而不是"渐近逼近、永远差一点"。这就是**有限时间共识(finite-time consensus)**。
为什么线性协议做不到有限时间? 先把这个不可能性讲清楚(一次**反事实推理**)。线性系统 \(\dot x=-Lx\) 的解是 \(e^{-Lt}x(0)\),矩阵指数 \(e^{-\lambda_k t}\) 对任意有限 \(t\) 都严格大于零——非零模态永远衰减不到精确的零。直觉上:线性协议里,机器人 \(i\) 调整的速度正比于它与邻居的差 \(\dot x_i\propto\sum(x_j-x_i)\),当差越来越小,调整速度也越来越小,于是"越接近一致,走得越慢",像芝诺悖论一样永远差最后一步。要打破这个"接近就变慢",必须让协议在误差小时仍保持足够的调整力度——这正是有限时间协议的设计核心。
怎么做到?用次线性(非 Lipschitz)的反馈。有限时间共识的标准构造是把线性协议里的"差" \((x_j-x_i)\) 换成它的**分数次幂**(带符号):
这里 \(\operatorname{sig}(y)^\alpha=\operatorname{sign}(y)|y|^\alpha\) 是"带符号的 \(\alpha\) 次幂",\(\alpha\in(0,1)\) 是关键。对比线性协议(\(\alpha=1\)):当差 \(|y|\) 很小时,\(|y|^\alpha\)(因 \(\alpha<1\))比 \(|y|\) 大——例如 \(|y|=0.01\)、\(\alpha=0.5\) 时 \(|y|^\alpha=0.1\),是线性的 10 倍。也就是说,越接近一致(差越小),分数次幂反而提供相对越强的"拉拢力",恰好补偿了线性协议"接近就变慢"的毛病,使系统能在有限时间内精确抵达一致,而不是渐近逼近。
可以用 Lyapunov 方法证明(取 \(V=\frac12\sum(x_i-\bar x)^2\),可证 \(\dot V\le -c\,V^{(1+\alpha)/2}\),这种"\(\dot V\le -cV^\theta\) 且 \(\theta<1\)"的微分不等式正是有限时间稳定的标准判据):式 (2.add) 在无向连通图下于**有限时间** \(T\) 收敛到精确平均,且 \(T\) 有上界(依赖 \(\alpha\)、\(\lambda_2\) 和初始误差,但是有限的)。\(\alpha\) 越接近 0,收敛越"急"(末段拉拢力越强),但 \(\alpha\) 太小会带来数值/抖振问题;\(\alpha\to 1\) 则退回渐近的线性共识(收敛时间趋于无穷)。
本质洞察:有限时间共识与渐近共识的本质分野,在于反馈在"误差趋零处"的**增益结构**。线性共识(Lipschitz 反馈)在误差→0 时增益不变、绝对调整量→0,于是渐近;有限时间共识用非 Lipschitz 的分数次幂反馈,在误差→0 时**相对增益→∞,把"最后一段"强行走完。这与控制里"有限时间镇定必须用非光滑/非 Lipschitz 反馈(如 terminal sliding mode、bang-bang)"是同一个深刻原理——光滑线性反馈只能指数收敛,要有限时间必须牺牲光滑性。代价也相通:非光滑反馈带来抖振(chattering)、对噪声敏感、实现上需小心数值。**所以有限时间不是免费的"更快",而是用"反馈的光滑性/鲁棒性"换"精确有限时间到达"——任务真的需要"卡点精确同步"时才值得上,否则渐近共识的简单与鲁棒往往更划算。
与"固定时间共识"的进一步推广(边界提醒)。有限时间共识的收敛时间 \(T\) 虽有限,但**依赖初始误差**——初值差得越远,\(T\) 越大,没有统一上界。更强的变体叫**固定时间共识(fixed-time consensus),通过组合两个不同幂次(\(\alpha<1\) 与 \(\beta>1\))的反馈项,使收敛时间有一个**与初值无关的统一上界——无论初始差多大,都在某个固定 \(T_{\max}\) 内到达。这对"必须保证最坏情况同步时刻"的任务(如严格时序的多机协同)很有用。但它更复杂、增益更难调,这里点到为止,记住谱系:渐近(线性,\(\alpha=1\))→ 有限时间(\(\alpha<1\),\(T\) 依赖初值)→ 固定时间(\(\alpha<1\) 与 \(\beta>1\) 组合,\(T\) 有统一上界),反馈越非线性,时间保证越强,但鲁棒性/可调性的代价也越大。
这一段把 §2.1 的共识从"渐近"补全到"有限/固定时间",和前面的最优权重(六)、动量(七)一起,构成了"如何让共识更快/更准"的完整工具箱——它们分别从权重、历史、反馈非线性三个正交维度发力,可按任务需求组合。
理论说"连续收敛率是 \(\lambda_2\)、离散是 \(|\rho_2(W)|\)、且 \(W=I-\varepsilon L\) 时 \(\rho_2=1-\varepsilon\lambda_2\)"。我们用代码把三者一次性验证:同一张图,既跑连续共识也跑离散共识,确认收敛值都是初始平均、且速率与谱预测一致。
import numpy as np
def laplacian_from_edges(N, edges):
"""由无向边集构造 Laplacian L = D - A(沿用第 1 章)。"""
A = np.zeros((N, N))
for i, j in edges:
A[i, j] = 1.0
A[j, i] = 1.0
D = np.diag(A.sum(axis=1))
return D - A
# 用一个 N=6 环图(每个节点连左右邻居)
N = 6
edges = [(i, (i + 1) % N) for i in range(N)]
L = laplacian_from_edges(N, edges)
eig = np.sort(np.linalg.eigvalsh(L))
lam2, lamN = eig[1], eig[-1]
print(f"环 C6: λ2={lam2:.4f}, λN={lamN:.4f}")
x0 = np.array([3.0, -1.0, 4.0, 1.0, -2.0, 0.0])
x_bar = x0.mean()
print(f"初始平均 x̄ = {x_bar:.4f}(连续/离散都应收敛到它)")
# --- 连续共识:dx/dt = -L x,用很小步长积分逼近连续 ---
def continuous_consensus(L, x0, dt=1e-3, T=20.0):
x, hist = x0.copy(), []
for _ in range(int(T / dt)):
x = x - dt * (L @ x)
hist.append(np.linalg.norm(x - x0.mean()))
return np.array(hist), x
err_c, xc = continuous_consensus(L, x0)
print(f"连续:收敛到 {xc.mean():.4f}(各分量 std={xc.std():.2e})")
# --- 离散共识:W = I - εL,ε 必须 < 2/λN 才稳定 ---
eps = 1.0 / lamN # 取一个安全步长
W = np.eye(N) - eps * L
# 验证双随机
print(f"W 行和={W.sum(1).round(4)}, 列和={W.sum(0).round(4)}(都应为 1)")
rho = np.sort(np.abs(np.linalg.eigvals(W)))
rho2 = rho[-2] # 第二大特征值模
print(f"ρ2(W)={rho2:.4f}, 理论 1-ε·λ2={1 - eps * lam2:.4f}(应相等)")
x = x0.copy()
for k in range(200):
x = W @ x
print(f"离散:收敛到 {x.mean():.4f}(各分量 std={x.std():.2e})")
运行要点:连续与离散都收敛到同一个初始平均 \(\bar x\);\(W=I-\varepsilon L\) 的行和列和都是 1(双随机);\(\rho_2(W)\) 数值上恰等于 \(1-\varepsilon\lambda_2\)。这三件事一旦在代码里看到,你对"\(\lambda_2\) 管速度、双随机管收敛到正确平均"就有了量的把握。
⚠️ 注意上面 eps = 1.0/lamN 这一步——如果取 eps 大于 2/lamN,离散迭代会发散。下面的编程陷阱会专门讲这个稳定性边界。
补充验证:有限时间共识 vs 渐近共识(对应 §2.1 八)。理论说线性共识(\(\alpha=1\))永远渐近、分数次幂(\(\alpha<1\))在有限时间精确到达。我们把两者放在同一张图、同一初值下积分,看误差曲线在对数坐标下是"永远斜向下"还是"撞到地板"。
import numpy as np
def laplacian_ring(N):
A = np.zeros((N, N))
for i in range(N):
A[i, (i + 1) % N] = 1.0; A[(i + 1) % N, i] = 1.0
return np.diag(A.sum(1)) - A
def sig(y, alpha):
"""带符号的 alpha 次幂 sig(y)^alpha = sign(y)|y|^alpha。"""
return np.sign(y) * np.abs(y) ** alpha
def finite_time_consensus(N, edges_adj, x0, alpha, dt=1e-3, T=8.0):
"""积分 dx_i/dt = Σ_j a_ij sig(x_j - x_i)^alpha。alpha=1 退回线性共识。"""
x = x0.copy(); xbar = x0.mean(); hist = []
for _ in range(int(T / dt)):
dx = np.zeros(N)
for i in range(N):
for j in range(N):
if edges_adj[i, j]:
dx[i] += sig(x[j] - x[i], alpha)
x = x + dt * dx
hist.append(np.linalg.norm(x - xbar))
return np.array(hist)
N = 6
L = laplacian_ring(N)
A = (np.diag(np.diag(L)) - L) # 邻接矩阵(度对角 - L)
x0 = np.array([3.0, -1.0, 4.0, 1.0, -2.0, 0.0])
print(f"初始平均 x̄ = {x0.mean():.4f}(有限时间共识也应收敛到它——总和守恒同样成立)")
for alpha in [1.0, 0.7, 0.5, 0.3]:
h = finite_time_consensus(N, A, x0, alpha)
final_err = h[-1]
# 找误差首次降到 1e-6 的时间(线性共识永远到不了)
hit = np.argmax(h < 1e-6)
t_hit = hit * 1e-3 if (h < 1e-6).any() else None
tag = f"有限时间到达 t≈{t_hit:.2f}s" if t_hit is not None else "渐近(8s 内未精确归零)"
print(f" α={alpha}: 末端误差={final_err:.2e} -> {tag}")
运行要点:\(\alpha=1\)(线性)的误差一路指数下降但 8 秒内到不了 \(10^{-6}\)(渐近,永远差一点);\(\alpha<1\) 的协议误差在某个有限时刻**精确归零**(对数坐标下"撞到地板"),且 \(\alpha\) 越小到达越早。同时注意:有限时间共识的收敛值仍是初始平均(分数次幂的"差"是反对称的 \(\operatorname{sig}(x_j-x_i)^\alpha=-\operatorname{sig}(x_i-x_j)^\alpha\),总和守恒照样成立)。这就直观坐实了 §2.1 八的核心结论:反馈在误差→0 处的增益结构决定了"渐近"还是"有限时间"。若把 \(\alpha\) 取得很小(如 0.1)并放大步长,你会看到末段抖振——这正是非光滑反馈的代价。
⚠️ 常见陷阱¶
⚠️ 编程陷阱:离散共识用非双随机的 \(W\)(典型:度归一化) - 错误描述:把 \(W\) 设成"机器人 \(i\) 对自己和每个邻居都取 \(1/(d_{ii}{+}1)\)"(度归一化/行随机),以为"取平均"就对了。 - 现象/后果:每行和确实为 1,但各 agent 度数不同时**列和不为 1**,平均值不守恒——共识收敛值偏离初始平均(被高度数节点"拉偏"),某些拓扑下甚至不收敛。debug 时你会发现"收敛了,但收敛到的值不对"。 - 根本原因:收敛到**正确平均**需要列和也为 1(平均值守恒),行随机只保证了"一致是不动点",没保证守恒。 - 正确做法:用对称的双随机权重。最常用的是 Metropolis-Hastings 权重:\(w_{ij}=\frac{1}{1+\max(d_{ii},d_{jj})}\)(\(i,j\) 相邻),\(w_{ii}=1-\sum_{j\in\mathcal N_i}w_{ij}\)。它自动对称(故双随机)、且只需邻居的度数(局部可算)。或者用 \(W=I-\varepsilon L\)(\(\varepsilon<2/\lambda_N\))这条捷径。自检方法:打印
W.sum(0)和W.sum(1),两者都应是全 1 向量。⚠️ 编程陷阱:离散步长 \(\varepsilon\) 取太大导致发散 - 错误描述:用 \(W=I-\varepsilon L\) 时把 \(\varepsilon\) 取得过大(比如直接取 1,而图的 \(\lambda_N\) 很大)。 - 现象/后果:迭代不收敛反而振荡发散,状态值越来越大直到溢出。 - 根本原因:\(W\) 的特征值是 \(1-\varepsilon\lambda_k\),要全部落在 \((-1,1)\) 内需 \(\varepsilon<2/\lambda_N\);\(\varepsilon\) 太大时 \(1-\varepsilon\lambda_N<-1\),对应模态发散。 - 正确做法:取 \(\varepsilon<2/\lambda_N\)(保守可取 \(\varepsilon=1/\lambda_N\) 或 \(\varepsilon=1/d_{\max}\),因为 \(\lambda_N\le 2d_{\max}\));若不知道 \(\lambda_N\),用度的上界 \(d_{\max}\) 估计。自检方法:计算
np.abs(np.linalg.eigvals(W)).max(),应严格小于 1。💡 概念误区:把 \(\lambda_2\) 决定的"速度"和 \(\lambda_N\) 决定的"稳定步长"混为一谈 - 错误描述:认为只要 \(\lambda_2\) 大,离散共识就一定快——忽略了步长上界由 \(\lambda_N\) 卡住。 - 现象/后果:在一个 \(\lambda_N\) 很大的稠密图上,你为了稳定不得不用很小的 \(\varepsilon\),结果即便 \(\lambda_2\) 不小,实际收敛(每步 \(\rho_2=1-\varepsilon\lambda_2\))也快不起来。 - 根本原因:离散收敛速度是 \(1-\varepsilon\lambda_2\),而 \(\varepsilon\) 受 \(\lambda_N\) 限制——真正决定快慢的是比值 \(\lambda_2/\lambda_N\)(谱的"条件数"),不是 \(\lambda_2\) 单独。 - 正确做法:评估离散共识快慢时看 \(\lambda_2/\lambda_N\);稠密但"病态"(谱很宽)的图未必比稀疏图收敛快。这与第 1 章"加边不一定加速"的洞察一脉相承——结构比边数更重要。
🧠 思维陷阱:以为"平均共识"是唯一的共识 - 错误描述:认为共识必然收敛到初始平均值。 - 现象/后果:在有向(非对称)拓扑或 leader-follower 结构下,你期望得到平均值,实际却收敛到别的值(比如完全由 leader 决定),与设计预期不符。 - 根本原因:收敛到**平均**值只在双随机(无向对称是其特例)时成立;有向图一般只保证收敛到某个一致值(凸组合),权重由图结构决定,未必是平均。例如有向星型(leader 广播)收敛到 leader 的值。 - 正确做法:明确你要的是"平均共识"(需双随机)还是"一般共识"(只需含生成树)。要平均就保证双随机;若是 leader-follower,接受收敛值由 leader 主导,这正是第 1 章 §1.3 异构角色分配里"领导-跟随"的数学体现。
🧠 思维陷阱:期望线性共识在有限时间内精确达成一致 - 错误描述:用线性协议 \(\dot x=-Lx\),却要求"在某个确定时刻 \(T\) 各 agent 精确相等"(如多机同时触发动作),并据此设计严格时序逻辑。 - 现象/后果:线性共识只渐近收敛,任意有限时刻都残留非零误差;到了预定 \(T\) 各 agent 仍有微小不一致,触发时机错开,严格时序逻辑出错。 - 根本原因:线性(Lipschitz)反馈在误差→0 时调整量→0("越接近越慢"),解 \(e^{-Lt}x(0)\) 对有限 \(t\) 永不精确为零——渐近收敛的数学必然。 - 正确做法:需要"卡点精确同步"时用**有限时间共识**(分数次幂反馈 \(\operatorname{sig}(x_j-x_i)^\alpha\),\(\alpha\in(0,1)\),式 2.add)或固定时间共识;若只需"足够接近",则给渐近共识留够收敛裕量(按 \(e^{-\lambda_2 T}<\epsilon\) 反推 \(T\))。注意有限时间协议非光滑、有抖振,对噪声更敏感,非必要不用。
练习¶
- [实现] 对 \(N=6\) 构造全连接、环、星、路径四种拓扑,分别用两种方式跑离散共识:(a) Metropolis-Hastings 权重;(b) \(W=I-\varepsilon L\) 取 \(\varepsilon=1/\lambda_N\)。对每种拓扑,验证两种 \(W\) 都双随机(打印行和列和)、都收敛到初始平均,并比较它们的 \(|\rho_2(W)|\) 与实际收敛速度。哪种拓扑收敛最快?用 \(\lambda_2/\lambda_N\) 解释。
- [推导] 证明:若 \(W\) 行随机(行和为 1)但**不**列随机,则离散共识 (2.8) 的不动点仍是一致状态 \(c\mathbf 1\),但 \(\sum_i x_i(k)\) 一般不守恒;给出一个 3 节点的具体反例(度归一化的星型),手算它收敛到的值,说明它**不**等于初始平均。
- [设计/思考] 连续共识 \(\dot x=-Lx\) 保证收敛到平均,这依赖"平均值守恒"(\(\mathbf 1^\top\dot x=0\))。现在假设机器人 3 是一个"顽固的 leader"——它根本不更新自己的意见(\(\dot x_3=0\)),其余机器人正常向邻居靠拢。这个系统最终会收敛到什么?(提示:这等价于把节点 3 的那一行 \(L\) 置零。)它还是"平均"吗?这个"锚定一个节点"的技巧将在第 4 章用来把编队"钉"在一个期望的全局位置上——先建立直觉:锚定一个 leader,共识就从'收敛到平均'变成'收敛到 leader 的值'。
- [实现/分析] 构造一个有向图(含生成树但不平衡,如一个有向环加一条单向弦),数值求它的左零特征向量 \(\gamma\)(\(\gamma^\top L=0\)),再积分有向共识 \(\dot x=-Lx\),验证收敛值等于 \(\gamma^\top x(0)\) 而非简单平均。然后构造一个**平衡**有向图(每个节点入度=出度),验证它退回简单平均(\(\gamma=\frac1N\mathbf1\))。这道题让你亲手看到"有向图里话语权由 \(\gamma\) 分配"。
- [实现/对比] 对一个固定的 \(N=8\) 稀疏图,比较三种离散共识权重的收敛速度:(a) 最大度权重;(b) Metropolis 权重;(c) 用 SDP 求最优对称权重(可用
cvxpy解 FDLA 问题 \(\min\|W-\frac1N\mathbf1\mathbf1^\top\|_2\))。比较三者的 \(|\rho_2(W)|\) 与实际收敛轮数,验证最优权重显著最快,并观察最优权重里是否出现**负**权重。作为对照,再实现随机 gossip(每步随机选一条边平均),记录它达到同等精度所需的"边激活次数",体会异步的代价。 - [实现/对比] 实现有限时间共识(式 2.add,分数次幂反馈 \(\operatorname{sig}(x_j-x_i)^\alpha\)),对 \(N=6\) 环图,取 \(\alpha\in\{0.3,0.5,0.7\}\) 与线性 \(\alpha=1\) 对照。从同一初值积分,记录各自的共识误差随时间曲线。验证:(a) \(\alpha<1\) 的协议在有限时间内误差精确归零(对数坐标下"撞到地板"),而 \(\alpha=1\) 永远渐近不到零;(b) \(\alpha\) 越小收敛时间越短但末段越"急"(注意小 \(\alpha\) 的数值抖振,可减小步长观察)。讨论:你的多机任务若要"同时起跳",该选哪个 \(\alpha\)?为什么不能无脑取最小 \(\alpha\)?(提示:抖振、对噪声敏感、控制量峰值)。
上一节我们在**理想条件**下证清了共识:通信无延迟、拓扑固定不变。但真实多机系统两条都不满足——无线通信有延迟,机器人移动导致链路时通时断、拓扑在变。这两个现实因素会不会破坏收敛?延迟多大就会让系统失稳?§2.2 把共识理论推进到这两种非理想情形,并推导出一个对工程极重要的量:临界时延阈值——它告诉你通信延迟的安全上限,而且这个上限恰恰由我们刚在 §2.1 末尾反复强调的最大特征值 \(\lambda_N\) 决定。
§2.2 时延与切换拓扑下的共识 ⭐⭐⭐¶
这一节解决什么问题:§2.1 的收敛证明依赖两个理想假设——通信瞬时无延迟、拓扑固定不变。真实多机系统两个都不成立:无线通信有几十毫秒的延迟,机器人移动让链路时断时续。本节回答两件事:(1) 通信延迟多大会让共识失稳?给出临界阈值;(2) 拓扑不停切换(甚至每一刻都不连通)时,共识还能收敛吗?
动机:几十毫秒的延迟会不会毁掉协调¶
回到 §2.1 的编队。现在加入两个现实因素。第一,机器人 \(i\) 收到邻居 \(j\) 的意见时,这个意见其实是 \(j\) 在 \(\tau\) 秒之前的状态——无线传输、编解码、排队都要时间,\(\tau\) 可能是几毫秒到几十毫秒。第二,机器人在动,\(i\) 和 \(j\) 之间的链路会随距离忽通忽断,通信拓扑 \(G\) 不再固定,而是一个随时间变化的 \(G(t)\)。
这两个因素都直觉上"有害":延迟意味着每个机器人都在根据"过时的信息"做调整,这很像控制系统里的纯滞后,而纯滞后是出了名的会引起振荡和失稳;拓扑切换意味着某些时刻图甚至可能分裂成几块(\(\lambda_2=0\)),按 §2.1 那一刻根本不连通。问题是:这两个因素是会彻底毁掉共识,还是在某个范围内系统依然能扛住? 工程上必须知道这个"范围"——它直接决定通信硬件的延迟预算和编队的最大间距。
如果忽视延迟会怎样¶
如果你拿 §2.1 的无延迟结论直接上实机,而实际通信有不可忽略的延迟,后果是:在延迟较小、图较稀疏时,系统可能侥幸还能收敛,只是慢一些、带点振荡;但一旦延迟超过某个临界值,或者你为了"协调更快"把拓扑加密(增大了 \(\lambda_N\)),系统会突然从"收敛"翻转为"持续振荡甚至发散"——编队不再稳定,机器人开始周期性地来回摆动。更隐蔽的是,这个失稳和延迟、拓扑的关系不是线性的,你很难靠试错找到边界。所以需要一个**解析的临界阈值**,事先算出来。
历史:Olfati-Saber 与 Murray 的时延分析¶
§2.1 提过 Olfati-Saber 与 Murray 2004 年系统分析了三种情形。其中第三种正是本节的主题:无向固定拓扑 + 通信时延。他们用频域方法(对每个特征模态做 Nyquist 判据)证明了一个干净的结论——存在一个临界时延 \(\tau^\star\),当所有通信延迟 \(\tau<\tau^\star\) 时共识仍指数收敛,而 \(\tau^\star\) 由图的最大 Laplacian 特征值 \(\lambda_N\) 唯一决定。同年 Ren 与 Beard(也是 IEEE TAC)处理了切换拓扑,给出"联合连通性"条件。我们这一节把这两个结论分别讲清楚,临界时延做完整推导。
理论¶
一、带时延的共识模型¶
把延迟加进连续共识。机器人 \(i\) 在时刻 \(t\) 用到的邻居 \(j\) 的意见,是 \(j\) 在 \(t-\tau\) 时刻的值(设所有链路延迟相同为 \(\tau\),这是最经典也最易分析的情形):
写成矩阵形式(注意:Olfati-Saber–Murray 模型里**自己和邻居都用延迟值**,这样才保持平均守恒):
这是一个**时滞微分方程(delay differential equation)**。\(\tau=0\) 时退回 §2.1 的 \(\dot x=-Lx\)。\(\tau>0\) 时,系统的稳定性不再只看 \(L\) 的特征值符号,还要看延迟与特征值的相互作用——这正是滞后系统的典型难点。
二、临界时延阈值的推导¶
我们用**频域 + 模态解耦**的方法。核心思想:把式 (2.12) 沿 \(L\) 的特征向量分解,每个模态变成一个独立的标量时滞方程,再对每个模态用频域稳定判据。
第一步:模态解耦。 设 \(L\) 的特征分解(无向图,对称 \(L\))为 \(L=\sum_k\lambda_k v_kv_k^\top\)。把 \(x(t)\) 投影到第 \(k\) 个特征方向:令 \(\eta_k(t)=v_k^\top x(t)\)。对式 (2.12) 两边左乘 \(v_k^\top\),利用 \(v_k^\top L = \lambda_k v_k^\top\):
这样 \(N\) 维耦合系统被解耦成 \(N\) 个独立的标量时滞方程,每个形如 \(\dot\eta=-\lambda_k\eta(t-\tau)\),参数只差一个 \(\lambda_k\)。
- \(k=1\):\(\lambda_1=0\),方程是 \(\dot\eta_1=0\),\(\eta_1\) 恒定——对应守恒的平均值,永远稳定。
- \(k\ge 2\):\(\lambda_k>0\),需要判断标量方程 \(\dot\eta=-\lambda_k\eta(t-\tau)\) 是否稳定(衰减到 0)。整个共识稳定 \(\iff\) 所有 \(k\ge 2\) 的模态都稳定。
第二步:单个模态的稳定性(频域判据)。 考察标量时滞方程 \(\dot\eta=-\lambda\,\eta(t-\tau)\)(\(\lambda>0\))。它的特征方程(设解 \(\eta\sim e^{st}\))是
系统稳定要求所有特征根 \(s\) 的实部为负。随着 \(\tau\) 增大,根会从左半平面向右移动;**临界**情况是某个根恰好落在虚轴上,即 \(s=j\omega\)(\(\omega>0\))。代入式 (2.14):
两边取模:\(\lambda = \omega\)(因为 \(|e^{-j\omega\tau}|=1\),\(|-j\omega|=\omega\)),所以临界频率 \(\omega=\lambda\)。再比较相位:\(e^{-j\omega\tau}=-j\omega/\lambda=-j\)(因 \(\omega=\lambda\)),而 \(-j=e^{-j\pi/2}\),所以 \(-\omega\tau=-\pi/2\),即
这就是单个模态(参数 \(\lambda\))的**临界时延**:\(\tau<\frac{\pi}{2\lambda}\) 时该模态稳定,超过则失稳振荡。
第三步:取最严格的约束。 整个共识要稳定,需要**所有** \(k\ge 2\) 的模态都满足 \(\tau<\frac{\pi}{2\lambda_k}\)。由于 \(\frac{\pi}{2\lambda_k}\) 随 \(\lambda_k\) 增大而减小,最严格的约束来自最大的特征值 \(\lambda_N\)。于是临界时延阈值:
当所有通信延迟 \(\tau<\tau^\star\) 时,共识仍收敛(到初始平均);\(\tau\) 超过 \(\tau^\star\) 时,与 \(\lambda_N\) 对应的那个"最快模态"率先失稳,系统开始持续振荡。
本质洞察:临界时延由 \(\lambda_N\)(最大特征值)决定,而不是 \(\lambda_2\)——这初看反直觉,值得品味。\(\lambda_2\) 管的是"收敛多快"(慢模态),\(\lambda_N\) 管的是"延迟容限"(快模态最先被延迟拖垮)。直观理解:\(\lambda_N\) 对应图里"反应最剧烈"的模态(通常是度数最高的节点附近),它对信息的响应增益最大,因而对"信息过时"也最敏感——延迟一大,就是它先开始过冲、振荡。这给了一个深刻的工程权衡:把拓扑加密(加边)会增大 \(\lambda_2\) 让收敛更快,但通常也会增大 \(\lambda_N\) 让延迟容限更小。所以"为了协调更快而疯狂加密通信"在有延迟的现实里可能适得其反——加得太密,稍有延迟就失稳。这是第 1 章"加边要谨慎"在动力学层面的又一个印证。
一个经典控制的视角(给熟悉 Bode/Nyquist 的读者)。上面的临界时延推导,本质就是经典控制里的**相位裕度(phase margin)** 分析,换个语言会更亲切。把单模态系统看成开环传递函数 \(G(s)=\lambda_k/s\)(一个积分器,增益 \(\lambda_k\)),加上延迟环节 \(e^{-s\tau}\),开环就是 \(\frac{\lambda_k}{s}e^{-s\tau}\)。它的**穿越频率**(开环幅值=1 处)是 \(\omega_c=\lambda_k\)(因为 \(|\lambda_k/(j\omega)|=1\Rightarrow\omega=\lambda_k\));在该频率处,积分器贡献 \(-90°\) 相位,延迟贡献 \(-\omega_c\tau=-\lambda_k\tau\) 相位。无延迟时相位裕度是 \(90°\)(积分器的 \(-90°\) 距 \(-180°\) 还有 \(90°\));延迟每增大,就吃掉 \(\lambda_k\tau\) 的相位裕度。当延迟把相位裕度**吃光**(相位到 \(-180°\))时失稳,即 \(90° = \lambda_k\tau\cdot\frac{180°}{\pi}\),解出 \(\tau=\frac{\pi}{2\lambda_k}\)——和式 (2.14) 完全一致。
这个视角让 \(\tau^\star=\pi/(2\lambda_N)\) 一下子有了工程直觉:延迟消耗相位裕度,而 \(\lambda_N\) 模态的穿越频率最高(\(\omega_c=\lambda_N\)),同样的延迟在它身上吃掉的相位最多(\(\lambda_N\tau\) 最大),所以它的相位裕度最先耗尽、最先失稳。这正是"为什么是 \(\lambda_N\) 而非 \(\lambda_2\) 定延迟上限"的控制论答案:不是因为 \(\lambda_N\) 模态本身不稳,而是它在频域里"跑得最快",最经不起延迟带来的相位滞后。任何学过经典控制的工程师都熟悉"延迟蚕食相位裕度致失稳",这里只是把它用在共识的最快模态上。
三、一个量化直觉¶
代入具体数字感受一下。全连接图 \(K_N\) 的 \(\lambda_N=N\)(回顾第 1 章:\(K_N\) 特征值是 0 和 \(N\)),所以 \(\tau^\star=\frac{\pi}{2N}\)——团队越大,能容忍的延迟越小,且反比于 \(N\)。例如 \(N=10\) 的全连接,\(\tau^\star=\pi/20\approx 0.157\) 秒;\(N=50\) 时 \(\tau^\star\approx 0.031\) 秒(31 毫秒)。这意味着大规模密集编队对通信延迟极其敏感,几十毫秒的无线延迟就可能踩线——这也是为什么大集群往往用稀疏拓扑(环、网格)而非全连接:稀疏拓扑 \(\lambda_N\) 小,延迟容限大得多。
四、切换拓扑与联合连通性¶
第二个现实因素:拓扑随时间变化。机器人移动,通信图从 \(G(t_0)\) 切换到 \(G(t_1)\) 再到 \(G(t_2)\)……每个时间段用一个可能不同的 Laplacian \(L(t)\),系统是
其中 \(L(t)\) 在一组拓扑 \(\{L_1,L_2,\dots\}\) 之间切换。第 1 章 §1.2 末尾已埋下伏笔:这时**单看某一刻是否连通已不够**。Ren–Beard 2005 的核心结论是:
即使每个瞬间的图 \(G(t)\) 都**不连通**,只要在任意长度为 \(T\) 的时间窗口内,这段时间出现过的所有图的**并集**(union graph)是连通的(含一棵生成树),共识仍然收敛。
这个条件叫**联合连通性(jointly connected)**。直觉上:信息不需要"同时"在所有链路上流通,只要"在一段时间里"每条必要的信息通路都曾经打开过,信息就能"接力"传遍全网。这正是第 1 章 §1.2 加权图小节里那个数值实验的理论依据——三个各自不连通的拓扑轮流使用,只要并集连通,共识照样达成。
严格证明用的是**共同 Lyapunov 函数**:取 \(V(x)=\frac12\|x-\bar x\mathbf 1\|^2\)(共识误差能量),可以证明对每个 \(L_p\) 都有 \(\dot V=-x^\top L_p x\le 0\)(因为 \(L_p\) 半正定),即每段拓扑下误差能量都不增;再用联合连通性保证"长期看 \(V\) 严格下降到 0"。这里我们点到为止——完整的切换系统稳定性分析属于第 2 章范围之外的混杂系统理论,关键是记住结论:联合连通即可收敛,不要求时刻连通。
五、二阶共识:当机器人是双积分器¶
前面的共识都假设一阶动力学 \(\dot x_i=u_i\)(单积分器):状态的导数直接是控制。但真实机器人(尤其是有惯性的)更接近**双积分器** \(\ddot p_i=u_i\)——你控制的是加速度/力,不是直接控制速度。这时"对位置达成一致"还要兼顾速度,称为**二阶共识(second-order consensus)**。这不是吹毛求疵:第 4 章的 MPC、第 5 章的力控,被控对象都有惯性,一阶共识的结论不能直接照搬。
二阶共识的协议要同时用邻居的**位置差和速度差**:
其中 \(\gamma_d>0\) 是速度耦合(阻尼)增益。写成矩阵形式,以 \((p,\dot p)\) 为状态:
关键区别:仅靠位置差不够,必须有速度阻尼项。这是二阶共识最容易栽的坑。如果去掉 \(\gamma_d\) 项(只用位置差 \(\ddot p_i=-\sum a_{ij}(p_i-p_j)\)),系统变成无阻尼的耦合振子——位置不会收敛到一致,而是永远**振荡**(像一堆用弹簧连起来、没有阻尼的小球,能量守恒、荡个不停)。这正好呼应第 1 章把图类比成弹簧网络的边界提醒:一阶共识是"纯阻尼松弛"(单调收敛),而二阶共识若无速度阻尼就是"无阻尼弹簧网络"(持续振荡)——必须显式加入速度差耦合 \(\gamma_d\) 提供阻尼,才能让振荡衰减、收敛到一致。
收敛性分析:上面那个 \(2N\times 2N\) 系统矩阵的特征值,可以证明与 \(L\) 的特征值 \(\lambda_k\) 通过一个二次方程关联——每个 \(\lambda_k\) 贡献一对特征值,其实部为负(即该模态收敛)的条件依赖 \(\gamma_d\) 和 \(\lambda_k\)。结论是:存在合适的 \(\gamma_d\) 使二阶共识收敛,且 \(\gamma_d\) 太小则收敛慢/欠阻尼振荡、太大则过阻尼也慢——又一个需要权衡的增益,和一阶共识"只要图连通就收敛"相比,二阶共识对参数更敏感。第 4、5 章处理有惯性的多机系统时,这个"位置一致还要速度协调、且需阻尼"的二阶视角会反复用到。
本质洞察:从一阶到二阶共识,质变在于"惯性"。一阶系统状态能瞬间响应控制,纯阻尼即可单调收敛;二阶系统有惯性、会"冲过头",必须靠速度差耦合提供阻尼才能稳下来。这解释了为什么真实机器人编队(有质量、有惯性)的控制器总带一个"速度/阻尼"项,而不只是位置反馈——不是工程师多此一举,是二阶系统不加阻尼必振荡的数学必然。
二阶共识是对动力学的推广(从单积分器到双积分器),它和前面的延迟、切换是正交的两类扩展——实际系统往往三者并存(有惯性、有延迟、拓扑在变)。
六、随机 gossip:异步共识¶
前面所有共识(连续、离散、延迟、切换)都隐含一个假设:同步——所有 agent 在同一时刻一起更新、一起通信。但真实分布式系统(传感器网、P2P 网、移动机器人集群)往往是**异步**的:没有全局时钟让大家齐步走,每个节点按自己的节奏、和碰巧能联系上的邻居零星通信。同步共识在这种系统里既不现实(谁来对齐时钟?)也不鲁棒(一个节点掉队就卡住全网)。随机 gossip(randomized gossip) 正是为异步场景设计的共识,由 Boyd、Ghosh、Prabhakar、Shah 在 2006 年系统分析。
gossip 的机制极简,是一个**边平均(edge-averaging)** 过程:每个节点带一个独立的随机时钟(Poisson 时钟),时钟一响,该节点就随机挑一个邻居,两者把各自的值**替换为它们俩的平均**。没有全局轮次,任意时刻只有零星的一对节点在交换。形式化:每次激活一条边 \((i,j)\),执行
这每一步是一个只动两个分量的随机线性映射 \(x\leftarrow W_{ij}x\)(\(W_{ij}\) 是只在 \(i,j\) 处做平均的矩阵)。注意单次边平均**保持总和不变**(\(x_i+x_j\) 平均后总和没变),所以 gossip 自动保持平均值守恒——这是它能收敛到正确平均的根。
收敛性与速率:gossip 是随机过程,收敛要谈期望。Boyd 等人证明:只要图连通,gossip 几乎必然收敛到初始平均;而**平均时间(averaging time,误差期望降到给定比例所需的更新次数)由一个刻画该 gossip 方案的双随机矩阵 \(\bar W=\mathbb E[W_{ij}]\) 的第二大特征值决定**。换句话说,异步 gossip 的收敛速率,还是落回到"某个双随机矩阵的谱隙"上——和同步离散共识(看 \(|\rho_2(W)|\))是同一套谱分析,只不过这里的 \(W\) 换成了边激活概率的期望矩阵。
本质洞察:从同步共识到异步 gossip,变的是"谁在什么时候动"(全体齐步 → 随机零星),不变的是"收敛快慢由一个双随机矩阵的第二大特征值决定"。这再次印证本章主线——协调的速度本质是图的谱性质,与同步/异步、连续/离散这些实现细节无关。而且 gossip 的平均时间也通过这个第二大特征值与随机游走的混合时间挂钩,和 §2.1 的马尔可夫链视角、最优权重视角连成一片:它们都在问"图上的扩散过程多快抹平差异"。
工程权衡:gossip 的代价是收敛慢——因为每步只动一对节点,信息传播比同步(每步全网一起更新)慢得多。Boyd 等人给出的上界显示,某些稀疏图(如环)上 gossip 的平均时间随节点数增长得很快(环上约是节点数的三次方量级,与环图 \(\lambda_2\sim 1/N^2\) 的慢收敛一致)。所以选择是:同步共识快但要全局时钟和齐步通信(脆弱);gossip 慢但完全异步、对节点掉线/拓扑变化极鲁棒(每步只需一对节点可达即可)。这正是第 1 章"协调速度 vs 鲁棒性"权衡在通信调度层面的体现——大规模、不可靠、无全局时钟的集群(传感器网、松散的机器人群)往往宁可慢也要用 gossip 的鲁棒性。
七、非均匀与非对称延迟:把理想阈值推向现实¶
§2.2 二推导临界时延 \(\tau^\star=\pi/(2\lambda_N)\) 时,有一个干净的简化假设——所有链路延迟相同(\(\tau\) 是同一个标量)。真实系统里这往往不成立:不同链路的距离、带宽、拥塞不同,延迟各异(非均匀延迟),甚至同一条链路两个方向的延迟也不同(非对称延迟)。这一段把理想阈值往现实推一步,讲清楚哪些结论稳健、哪些要修正(一次**反事实推理**:如果延迟非均匀/非对称会怎样)。
非均匀延迟(各链路 \(\tau_{ij}\) 不同,但每条链路对称)。此时模态解耦不再像式 (2.13) 那样干净(不同模态混在一起),严格的临界条件要用更复杂的频域分析。但有一个对工程极有用的**稳健结论**:只要所有链路延迟都小于由**最大**延迟决定的保守阈值,系统仍稳定——即用 \(\tau_{\max}=\max_{ij}\tau_{ij}\) 代入,保证 \(\tau_{\max}<\pi/(2\lambda_N)\) 是一个(偏保守但可靠的)充分条件。直觉:最坏的那条链路(延迟最大)最可能引发失稳,守住它就守住了全局。所以工程上的简单做法是——按最大延迟来卡裕量,不必精确知道每条链路的延迟。这把复杂的非均匀情形化归为一个可操作的保守设计准则。
非对称延迟(同一链路两方向延迟不同,\(\tau_{ij}\ne\tau_{ji}\))。这更棘手,因为它破坏了 \(L\) 作用的对称性——本质上让系统行为像一个**有向图**(回顾 §2.1 五:有向图共识收敛到 \(\gamma\) 加权平均而非简单平均)。后果:非对称延迟不仅影响稳定性,还可能让收敛值**偏离初始平均**(延迟大的方向"话语权"被削弱),类似有向图的加权平均。所以在对"收敛到精确平均"敏感的任务里(如分布式估计要无偏),非对称延迟是一个隐蔽的偏差源,需要用时间戳对齐、双向延迟补偿等机制处理。
本质洞察:从"均匀延迟"到"非均匀/非对称延迟",理想的解析阈值 \(\tau^\star=\pi/(2\lambda_N)\) 从"精确边界"退化为"保守准则"(用 \(\tau_{\max}\) 卡),而非对称延迟更会把问题从"稳定性"牵连到"收敛值正确性"(像有向图那样拉偏平均)。这给工程的启示是:延迟分析的两个结论稳健性不同——"稳定性有上限"很稳健(用最大延迟保守估计即可),"收敛到精确平均"很脆弱(非对称延迟就会破坏)。所以实机部署时,对"是否稳定"可以靠 \(\tau_{\max}<\pi/(2\lambda_N)\) 放心;但对"收敛值准不准",必须额外关注延迟的对称性。这也是为什么高精度分布式估计系统(共识卡尔曼)要在通信层做时间戳同步——不是为了稳定,是为了不让非对称延迟悄悄拉偏估计。
回到本节聚焦的三类"非理想"因素——延迟、切换、异步——做个收束。
阶段小结:到这里 §2.2 的三类现实因素都有了结论——延迟有安全阈值 \(\tau^\star=\pi/(2\lambda_N)\);拓扑切换只要联合连通就不影响收敛;异步(gossip)收敛慢但极鲁棒,速率仍由双随机矩阵的第二大特征值决定。三个结论合起来告诉工程师:共识对"拓扑断续"和"异步零星通信"都相当鲁棒,但对"信息过时"(延迟)有硬上限。这些都不改变本章主线——收敛快慢始终是图的谱性质。
代码验证:临界时延阈值¶
理论预测 \(\dot x=-Lx(t-\tau)\) 在 \(\tau<\pi/(2\lambda_N)\) 时收敛、超过则振荡。我们数值积分这个时滞方程,扫不同 \(\tau\),看失稳是否恰好发生在 \(\tau^\star=\pi/(2\lambda_N)\) 附近。
import numpy as np
def laplacian_from_edges(N, edges):
A = np.zeros((N, N))
for i, j in edges:
A[i, j] = 1.0; A[j, i] = 1.0
return np.diag(A.sum(1)) - A
# 全连接 K4: λN = N = 4, 理论 τ* = π/(2·4) ≈ 0.3927
N = 4
edges = [(i, j) for i in range(N) for j in range(i + 1, N)]
L = laplacian_from_edges(N, edges)
lamN = np.linalg.eigvalsh(L)[-1]
tau_star = np.pi / (2 * lamN)
print(f"K4: λN={lamN:.3f}, 理论临界时延 τ* = {tau_star:.4f} s")
def sim_delayed(L, tau, dt=1e-3, T=40.0, x0=None):
"""积分 dx/dt = -L x(t-τ),用历史缓冲实现延迟。返回末段误差幅度。"""
N = L.shape[0]
if x0 is None:
x0 = np.array([1.0, -1.0, 2.0, -2.0])[:N]
d = max(1, int(round(tau / dt))) # 延迟对应的步数
buf = [x0.copy() for _ in range(d + 1)] # 历史缓冲
x = x0.copy(); xbar = x0.mean()
tail = []
for k in range(int(T / dt)):
x_delayed = buf[0] # τ 秒前的状态
x = x + dt * (-(L @ x_delayed))
buf.append(x.copy()); buf.pop(0)
if k > int(T / dt) * 0.8: # 记录最后 20% 时间的误差
tail.append(np.linalg.norm(x - xbar))
return np.max(tail) # 末段误差幅度:趋0=收敛,不衰减=振荡
for tau in [0.1, 0.3, 0.38, 0.40, 0.45, 0.6]:
amp = sim_delayed(L, tau)
status = "收敛" if amp < 1e-2 else ("临界" if amp < 0.5 else "振荡/发散")
print(f" τ={tau:.2f}s (τ/τ*={tau/tau_star:.2f}): 末段误差幅度={amp:.3e} -> {status}")
运行要点:\(\tau\) 明显小于 \(\tau^\star\approx 0.393\) 时(如 0.1、0.3)末段误差趋于 0(收敛);\(\tau\) 跨过 \(\tau^\star\) 后(如 0.45、0.6)误差不再衰减、维持振荡——失稳点与解析阈值吻合。把这条边界亲手扫出来,你对"延迟有硬上限、且由 \(\lambda_N\) 定"就不再是纸上结论。
⚠️ 常见陷阱¶
🧠 思维陷阱:以为"加密通信总能让协调更稳更快" - 错误描述:遇到协调慢或不稳,第一反应是给机器人之间多连通信链路(加边),以为越密越好。 - 现象/后果:加边确实增大 \(\lambda_2\)(收敛更快),但通常也增大 \(\lambda_N\),使临界时延 \(\tau^\star=\pi/(2\lambda_N)\) 变小;在有通信延迟的实机上,加密后反而更容易踩过失稳边界,出现振荡。 - 根本原因:\(\lambda_2\)(速度)与 \(\lambda_N\)(延迟容限)是两个不同的谱端点,加边往往同时推高两者,二者的权衡不能只看一边。 - 正确做法:有延迟的场景下,设计拓扑要同时看 \(\lambda_2\)(够快)和 \(\lambda_N\)(够稳);估算 \(\tau^\star=\pi/(2\lambda_N)\) 并留够裕量(如实际延迟 < \(0.5\tau^\star\))。稀疏拓扑(环/网格)的 \(\lambda_N\) 小、延迟鲁棒性好,常比全连接更适合大规模、长延迟场景。
💡 概念误区:把"时刻连通"当成共识收敛的必要条件 - 错误描述:看到某些时刻通信图分裂(瞬时 \(\lambda_2=0\)),就断定共识一定失败。 - 现象/后果:对一个链路频繁通断的移动编队,你误判它"无法协调"而放弃了本可行的分布式方案,或盲目要求"始终全连通"导致通信开销暴涨。 - 根本原因:动态拓扑下收敛的正确条件是**联合连通**(时间窗内并集连通),而非时刻连通;信息可以靠"接力"跨时间传播。 - 正确做法:用联合连通性判据——只要在一个有界时间窗内,所有出现过的图的并集含生成树,共识就收敛;监控的是"窗口并集的 \(\lambda_2\)"而非每一刻的 \(\lambda_2\)。
⚠️ 编程陷阱:仿真延迟共识时只延迟邻居项、不延迟自身项 - 错误描述:实现式 (2.11) 时写成 \(\dot x_i=\sum_j a_{ij}(x_j(t-\tau)-x_i(t))\)——邻居用延迟值,自己却用当前值。 - 现象/后果:这个"半延迟"模型不再保持平均值守恒,收敛值会漂移,且稳定性边界与理论 \(\pi/(2\lambda_N)\) 对不上,你会以为是阈值公式错了。 - 根本原因:Olfati-Saber–Murray 的守恒性依赖"自身与邻居都取同一时刻的延迟值",即矩阵形式 \(\dot x=-Lx(t-\tau)\) 整体延迟;拆开延迟破坏了 \(L\) 作用的对称结构。 - 正确做法:严格按 \(\dot x(t)=-L\,x(t-\tau)\) 实现——整个 \(Lx\) 项用同一个延迟状态 \(x(t-\tau)\)(代码里就是
-(L @ x_delayed),而非把 \(L\) 拆成对角与非对角分别延迟)。💡 概念误区:把均匀延迟的阈值 \(\tau^\star=\pi/(2\lambda_N)\) 直接套到非对称延迟上还期望收敛到精确平均 - 错误描述:实机链路双向延迟不同(\(\tau_{ij}\ne\tau_{ji}\)),却仍用均匀延迟模型分析,且期望共识收敛到初始平均。 - 现象/后果:稳定性大体还能用 \(\tau_{\max}\) 保守估计,但收敛值会**偏离初始平均**(像有向图那样被加权),分布式估计因此产生隐蔽的系统偏差,且难察觉。 - 根本原因:非对称延迟破坏了 \(L\) 作用的对称性,系统行为类似有向图(§2.1 五),收敛到 \(\gamma\) 加权平均而非简单平均;均匀延迟模型假设了它没有的对称性。 - 正确做法:稳定性用 \(\tau_{\max}<\pi/(2\lambda_N)\) 保守卡;对"收敛值正确性"敏感的任务(如无偏分布式估计),在通信层做时间戳对齐/双向延迟补偿,消除非对称带来的偏差,而不能只靠阈值公式。
练习¶
- [实现/分析] 用本节的时滞共识仿真,对环 \(C_8\) 和全连接 \(K_8\) 两种拓扑,分别扫描 \(\tau\) 找出数值失稳点,与各自的 \(\tau^\star=\pi/(2\lambda_N)\) 对比。哪种拓扑能容忍更大延迟?用 \(\lambda_N\) 解释,并说明这对"大编队该用稀疏还是密集拓扑"的工程含义。
- [推导] 完整复现临界时延的推导:从标量时滞方程 \(\dot\eta=-\lambda\eta(t-\tau)\) 的特征方程 \(s+\lambda e^{-s\tau}=0\) 出发,令 \(s=j\omega\),分别由模相等和相位相等解出临界 \(\omega=\lambda\) 与 \(\tau=\pi/(2\lambda)\)。然后说明为什么整网的阈值取 \(\lambda=\lambda_N\) 而非 \(\lambda_2\)。
- [设计/思考] 联合连通性说"时间窗内并集连通即可"。设计一个 4 机器人的轮转通信方案:任意时刻只允许开 1 条边(通信带宽极度受限),但通过轮流开不同的边,在一个周期内让并集连通。画出你的轮转序列,说明一个周期需要至少几条不同的边、对应并集是什么图。这种"时分复用通信"在带宽受限的大集群里很常见——它用时间换连通性。
- [实现/分析] 实现二阶共识(式 2.28),对 \(N=5\) 环图,扫描阻尼增益 \(\gamma_d\) 从 0 到较大值。验证:\(\gamma_d=0\) 时位置持续振荡不收敛;\(\gamma_d>0\) 时收敛;并找出收敛最快的 \(\gamma_d\)(欠阻尼与过阻尼之间)。把位置随时间的曲线画出来,直观看到从"无阻尼振荡"到"临界阻尼平滑收敛"再到"过阻尼迟缓"的过渡。
- [实现/对比] 实现随机 gossip(每步随机选一条边做平均),对 \(N=10\) 的环和全连接两种图,记录误差降到 1% 所需的边激活次数。验证:gossip 收敛到正确的初始平均(总和守恒);环图的 gossip 平均时间远大于全连接(印证稀疏图慢);并与同步离散共识(每步全网更新)在"达到同等精度的总通信量"上对比,体会异步 gossip 用收敛速度换鲁棒性的权衡。
- [实现/分析,非均匀延迟] 把时滞共识仿真改成**每条链路延迟不同**(各 \(\tau_{ij}\) 在某区间随机取),对 \(K_4\) 扫描整体延迟水平。验证:(a) 用最大延迟 \(\tau_{\max}\) 代入 \(\pi/(2\lambda_N)\) 作为稳定判据是偏保守但可靠的(实际失稳点延迟比保守阈值略大);(b) 再做一组**非对称**延迟(\(\tau_{ij}\ne\tau_{ji}\)),观察收敛值是否偏离初始平均(应像有向图那样被拉偏),并解释为什么——把它和 §2.1 五的有向图加权平均联系起来。这道题让你看清"均匀延迟阈值"在现实里哪部分稳健、哪部分会失效。
§2.1 和 §2.2 把"共识"这个标量协调过程彻底讲透了:怎么收敛、敛到哪、多快、延迟和切换怎么影响。但有一个根本的局限——共识处理的是每个 agent 持有一个**标量(或向量)意见**、目标是让这些意见**相等**。可现实中的多机协调往往复杂得多:每个机器人要解的不是"持有一个意见",而是一整个**优化问题**(比如它自己的 MPC:在自身动力学约束下最小化某个代价),而机器人之间的耦合也不只是"意见相等",可能是共享一个负载、要满足联合约束。这种"每个 agent 解一个优化子问题、子问题之间还要协调一致"的场景,共识协议不够用了——需要**分布式优化**。§2.3 引入 ADMM,它是把"一个大优化"拆成"\(N\) 个小优化 + 邻居协调"的标准框架,也是第 4、5 章所有分布式 MPC 的数学引擎。
§2.3 ADMM 分布式优化 ⭐⭐⭐⭐¶
这一节解决什么问题:共识让 agent 对"一个意见"达成一致。但多机协调里,每个 agent 持有的不是一个意见,而是一整个**优化问题**——它要在自身动力学约束下最小化自己的代价(比如各自的 MPC),同时机器人之间还要满足耦合约束(共享负载、避碰、编队)。直接把所有 agent 的优化拼成一个集中式大问题,会撞上第 1 章的 \(O(N^3)\) 爆炸。ADMM(交替方向乘子法)给出标准解法:把大问题**拆**成每个 agent 的本地小问题,用一个协调变量 + 对偶变量在迭代中"缝合"出全局一致解。这是后续所有分布式 MPC 的数学引擎。
动机:每个机器人解自己的优化,如何拼出全局协调¶
把场景具体化。\(N\) 台机器人协同搬运一个负载,每台机器人 \(i\) 要决定自己未来若干步的动作 \(x_i\)(它的局部决策变量,比如足端力轨迹),最小化自己的代价 \(f_i(x_i)\)(跟踪误差 + 能量)。如果机器人之间互不耦合,各解各的 \(\min_{x_i}f_i(x_i)\) 就完事了。但它们共享一个刚性负载——存在一个全局量(比如负载受到的合力、或一个所有机器人都要同意的"参考点")必须一致。
最干净的抽象是:每个 agent 有本地变量 \(x_i\) 和本地代价 \(f_i\),但所有 \(x_i\) 必须等于一个公共变量 \(z\):
这个"一致性约束 \(x_i=z\)"就是把 \(N\) 个本地问题耦合起来的纽带。问题是:怎样在不把所有 \(f_i\) 汇总到一个中央求解器的前提下,解出这个带耦合约束的问题? 如果能让每个 agent 只解关于自己 \(x_i\) 的小问题、再通过少量通信协调 \(z\),就既避开了 \(O(N^3)\)、又保持了分布式。ADMM 正是为此而生。
如果用朴素办法会怎样¶
朴素办法一:直接集中式求解。 把式 (2.19) 当成一个大优化丢给中央求解器。变量是所有 \(x_i\) 加 \(z\),维度随 \(N\) 线性增长,但约束把它们紧紧耦合,求解的线性系统规模随 \(N\) 增长——回到第 1 章的 \(O(N^3)\) 乃至更高。机器人一多就超时,且中央节点是单点故障。这正是我们想避开的。
朴素办法二:各解各的,再投影到一致。 让每个 agent 先独立解 \(\min_{x_i}f_i(x_i)\),得到各自最优 \(x_i^\*\),然后简单取平均 \(z=\frac1N\sum x_i^\*\) 强行拉一致。问题是:这个平均点通常**不是**原问题 (2.19) 的最优解——每个 agent 是在"无视一致性约束"下最优的,事后取平均既不满足各自的最优性、合起来也不是全局最优。你会得到一个可行但次优、甚至明显偏离的解。
朴素办法三:罚函数法。 把约束 \(x_i=z\) 变成软惩罚,求 \(\min\sum_i f_i(x_i)+\frac{\rho}{2}\sum_i\|x_i-z\|^2\)。这能让各 \(x_i\) 互相靠拢,但有个老问题:要让约束**严格**满足(\(x_i\) 精确等于 \(z\)),罚参数 \(\rho\) 必须趋于无穷,而 \(\rho\) 越大问题越病态(数值上越难解)。纯罚函数法在"精确满足约束"和"数值可解"之间无法兼得。
ADMM 的高明之处,正是**同时**保留罚函数法的"可分解性"(平方罚项让各 agent 能并行)和拉格朗日法的"精确性"(对偶变量让约束最终精确满足),用一个适中的、固定的 \(\rho\) 就能收敛到精确最优。下面看它怎么做到。
历史:从对偶分解到 ADMM¶
ADMM 的思想根植于 1970 年代的优化理论。它融合了两条线:一是**对偶上升/对偶分解(dual decomposition)——通过拉格朗日对偶把耦合约束"价格化",让子问题可分解,但对偶上升要求严格凸且收敛慢;二是**增广拉格朗日法(method of multipliers)——给拉格朗日函数加一个二次罚项改善收敛和鲁棒性,但二次罚项破坏了可分解性。ADMM 由 Gabay、Mercier 以及 Glowinski、Marrocco 在 1975-76 年前后提出,巧妙地**交替**优化各组变量,既得到增广拉格朗日的鲁棒收敛,又恢复了可分解性。它沉寂了几十年,直到 2011 年 Boyd 等人的长综述《Distributed Optimization and Statistical Learning via ADMM》把它系统化、并指出它特别适合大规模分布式优化,才大放异彩——如今它是分布式机器学习、分布式 MPC、传感器网络的标准工具。我们这一节就沿 Boyd 综述的标准形式来讲。
理论¶
一、增广拉格朗日:把约束"价格化"再加"罚"¶
处理带约束的优化,经典工具是**拉格朗日函数**:给每个约束配一个**对偶变量(乘子)**。对一致性约束 \(x_i=z\),配乘子 \(y_i\):
乘子 \(y_i\) 的直觉是约束 \(x_i=z\) 的"价格"——违反约束((\(x_i\ne z\)))要付出 \(y_i^\top(x_i-z)\) 的代价。但只有线性项的拉格朗日函数对应的对偶上升法收敛慢、且要求 \(f_i\) 严格凸。**增广拉格朗日**在此基础上再加一个二次罚项(罚参数 \(\rho>0\)):
二次项 \(\frac\rho2\|x_i-z\|^2\) 的作用:它在约束附近形成一个"碗",把 \(x_i\) 往 \(z\) 拉,改善收敛性和数值条件,且(关键)它对每个 \(i\) 是可分离的——这为分解埋下伏笔。
二、ADMM 的三步交替迭代¶
直接对 \(\mathcal L_\rho\) 同时优化所有变量,二次项 \(\|x_i-z\|^2\) 把 \(x_i\) 和 \(z\) 耦合在一起,无法分解。ADMM 的核心技巧是**交替(alternating)**:固定其它变量,轮流优化 \(\{x_i\}\)、\(z\)、\(\{y_i\}\)。每一轮(第 \(k\to k{+}1\) 步)三个更新:
① \(x\)-更新(各 agent 并行):固定 \(z^k\) 和 \(y_i^k\),对每个 \(x_i\) 独立求最小:
这一步是分布式的关键:因为 \(\mathcal L_\rho\) 对 \(\{x_i\}\) 是可分离的(每个 \(x_i\) 只出现在第 \(i\) 项里),\(N\) 个 \(x_i\) 的更新**完全独立、可并行**——每个 agent 只用自己的 \(f_i\) 和当前的 \(z^k,y_i^k\) 解一个本地小问题(单体规模,\(O(n^3)\) 而非 \(O((Nn)^3)\))。这就是 ADMM 把 \(O(N^3)\) 打散成 \(N\) 个 \(O(n^3)\) 的地方。
② \(z\)-更新(协调):固定 \(\{x_i^{k+1}\}\) 和 \(\{y_i^k\}\),对 \(z\) 求最小。\(\mathcal L_\rho\) 中含 \(z\) 的项是 \(\sum_i[-y_i^\top z+\frac\rho2\|x_i^{k+1}-z\|^2]\),对 \(z\) 求导置零:
即 \(z\) 更新为"各 agent 本地解 + 缩放对偶变量"的**平均**。这一步需要把各 \(x_i^{k+1}\) 汇总求平均——可以由一个轻量协调器做,也可以用 §2.1 的平均共识分布式地算(这正是共识与 ADMM 的连接点:\(z\)-更新就是一次平均共识)。
③ \(y\)-更新(对偶上升,各 agent 并行):每个 agent 用本地的约束违反量更新自己的对偶变量:
直觉:如果 \(x_i^{k+1}\) 仍偏离 \(z^{k+1}\)(约束没满足),就按偏离量调整"价格" \(y_i\),逼着下一轮的 \(x_i\) 更靠近 \(z\)。\(y\)-更新也是各 agent 本地独立的。
把三步连起来:每一轮 ADMM = 各 agent 并行解本地优化(①)→ 汇总求平均得协调变量(②)→ 各 agent 并行更新对偶价格(③),只需在 ② 处做一次"求平均"的通信。迭代直到 \(x_i\) 与 \(z\) 足够接近(约束满足)且不再变化(收敛)。
三、缩放形式:更简洁的等价写法¶
工程实现常用**缩放对偶变量(scaled dual)** \(u_i=y_i/\rho\),把式 (2.21)(2.23) 写得更干净。代入并配方,\(x\)-更新变为
这就是骨架里给出的、也是 Boyd 综述里最常用的形式(对照骨架的 \(y_i\) 即这里的 \(u_i\))。缩放形式把对偶变量和原变量合进同一个二次项 \(\|x_i-z+u_i\|^2\),实现时更顺手——\(x\)-更新就是"在本地代价上加一个把 \(x_i\) 往 \((z^k-u_i^k)\) 拉的二次项"。
本质洞察:ADMM 三步的分工,恰好对应一个"分散决策 + 中央协调 + 价格调节"的经济系统。\(x\)-更新是各 agent 在当前"价格"\(u_i\) 下自利地优化自己(分散决策);\(z\)-更新是把大家的意愿汇总成一个共识方案(中央协调);\(y\)/\(u\)-更新是根据"谁还没对齐"调整价格,逼着下一轮更一致(价格调节)。这与第 1 章把分布式架构类比成"开会协商"一脉相承,但 ADMM 给了这个"协商"一个收敛性可证、且只需邻居通信的精确算法。也正因如此,\(\rho\)(价格调整的步长/罚的强度)成了整个过程的关键旋钮——下一段专门讲它。
四、罚参数 \(\rho\) 的作用与选取¶
\(\rho\) 是 ADMM 唯一的核心超参,它的角色是一个**权衡旋钮**,这里从两个互补角度理解(双重解读):
- 优化视角(原始 vs 对偶残差的平衡):ADMM 的收敛由两个残差刻画——原始残差 \(r^k=\{x_i^k-z^k\}\)(约束违反程度,衡量"各 agent 对齐了没")和**对偶残差** \(s^k=\rho(z^k-z^{k-1})\)(衡量"协调变量还在不在动")。\(\rho\) 大→更重罚约束违反→原始残差降得快(快速对齐)但对偶残差大(协调变量剧烈波动,易过冲震荡);\(\rho\) 小→约束约束松→各 agent 更自由地优化自己的 \(f_i\)(对偶残差小)但原始残差降得慢(迟迟对不齐)。好的 \(\rho\) 让两个残差同量级地一起下降。
- 协调视角(全局一致 vs 局部自主):这正好呼应第 1 章的核心权衡。\(\rho\) 大 = 强调"全局一致性约束"压过"本地代价",各 agent 被迫牺牲自己的最优来对齐(全局协调主导);\(\rho\) 小 = 各 agent 更多按自己的 \(f_i\) 走、慢慢协调(局部自主主导)。\(\rho\) 调的就是"协调 vs 自主"的相对话语权。
这里就是蓝图认知工具 B 指出的同构:ADMM 的 \(\rho\) 与采样式 MPC(MPPI)里的温度参数 \(\lambda\) 在结构上对应——都在调节"全局一致/集体"与"局部自主/个体探索"的平衡。\(\rho\) 大像 MPPI 温度低(强约束/强利用、各 agent 紧贴共识),\(\rho\) 小像温度高(弱约束/强探索、各 agent 更自由)。两者都是"一个标量旋钮控制集体协调强度",理解了一个就能迁移到另一个。但要标清边界:\(\rho\) 是优化算法的罚参数(影响收敛速度与残差平衡,不改变最优解的位置——凸问题下任何 \(\rho>0\) 最终都收敛到同一最优),而 MPPI 温度直接改变采样分布的形状和最终策略;两者"调集体 vs 个体"的角色相似,但作用机制和对最终解的影响并不等同。
实用选取:固定 \(\rho\) 难以兼顾,标准做法是**自适应调节**——监控两个残差,若原始残差远大于对偶残差(对齐太慢)就增大 \(\rho\),反之减小,常用规则是
典型取 \(\mu=10\)、\(\tau^{\text{incr}}=\tau^{\text{decr}}=2\)。这是 Boyd 综述推荐的残差平衡法,能让 ADMM 对 \(\rho\) 初值不那么敏感。
五、收敛性:凸保证,非凸"通常可用但无保证"¶
ADMM 的收敛性结论要分清,这是一个**极易被误解**的点:
- 凸问题:若所有 \(f_i\) 是闭凸函数(允许取 \(+\infty\),即可含凸约束),ADMM 保证收敛到全局最优。收敛率方面,一般凸是 \(O(1/k)\)(残差按 \(1/k\) 衰减),强凸 + 光滑等条件下可达线性收敛;实践中对二次规划(QP)常观察到线性收敛——这也是为什么 ADMM 在分布式 MPC(子问题是 QP)里好用。
- 非凸问题:当 \(f_i\) 非凸(比如带非线性动力学、接触切换的 MPC 子问题),ADMM 没有一般的收敛保证。某些结构化非凸问题在额外假设下可证收敛到 KKT 点(局部驻点),但这是有条件的、且不保证全局最优。
第 4 章会反复撞上这一点:多足机器人的 MPC 子问题含非凸的接触/摩擦约束,把它们用 ADMM 协调时,收敛是"工程上通常能行"而非"理论上保证"——实践中要靠好的初值、warm-start、自适应 \(\rho\)、限制迭代轮数来让它稳定工作。把"ADMM 凸时收敛到全局最优"错误地外推到非凸 MPC、以为"用了 ADMM 就一定收敛到最优",是分布式 MPC 实现里最常见的认知错误之一(见下方陷阱)。
什么时候停?停止准则的工程细节。前面说"迭代到残差足够小",但"足够小"要量化。标准做法(Boyd 综述)是同时检查原始残差 \(\|r^k\|\) 和对偶残差 \(\|s^k\|\) 都低于各自的容差,而容差由**绝对 + 相对**两部分组成:
绝对容差 \(\epsilon^{\text{abs}}\)(如 \(10^{-4}\))防止变量量级很小时残差判据过松,相对容差 \(\epsilon^{\text{rel}}\)(如 \(10^{-3}\))让判据随问题规模自适应缩放(\(\sqrt n\) 是变量维度的归一化)。为什么不能只看目标函数值收敛?因为 ADMM 的目标值可能早就接近最优,但约束(原始残差)还没满足——此时解还不可行,停下来会得到一个违反一致性的"伪解"。必须两个残差都达标才算收敛:原始残差小 = 约束基本满足(各 agent 对齐了),对偶残差小 = 协调变量基本不动了(到了驻点)。在实时 MPC 里则换一种策略:不等收敛,每周期跑固定轮数 + warm-start(下一小节展开),把收敛摊到多个控制周期上。
六、去中心化的共识型 ADMM:让 \(z\)-更新也分布式¶
前面的 \(z\)-更新(式 2.20/2.23)是一个**全局平均** \(z=\frac1N\sum_i(x_i+u_i)\)——它需要把所有 agent 的本地解汇总起来。如果由一个中央协调器来做这个平均,那 ADMM 就还残留一个"准中央节点":虽然 \(x\)-更新分布式了,\(z\)-更新仍要全局汇聚,存在单点和通信瓶颈。对真正的去中心化多机系统(第 4 章的分布式 MPC、第 12 章的混合架构),我们希望**连 \(z\)-更新都只靠邻居通信**完成。这就是**共识型 ADMM(consensus ADMM)** 要解决的。
关键观察:\(z\)-更新要算的"全局平均",正是 §2.1 的**平均共识**能分布式计算的东西!于是有两条路线把 \(z\)-更新去中心化:
路线一:用平均共识子程序算 \(z\)。每轮 ADMM 的 \(z\)-更新内部,跑若干步 §2.1 的离散平均共识(用双随机权重 \(W\)),让各 agent 对 \(\frac1N\sum_i(x_i+u_i)\) 达成一致——每个 agent 维护自己的 \(z\) 估计 \(z_i\),通过邻居交换收敛到全局平均。这样整个 ADMM 只需邻居通信,无中央节点。代价是每轮 ADMM 内嵌了一个共识循环(通信轮数增加),但彻底去中心化。
路线二:为每个 agent 配本地副本 \(z_i\),把"\(z_i\) 相等"也作为一致性约束。更彻底的做法是不再有单一全局 \(z\),而是每个 agent \(i\) 持有自己的局部副本 \(z_i\),并要求相邻 agent 的副本一致(\(z_i=z_j\) 对 \((i,j)\in E\))。这把一致性约束从"\(x_i=z\)"(全局)改写为"边上的一致"(\(x_i=z_i\),且 \(z_i=z_j\) 沿边),约束结构正好对应第 1 章的关联矩阵 \(B\)。这种"边一致性(edge consistency)"形式的 ADMM,\(x\)-更新和对偶更新都只涉及邻居,是完全去中心化的——它正是 Zeng-Hamed 的 node-edge splitting(下一段)和许多分布式 MPC 的数学骨架。
两条路线的本质都是:把 ADMM 里那个"全局平均"用图上的局部操作(邻居平均共识 / 边一致性约束)替代。这也再次印证了本章的主线——共识(\(z\)-更新的分布式实现)和 ADMM(整体框架)不是两个孤立工具,而是咬合在一起的:ADMM 的协调步,内核就是一次共识。
本质洞察:从"中央协调的 ADMM"到"共识型去中心化 ADMM",变的不是优化的数学(还是那三步),而是 \(z\)-更新这一步**由谁来算、怎么算**。中央版让一个节点算全局平均;共识版让所有节点通过邻居接力算出同一个平均。这正是第 1 章"分布式 vs 集中"在算法层面的体现——同一个优化,可以有"带准中央节点"的实现,也可以有"纯邻居通信"的实现,取决于你能否容忍那个汇聚点。第 4 章的双 Go2 编队、第 12 章的安全协调,用的都是去中心化的共识型 ADMM。
需要权衡的是:去中心化(共识型)虽然消除了中央节点,但每轮 ADMM 内嵌共识会增加通信轮数(路线一)或增加变量与对偶维度(路线二)。\(N\) 很小(如 2-4 台)时,带轻量协调器的中央版 \(z\)-更新可能更简单高效;\(N\) 大或要求绝对无单点时,才值得上完全去中心化的共识型。这又是第 1 章"架构选择是权衡"的回声。
七、对偶分解、sharing 形式与过松弛:ADMM 的家族与加速¶
ADMM 不是孤立的算法,它在分布式优化的家族里有"前辈"和"变体"。理清这层关系,能让你在面对一个新的多机协调问题时知道该选哪个工具。
与对偶分解(dual decomposition)的对比——为什么 ADMM 更好用。ADMM 的直接前辈是对偶分解:同样给一致性约束配乘子 \(y\),但它用的是**普通**拉格朗日(没有二次罚项),迭代是"各 agent 解本地问题 → 用约束违反量做对偶梯度上升更新 \(y\)"。对偶分解可分解性同样好(本地问题并行),但有两个硬伤:(1) 要求每个 \(f_i\) 严格凸,否则本地 \(\arg\min\) 可能无界或不唯一;(2) 收敛慢且对步长敏感(对偶上升是一阶方法,步长难调)。ADMM 加的那个二次罚项 \(\frac\rho2\|x_i-z\|^2\) 恰好治这两个病:罚项让本地问题即使 \(f_i\) 只是凸(不严格凸)也良定、且数值条件更好,同时大幅改善收敛。代价是二次项耦合了变量——但 ADMM 用"交替"巧妙绕过(§2.3 二)。一句话:ADMM = 对偶分解的可分解性 + 增广拉格朗日的鲁棒收敛,这正是它取代对偶分解成为分布式优化主力的原因。
consensus 形式 vs sharing 形式——两种对偶的问题结构。Boyd 综述区分了 ADMM 的两类典型分布式形式,它们对应两种不同的耦合结构,实际多机问题里都会遇到:
- consensus 形式(我们一直用的):\(\min\sum_i f_i(x_i)\) s.t. \(x_i=z\)。耦合是"所有本地变量要等于一个公共变量"。典型场景:各 agent 对一个**全局量**(全局参考点、共享负载状态)达成一致。\(x\)-更新各自解,\(z\)-更新求平均。
- sharing 形式:\(\min\sum_i f_i(x_i)+g(\sum_i x_i)\)。耦合在一个作用于**各 agent 贡献之和**的公共代价 \(g\) 上。典型场景:各 agent 共享一个**总资源/总量**(如总功率预算、对负载的合力 \(\sum_i F_i\) 要等于期望值)。它的 ADMM 也是三步,但 \(z\)/对偶更新围绕"和"而非"每个相等"。
两者通过对偶其实可以互相转化(Boyd 综述有详述),但在建模时选对形式很关键:协调"大家要一致"用 consensus 形式,协调"大家之和要满足某约束"用 sharing 形式。第 5 章协同搬运里"各机器人出力之和 = 负载所需合力"就是天然的 sharing 结构,而"各机器人对负载位姿的估计要一致"是 consensus 结构——一个搬运任务可能同时含两种。认出问题是哪种结构,直接决定 ADMM 怎么写。
过松弛(over-relaxation)——几乎免费的加速。一个实用的 ADMM 加速技巧:在 \(z\)-更新和 \(y\)-更新里,把 \(x_i^{k+1}\) 替换成一个"过松弛"组合
其中松弛因子 \(\alpha\in(1,2)\)(取 1 退回标准 ADMM)。直觉:让更新"多走一点"(外推),加快收敛。Boyd 综述指出 \(\alpha\in[1.5,1.8]\) 经验上常能带来明显加速,且几乎不增加计算量(只是一个凸组合)、不破坏收敛保证(凸问题下仍收敛)。这是工程上"几乎免费的午餐"——实现分布式 MPC 时值得默认开启过松弛。
本质洞察:对偶分解、标准 ADMM、过松弛 ADMM,是同一思想(对偶 + 分解)在"鲁棒性/速度"上的递进改良——对偶分解给出可分解性,增广拉格朗日(ADMM)补上鲁棒收敛,过松弛再榨一点速度。而 consensus 与 sharing 形式则是同一框架适配"一致型"与"求和型"两类耦合。理解这个家族谱系,你就不会把 ADMM 当成一个黑箱公式,而能根据问题的耦合结构(一致?求和?)和需求(凸性?速度?)裁剪出合适的变体。
八、在多机 MPC 中的落地形态¶
ADMM 在多机 MPC 里的典型用法:每个机器人 \(i\) 把自己的 MPC(在自身动力学约束下最小化代价)作为本地子问题(对应 \(x\)-更新),机器人间的耦合(避碰、编队、共享负载)写成一致性约束(对应 \(z\)),通过 ADMM 迭代协调。每个控制周期跑若干轮 ADMM(常 3-10 轮,不必跑到完全收敛),只与邻居通信。这把第 1 章的 \(O(N^3)\) 集中式 QP 打散成 \(N\) 个并行的单体 QP + 邻居协调,通信复杂度正比于边数而非 \(N^2\)。
这里值得点破一个工程上极重要、却常被忽视的细节——每周期跑几轮 ADMM。理论上 ADMM 要迭代到残差收敛才得到最优;但实时 MPC 每个控制周期只有几毫秒到几十毫秒,跑不起几百轮。实践做法是:每周期只跑固定的少数几轮(如 3-10),配合 warm-start——用上一个控制周期收敛的对偶变量 \(u_i\) 和协调变量 \(z\) 作为本周期的初值。因为相邻控制周期的最优解变化很小,warm-start 让 ADMM 从"已经接近"的地方启动,几轮就够用。这把"ADMM 要收敛"和"实时性"调和起来:不追求每周期内收敛到最优,而是让 ADMM 的迭代和 MPC 的滚动时域**同步推进**,跨周期逐渐收敛。这是分布式 MPC 能实时运行的关键技巧,第 4 章会落地。
一个最小的 ADMM-MPC 映射(为第 4 章铺垫):设每个机器人是单积分器 \(\dot p_i=v_i\),本地 MPC 在时域 \(T\) 内最小化跟踪代价 \(\sum_t\|p_i(t)-p_i^{\text{ref}}(t)\|^2+\|v_i(t)\|^2\),受自身动力学约束——这就是本地子问题 \(f_i(x_i)\),其中 \(x_i\) 是机器人 \(i\) 的整条预测轨迹 \((p_i,v_i)\)。机器人间的编队约束(相邻机器人的相对位置应等于期望队形)写成一致性约束。每个 \(x\)-更新就是一个机器人的单体 MPC(QP,可用 OSQP 解),\(z\)-更新协调相邻机器人的轨迹。把第 1 章和本章的东西拼起来:单体 MPC(你已会)+ ADMM(本节)+ 编队约束(§2.4)= 分布式编队 MPC,正是第 4 章的任务 A。
值得记下两个真实的前沿落地形态,它们都把上面的抽象框架用在了多足机器人上:
- 共享负载的星形耦合(ACLM, 2026):Zhou 等人(Georgia Tech)的 ACLM 处理多个"四足+臂"协同搬一个负载。关键洞察是——机器人之间并不直接耦合,而是都通过那个共享负载耦合,形成一个"星形"结构(负载在中心)。于是 consensus ADMM 把问题拆成一个负载子问题 + \(N\) 个并行的机器人子问题,一致性约束只加在 manipulation wrench(交互力/力矩)上:每个机器人子问题用上一轮的负载状态,负载子问题用各机器人 wrench 的本地副本。这是 §2.3 抽象的 \(x_i=z\) 在"力一致"上的具体化,直接预告第 5 章的协同搬运。
- 含 CBF 耦合的安全 MPC(Zeng-Hamed, 2026):当机器人间加入避碰的控制障碍函数(CBF)约束时,这些约束本身在机器人之间引入耦合,使集中问题不能直接分解。他们用一个 node-edge splitting(节点-边分裂)的 consensus 形式,把全局问题分解成可并行的 node-local 和 edge-local QP,只需邻居通信,在两台 Go2 上实机、仿真到 4 台,性能逼近集中式而每周期计算量大降。这预告第 12 章的 MARL+规控混合里的安全层。
这两个例子的共同点:都是 §2.3 的标准 ADMM,只是"本地子问题"和"一致性约束"按各自的物理结构(共享负载 / CBF 耦合)做了具体化。把本节的抽象框架吃透,这些前沿工作就只是"填空"。
九、收敛点的 KKT 与对偶变量的含义¶
最后回答一个理论问题,也回扣章首前置自测的 KKT:ADMM 收敛时,各变量收敛到了什么?对偶变量 \(y_i\) 的物理含义是什么? 这关系到怎么用 ADMM 的输出、以及怎么诊断它是否真的收敛了。
凸问题下 ADMM 收敛时,\((x_i^\star, z^\star, y_i^\star)\) 满足原问题 (2.17) 的 KKT 最优性条件:
- 原始可行(primal feasibility):\(x_i^\star = z^\star\) 对所有 \(i\)——一致性约束精确满足。这对应原始残差 \(r=x_i-z\to 0\)。
- 对偶可行 + 稳定性(stationarity):每个本地问题的最优性给出 \(0\in\partial f_i(x_i^\star)+y_i^\star\),即 \(-y_i^\star\in\partial f_i(x_i^\star)\)——对偶变量 \(y_i^\star\) 恰好等于 \(f_i\) 在最优点处梯度的相反数。这对应对偶残差 \(s\to 0\)。
把所有本地稳定性条件加起来,并用 \(\sum_i y_i^\star=0\)(收敛时对偶变量之和归零,这是 \(z\)-更新的最优性给出的),就得到 \(\sum_i \nabla f_i(x_i^\star)=0\) 且所有 \(x_i^\star=z^\star\)——这正是原问题"在一致约束下最小化 \(\sum f_i\)"的最优性条件。所以 ADMM 不是近似:凸问题下它收敛到的 \(z^\star\) 就是带约束原问题的精确全局最优,对偶变量 \(y_i^\star\) 就是约束 \(x_i=z\) 的最优拉格朗日乘子。
本质洞察:对偶变量 \(y_i^\star\) 是一致性约束的**影子价格(shadow price)——它度量"如果允许 agent \(i\) 稍微偏离一致(\(x_i\) 不必精确等于 \(z\)),总代价能降多少"。在多机协调里这有直接的物理意义:在协同搬运中(§2.3 八的 ACLM),wrench 一致性约束的对偶变量就是各机器人为"力达成一致"所承受的"内部应力";在编队中,它是各机器人为维持队形相对邻居付出的"协调努力"。**对偶变量不是算法的副产品,而是携带了"协调代价"信息的量——监控它的大小能告诉你哪个 agent 在协调中"最吃力"(对偶变量最大),这对诊断编队里哪台机器人快到能力极限很有用。
这也给了 ADMM 收敛诊断的理论依据(呼应五的停止准则):原始残差 \(r\to 0\) 对应 KKT 的原始可行、对偶残差 \(s\to 0\) 对应 KKT 的稳定性——两个残差都小,才同时满足"约束满足"和"最优"。只看其一会漏判:原始残差小但对偶残差大 = 各 agent 对齐了但还没到最优(还在协调谁多担一点);对偶残差小但原始残差大 = 各自"最优"了但还没对齐(约束没满足)。这就是为什么 §2.3 五强调必须两个残差都达标——它对应 KKT 的两组条件缺一不可。
需要重申边界:以上 KKT 等价性**只在凸问题下成立**。非凸 MPC(含接触/非线性动力学)下,即便残差都降到很小,得到的也只是一个 KKT 点(局部驻点),不保证全局最优——这再次呼应五的警告,也是第 4 章用 ADMM 协调非凸多足 MPC 时必须记住的。
十、x-更新里有不等式约束怎么办:proximal 与投影¶
前面讲 \(x\)-更新(式 2.21/2.24)时,本地子问题大多是无约束或只含等式约束的二次问题(有闭式解)。但真实 MPC 的本地子问题几乎总带**不等式约束**——控制量有上下界(执行器饱和 \(|u|\le u_{\max}\))、状态有安全区域(避障)、足端力有摩擦锥约束。\(x\)-更新此时不再有闭式解,这是一个常被初学者忽略、却直接决定 ADMM 能否用在真实 MPC 上的环节(一次**理论-工程桥接**)。
关键认识:\(x\)-更新本质是一个 **proximal(邻近)算子**求值。把式 (2.24) 写成
这正是 \(f_i\) 的 proximal 算子 \(\operatorname{prox}_{f_i/\rho}(v_i^k)\)——"在最小化 \(f_i\) 和靠近 \(v_i^k\) 之间折中"。当 \(f_i\) 含约束(写成示性函数 \(+\infty\) 表示违反约束),proximal 算子自然处理约束,只是没了闭式解。怎么算?
- 本地子问题仍是凸 QP(带不等式约束)→ 用 QP 求解器。最常见的情形:\(f_i\) 是二次代价 + 线性不等式约束,本地子问题就是一个**带约束的 QP**,直接用 OSQP(它本身就是基于 ADMM 的 QP 求解器,故有"ADMM 套 ADMM"的层次)、qpOASES 等解。每个 \(x\)-更新内部解一个小 QP,这正是分布式 MPC 的标准做法——外层 ADMM 协调机器人间耦合,内层 QP 解单机带约束子问题。
- 约束是简单集合(盒约束/范数球)→ 用投影代替求解。若约束只是"控制量在 \([u_{\min},u_{\max}]\) 内"这类简单集合,proximal 退化为先无约束求解、再**投影**到可行集(\(\operatorname{clip}\) 到盒子、或归一化到范数球),几乎免费。这叫 proximal 的"投影形式",对盒约束尤其高效。
本质洞察:ADMM 的 \(x\)-更新 = 本地代价的 proximal 算子,这个视角把"ADMM 怎么处理约束"统一起来了——约束不是 ADMM 框架之外的麻烦,而是被吸收进 proximal 算子里:无约束 → 闭式解;凸约束 → 内层 QP;简单集合约束 → 投影。这也解释了 ADMM 为何在带约束的分布式 MPC 里如此自然:它天然把"满足本地约束"(proximal 内部)和"满足耦合约束"(ADMM 的一致性)分到两个层次各自处理——本地约束在 \(x\)-更新里解掉,耦合约束靠 \(z\)/对偶更新协调。理解了这点,你看 OSQP 解的单机 MPC 如何嵌进 ADMM 协调器,就只是"内层 proximal 用 QP 实现"这一句话。第 4 章的分布式 MPC 正是这个结构:每个 \(x\)-更新 = 一次 OSQP 求解的带约束单机 MPC。
代码验证:用 ADMM 求解分布式 QP¶
把抽象落到能跑的代码。考虑最经典的可分布式问题:\(N\) 个 agent,每个有一个本地二次代价 \(f_i(x)=\frac12 a_i(x-b_i)^2\)(agent \(i\) 希望 \(x\) 接近自己的目标 \(b_i\),权重 \(a_i\)),但所有 agent 必须对一个公共标量 \(z\) 达成一致。这其实是个"加权平均"问题——闭式最优解是 \(z^\star=\frac{\sum a_i b_i}{\sum a_i}\)(加权平均)。我们用 ADMM 解它,验证收敛到这个已知最优,并观察 \(\rho\) 对收敛速度的影响。
import numpy as np
# N 个 agent,本地代价 f_i(x) = 0.5 * a_i * (x - b_i)^2
np.random.seed(0)
N = 5
a = np.array([1.0, 2.0, 0.5, 3.0, 1.5]) # 各 agent 的代价权重
b = np.array([4.0, 1.0, 7.0, 2.0, 5.0]) # 各 agent 的本地目标
z_star = (a @ b) / a.sum() # 已知闭式最优:加权平均
print(f"闭式最优 z* = {z_star:.4f}")
def admm_consensus_qp(a, b, rho, iters=60):
"""缩放形式 ADMM 解 min Σ 0.5 a_i (x_i-b_i)^2 s.t. x_i=z。"""
N = len(a)
x = np.zeros(N); u = np.zeros(N); z = 0.0
hist = []
for k in range(iters):
# ① x-更新(各 agent 并行,本地 QP 有闭式解):
# min 0.5 a_i(x-b_i)^2 + (rho/2)(x - z + u_i)^2
# => x_i = (a_i b_i + rho(z - u_i)) / (a_i + rho)
x = (a * b + rho * (z - u)) / (a + rho)
# ② z-更新(平均):
z = np.mean(x + u)
# ③ u-更新(对偶):
u = u + x - z
hist.append(abs(z - z_star)) # 到最优的距离
return z, np.array(hist)
for rho in [0.1, 1.0, 10.0, 100.0]:
z_final, hist = admm_consensus_qp(a, b, rho)
# 找收敛到 1e-6 所需迭代数
conv = np.argmax(hist < 1e-6) if np.any(hist < 1e-6) else len(hist)
print(f"ρ={rho:6.1f}: 收敛到 z={z_final:.6f}, 误差<1e-6 需 {conv:3d} 轮"
f"{' (60轮内未达)' if conv==len(hist) else ''}")
运行要点:在凸问题下,只要迭代足够多,任何 \(\rho>0\) 的 ADMM 都收敛到同一个闭式最优 \(z^\star\)(加权平均)——这印证了"\(\rho\) 不改变最优解的位置,只影响到达它的速度"。但**有限轮数内不同 \(\rho\) 的进度天差地别**:取 \(\rho=1\) 几十轮就高精度收敛,而 \(\rho\) 太小(\(0.1\))收敛慢、\(\rho\) 太大(\(100\))在同样轮数内甚至还停在远离最优的地方(原始-对偶残差严重失衡)。中间存在一个最优 \(\rho\)。这就是为什么实际中每周期只跑有限轮 ADMM 时,\(\rho\) 必须调好(或自适应)——不是"反正会收敛就行",有限预算下 \(\rho\) 直接决定你这几轮能走多近。亲手扫一遍 \(\rho\),你对它的"权衡旋钮"角色就有了量的感受。
进阶:一个最小的 ADMM-MPC 编队例子(直通第 4 章)。上面的标量 QP 是为了讲清 ADMM 机制。现在把它升级成一个**有 MPC 味道**的例子:两个单积分器机器人 \(\dot p_i=v_i\),各自在时域 \(T\) 内规划自己的轨迹(本地 MPC),同时要保持一个期望的相对位置(编队约束 \(p_2-p_1=d^\*\))。这正是第 4 章双 Go2 编队 MPC 的"玩具版",展示"单体 MPC(本地子问题)+ ADMM(协调编队约束)"如何拼起来。我们用 consensus ADMM:引入耦合变量协调编队约束,每个 \(x\)-更新是一个机器人的轨迹 QP(这里用闭式/小型最小二乘代替真正的 QP 求解器,但结构一致)。
import numpy as np
# 两个一维单积分器机器人,各规划 T 步轨迹。编队:期望相对位置 p2 - p1 = d_star。
# 本地 MPC: min Σ_t (p_i(t)-p_ref_i)^2 + w*(v_i(t))^2, s.t. p_i(t+1)=p_i(t)+dt*v_i(t)
T, dt, w = 10, 0.2, 0.1
d_star = 2.0 # 期望编队间距
p1_0, p2_0 = 0.0, 5.0 # 初始位置(间距 5,需收敛到 2)
p1_ref, p2_ref = 1.0, 3.0 # 各自参考(标称队形:间距 2)
def local_mpc_traj(p0, p_ref, lam, z_coupling, rho):
"""本地子问题:单积分器轨迹 MPC + ADMM 耦合项。
决策变量 = 速度序列 v[0..T-1];位置由动力学递推。
目标: Σ(p_t - p_ref)^2 + w Σ v_t^2 + (rho/2)(p_T - z_coupling + lam)^2
(用末端位置 p_T 参与编队耦合,简化但保留 ADMM 结构)。闭式最小二乘解。"""
# 构造 p_T = p0 + dt * sum(v) 关于 v 的线性表达,组装最小二乘
# 这里用数值最小二乘(把目标写成 ||Av - b||^2 形式)
A_rows, b_rows = [], []
# 跟踪项:每个 t 的 p_t - p_ref
for t in range(1, T + 1):
row = np.zeros(T); row[:t] = dt
A_rows.append(row); b_rows.append(p_ref - p0)
# 控制正则项 sqrt(w) * v_t
for t in range(T):
row = np.zeros(T); row[t] = np.sqrt(w)
A_rows.append(row); b_rows.append(0.0)
# ADMM 耦合项 sqrt(rho/2)*(p_T - z + lam):p_T = p0 + dt*sum(v)
row = np.zeros(T); row[:] = dt * np.sqrt(rho / 2)
A_rows.append(row); b_rows.append(np.sqrt(rho / 2) * (z_coupling - lam - p0))
A = np.array(A_rows); b = np.array(b_rows)
v = np.linalg.lstsq(A, b, rcond=None)[0]
p_T = p0 + dt * v.sum()
return v, p_T
# consensus ADMM 协调编队约束 p2_T - p1_T = d_star
# 引入: 让 r1 = -p1_T, r2 = p2_T 的"相对贡献"一致于 z(把编队约束转成一致性)
# 简化:直接协调 p1_T 与 p2_T 使 p2_T - p1_T -> d_star
rho = 5.0
lam1, lam2 = 0.0, 0.0
z1, z2 = p1_ref, p2_ref # 耦合目标初值
for k in range(40):
v1, p1_T = local_mpc_traj(p1_0, p1_ref, lam1, z1, rho)
v2, p2_T = local_mpc_traj(p2_0, p2_ref, lam2, z2, rho)
# z-更新:在满足 z2 - z1 = d_star 的约束下,取最接近 (p_T + lam) 的点(投影)
a1, a2 = p1_T + lam1, p2_T + lam2
# 投影到 z2 - z1 = d_star: 平移使差为 d_star,均分残差
gap = (a2 - a1) - d_star
z1 = a1 + gap / 2
z2 = a2 - gap / 2
# 对偶更新
lam1 += p1_T - z1
lam2 += p2_T - z2
print(f"末端位置 p1_T={p1_T:.4f}, p2_T={p2_T:.4f}")
print(f"实际编队间距 p2_T - p1_T = {p2_T - p1_T:.4f}(期望 {d_star})")
print(f"编队约束满足: {'✓' if abs((p2_T - p1_T) - d_star) < 1e-2 else '✗'}")
运行要点:两个机器人各自解自己的轨迹 MPC(本地子问题),通过 consensus ADMM 协调,末端编队间距收敛到期望的 \(d^\*=2\)。这就是"每个机器人解单体 MPC + ADMM 缝合机器人间的耦合约束"的完整骨架——第 4 章只需把这里的"一维单积分器 + 末端位置耦合"换成"SRB 动力学 + 全轨迹的编队/力耦合",把 local_mpc_traj 的最小二乘换成 OCS2/OSQP 解的真实 MPC QP,协调逻辑(z-更新投影到约束、对偶更新)原样保留。把这个玩具例子跑通,你就抓住了分布式 MPC 的全部骨架,剩下的都是把子问题"加重"。
⚠️ 常见陷阱¶
💡 概念误区:把"ADMM 凸时收敛到全局最优"外推到非凸 MPC - 错误描述:知道 ADMM 凸问题保证全局最优,就默认把它用在含非线性动力学/接触约束的非凸 MPC 上也"一定收敛到最优"。 - 现象/后果:非凸子问题下 ADMM 可能收敛到不同的局部解、对初值敏感、甚至不收敛(残差不降);你却以为拿到了"最优解",或在不收敛时百思不得其解。 - 根本原因:ADMM 的全局最优保证**只对凸问题成立**;非凸下一般无收敛保证,某些结构化情形仅能证到 KKT 点(局部驻点)且需额外假设。 - 正确做法:非凸 MPC 用 ADMM 时,把它当"工程上通常有效的启发式"而非"有保证的最优求解器";配 warm-start(用上周期解作初值)、自适应 \(\rho\)、限制每周期迭代轮数(3-10 轮)、并监控残差;关键安全约束不要只靠 ADMM 收敛来保证。这一点第 4 章分布式 MPC 会反复强调。
🧠 思维陷阱:\(\rho\) 取极端值且不自查残差 - 错误描述:\(\rho\) 随手取一个值(常见是取很大,以为"强约束=快对齐"),且只看目标函数不看原始/对偶残差。 - 现象/后果:\(\rho\) 太大→对偶残差大、迭代震荡或过冲,看起来"在动但不收敛";\(\rho\) 太小→原始残差降得极慢、几百轮还对不齐,你误以为是问题本身难解或代码有 bug。 - 根本原因:\(\rho\) 平衡原始残差(约束违反)与对偶残差(协调变量变化),单看一边或取极端都会失衡;收敛诊断必须同时看两个残差。 - 正确做法:同时监控 \(\|r^k\|\)(原始)和 \(\|s^k\|\)(对偶),用残差平衡规则自适应调 \(\rho\)(如 \(\|r\|>10\|s\|\) 则 \(\rho\!\times\!2\),反之 \(\div 2\));把"两个残差都降到阈值以下"作为收敛判据,而非只看其一或只看目标值。
⚠️ 编程陷阱:\(z\)-更新用了错误的平均(漏掉对偶项或权重) - 错误描述:实现缩放形式时,\(z\)-更新写成 \(z=\frac1N\sum x_i\)(漏掉了 \(u_i\)),或在带权/带约束变体里用了错误的平均权重。 - 现象/后果:漏掉 \(u_i\) 会让对偶变量的修正无法反馈到协调变量,收敛变慢或收敛到错误点;约束满足后 \(z\) 仍偏移。 - 根本原因:标准一致性 ADMM 的 \(z\)-更新是 \(z=\frac1N\sum(x_i+u_i)\)(缩放形式),\(u_i\) 项承载了对偶修正,不能省。 - 正确做法:严格按式 (2.25) 实现 \(z=\frac1N\sum(x_i+u_i)\);在分布式实现里这一步用平均共识(§2.1)算,注意共识本身要用双随机权重(否则 \(z\) 又被算偏);自检:收敛时应有 \(\sum_i u_i\to 0\)(对偶变量均值归零)。
⚠️ 编程陷阱:x-更新含不等式约束却仍用无约束闭式解 - 错误描述:本地子问题带控制量上下界/避障等不等式约束,却照搬无约束二次问题的闭式解(式 2.24 的解析公式),忽略约束。 - 现象/后果:解出的 \(x_i\) 违反本地约束(控制量超饱和、轨迹穿障),整个 ADMM 协调出的"解"不可执行;或 warm-start 漂移到不可行区导致后续不收敛。 - 根本原因:\(x\)-更新是 \(f_i\) 的 proximal 算子,\(f_i\) 含约束时无闭式解;用无约束公式等于丢掉了约束,proximal 不再是对正确(含约束)\(f_i\) 求值。 - 正确做法:带凸不等式约束的本地子问题用内层 QP 求解器(OSQP/qpOASES)解,即 \(x\)-更新=一次小 QP;若约束是盒/范数球这类简单集合,用"无约束解 + 投影(clip/归一化)"代替。第 4 章单机 MPC 子问题正是用 OSQP 解的带约束 QP。
练习¶
- [实现] 扩展本节的分布式 QP 代码:把标量 \(x_i\) 换成 2 维向量,\(f_i(x)=\frac12(x-b_i)^\top Q_i(x-b_i)\)(\(Q_i\) 为随机正定阵)。实现向量版 ADMM,验证收敛到闭式最优 \(z^\star=(\sum Q_i)^{-1}(\sum Q_i b_i)\)。画出原始残差 \(\|x_i-z\|\) 和对偶残差 \(\rho\|z^k-z^{k-1}\|\) 随迭代的曲线,观察它们如何一起下降。
- [实现/分析] 在练习 1 基础上加入自适应 \(\rho\)(残差平衡规则,\(\mu=10\)、\(\tau=2\))。对比固定 \(\rho\)(取 0.1、1、10、100)与自适应 \(\rho\) 的收敛轮数,验证自适应版对初值 \(\rho\) 不敏感。记录:固定 \(\rho\) 的最优值大概是多少,自适应版最终稳定在什么量级。
- [B型·精读,跨章接 Ch4] 精读 Keviczky-Borrelli 2008 或 Zeng-Hamed 2026(ADMM-CBF 分布式 MPC)中的问题分解。画出数据流图:每个 agent 的本地 MPC(QP)如何对应 ADMM 的 \(x\)-更新,邻居间交换什么量(预测轨迹?wrench?对偶变量?),\(z\)-更新在哪里完成。说明它与本节标准一致性 ADMM 的对应关系——本地子问题是什么、一致性约束加在什么量上。这道题直接为第 4 章的分布式 MPC 编队铺路。
- [实现/扩展] 在本节的 ADMM-MPC 玩具例子(两个单积分器 + 末端编队约束)基础上扩展:(a) 改成约束**整条轨迹**的相对位置(每个时刻 \(p_2(t)-p_1(t)=d^\*\)),而非只约束末端;(b) 加入 warm-start——每个"控制周期"用上周期的对偶变量作初值,每周期只跑 3 轮 ADMM,模拟滚动时域,观察跨周期是否逐渐收敛;(c) 把 \(\rho\) 换成自适应残差平衡。比较"每周期跑到收敛"与"每周期只跑 3 轮 + warm-start"在总计算量上的差异。
- [推导/思考] (a) 写出 sharing 形式 ADMM(\(\min\sum_if_i(x_i)+g(\sum_ix_i)\))的三步迭代,并说明它与 consensus 形式的对偶关系;给一个多机例子说明何时该用 sharing(提示:协调"各机器人出力之和=负载合力")。(b) 给本节的分布式 QP 加入过松弛(\(\alpha\in\{1.0,1.5,1.8\}\)),比较收敛轮数,验证 \(\alpha\in[1.5,1.8]\) 的加速效果。
- [实现/约束处理] 给本节的分布式 QP 加入**盒约束** \(x_i\in[\ell,h]\)。两种实现:(a) \(x\)-更新里无约束解后**投影**(clip 到 \([\ell,h]\));(b) 用
cvxpy/OSQP 把 \(x\)-更新写成带约束的小 QP 解。验证两者收敛到同一个(满足约束的)最优,并解释为什么投影法对盒约束等价于解带约束 QP(提示:盒约束的 proximal 就是 clip)。再把约束改成"\(\|x_i\|\le r\)"(范数球),验证投影变成"超出则归一化到球面"。这道题让你亲手实现 §2.3 十的 proximal/投影,直通第 4 章带约束 MPC 子问题。
至此,本章的两大数学工具——共识(§2.1-2.2)和分布式优化 ADMM(§2.3)——都已就位。它们解决的是"如何让多机协调/一致"的通用机制。最后一节把这些机制落到多机控制里最经典、最直观的任务:编队控制。我们会看到,让机器人保持队形的控制律,本质上就是 §2.1 的共识协议作用在"相对位置误差"上——编队是共识的一个变体。§2.4 还会区分三种编队范式,它们对"每个机器人需要知道什么信息"有截然不同的要求,直接决定了你需要什么传感器、什么通信。
§2.4 编队控制三范式 ⭐⭐¶
这一节解决什么问题:前三节给了"协调"的通用机制(共识、ADMM)。编队控制是这些机制最直观的落地——让一群机器人保持一个期望的几何队形(一字排开、楔形、方阵)。本节回答两件事:(1) 编队控制律怎么写?会发现它就是 §2.1 共识协议的变体;(2) 实现一个编队,每个机器人到底需要知道什么信息?这取决于你选哪种范式,而范式选择直接决定了传感器和通信需求。
动机:保持队形需要每个机器人知道什么¶
设想 \(N\) 台机器人要保持一个楔形(雁阵)队形前进。每台机器人都没有全局视角,只能感知/通信到邻居。要维持队形,机器人 \(i\) 需要不断调整自己的位置。问题是——它到底需要知道什么,才能算出该往哪调?
有三种可能的答案,对应三种**编队范式**:它可能需要知道邻居的**绝对位置**(在某个全局坐标系下),或只需要邻居相对于自己的**相对位置**(方向+距离),或者甚至只需要和邻居的**距离**(连方向都不要)。这三种答案对传感器和通信的要求递减,但对队形的"刚性"保证也递减。选错范式,要么你装了用不上的昂贵传感器(GPS/动捕),要么你的队形会出现意想不到的自由度(比如整体旋转或镜像)。所以编队控制的第一课不是"控制律怎么写",而是"我能拿到什么信息,据此该选哪种范式"。
如果不区分范式会怎样¶
如果不想清楚范式直接写控制律,典型的翻车是:你照着教科书写了个"position-based"控制律(要用邻居绝对位置),部署到野外才发现机器人根本没有共同的全局坐标系(没有 GPS、动捕,只有相对测量)——控制律里的绝对位置量根本拿不到,系统跑不起来。反过来,你用只需测距的"distance-based"省传感器,却没意识到仅靠距离约束的队形存在**翻转/旋转的歧义**(同样的两两距离,队形可以整体旋转、甚至镜像翻转),结果编队"形状对了但朝向乱了"或出现镜像。范式决定了"什么信息够用、什么队形能唯一确定",必须先想清楚。
历史:编队控制的范式分类¶
编队控制的研究在 2000 年代随多机系统兴起而系统化。一个被广泛接受的分类框架(可见于 Oh、Park、Ahn 2015 的综述等)按**机器人之间需要测量/通信的量**把编队控制分成三类:position-based、displacement-based、distance-based。这个分类的深刻之处在于,它把"控制律设计"和"传感/通信能力"直接挂钩——你有什么样的感知能力,就决定了你能用哪种范式、能实现什么样的队形约束。我们沿这个框架讲,并揭示它们与 §2.1 共识的内在联系。
理论¶
一、三范式概览¶
| 范式 | 每个 agent 需要的信息 | 全局信息需求 | 能确定的队形 | 典型应用 |
|---|---|---|---|---|
| Position-based | 邻居绝对位置 \(p_j\)(及自身 \(p_i\)) | 共同参考系(全局坐标) | 绝对位置+朝向(最强) | 精确编队(工厂、有动捕) |
| Displacement-based | 相对位置 \(p_j-p_i\)(向量) | 共同朝向(各轴对齐) | 形状+朝向,位置自由 | 野外编队(有 IMU 对齐朝向) |
| Distance-based | 距离 \(\|p_j-p_i\|\)(标量) | 无 | 仅形状(差一个旋转/平移/镜像) | 仅有测距传感器的集群 |
信息需求从上到下递减(绝对位置 → 相对位置向量 → 仅距离标量),全局协调需求也递减(共同坐标系 → 共同朝向 → 无),但能唯一确定的队形也越来越"松"(从完全确定到只确定形状)。这是一个清晰的**权衡谱系**:用更弱的感知,换更松的队形保证。
二、displacement-based 控制律:就是共识的变体¶
取最常用的 displacement-based 范式(野外编队的主力,因为只需相对位置 + IMU 对齐朝向,不需要 GPS)。期望队形由一组**期望相对位置**给定:记机器人 \(i\) 在队形中的标称位置为 \(p_i^\*\)(这只是用来定义期望相对量,不需要真实存在的全局坐标),则期望的相对位置是 \(p_j^\*-p_i^\*\)。控制目标:让实际相对位置 \(p_j-p_i\) 等于期望相对位置 \(p_j^\*-p_i^\*\)。
对单积分器模型(\(\dot p_i=u_i\)),displacement-based 编队控制律是:
直觉:方括号里是"当前相对位置"与"期望相对位置"之差,即**相对位置误差**;机器人 \(i\) 朝着减小与所有邻居的相对位置误差的方向移动。当所有相对位置都达到期望时,每个方括号为零,\(u_i=0\),队形保持。
关键洞察:这就是 §2.1 的共识协议。定义误差变量 \(\tilde p_i = p_i - p_i^\*\)(实际位置减标称位置)。把式 (2.26) 改写:
而 \(\dot{\tilde p}_i=\dot p_i=u_i\)(因为 \(p_i^\*\) 是常量),所以
这正是 §2.1 的连续共识协议,只不过作用在误差变量 \(\tilde p\) 上!由 §2.1 的结论:\(\tilde p\) 收敛到一致 \(\tilde p_i\to c\)(对所有 \(i\) 相同的常向量),即 \(p_i\to p_i^\*+c\)——所有机器人收敛到"标称队形整体平移 \(c\)"的位置。队形(相对关系)被精确恢复,而整体平移 \(c\) 由初始条件决定(等于初始误差的平均)。
本质洞察:编队控制律本质上就是**共识协议作用在"相对位置误差"上**。§2.1 我们让标量意见达成一致;这里让"位置误差"达成一致,而"误差一致"就意味着"队形恢复"。这解释了为什么编队的收敛性、收敛速率(还是 \(\lambda_2\)!)、对拓扑/延迟的依赖,全部继承自共识理论——编队不是一个新问题,而是共识的几何化身。你在 §2.1 推的所有结论(指数收敛、\(\lambda_2\) 决定速度、\(\lambda_N\) 决定延迟容限)对编队原样成立。这也是为什么本章把共识放在编队之前:吃透共识,编队是水到渠成的推论。
三、三范式的歧义与刚性¶
为什么 distance-based 的队形"只确定形状,差一个旋转/平移/镜像"?因为它只约束两两距离 \(\|p_j-p_i\|\)。一组距离约束下,整个队形可以刚性地旋转、平移而距离不变(旋转/平移不改变距离),甚至镜像翻转也不改变距离。要让距离约束**唯一确定**队形(差一个全局刚体运动),需要图满足**刚性(rigidity)**条件——这把第 1 章的图论又往前推了一步:不是任意连通图都能用距离锁定队形,图必须"刚性"(边足够多且位置合适)。这正是第 1 章关联矩阵 \(B\) 引出的刚性理论的用武之地,完整内容留到第 4 章编队控制深入。
- Position-based 无歧义:绝对位置直接钉死每个机器人,队形的位置和朝向都确定。代价:需要全局坐标系。
- Displacement-based 差一个平移:如上面推导,队形形状和朝向确定,但整体位置(平移 \(c\))自由。代价:需要共同朝向(各机器人坐标轴对齐,靠 IMU/磁力计)。
- Distance-based 差一个刚体运动(旋转+平移)甚至镜像:只锁形状。代价最小(仅测距),歧义最大,且需要图刚性才能锁住形状。
这个"信息越少、歧义越大"的谱系,是选范式的核心依据:先问"我的机器人能测到什么、有没有共同坐标系/朝向",再据此选范式,而不是先选控制律再发现信息不够。
刚性矩阵:把"距离能否锁住队形"代数化。第 1 章的关联矩阵 \(B\) 在这里升级为**刚性矩阵(rigidity matrix)** \(R(p)\)。对每条边 \((i,j)\),distance-based 约束是 \(\|p_i-p_j\|^2=\text{const}\);对它求导得到速度约束 \((p_i-p_j)^\top(\dot p_i-\dot p_j)=0\),把所有边叠起来写成 \(R(p)\dot p=0\)。这个 \(R(p)\) 就是刚性矩阵——它和关联矩阵 \(B\) 的关系是:\(R\) 的每一行对应一条边,是该边在关联结构 \(B\) 上再"加权"上相对位置向量 \((p_i-p_j)\)。队形**无穷小刚性(infinitesimally rigid)** 的判据是 \(R(p)\) 的秩达到最大可能值(\(2N-3\) 在平面、\(3N-6\) 在空间,扣掉整体平移+旋转的自由度)。秩不够 = 存在不改变所有边长的"柔性形变" = 距离锁不住队形。这把"图刚不刚"从几何直觉变成"算 \(R(p)\) 的秩"这个可计算判据——完整的刚性图构造留到第 4 章,这里要记住:距离约束能否唯一确定队形,等价于刚性矩阵满秩;而刚性矩阵就是关联矩阵 \(B\) 的几何加权版,第 1 章的图论工具在这里再次延续。
distance-based 控制律:距离误差势函数的梯度。displacement-based 用相对位置向量(式 2.24);distance-based 只有距离标量,控制律也不同——它是一个**距离误差势函数**的负梯度。定义势函数(对每条边,实际距离平方与期望距离平方之差的平方)
其中 \(d_{ij}^\*\) 是期望边长。控制律取负梯度 \(\dot p_i=-\nabla_{p_i}V\):
直觉:对每个邻居,若当前距离大于期望(括号为正),就把自己朝邻居拉近(沿 \(-(p_i-p_j)\) 方向);小于期望则推远。它只需测到与邻居的相对位置来算 \((p_i-p_j)\) 和距离——注意虽然写出来用了相对位置向量,但**约束本身只是距离**,所以期望队形只到"差一个刚体运动"。与 displacement 控制律(2.26)的关键区别:(2.26) 是**线性**的(\(\dot{\tilde p}=-L\tilde p\),全局收敛、收敛到平移),而 (2.28) 是**非线性**的(势函数非凸),只能保证局部收敛到满足距离约束的某个构型,且可能收敛到镜像/翻转的"错误"构型——这正是 distance-based 歧义在控制律层面的体现。
四、把编队"钉"在期望位置:锚定 leader¶
displacement-based 留下的"整体平移自由"(\(c\) 由初值决定)在很多任务里不可接受——你要编队去某个**指定**的全局位置,而不是"形状对但停在哪看运气"。解决办法呼应 §2.1 练习 3 的伏笔:锚定一个或多个 leader。让某个机器人(leader)不跟随共识、而是直接跟踪一个期望的全局位置(它有 GPS 或被指定目标),其余机器人按式 (2.26) 跟随。数学上这相当于给共识系统加一个"锚":\(\tilde p\) 不再收敛到任意平移,而是被 leader 钉到确定值。这把"相对队形"和"绝对定位"解耦——大多数机器人只需相对感知(便宜),少数 leader 负责绝对定位(贵),是工程上常见的混合方案,直接预告第 4 章的编队实现。
五、二阶编队与编队机动¶
前面的编队控制律(式 2.26)是一阶的(单积分器 \(\dot p_i=u_i\))。但真实机器人有惯性,更接近双积分器 \(\ddot p_i=u_i\)——这与 §2.2 的二阶共识完全平行。二阶编队控制律必须同时用相对位置误差和相对速度误差:
其中第一项是位置编队误差(同式 2.26),第二项 \(\gamma_d(\dot p_i-\dot p_j)\) 是速度一致(阻尼)项。和 §2.2 二阶共识同样的道理:没有速度阻尼项,有惯性的编队会持续振荡——机器人冲过期望位置、荡回来、再冲过,队形像一堆无阻尼弹簧连着的小球。这解释了为什么真实机器人编队控制器(第 4、5 章的 MPC/力控)总隐含一个速度协调/阻尼项,不只是位置反馈。式 (2.29) 的误差动力学不再是一阶的 \(\dot{\tilde p}=-L\tilde p\),而是二阶的 \(\ddot{\tilde p}=-L\tilde p-\gamma_d L\dot{\tilde p}\),收敛性与 §2.2 二阶共识同构:存在合适的 \(\gamma_d\) 使队形收敛,太小欠阻尼振荡、太大过阻尼迟缓。
编队机动:让整个队形动起来。前面都在"恢复并保持静止队形"。但实际任务要编队**整体运动**——平移(整队前进)、旋转(转向)、缩放(收缩通过窄道)。这些叫**编队机动(formation maneuver)。关键洞察:displacement-based 编队的"整体平移自由"在这里从"缺陷"变成"特性"——既然队形对整体平移不敏感,那就让期望队形 \(p_i^\*\) 变成**时变**的来携带整体运动。最简洁的做法是把期望位置设为 \(p_i^\*(t)=s(t)+R(t)\,p_i^{\text{shape}}\),其中 \(p_i^{\text{shape}}\) 是固定的标称形状,\(s(t)\) 描述整体平移轨迹、\(R(t)\) 描述整体旋转与缩放。各机器人仍只用相对信息(式 2.26/2.29)维持 \(p_i^{\text{shape}}\) 定义的形状,而 \(s(t),R(t)\) 这个"整体运动"由 leader 或全局指令驱动。**形状(相对、分布式维持)和位姿(整体、由少数 leader 或指令驱动)解耦——这正是 §2.4 四"锚定 leader"思想的动态版,也是编队穿越复杂环境(队形随地形收缩、转向)的标准做法,第 4 章会用它让双 Go2 编队"既保持队形又整体行进到目标"。
本质洞察:一阶到二阶编队、静止队形到编队机动,看似在加复杂度,实则都在复用同两个解耦:(1) 形状 vs 位姿解耦——形状靠相对信息分布式维持(共识/编队律),整体位姿靠少数 leader 或指令驱动;(2) 位置一致 vs 速度阻尼——有惯性就必须补速度协调项防振荡。抓住这两个解耦,从"双机静态保持队形"到"大编队动态穿越地形",都是同一套共识思想的展开。这也再次回扣本章开头:共识不是一个孤立算法,而是一种"让分布式个体涌现出协调整体"的通用范式。
代码验证:displacement-based 编队 = 共识¶
验证"编队控制律就是共识作用在误差上":跑一个 displacement-based 编队,确认误差变量 \(\tilde p\) 按 \(\dot{\tilde p}=-L\tilde p\) 收敛、队形被恢复、且整体平移等于初始误差均值。
import numpy as np
def laplacian_from_edges(N, edges):
A = np.zeros((N, N))
for i, j in edges:
A[i, j] = 1.0; A[j, i] = 1.0
return np.diag(A.sum(1)) - A
# 4 机器人,期望队形:一个正方形(标称位置 p*)
N = 4
p_star = np.array([[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0]])
edges = [(0, 1), (1, 2), (2, 3), (3, 0), (0, 2)] # 含对角,保证刚性
L = laplacian_from_edges(N, edges)
# 随机初始位置(队形被打乱)
rng = np.random.default_rng(1)
p = p_star + rng.normal(scale=0.5, size=(N, 2))
p0 = p.copy()
err0 = p0 - p_star # 初始误差 \tilde p(0)
# displacement-based 控制律 u_i = Σ_j [(p_j-p_i)-(p_j*-p_i*)],积分
dt = 0.01
for _ in range(2000):
# u = -L @ (p - p_star) (对每一维),即误差的共识
u = -L @ (p - p_star)
p = p + dt * u
err_final = p - p_star
print("各机器人最终误差 \\tilde p (应全部相等=整体平移):")
print(err_final.round(4))
print(f"误差的 std(各机器人间,应≈0 表示队形已恢复): {err_final.std(axis=0).round(5)}")
print(f"整体平移 c(实际)= {err_final.mean(axis=0).round(4)}")
print(f"初始误差均值(理论平移)= {err0.mean(axis=0).round(4)} -> 应与上一行相等")
# 验证形状恢复:实际相对位置 vs 期望相对位置
print("\n验证边上的相对位置误差(应≈0):")
for (i, j) in edges:
actual = p[j] - p[i]; desired = p_star[j] - p_star[i]
print(f" 边({i},{j}): ‖实际-期望‖ = {np.linalg.norm(actual - desired):.5f}")
运行要点:最终各机器人的误差 \(\tilde p_i\) 全部相等(等于整体平移 \(c\)),说明队形形状被精确恢复;这个 \(c\) 恰等于初始误差的平均(继承自共识的"收敛到平均");每条边上的相对位置误差趋于 0(队形约束满足)。这就直观坐实了"编队 = 共识作用在误差上"。
⚠️ 常见陷阱¶
💡 概念误区:不区分编队范式,默认能拿到绝对位置 - 错误描述:照搬 position-based 控制律(用邻居绝对位置 \(p_j\)),不检查机器人是否真有共同的全局坐标系。 - 现象/后果:部署到无 GPS/动捕的野外,绝对位置量根本无法获取,控制律失效;或各机器人用了各自不一致的局部坐标系,队形错乱。 - 根本原因:三范式对全局信息的需求不同——position 要共同坐标系、displacement 要共同朝向、distance 什么都不要;用错范式 = 假设了拿不到的信息。 - 正确做法:先盘点机器人的真实感知能力(有无全局定位、能否对齐朝向、能否测相对位置/距离),再据"信息需求表"选范式。野外无 GPS 通常用 displacement-based(IMU 对齐朝向 + 相对位置测量)。
🧠 思维陷阱:用 distance-based 却忽视刚性与镜像歧义 - 错误描述:为省传感器用 distance-based(只测距),但随便连个连通图就以为能锁住队形。 - 现象/后果:队形出现非预期自由度——整体旋转、甚至镜像翻转(同样的两两距离对应多个队形),"形状像了但朝向/手性不对"。 - 根本原因:仅距离约束在旋转/平移/镜像下不变;要唯一确定形状(差一个刚体运动)需要图**刚性**,普通连通不够;消除镜像还需全局刚性或额外约束。 - 正确做法:用 distance-based 时检查图的刚性(边数与配置满足刚性条件,第 4 章详述);需要消除镜像时增加约束(如锚定额外节点或混入少量 displacement 信息)。
⚠️ 编程陷阱:编队控制律里相对量的符号/参考写反 - 错误描述:实现式 (2.26) 时把 \((p_j-p_i)-(p_j^\*-p_i^\*)\) 的某个差写反方向(如写成 \(p_i-p_j\)),或期望相对位置的下标配错。 - 现象/后果:误差项符号反了,控制律变成"放大误差"而非"消除误差",队形发散或收敛到错误构型。 - 根本原因:相对量是有方向的向量,\(p_j-p_i\) 与 \(p_i-p_j\) 差一个负号;式 (2.26) 必须保证"当前相对 - 期望相对"且两者同方向(都从 \(i\) 指向 \(j\))。 - 正确做法:统一约定相对量方向(如一律 \(p_{\text{邻居}}-p_{\text{自己}}\)),并验证退化情形——当 \(p=p^\*\)(已在期望队形)时控制律必须给出 \(u_i=0\);代码里用矩阵形式 \(u=-L(p-p^\*)\) 最不易错(符号由 \(-L\) 统一保证)。
练习¶
- [实现] 实现三范式的编队控制对比:对同一个 6 机器人期望队形(如正六边形),分别写 position-based、displacement-based、distance-based 控制律,从同一打乱的初始位置出发。观察:position 收敛到绝对队形(位置+朝向都对);displacement 收敛到"形状对、整体平移随初值";distance 收敛到"形状对、但可能整体旋转/镜像"。用代码可视化三者的差异。
- [推导] 从 displacement-based 控制律 (2.26) 出发,严格推导出误差动力学 \(\dot{\tilde p}=-L\tilde p\),并据 §2.1 的共识收敛结论说明:(a) 队形为何恢复;(b) 整体平移 \(c\) 为何等于初始误差均值;(c) 收敛速率为何仍是 \(\lambda_2\)。这道题把 §2.4 和 §2.1 正式接通。
- [设计/思考,跨章接 Ch4] 你要让一个 5 机器人编队**去到**一个指定的全局位置(不只是保持形状)。设计一个"锚定 leader"方案:哪台机器人当 leader(需要什么传感器)、其余机器人用什么范式、leader 如何把整个队形"拖"到目标位置。说明这个方案如何把"相对队形(便宜的相对感知)"和"绝对定位(只有 leader 需要贵的全局定位)"解耦。这正是第 4 章双 Go2 编队行走要落地的结构。
- [实现/分析] 实现二阶编队控制律(式 2.29),对 4 机器人正方形队形,从打乱的初始位置 + 零初速出发,扫描阻尼增益 \(\gamma_d\)。验证:\(\gamma_d=0\) 时队形持续振荡(各边长来回波动);\(\gamma_d>0\) 时收敛到正确队形。这道题让你亲眼看到"有惯性的编队必须有速度阻尼项",理解第 4、5 章控制器里那个速度协调项的必要性。
- [实现/综合,跨章接 Ch4] 实现一个**编队机动**:4 机器人保持正方形形状,同时整体沿一条直线平移并缓慢旋转。用时变期望队形 \(p_i^\*(t)=s(t)+R(t)p_i^{\text{shape}}\),各机器人用式 (2.29) 跟踪。验证机动过程中内部形状(相对边长)基本保持,而整体位姿按 \(s(t),R(t)\) 运动。讨论:要让形状在快速机动中也保持得好,为什么需要给控制律加一个"整体运动的前馈项"(纯反馈跟踪时变目标会有稳态滞后)?
至此 §2.1-§2.4 把"共识—延迟/切换—分布式优化—编队"这条主线走完了。但回头看 §2.1 动机里埋的一个伏笔——"分布式估计要让各机器人对同一个量的估计收敛"——我们一直没真正展开:前面所有共识协议都假设每个 agent 持有的初值 \(x_i(0)\) 是**固定**的,目标是收敛到这些固定值的平均。可现实中机器人要"共识"的量往往是**时变**的:一群机器人各自用传感器测同一个移动目标,每个 agent 的测量值时刻在变,要的不是"收敛到某个固定平均",而是"实时跟踪所有测量的瞬时平均"。这就是**动态共识(dynamic consensus)**,也是分布式估计、分布式 MPC 里 \(z\)-更新跨周期推进的底层机制。§2.5 把静态共识推广到这个时变情形,顺带把 §2.1 动机里提的"分布式估计"补全——它是本章理论工具的最后一块拼图,也直接服务于第 4 章分布式 MPC 的实时协调和第 6 章异构感知融合。
§2.5 动态共识与分布式估计 ⭐⭐⭐¶
这一节解决什么问题:§2.1-§2.4 的共识都假设每个 agent 的"意见"初值固定,收敛到固定平均。但机器人真正要协调的量常是**时变**的——跟踪移动目标、融合不断更新的传感读数、分布式 MPC 里每周期变化的协调变量 \(z\)。本节回答:(1) 当各 agent 的输入信号 \(r_i(t)\) 持续变化时,如何让它们的估计**实时跟踪**所有输入的瞬时平均 \(\frac1N\sum_i r_i(t)\),而不是收敛到一个固定值就停?(2) 由此引出的分布式估计(每个机器人用本地传感器 + 邻居通信,得到一个全局一致的估计)怎么落地?这把 §2.1 动机里埋下的"分布式估计"伏笔补全,也解释了 §2.3 的 ADMM 为何能跨控制周期 warm-start。
动机:让一群机器人实时跟踪一个移动目标的平均¶
把 §2.1 的场景往前推一步。设想 \(N\) 台机器人分散在一片区域,共同观测一个**移动**的目标(比如一个需要被多机包围的入侵者、或一个要协同搬运的漂浮物)。每台机器人 \(i\) 用自己的传感器得到一个对目标某个量(位置坐标、速度、信号强度)的本地测量 \(r_i(t)\)——由于视角、噪声、遮挡不同,各机器人的测量值各不相同,而且因为目标在动,每个 \(r_i(t)\) 时刻都在变。
现在的协调目标变了:不再是"让各机器人对一个固定意见达成一致",而是要让**每台机器人都实时持有一个对"全体测量的瞬时平均" \(\bar r(t)=\frac1N\sum_i r_i(t)\) 的估计**——这个瞬时平均通常比任何单台机器人的测量都更准(平均抵消独立噪声),是多机协同决策(往哪围、怎么搬)的共同依据。问题是:在只能和邻居通信、且输入信号一直在变的约束下,怎样让每个 agent 的估计实时跟上这个时变的平均,而不滞后、不漂移?
这个问题看似只是 §2.1 的"加个时变输入",但有一个本质的新困难:静态共识收敛到平均后就**停在那里**(\(\dot x\to 0\));而这里平均值本身在动,估计必须**持续地动**才能跟住——一旦"停下来"就立刻落后于移动的真值。所以静态共识协议(收敛即静止)直接用在时变输入上会**系统性滞后**,必须改造。
如果直接套用静态共识会怎样¶
最自然的"复用"想法:既然静态共识 \(\dot x=-Lx\) 能让各 agent 收敛到初值平均,那把固定初值换成时变输入,让每个 agent 不断把自己的状态"重置"为当前测量、再跑共识,不就行了?具体有两种朴素做法,都会出问题:
朴素做法一:反复用静态共识"重新平均"。每隔一段时间,把所有 agent 的状态重置为各自的当前测量 \(x_i\leftarrow r_i(t)\),然后跑若干步静态共识收敛到这一时刻的平均。问题:目标在动,你"重置—收敛"一轮需要时间(收敛要好几个时间常数 \(1/\lambda_2\)),等收敛完,目标早移到别处了——你得到的是**过时**的平均。而且两次重置之间估计是"冻结"的,跟踪是一跳一跳的锯齿,不平滑。
朴素做法二:直接把静态共识的输入接成时变。写成 \(\dot x=-Lx+\)(某种和 \(r_i(t)\) 有关的项),但如果只是简单地 \(\dot x_i=-\sum_j a_{ij}(x_i-x_j)+(r_i-x_i)\)(让状态既向邻居靠拢、又向本地测量靠拢),你会发现:稳态时各 agent 收敛到的是一个**被本地测量拉偏**的值,不是真正的全体平均——因为每个 agent 都额外被自己的 \(r_i\) 往回拽,破坏了平均的对称性(这恰恰和 §2.1 度归一化破坏双随机、收敛值被拉偏是同一类病)。
这两个朴素做法暴露了核心矛盾:要跟踪时变平均,既要让估计"持续动"(跟上变化),又要保证"动的方向是对的"(不被本地输入拉偏、稳态无偏)。静态共识只会"动到停为止",朴素的时变输入又会"停在偏的地方"。正确的动态共识协议必须巧妙地引入输入的**变化率**信息,让估计的运动恰好补偿平均值的运动——下面看它怎么做到。
历史:从静态共识到动态平均共识¶
动态共识(也叫**动态平均共识**,dynamic average consensus)的提出,源于把共识从"一次性协商"推广到"持续估计"的需求。早期的共识(Olfati-Saber–Murray 2004,§2.1)处理的是固定输入。2005-2008 年间,Spanos、Olfati-Saber、Freeman、Lynch、Kumar 等人针对"输入时变、要实时跟踪平均"的传感器网络场景,提出并分析了动态平均共识估计器——核心思想是把输入信号的**导数**(变化率)作为前馈注入共识动力学,使估计能跟上时变的平均而无稳态滞后。这一族算法后来成为分布式估计、分布式卡尔曼滤波、多机协同感知的基础工具。Kia 等人 2019 年在 IEEE Control Systems Magazine 上的综述《Tutorial on Dynamic Average Consensus》系统总结了这条线,是本节的主要参考。我们沿这条路线,先讲清"为什么要用导数前馈",再给出可落地的离散估计器。
理论¶
一、动态平均共识的连续协议¶
目标形式化:每个 agent \(i\) 有一个时变输入(参考信号)\(r_i(t)\),要让每个 agent 的估计 \(x_i(t)\) 都跟踪全体输入的瞬时平均
回顾朴素做法二失败的原因:简单地把状态往本地输入拉会破坏平均的对称性。动态共识的关键修正是——不让状态直接跟踪本地输入,而是让状态的"相对邻居的偏差"由共识消除,同时用输入的导数 \(\dot r_i\) 做前馈,补偿平均值的漂移。一个经典且易于理解的连续动态共识协议(基于"内部模型 + 积分"的思路)是:
这里 \(p_i\) 是一个辅助的**积分状态**(每个 agent 本地维护),它积累与邻居的累计偏差。式子看着复杂,但拆开看每一项的作用就清楚了(这是一次**多视角理解**):
- 前馈项 \(\dot r_i\):直接把本地输入的变化率喂进来。直觉:如果所有输入同步地以速率 \(\dot r\) 变化,那么平均值也以 \(\dot r\) 变化,这一项让估计"预判"地跟上,这是消除稳态滞后的关键——它对应经典控制里的"前馈补偿",用已知的输入变化抵消跟踪误差。
- 比例共识项 \(-\sum a_{ij}[(x_i-r_i)-(x_j-r_j)]\):让"估计减去本地输入"这个量(\(x_i-r_i\),即本地估计偏差)在邻居间达成一致——这正是 §2.1 的共识协议作用在偏差变量上,把各 agent 的偏差抹平。
- 积分项 \(p_i\):消除常值扰动/初值误差带来的稳态偏差(类似 PID 里的积分项消除稳态误差)。没有它,估计会有一个不随时间消失的固定偏移。
可以证明(用类似 §2.1 的模态分析 + 内部模型原理):在无向连通图下,只要输入变化不太剧烈(导数有界),式 (2.30) 的估计 \(x_i(t)\) 渐近跟踪 \(\bar r(t)\),即 \(x_i(t)-\bar r(t)\to 0\) 对所有 \(i\)。关键是引入了 \(\dot r_i\) 前馈和积分 \(p_i\) 后,稳态跟踪误差为零(对常值或匀速变化的输入),而不再是朴素做法的"被拉偏"。
本质洞察:动态共识与静态共识的本质区别,在于"目标是不是在动"。静态共识是**镇定问题**(把误差打到零就停);动态共识是**跟踪问题**(目标在动,估计必须持续运动去跟)。这解释了为什么动态共识非要引入输入导数 \(\dot r_i\) 的前馈——它对应控制论里"跟踪时变参考必须有前馈或内部模型"的基本原理(内部模型原理:要无误差跟踪某类信号,控制器内部必须包含该信号的动力学模型)。把静态共识比作"让一群人对一个静止靶心达成共识",动态共识就是"让一群人持续瞄准一个移动靶"——后者必须预判靶的运动(前馈),只靠反馈(比例项)会永远滞后一个身位。边界提醒:这个"移动靶"类比在输入变化平缓时贴切,但若输入突变(不可微),\(\dot r_i\) 前馈会失效(导数无界),退化为有跟踪误差——这正是下面陷阱要讲的。
二、离散动态共识估计器:可落地的形式¶
工程实现要离散。一个更简洁、广泛使用的**离散动态平均共识**估计器(可看作上面连续协议的离散内部模型版,也是分布式估计最常用的形式)是:每个 agent 维护估计 \(x_i(k)\),每步先做一次共识混合、再注入本地输入的增量:
其中 \(W=[w_{ij}]\) 仍是 §2.1 的**双随机**共识权重矩阵。这个形式极其直观,拆成两步看(对照 §2.1 的离散共识):
- 共识混合步 \(\sum_j w_{ij}x_j(k)\):和静态离散共识 (2.8) 完全一样——把各 agent 的当前估计向邻居平均,抹平估计间的差异。
- 输入增量注入 \(r_i(k{+}1)-r_i(k)\):这是动态共识相对静态的唯一新增项——把本地输入这一步的**变化量**加进去。它是离散版的"导数前馈"。
为什么这个简单形式能跟踪时变平均? 关键在两点的配合(这是一次**理论-工程桥接**):(1) \(W\) 双随机 ⟹ 共识混合步**保持所有 agent 估计之和不变**(列和为 1,回顾 §2.1)——这是平均守恒的根;(2) 输入增量项让"全体估计之和"每步恰好增加 \(\sum_i[r_i(k{+}1)-r_i(k)]=\sum_i r_i(k{+}1)-\sum_i r_i(k)\),即估计的总和**精确地跟随输入总和的变化**。两点合起来:若初始化 \(x_i(0)=r_i(0)\),则任意时刻"全体估计之和 = 全体输入之和",于是估计的平均始终等于输入的瞬时平均 \(\bar r(k)\);而共识混合步让各 agent 的估计**收敛到这个共同平均**(差异以 \(|\rho_2(W)|\) 衰减)。所以只要输入变化的速度比共识收敛速度(\(1-|\rho_2(W)|\) 决定)慢,各 agent 的估计就能紧跟瞬时平均。
这就给出了一个**跟踪速度 vs 共识速度**的权衡:输入变化越快(目标移动越快),越需要 \(|\rho_2(W)|\) 小(共识混合越快)才能跟上;若目标移动快过共识收敛,估计就会滞后。这又一次回到本章主线——协调能力由图的谱(\(|\rho_2(W)|\)、\(\lambda_2\))决定,动态共识只是把它从"收敛多快"延伸到"能跟踪多快变化的信号"。
量化一下这个权衡(给个可估的直觉):若每步共识把估计间差异乘以 \(|\rho_2(W)|\),而输入每步变化 \(\delta\),则稳态跟踪误差大致是几何级数 \(\sum_k|\rho_2|^k\delta\sim\frac{\delta}{1-|\rho_2(W)|}\) 量级——误差正比于输入变化速度 \(\delta\)、反比于谱隙 \(1-|\rho_2(W)|\)。这立刻告诉你两条提精度的路:要么减小 \(\delta\)(对测量先平滑、降低有效变化率),要么增大谱隙(加边/换最优权重让 \(|\rho_2|\) 更小、混合更快)。这和静态共识"\(\lambda_2\) 越大收敛越快"是同一个谱隙在起作用,只是这里它决定的是"跟得多准"而非"敛得多快"。所以 §2.1 学的最优权重(六)、动量加速(七)对动态共识同样有提速/提精度的意义——又一次印证共识理论的可迁移性。
本质洞察:离散动态共识 (2.31) = 静态离散共识(混合步)+ 输入增量(前馈步),这个"分解"揭示了它和静态共识是同一个东西的延伸,而非新算法。静态共识是动态共识在"输入不变(\(r_i\) 恒定 ⟹ 增量为零)"时的特例——此时 (2.31) 退化为 (2.8),收敛到固定平均。理解这一点,你就能把 §2.1 的全部谱分析(\(\lambda_2\)、\(|\rho_2(W)|\)、双随机、最优权重)**原样迁移**到动态共识:跟踪能力的好坏,本质还是那个第二大特征值说了算。这也是为什么 §2.3 的 ADMM 能跨控制周期 warm-start——每个控制周期的 \(z\)-更新(平均)正是一次共识,而相邻周期的输入(各 agent 的本地解)变化很小,本质上就是在跑一个慢变输入的动态共识,所以上周期的结果是这周期极好的初值。
三、与分布式估计、分布式卡尔曼滤波的联系¶
动态共识最重要的应用,是**分布式估计**——多个机器人各持一个带噪声的本地传感器,要协同得到一个比任何单传感器都好的全局一致估计。把动态共识 (2.31) 的输入 \(r_i(k)\) 设成 agent \(i\) 的本地测量(或本地新息),各 agent 的估计就会收敛到所有测量的平均——而独立噪声的平均会**以 \(1/N\) 的方差缩减**,这正是多传感器融合的核心收益:\(N\) 台机器人协同观测,等效测量精度提升 \(\sqrt N\) 倍,且无需中央融合中心。
更进一步,把动态共识嵌进卡尔曼滤波的框架,就得到**分布式卡尔曼滤波/共识卡尔曼滤波(consensus Kalman filter)**:每个机器人跑一个本地卡尔曼滤波器(用自己的测量),并在每步用动态共识把各自的状态估计(或信息矩阵/信息向量)向邻居平均、达成一致。这样每台机器人都得到一个接近"集中式卡尔曼滤波(把所有测量汇总)"的估计,却只需邻居通信、无中央节点。这是多机协同 SLAM、协同目标跟踪、协同定位的底层引擎——第 6 章异构多机协同感知、以及更后面的多机 SLAM 都会用到。
实际的共识卡尔曼有两种粒度,工程上要按通信预算选(一次**对比性思维**):一种是**每个滤波周期内嵌多步共识**(让信息量在邻居间充分平均到接近全局一致再做状态更新),精度高但每周期通信轮数多;另一种是**每周期只跑一步共识**(滤波递推和共识交替单步推进),通信省但各机器人估计的一致性较弱、可能略有偏差。前者像"先彻底开会统一意见再决策",后者像"边干边碰头",对应的正是 §2.3 ADMM"每周期跑几轮"的同一个权衡——内嵌协调的轮数 = 精度与通信开销的折中。这个折中在所有"滤波/优化 + 共识协调"的分布式算法里反复出现,本质都是 §2.2 gossip 那条主线:协调充分度由你愿意付出的通信轮数(以及图的谱)决定。
本质洞察:从动态共识到分布式卡尔曼滤波,体现了共识作为"分布式平均原语"的威力——任何"需要把分散在各 agent 的量平均/融合成全局一致结果"的任务,都可以用共识来分布式地实现,无需中央节点。集中式融合是"所有数据汇到一处算",共识式融合是"各算各的 + 邻居反复平均达成一致",两者在收敛后给出几乎相同的结果(差一个共识误差),但后者无单点、可扩展、抗节点失效。这正是第 1 章"集中 vs 分布式"权衡在估计任务上的体现:用通信轮数(反复平均)换取去中心化的鲁棒性。理解了这个"共识 = 分布式平均原语",你看分布式优化(ADMM 的 \(z\)-更新)、分布式估计(共识卡尔曼)、分布式学习(联邦平均)会发现它们共享同一个内核。
四、动态共识的稳态误差与限制¶
动态共识不是万能的,它的跟踪能力有明确边界,工程上必须心里有数(这是一次**反事实推理**:不了解这些边界会怎样)。
- 对常值/匀速输入零稳态误差,对加速输入有残差。带积分项的动态共识 (2.30) 能无误差跟踪常值和匀速变化的平均(类比 PID:积分项消除阶跃稳态误差);但若输入以恒定**加速度**变化(\(\ddot r\ne 0\)),只有一阶前馈的估计器会有不为零的稳态跟踪误差(类比 PID 对匀加速输入有稳态误差)。要消除需要更高阶的前馈/内部模型——这是"内部模型原理"的直接推论:能无误差跟踪几阶的信号,取决于估计器内部含几阶积分。
- 输入突变(不可微)时前馈失效。\(\dot r_i\) 前馈依赖输入可微;若 \(r_i\) 突跳(传感器跳变、目标瞬移),导数无界,前馈给出脉冲式的错误修正,估计会有瞬态尖峰。工程上对测量先做平滑/限幅,或用只依赖增量(离散形式 2.31)而非导数的实现来缓解。
- 通信噪声/丢包累积。离散形式 (2.31) 靠"估计之和精确跟随输入之和"保证无偏,但这依赖每步共识精确保持总和(双随机)。若通信有噪声或丢包,双随机性被破坏,误差会**累积**(因为它是个积分型估计器,没有遗忘机制),长期运行会漂移。鲁棒的动态共识需要额外的机制(如带遗忘因子、或用比例型动态共识牺牲稳态精度换有界误差)。
本质洞察:动态共识的这些限制,本质都是"积分型估计器"的通病——积分带来零稳态误差(优点),也带来对噪声/丢包的误差累积、对突变的敏感(缺点)。这与控制里"积分作用是双刃剑"完全同构:积分消除稳态误差,但引入相位滞后、积分饱和、对扰动累积。所以选动态共识的形式(带不带积分、几阶前馈)是一个权衡:要高跟踪精度(无稳态误差)就上积分,但要接受它对噪声更敏感;要鲁棒(有界误差、抗丢包)可用纯比例型,但接受稳态有残差。这个权衡的判断依据,还是回到任务:目标动得多快(决定要几阶前馈)、通信多可靠(决定能否承受积分累积)。
五、比例型 vs 比例-积分型:两种动态共识的工程选择¶
上面反复提到"纯比例型"与"带积分型"两种动态共识,这里把它们正式对比清楚——这是实际选型时绕不开的一个决定(一次**对比性思维**)。两者的差别,恰好是经典控制里 P 控制器与 PI 控制器之争在共识上的翻版:
- 比例型(P)动态共识:最简形式 \(\dot x_i=-\sum_j a_{ij}(x_i-x_j)+\gamma(r_i-x_i)\)——估计既向邻居靠拢、又被自己的输入"拉"。它**没有积分状态**,所以结构简单、无累积、对丢包/噪声鲁棒(误差有界、不漂移)。代价:对时变输入有**稳态跟踪误差**(输入动得越快,残差越大),且如 §2.5 反面所述会被本地输入轻微拉偏。适合"输入变化平缓、通信不可靠、只需大致跟踪"的场景。
- 比例-积分型(PI)动态共识:就是式 (2.30)/(2.31) 那一族,带积分状态 \(p_i\)(或等价的输入增量累积)。它对常值/匀速输入**零稳态误差**(积分项消除残差),跟踪精度高。代价:积分带来对丢包/噪声的误差累积、长期漂移、对输入突变敏感。适合"要高精度跟踪、通信较可靠"的场景。
这个对比的深层结构(一次**理论-工程桥接**):它和 PID 选型逻辑完全同构——P 快但有稳态误差、加 I 消除稳态误差但引入累积与超调风险。共识只是把这套逻辑搬到了"分布式跟踪平均"上。所以你在单机控制里建立的 P/PI 直觉,可以**原样迁移**来判断动态共识选型:要不要那个"积分",取决于"稳态精度"和"抗扰鲁棒"哪个更重要。
接到共识卡尔曼滤波(信息形式)。把 PI 动态共识嵌进卡尔曼滤波,得到 §2.5 三提的共识卡尔曼。最干净的实现用**信息形式(information form):卡尔曼滤波的测量更新在信息空间里是**加法——融合 \(N\) 个传感器,就是把各自的信息向量 \(\iota_i=H_i^\top R_i^{-1}z_i\) 和信息矩阵 \(\Omega_i=H_i^\top R_i^{-1}H_i\) 相加。而"求和"正是共识能分布式算的东西(平均后乘 \(N\) 即得和)!于是共识卡尔曼的做法是:每台机器人本地算出自己的 \((\iota_i,\Omega_i)\),用动态共识对它们求平均达成一致,各机器人就都得到了"等效于汇总所有测量"的融合信息,再转回状态空间。这就是为什么信息形式特别适合分布式滤波——它把"融合多传感器"变成了"求和/求平均",而求平均恰是共识的本行。
本质洞察:从动态共识到共识卡尔曼,关键桥梁是"卡尔曼测量更新在信息形式下是加法"这一事实。这让"多传感器融合"和"共识求平均"对接得天衣无缝——融合即求和,求和即(乘 \(N\) 的)平均,平均即共识。理解这一点,你就明白为什么分布式估计文献几乎都用信息形式而非协方差形式:不是偏好,是因为只有加法结构才能让共识这个"分布式平均原语"直接派上用场。这也再次回扣 §2.5 三的洞察——共识是"分布式平均原语",而任何能写成"求和/求平均"的融合任务(多传感器、联邦学习的梯度平均)都能用它分布式化。
代码验证:动态共识跟踪移动目标的平均¶
验证离散动态共识 (2.31):让 \(N\) 个 agent 的输入是同一个移动目标的带噪测量,看各 agent 的估计能否实时跟踪输入的瞬时平均,并对比"静态共识(不注入输入增量)"的滞后。
import numpy as np
def metropolis_weights(N, edges):
"""构造 Metropolis-Hastings 双随机权重(沿用 §2.1)。"""
A = np.zeros((N, N))
for i, j in edges:
A[i, j] = 1.0; A[j, i] = 1.0
deg = A.sum(1)
W = np.zeros((N, N))
for i, j in edges:
w = 1.0 / (1.0 + max(deg[i], deg[j]))
W[i, j] = w; W[j, i] = w
for i in range(N):
W[i, i] = 1.0 - W[i].sum()
return W
N = 6
edges = [(i, (i + 1) % N) for i in range(N)] # 环 C6
W = metropolis_weights(N, edges)
print(f"W 双随机检查: 行和={W.sum(1).round(3)}, 列和={W.sum(0).round(3)}")
# 移动目标:真值 m(k) 做正弦运动;各 agent 测量 = 真值 + 固定偏置 + 噪声
K = 400
rng = np.random.default_rng(0)
bias = rng.normal(scale=0.5, size=N) # 各 agent 固定测量偏置
def measurements(k):
m = 2.0 * np.sin(0.02 * k) # 移动目标真值(平缓变化)
return m + bias + rng.normal(scale=0.1, size=N), m
# --- 动态共识:每步共识混合 + 注入输入增量 ---
r_prev, _ = measurements(0)
x_dyn = r_prev.copy() # 初始化 x_i(0)=r_i(0)(关键!)
# --- 静态共识对照:只混合,不注入增量(每步用当前测量做一次平均) ---
x_sta = r_prev.copy()
err_dyn, err_sta, truth = [], [], []
for k in range(1, K):
r_now, m = measurements(k)
# 动态共识(式 2.31)
x_dyn = W @ x_dyn + (r_now - r_prev)
# 静态共识对照:把状态向邻居平均,但输入靠"重置"——这里模拟朴素做法二
# x <- W x + (r_now - x) 的简化:每步轻微拉向当前测量(会滞后+被拉偏)
x_sta = W @ x_sta + 0.3 * (r_now - x_sta)
r_prev = r_now
avg_now = r_now.mean() # 输入的瞬时平均(动态共识的目标)
err_dyn.append(np.abs(x_dyn - avg_now).mean()) # 动态共识到瞬时平均的误差
err_sta.append(np.abs(x_sta - avg_now).mean())
truth.append(avg_now)
print(f"动态共识 稳态跟踪误差(后100步均值)= {np.mean(err_dyn[-100:]):.4f}")
print(f"朴素对照 稳态跟踪误差(后100步均值)= {np.mean(err_sta[-100:]):.4f}")
print(f"各 agent 估计是否一致(动态,末步 std)= {x_dyn.std():.4f}")
print("结论:动态共识误差显著更小且各 agent 一致——它跟住了移动平均;朴素做法滞后/被偏置拉偏。")
运行要点:动态共识(注入输入增量)的稳态跟踪误差远小于朴素对照——它实时跟住了移动目标的瞬时平均,且各 agent 估计彼此一致;而朴素做法(每步轻微拉向本地测量)既滞后于移动平均、又被各自的固定偏置 bias 拉偏(稳态误差不为零)。这直观坐实了 §2.5 一的结论:跟踪时变平均必须注入输入变化(前馈),只靠把状态拉向本地测量会滞后且有偏。把目标移动速度 0.02 调大(目标动得更快),会看到动态共识的跟踪误差也增大——印证"跟踪速度受共识速度 \(|\rho_2(W)|\) 限制"。
⚠️ 常见陷阱¶
⚠️ 编程陷阱:动态共识忘记初始化 \(x_i(0)=r_i(0)\) 或漏注入输入增量 - 错误描述:实现式 (2.31) 时,把估计初始化为零(\(x_i(0)=0\))而非本地输入 \(r_i(0)\);或者只做共识混合 \(x=Wx\)、忘了加输入增量 \(r_i(k{+}1)-r_i(k)\)。 - 现象/后果:漏初始化 ⟹ "估计之和=输入之和"这个不变量从一开始就不成立,估计平均永远偏离真平均一个常数(差初始之和的差);漏注入增量 ⟹ 退回静态共识,估计收敛到某个固定值后就不动了,完全跟不上移动的平均。 - 根本原因:动态共识靠"估计之和精确等于输入之和"保证无偏,这要求初始相等(\(x_i(0)=r_i(0)\))且每步增量精确注入(\(\sum\) 增量 = 输入总和的变化);任一环节断了,守恒就破了。 - 正确做法:严格初始化 \(x_i(0)=r_i(0)\),每步先共识混合再加输入增量 \(r_i(k{+}1)-r_i(k)\);自检:任意步打印"全体估计之和"与"全体输入之和",两者应始终相等(浮点误差内)。
💡 概念误区:以为静态共识协议直接喂时变输入就能跟踪 - 错误描述:把静态共识 \(\dot x=-Lx\) 的固定初值换成时变 \(r_i(t)\)(如令 \(\dot x_i=-\sum a_{ij}(x_i-x_j)+(r_i-x_i)\)),以为这样就能跟踪时变平均。 - 现象/后果:稳态时估计被各 agent 自己的本地输入 \(r_i\) 拉偏,收敛到的不是全体平均而是一个有偏的折中;且对移动目标有持续滞后。 - 根本原因:跟踪时变信号是**跟踪问题**(需前馈/内部模型),静态共识是**镇定问题**(只有反馈);简单加本地输入项破坏了平均的对称性(每个 agent 被自己的输入额外拉拽),稳态有偏——这与 §2.1 度归一化破坏双随机、收敛值被拉偏是同一类病根。 - 正确做法:用真正的动态共识(注入输入导数/增量做前馈 + 积分项消稳态误差),即式 (2.30)/(2.31);判据:对常值输入应退回静态共识、对匀速输入应零稳态误差。
🧠 思维陷阱:忽视动态共识是积分型估计器、长期运行会因丢包/噪声漂移 - 错误描述:把动态共识当成"无偏且永远准"的黑箱,在有通信丢包/噪声的实机上长期运行而不加任何鲁棒化。 - 现象/后果:短期看跟踪很准,但长时间运行后估计缓慢漂移、各 agent 一致性变差——尤其在丢包率高时,估计可能越跑越偏且不会自愈。 - 根本原因:动态共识 (2.31) 是积分型(靠累积输入增量保持守恒),没有遗忘机制;一旦丢包/噪声破坏了某步的双随机守恒,误差会被永久"积分"进去而不衰减,长期累积成漂移。 - 正确做法:长期运行的实机用鲁棒化变体——加遗忘因子(让旧误差衰减)、或周期性重置/重新初始化、或改用纯比例型动态共识(牺牲零稳态误差换有界误差、抗丢包);并监控"全体估计之和 vs 输入之和"的偏离作为漂移报警。
练习¶
- [实现] 实现离散动态共识 (2.31),对 \(N=8\) 环图,输入设为各 agent 测同一个匀速移动目标(\(r_i(k)=v\cdot k+\text{bias}_i+\text{噪声}\))。验证:(a) 各 agent 估计收敛到一致并跟踪瞬时平均;(b) 任意步"全体估计之和=全体输入之和"(打印验证守恒);(c) 把目标速度 \(v\) 逐步加大,记录稳态跟踪误差如何随 \(v/(1-|\rho_2(W)|)\) 增长——验证"跟踪能力受共识速度限制"。
- [推导] 证明:若 \(x_i(0)=r_i(0)\) 且 \(W\) 双随机,则离散动态共识 (2.31) 满足 \(\sum_i x_i(k)=\sum_i r_i(k)\) 对所有 \(k\) 成立(即估计平均恒等于输入瞬时平均)。提示:对 \(\mathbf 1^\top x(k{+}1)=\mathbf 1^\top W x(k)+\mathbf 1^\top[r(k{+}1)-r(k)]\) 用列和为 1。再说明:若漏掉初始化或某步丢包破坏双随机,这个守恒如何被打破。
- [设计/思考,跨章接 Ch6] 设计一个**分布式协同目标跟踪**方案:\(N\) 台机器人各用本地传感器测一个移动目标的位置(带独立噪声),用动态共识让每台机器人都得到一个融合后的全局一致估计。说明:(a) 为什么融合后的估计比单台的精度高(噪声方差如何随 \(N\) 缩减);(b) 这相比"把所有测量发给一个中央节点融合"的优劣(通信、鲁棒性、单点故障);(c) 若某台机器人的传感器突然失效(测量变成乱码),你的方案会怎样、如何鲁棒化。这正是第 6 章异构协同感知的雏形。
- [实现/分析] 对比动态共识的两种形式:(a) 带积分项的式 (2.30) 离散化;(b) 纯比例型(去掉积分 \(p_i\))。对一个匀速移动目标和一个匀加速移动目标分别测试,验证:带积分型对匀速输入零稳态误差、对匀加速有残差;纯比例型对匀速输入也有稳态误差但对丢包更鲁棒。用曲线展示两者的跟踪误差,讨论"内部模型阶数决定能无误差跟踪几阶信号"。
- [实现/综合,跨章接 Ch4] 把动态共识接到 §2.3 的 ADMM 上:实现一个分布式 MPC 的玩具循环,每个控制周期 \(z\)-更新用动态共识(而非中央求平均)分布式地算各 agent 本地解的平均,且用上周期的共识状态 warm-start 本周期。验证:因为相邻周期各 agent 本地解变化小(慢变输入),动态共识每周期只需很少几步就能跟上,整个分布式 MPC 无需中央节点也能实时协调。这把 §2.5 和 §2.3 正式接通,直通第 4 章去中心化分布式 MPC。
至此本章的理论工具彻底齐备:从静态共识(§2.1)、其非理想修正(§2.2)、分布式优化 ADMM(§2.3)、编队落地(§2.4),到把共识推广到时变信号的动态共识与分布式估计(§2.5)。这五节看似各讲一块,实则是同一套"图上协调"思想的不同切面。最后用一节把它们**拼到一个任务上**,看清它们如何咬合协作——这也是本章的跨节综合实战。
§2.6 综合实战:分布式协同围捕 ⭐⭐⭐¶
这一节解决什么问题:前五节像五件单独的工具,但真实多机任务往往**同时**用到它们。本节用一个贯穿性的任务——\(N\) 台机器人协同围捕一个移动目标——把共识(§2.1)、时延(§2.2)、ADMM(§2.3)、编队(§2.4)、动态共识/分布式估计(§2.5)串成一条完整的数据流,让你看清"在一个真实任务里,每件工具各自负责哪一环、它们如何交接"。这既是对全章的综合复盘,也是第 4、5、6 章实战的预演骨架。
任务设定:把五件工具放进同一个场景¶
设想一个典型的多机协同任务:\(N=4\) 台移动机器人要**协同围捕**一个在平面上移动的目标(逃逸者/待搬运的漂浮物)。这个任务自然地分解成四个子问题,而每个子问题恰好对应本章的一节工具:
| 子问题 | 这一环要做什么 | 用本章哪节工具 |
|---|---|---|
| ① 协同感知目标在哪 | 每台机器人只能带噪声地局部观测目标,要融合出一个全队一致的目标位置估计 | §2.5 动态共识 / 分布式估计 |
| ② 就"何时合拢"达成一致 | 各机器人要对一个共同的标量(如合拢时刻、围捕半径)达成共识 | §2.1 共识(必要时 §2.1 八有限时间共识) |
| ③ 保持围捕队形 | 机器人要以目标为中心,均匀分布成一个包围圈(正多边形) | §2.4 编队(displacement-based + 时变期望队形) |
| ④ 协调各自轨迹 | 每台机器人解自己的轨迹优化(避碰、省力),但要满足"合拢到包围圈"的耦合约束 | §2.3 ADMM 分布式优化 |
而 §2.2(时延/切换)是贯穿所有环节的**现实约束**:这四个子问题里的每一次通信都有延迟、机器人移动导致拓扑切换,所以每一环都要用 §2.2 的结论保证鲁棒(延迟 < \(\tau^\star\)、联合连通)。
这个分解本身就是一次**系统性分类(认知工具 E)**:它告诉你,一个看似复杂的多机任务,可以沿"感知→决策→队形→轨迹协调"四层拆开,每层用一件成熟的分布式工具。下面逐层讲清交接关系。
数据流:五件工具如何交接¶
在看具体交接前,先建立一个整体图景:这四层构成一条**自下而上的信息流水线**——感知层先把"世界状态"(目标在哪)从含噪局部观测中提炼出来,决策层据此定下"做什么"(围捕参数),队形层把决策翻译成"每台机器人该在哪"(期望位置),轨迹层再把期望位置变成"怎么动到那"(可执行轨迹)。每一层都为上一层的输出加工出更具体、更可执行的指令,直到落地为电机指令。这种"感知→决策→规划→控制"的分层,正是机器人系统的经典架构,而本章的贡献是给每一层都配上了**分布式、只靠邻居通信**的实现。下面把数据在各层间的流动写清楚(这是一次**理论-工程桥接**,把抽象工具映射成一条流水线):
-
感知层(§2.5):每台机器人 \(i\) 的传感器给出对目标位置的本地测量 \(r_i(t)\)(带噪、可能遮挡)。各机器人跑**动态共识**(式 2.31),实时融合出一个全队一致的目标位置估计 \(\hat q(t)\approx\frac1N\sum_i r_i(t)\)。这一步把"\(N\) 个含噪局部观测"变成"\(1\) 个高精度一致估计",噪声方差缩减 \(1/N\),且无中央融合节点。
-
决策层(§2.1):基于一致的目标估计 \(\hat q\),各机器人要对"围捕参数"达成共识——比如包围圈半径 \(R\)(可能各机器人根据自身电量/距离有不同偏好,要协商一个折中)、以及合拢的触发时刻。半径协商是标准**平均共识**;若任务要求"所有机器人在同一精确时刻合拢",则用**有限时间共识**(§2.1 八)保证卡点同步(渐近共识会让触发时机错开)。
-
队形层(§2.4):有了目标估计 \(\hat q\) 和半径 \(R\),期望围捕队形就确定了——以 \(\hat q\) 为中心、半径 \(R\) 的正 \(N\) 边形顶点。因为目标在动,期望队形是**时变**的:\(p_i^\*(t)=\hat q(t)+R\,[\cos\theta_i,\sin\theta_i]^\top\),这正是 §2.4 五的**编队机动**(时变期望队形携带整体运动)。各机器人用 displacement-based 控制律(式 2.26)维持相对队形,而中心 \(\hat q(t)\) 的运动由感知层实时提供——"形状靠相对信息维持、整体位姿靠目标估计驱动"的解耦在这里再次出现。
-
轨迹协调层(§2.3):最后,每台机器人不只是简单跟踪 \(p_i^\*\),而要解一个本地轨迹优化(在自身动力学约束下,平滑、省力、避免与队友相撞地抵达自己的包围圈顶点)。机器人间的避碰是**耦合约束**,于是用 ADMM 协调:每个 \(x\)-更新是一台机器人的本地轨迹 QP,一致性约束保证"各自轨迹合起来不碰撞、且都收敛到包围圈"。这把"\(N\) 条轨迹的联合优化"打散成"\(N\) 个本地 QP + 邻居协调"。
本质洞察:这条流水线揭示了本章五件工具的**协作分工**——它们不是五个孤立算法,而是一个分布式协调系统的五个层次,各管一段、上下交接:动态共识管"感知融合"(把分散观测变一致估计)→ 共识管"参数协商"(把分散偏好变一致决策)→ 编队管"几何队形"(把一致决策变期望位置)→ ADMM 管"轨迹协调"(把期望位置变可执行的、互不冲突的轨迹),而时延理论(§2.2)是贯穿全程的鲁棒性保证。更深一层:这五层全都建立在第 1 章的**同一张通信图 \(G\) 和它的谱**之上——感知融合的速度、共识的速度、编队的收敛、ADMM 的协调,全由这张图的 \(\lambda_2\)、\(\lambda_N\)、\(|\rho_2(W)|\) 支配。所以"设计一张好的通信拓扑"(够大的 \(\lambda_2\)、不过大的 \(\lambda_N\))是整个系统所有层次共同的地基——这就是为什么本章(乃至第 1 章)反复强调谱:它是所有分布式协调的公共 DNA。
反面:如果不分层、用一个集中式大优化会怎样¶
为什么要这样分层,而不是把整个围捕任务写成一个集中式大优化(把所有机器人的轨迹、目标估计、队形约束全塞进一个问题,丢给一个中央节点解)?这正是本章开头第 1 章 \(O(N^3)\) 痛点的回归(一次**反事实推理**):
- 计算爆炸:集中式大问题的规模随 \(N\) 和时域 \(T\) 增长,求解成本 \(O((NT)^3)\),机器人一多就实时跑不动。分层 + ADMM 把它打散成 \(N\) 个本地小问题并行解。
- 单点故障:中央节点一挂,整个围捕瘫痪;且所有机器人都要把数据发给中央,通信是星形瓶颈。分布式方案(共识/动态共识/共识型 ADMM)只需邻居通信,任一节点失效系统仍能降级运行。
- 感知与决策耦合死:集中式里目标估计、队形、轨迹是一个耦合大问题,改任何一环都要重解全局;分层后各层接口清晰(感知层输出 \(\hat q\)、决策层输出 \(R\)……),可独立替换升级(比如把感知层的动态共识换成共识卡尔曼,不影响下游)。
这就是分布式分层设计的价值:用"分层 + 邻居通信"换来可扩展、抗故障、易维护——代价是每层都引入了协调迭代(共识轮数、ADMM 轮数),总通信量比集中式大,但避开了集中式的计算爆炸和单点脆弱。这又是第 1 章"集中 vs 分布式"权衡在一个完整任务上的总体现。
还有一个常被忽视的好处值得点出——优雅降级(graceful degradation)。集中式系统是"全有或全无":中央节点或其与某机器人的链路一断,要么整个任务瘫痪,要么那台机器人彻底失联。分层分布式系统则能逐级降级:某台机器人传感器失效,感知层(动态共识)的其余机器人仍能融合出目标估计(只是精度从 \(1/\sqrt N\) 略降到 \(1/\sqrt{N-1}\));某条通信链路断开,只要图仍联合连通(§2.2),各层照常工作,只是收敛慢一点。这种"局部失效只导致局部、可预测的性能下降,而非系统崩溃"的特性,是分布式方案在真实、不可靠环境里最被看重的工程价值——也是为什么对可靠性要求高的多机任务(救援、巡检)宁可接受协调迭代的开销也要用分布式。
代码验证:四层串联的协同围捕骨架¶
把四层串成一个最小可跑的骨架:动态共识估计移动目标 → 据估计生成时变包围圈队形 → displacement 控制律驱动机器人合拢。为聚焦"工具如何交接",这里把 ADMM 轨迹层简化为直接的编队跟踪(真实 ADMM 协调见 §2.3 代码),重点展示感知层(动态共识)与队形层(时变编队)的衔接。
import numpy as np
def metropolis_weights(N, edges):
A = np.zeros((N, N))
for i, j in edges:
A[i, j] = 1.0; A[j, i] = 1.0
deg = A.sum(1); W = np.zeros((N, N))
for i, j in edges:
w = 1.0 / (1.0 + max(deg[i], deg[j])); W[i, j] = w; W[j, i] = w
for i in range(N):
W[i, i] = 1.0 - W[i].sum()
return W
def laplacian_from_edges(N, edges):
A = np.zeros((N, N))
for i, j in edges:
A[i, j] = 1.0; A[j, i] = 1.0
return np.diag(A.sum(1)) - A
N = 4
edges = [(i, (i + 1) % N) for i in range(N)] # 环形通信
W = metropolis_weights(N, edges)
L = laplacian_from_edges(N, edges)
R = 1.5 # 围捕半径(设已由共识协商好)
theta = np.array([2 * np.pi * i / N for i in range(N)]) # 各机器人在圈上的角度
offset = R * np.stack([np.cos(theta), np.sin(theta)], axis=1) # 相对包围圈中心的标称位置
rng = np.random.default_rng(2)
# 移动目标真值:沿一条曲线运动
def target_truth(t):
return np.array([2.0 * np.cos(0.3 * t), 1.5 * np.sin(0.3 * t)])
# 机器人初始位置(散乱)、各自对目标的本地测量初值
robots = rng.normal(scale=1.0, size=(N, 2)) + np.array([3.0, 0.0])
q_true0 = target_truth(0.0)
meas = q_true0[None, :] + rng.normal(scale=0.3, size=(N, 2)) # 各机器人含噪测量
q_hat = meas.copy() # §2.5 动态共识:每台机器人对目标位置的估计,init=本地测量
meas_prev = meas.copy()
dt = 0.05
for step in range(400):
t = step * dt
q_true = target_truth(t)
# ---- 感知层(§2.5 动态共识):融合各机器人的含噪测量为一致估计 ----
meas = q_true[None, :] + rng.normal(scale=0.3, size=(N, 2)) # 新测量(目标在动)
q_hat = W @ q_hat + (meas - meas_prev) # 动态共识(逐维),跟踪测量瞬时平均
meas_prev = meas
# 每台机器人用自己的 q_hat 估计;取其均值仅用于打印对比真值
# ---- 队形层(§2.4 时变编队):期望位置 = 估计的目标中心 + 圈上标称偏移 ----
p_star = q_hat + offset # 时变期望队形(围捕圈,随目标移动)
# ---- 控制层(displacement 控制律,§2.4):向期望队形 + 跟随中心运动 ----
# 编队内部一致(误差共识) + 整体跟随目标估计(前馈中心速度)
u = -L @ (robots - p_star) # 编队误差的共识(恢复队形)
robots = robots + dt * (u + (p_star - robots) * 1.5) # 叠加向期望位置的跟踪
# 结果检查
q_hat_mean = q_hat.mean(0)
print(f"目标真值末位置 = {target_truth(400 * dt).round(3)}")
print(f"动态共识融合估计(均值)= {q_hat_mean.round(3)}(应接近真值,噪声被 1/N 平均掉)")
print(f"各机器人目标估计是否一致 std = {q_hat.std(0).round(4)}(应≈0)")
# 检查围捕队形:各机器人到估计中心的距离应≈R,且均匀分布
dists = np.linalg.norm(robots - q_hat_mean, axis=1)
print(f"各机器人到目标中心距离 = {dists.round(3)}(应都≈R={R},即已形成包围圈)")
print(f"包围圈半径误差 = {np.abs(dists - R).max():.3f}")
运行要点:动态共识把 4 台机器人的含噪测量融合成一个一致、接近真值的目标估计(各机器人估计 std \(\approx 0\)、均值接近真值,噪声被 \(1/N\) 平均);据此生成的时变包围圈队形被 displacement 控制律精确维持(各机器人到目标中心距离都 \(\approx R\),形成均匀包围圈);整个过程目标在动,队形随之移动——这就是 §2.5(感知)、§2.4(队形)两件工具交接的最小闭环。把控制层换成真正的 §2.3 ADMM 轨迹协调(加入避碰耦合约束),把半径 \(R\) 换成 §2.1 共识协商的结果,就是一个完整的四层分布式围捕系统——第 4、6 章会把这个骨架"加重"成实机可跑的版本。
上面骨架里半径 \(R\) 是直接给定的,现在补上**决策层(§2.1)**——让各机器人对围捕半径达成共识。每台机器人根据自身情况(电量、与目标距离)有一个偏好半径 \(R_i^{\text{pref}}\),通过平均共识协商出一个全队一致的 \(R\):
import numpy as np
# 各机器人的偏好半径(电量足/距离近的偏好小半径,反之偏好大半径)
R_pref = np.array([1.2, 1.8, 1.5, 1.4]) # 4 台机器人各自的偏好
N = 4
edges = [(i, (i + 1) % N) for i in range(N)]
# 用 W = I - eps*L(双随机),跑平均共识协商统一半径
A = np.zeros((N, N))
for i, j in edges:
A[i, j] = A[j, i] = 1.0
L = np.diag(A.sum(1)) - A
eps = 1.0 / np.linalg.eigvalsh(L)[-1] # eps < 2/λN 保稳定
W = np.eye(N) - eps * L
R_est = R_pref.copy() # 各机器人对"统一半径"的估计,init=自己偏好
for _ in range(100):
R_est = W @ R_est # 平均共识:收敛到偏好的平均
print(f"各机器人偏好半径 = {R_pref}")
print(f"共识协商的统一半径 = {R_est.round(4)}(应全部相等=偏好平均 {R_pref.mean():.4f})")
print(f"是否达成一致 std = {R_est.std():.2e}")
运行要点:各机器人从不同偏好半径出发,通过平均共识(双随机 \(W\))收敛到一个全队一致的半径(等于偏好的平均)。这个一致的 \(R\) 就喂给上面队形层生成包围圈——决策层(§2.1 共识)与队形层(§2.4)就此接通。若任务要求"所有机器人在同一精确时刻合拢",把这里的线性共识换成 §2.1 八的有限时间共识即可(协商"合拢进度"而非半径)。四层(感知/决策/队形/轨迹)的接口至此全部打通。
本章工具全景图¶
把全章五节的工具放在一张表里,看清各自的"输入—输出—背后的谱量—去向"——这是本章的最终全景(一次**系统性分类**):
| 工具(节) | 输入 | 输出 | 收敛/性能由谁定 | 在围捕里的角色 | 去向章节 |
|---|---|---|---|---|---|
| 静态共识(§2.1) | 各 agent 固定标量 | 一致的平均值 | \(\lambda_2\) / $ | \rho_2(W) | $ |
| 有限时间共识(§2.1八) | 各 agent 固定标量 | 有限时间精确一致 | \(\alpha\)、\(\lambda_2\) | 同时合拢的卡点同步 | Ch12 安全时序 |
| 时延/切换(§2.2) | 延迟 \(\tau\)、切换拓扑 | 稳定性/收敛保证 | \(\lambda_N\)(\(\tau^\star\))、联合连通 | 全程鲁棒性约束 | Ch4 实机通信 |
| ADMM(§2.3) | 各 agent 本地优化 + 耦合约束 | 全局协调的最优解 | \(\rho\)、子问题凸性 | 轨迹协调(避碰) | Ch4/5 分布式 MPC |
| 编队(§2.4) | 期望相对队形 | 维持队形的控制律 | \(\lambda_2\)(=共识) | 生成围捕队形 | Ch4 编队行走 |
| 动态共识(§2.5) | 各 agent 时变测量 | 实时一致的融合估计 | $ | \rho_2(W) | $、输入变化率 |
这张表把本章压缩成一句话:六件工具,六个不同的输入输出,但收敛快慢全部回到同一张图的谱(\(\lambda_2\)、\(\lambda_N\)、\(|\rho_2(W)|\))。这就是为什么第 1 章要先讲图与谱——它是本章一切的地基。也因此,设计多机系统的第一步永远是"设计一张好的通信图",因为它一次性决定了上面所有六件工具的性能上限。
更进一步,这个"共识 = 分布式平均原语"的视角还能把本章工具与更广的领域连起来(一次**多视角理解**):联邦学习的参数平均(各节点本地训练、周期性平均模型)本质是一次共识;**分布式 SGD 的梯度同步**是对梯度求共识;**区块链/分布式数据库的状态一致**也是共识的变体(只是换了拜占庭容错的设定)。它们与本章的多机共识共享同一个内核——让分散在各节点的量,只靠节点间通信收敛到一致。所以你在本章建立的谱视角(\(\lambda_2\) 决定多快抹平差异)是可迁移的:看任何"分散个体要达成一致"的系统,都可以问它的"通信图"和"谱隙"。这正是把多机器人协调放进更大图景的价值——它不是机器人学独有的技巧,而是一切去中心化协调的公共数学。
⚠️ 常见陷阱¶
🧠 思维陷阱:分层设计时忽略各层的"时间尺度匹配" - 错误描述:把感知(动态共识)、决策(共识)、队形、轨迹(ADMM)四层各自独立设计,不考虑它们的收敛速度是否匹配。 - 现象/后果:若感知层动态共识收敛慢于目标移动,下游拿到的是过时目标估计,队形追着错误位置跑;若 ADMM 每周期轮数不够、还没协调好轨迹就执行,机器人可能相撞——各层"快慢不匹配"导致系统级失效,却难定位是哪层的锅。 - 根本原因:分层系统的整体性能由**最慢的那层**和**层间时间尺度的匹配**决定;每层的收敛速度都受各自的图谱(\(\lambda_2\)、\(|\rho_2(W)|\))和迭代预算限制,孤立设计会忽略它们的相对快慢。 - 正确做法:按"感知 ≫ 决策 ≥ 队形 ≥ 轨迹"的时间尺度分离设计——感知层(动态共识)要快到目标移动看起来"准静态";内层(ADMM 轨迹)在外层(队形)的一个周期内跑够轮数收敛。监控各层的收敛裕量,保证上游输出对下游"足够稳定"。
💡 概念误区:以为分布式分层一定优于集中式 - 错误描述:认为"分布式 = 先进",任何多机任务都该上分层分布式方案。 - 现象/后果:在 \(N\) 很小(2-3 台)、通信可靠、有算力的场景,硬上分布式分层反而引入不必要的协调迭代(共识轮数、ADMM 轮数)、调参负担(多个 \(\rho\)、\(\lambda_2\)),整体比直接集中式求解更慢更难调。 - 根本原因:分布式的价值(可扩展、抗单点、邻居通信)在 \(N\) 大、通信受限、要求鲁棒时才显著;\(N\) 小、条件好时,集中式的简单与最优性可能更划算——这是第 1 章"架构是权衡"的直接推论。 - 正确做法:按 \(N\) 规模、通信可靠性、单点容忍度、实时算力综合判断:小队伍/好条件优先集中式;大集群/弱通信/高鲁棒要求才上分布式分层。不要为分布式而分布式。
⚠️ 编程陷阱:多层串联时各层用了不一致的目标估计 - 错误描述:实现分层时,队形层用 agent \(i\) 自己的目标估计 \(\hat q_i\)、而避碰协调层却用了另一台机器人的估计或一个全局平均,各层引用的"目标在哪"不一致。 - 现象/后果:不同机器人/不同层对"目标中心"的认知不一致,生成的期望队形彼此错位,机器人朝不同的"圈心"合拢,队形散乱甚至对撞。 - 根本原因:动态共识收敛前各 agent 的估计 \(\hat q_i\) 尚未完全一致,若各层各取所需、不统一用同一个(收敛后的)估计,就会引入不一致;分布式系统里"每个 agent 用自己的本地估计"是常态,但同一 agent 的各层必须用同一份。 - 正确做法:约定同一台机器人的所有层都用它**自己**的、当前最新的目标估计 \(\hat q_i\)(保证单机内部一致);并确保动态共识已基本收敛(各 \(\hat q_i\) 足够接近)再驱动下游队形,必要时给感知层留足共识轮数。
练习¶
- [实现/综合] 扩展本节的围捕骨架:把控制层换成真正的 §2.3 ADMM——每台机器人解一个本地轨迹 QP(最小化到包围圈顶点的距离 + 控制能量),相邻机器人间加避碰一致性约束。验证:(a) 动态共识融合的目标估计驱动时变包围圈;(b) ADMM 协调出的轨迹既合拢成圈又互不碰撞;(c) 全程无中央节点。这是第 4 章分布式 MPC 围捕的雏形。
- [设计/分析] 为本节围捕任务设计通信拓扑:\(N=6\) 台机器人,要兼顾(a) 感知融合够快(动态共识跟得上目标移动)、(b) 对通信延迟鲁棒(§2.2 的 \(\tau^\star\) 够大)。比较环、完全图、两个备选稀疏图的 \(\lambda_2\)(定共识/感知速度)与 \(\lambda_N\)(定延迟容限 \(\tau^\star=\pi/(2\lambda_N)\)),论证你的选择。这道题把 §2.1、§2.2、§2.5 在"拓扑设计"上打通。
- [实现/分析,时间尺度] 在围捕骨架里故意制造"时间尺度不匹配":把目标移动速度调到接近动态共识的收敛速度,观察队形如何因"追过时估计"而滞后/散乱。然后通过减小共识权重的 \(|\rho_2(W)|\)(加边或换 Metropolis)让感知层变快,验证队形重新跟稳。用这道题体会"分层系统整体性能受最慢层和时间尺度匹配制约"。
- [设计/思考,跨章接 Ch4/Ch5/Ch6] 把本节的"协同围捕"改写成"协同搬运"(§2.3 八的 ACLM 场景):目标变成被多机抬着的负载,感知层估计的是负载位姿,轨迹协调层的耦合约束从"避碰"变成"各机器人对负载的合力 = 期望 wrench"(sharing 形式 ADMM,§2.3 七)。说明哪些层可原样复用、哪些层要改,以及为什么搬运比围捕多了一个"力一致性"约束。这道题把全章工具迁移到第 5 章的协同搬运。
- [实现/综合,有限时间] 给围捕任务加一个"同时合拢"要求:所有机器人必须在同一精确时刻 \(T\) 同时到达包围圈(而非先后陆续到达)。用 §2.1 八的**有限时间共识**协调各机器人的"合拢进度变量",使它们在有限时间内精确同步;对比用普通线性共识时各机器人到达时刻的错开。讨论:有限时间协议的抖振在这个任务里会带来什么实际问题(控制量峰值、执行器饱和),如何缓解。
- [实现/容错] 在围捕骨架里注入两类故障并观察**优雅降级**:(a) 让某台机器人的传感器在中途失效(测量变乱码),验证感知层(动态共识)在剔除该机器人测量后,其余机器人仍能融合出目标估计,只是精度从 \(1/\sqrt N\) 略降到 \(1/\sqrt{N-1}\);(b) 让某条通信链路中途断开,验证只要剩余图仍联合连通(§2.2),系统仍工作、只是收敛变慢。再对照"集中式实现"——中央节点失效会怎样。用这道题量化分布式相对集中式的可靠性优势(局部失效→局部下降 vs 全局崩溃),理解为什么救援/巡检等高可靠任务偏好分布式。
本章常见误解汇总¶
| 常见误解 | 正确理解 |
|---|---|
| 共识总是收敛到初始平均值 | 仅当权重双随机(无向对称是特例)时收敛到平均;有向/leader-follower 一般收敛到由图结构决定的凸组合(如 leader 的值) |
| 离散共识权重"取平均"就行 | 必须双随机(行和+列和都为 1);度归一化只满足行和,平均值不守恒、收敛值被高度数节点拉偏 |
| \(\lambda_2\) 越大离散共识就越快 | 离散收敛率是 \(1-\varepsilon\lambda_2\),而步长 \(\varepsilon<2/\lambda_N\) 受 \(\lambda_N\) 限制;真正决定快慢的是比值 \(\lambda_2/\lambda_N\) |
| 加密通信(加边)总让协调更好 | 加边增大 \(\lambda_2\)(更快)但通常也增大 \(\lambda_N\),使临界时延 \(\tau^\star=\pi/(2\lambda_N)\) 变小(更易因延迟失稳) |
| 临界时延由 \(\lambda_2\) 决定 | 由**最大**特征值 \(\lambda_N\) 决定(\(\tau^\star=\pi/(2\lambda_N)\));最快模态对延迟最敏感、最先失稳 |
| 临界时延公式对任何延迟都精确 | 它假设均匀延迟;非均匀延迟用 \(\tau_{\max}\) 保守卡,非对称延迟还会像有向图那样拉偏收敛值 |
| 拓扑必须时刻连通共识才收敛 | 切换拓扑只需**联合连通**(时间窗内并集含生成树),信息可跨时间接力 |
| ADMM 用了就保证收敛到全局最优 | 仅凸问题保证全局最优;非凸(如含接触约束的 MPC)一般无收敛保证,至多在条件下收敛到 KKT 点 |
| \(\rho\) 越大约束满足越快越好 | \(\rho\) 大→对偶残差大、易震荡;\(\rho\) 小→原始残差降得慢;需平衡两个残差,常自适应调节 |
| \(\rho\) 会改变 ADMM 的最优解 | 凸问题下任何 \(\rho>0\) 收敛到同一最优,\(\rho\) 只影响收敛速度(但有限轮数内进度差异巨大) |
| ADMM 的 x-更新总有闭式解 | 仅无约束二次问题有;含不等式约束时 x-更新是 proximal 算子,要内层 QP 或投影求解 |
| 编队控制是独立于共识的新问题 | 编队控制律本质是共识协议作用在"相对位置误差"上(\(\dot{\tilde p}=-L\tilde p\)),收敛性全部继承自共识 |
| distance-based 编队连通就能锁住队形 | 仅距离约束在旋转/平移/镜像下不变;唯一确定形状需图**刚性**,普通连通不够 |
| 共识权重应该都是正的(取邻居正向平均) | 最快(SDP 最优)的对称权重里某些可为**负**;让单步最"合理"未必整体最快,最优是全局谱性质 |
| 线性共识能在有限时间内精确达成一致 | 线性(\(\dot x=-Lx\))只渐近收敛、永远差一点;要有限时间精确一致须用非光滑的分数次幂反馈(\(\alpha<1\)),代价是抖振 |
| gossip 异步共识和同步共识没本质区别 | gossip 每步只动一对节点、收敛慢得多,但完全异步、对掉线/拓扑变化极鲁棒;是速度换鲁棒的权衡 |
| 有惯性的编队只要位置反馈就能保持队形 | 双积分器编队缺速度阻尼项必持续振荡;真实机器人编队控制器必含速度协调/阻尼项 |
| 静态共识协议直接喂时变输入就能跟踪移动平均 | 跟踪时变平均是跟踪问题,必须注入输入导数/增量做前馈;只把状态拉向本地输入会滞后且被拉偏 |
| 动态共识无偏、可永远准 | 它是积分型估计器,靠"估计之和=输入之和"保证无偏;丢包/噪声破坏双随机守恒会让误差累积漂移 |
| 分布式估计必须有中央融合节点 | 动态共识/共识卡尔曼可用纯邻居通信达成与集中式几乎相同的融合估计,无单点、可扩展 |
| 分布式分层方案一定优于集中式 | 分布式的价值在 \(N\) 大/通信弱/高鲁棒时才显著;小队伍、好通信、有算力时集中式更简单更优 |
| 分层系统各层可独立设计 | 整体性能受最慢层与层间时间尺度匹配制约;感知须快到目标"准静态",内层在外层一周期内收敛 |
| 分布式与集中式可靠性差不多 | 分布式支持优雅降级(局部失效→局部性能下降),集中式是全有或全无(中央/链路断即瘫痪) |
本章小结¶
本章把第 1 章的图论语言"用起来",建立了分布式多机协调的两大数学引擎。
共识(§2.1-2.2):我们把"向邻居靠拢"写成 \(\dot x=-Lx\),严格证明了它收敛到初始平均、收敛速率正是 \(\lambda_2\)——第 1 章那句"图越连通协调越快"在这里得到证明。离散情形用双随机权重矩阵 \(W\),收敛率是 \(|\rho_2(W)|\),步长受 \(\lambda_N\) 限制。加入现实因素后:通信延迟有临界阈值 \(\tau^\star=\pi/(2\lambda_N)\)(由最大特征值决定,反直觉但深刻);拓扑切换只要联合连通就不影响收敛。这里浮现出一对主宰图上一切迭代算法的特征值——\(\lambda_2\)(管收敛速度)与 \(\lambda_N\)(管步长与延迟容限)。
分布式优化(§2.3):当每个 agent 要解的是一整个优化问题时,ADMM 把"一个大优化"拆成"\(N\) 个本地小优化 + 协调变量 + 对偶变量"的三步迭代,既避开第 1 章的 \(O(N^3)\) 爆炸、又(凸时)保证收敛到全局最优。罚参数 \(\rho\) 是权衡"全局一致 vs 局部自主"的旋钮,呼应第 1 章的核心权衡,也与 MPPI 温度同构。非凸 MPC 下 ADMM 是"工程有效但无保证"的启发式。
编队控制(§2.4):三范式(position/displacement/distance-based)对信息的需求递减、队形保证递减;而 displacement-based 控制律的误差动力学恰好是 \(\dot{\tilde p}=-L\tilde p\)——编队就是共识的几何化身,收敛性全部继承。
动态共识与分布式估计(§2.5):把共识从"固定输入收敛到固定平均"推广到"时变输入实时跟踪瞬时平均"。关键是注入输入的导数/增量做前馈——离散形式就是"共识混合步 + 输入增量注入",靠双随机保持"估计之和=输入之和"实现无偏跟踪。它是分布式估计、共识卡尔曼滤波的引擎,也解释了 ADMM 为何能跨周期 warm-start(慢变输入的动态共识)。跟踪能力的上限仍由谱(\(|\rho_2(W)|\))决定——本章主线的最后一次印证。
综合实战(§2.6):用一个协同围捕任务把五件工具串成"感知(动态共识)→决策(共识)→队形(编队)→轨迹协调(ADMM)"的分层数据流,时延理论贯穿全程作鲁棒保证。它揭示了本章工具不是孤立算法,而是同一个分布式协调系统的五个层次,且全部建立在第 1 章同一张图的谱之上。关键工程洞察:分层系统要做**时间尺度匹配**(感知 ≫ 决策 ≥ 队形 ≥ 轨迹),且分布式不总优于集中式(小队伍/好通信时集中式更划算)。
回到章首的两个"如果跳过会怎样":现在你知道离散共识必须用**双随机**权重(否则平均不守恒、收敛值漂移),也知道 ADMM 的 \(\rho\) 是必须调好的**权衡旋钮**(不是 bug,是超参)。章首自测的五个问题(\(L\) 零特征值、连续/离散稳定条件、对偶/KKT、双随机、\(O(N^3)\) 爆炸),现在都能看出它们各自支撑本章哪一节。
术语速查表¶
| 术语(中) | English | 一句话定义 |
|---|---|---|
| 共识 | consensus | 各 agent 只和邻居通信、收敛到同一值的过程;\(\dot x=-Lx\) |
| 平均共识 | average consensus | 收敛值等于初始平均;需双随机(无向对称) |
| 收敛速率 | convergence rate | 连续:\(\lambda_2\)(误差 \(\sim e^{-\lambda_2 t}\));离散:$ |
| 有向图共识 | directed consensus | 收敛到左 Perron 向量 \(\gamma\) 加权的平均;平衡图退回简单平均 |
| 左 Perron 特征向量 | left Perron eigenvector \(\gamma\) | \(\gamma^\top L=0\);有向共识中各 agent 的"话语权" |
| 权重矩阵 / 共识矩阵 | weight matrix \(W\) | 离散共识 \(x(k{+}1)=Wx(k)\) 的矩阵 |
| 双随机矩阵 | doubly stochastic | 行和与列和都为 1;保证收敛到正确平均 |
| Metropolis-Hastings 权重 | Metropolis weights | 局部可算的双随机权重 \(w_{ij}=\frac{1}{1+\max(d_i,d_j)}\) |
| 第二大特征值模 | $ | \rho_2(W) |
| 有限时间共识 | finite-time consensus | 用分数次幂反馈在有界时间内精确达成一致 |
| 固定时间共识 | fixed-time consensus | 收敛时间有与初值无关的统一上界(组合 \(\alpha<1,\beta>1\)) |
| 分数次幂反馈 | fractional power feedback | \(\operatorname{sig}(y)^\alpha=\operatorname{sign}(y)\|y\|^\alpha\),\(\alpha\in(0,1)\);有限时间收敛的核心 |
| 最大特征值 | \(\lambda_N\) | \(L\) 最大特征值;定步长上界与延迟容限 |
| 临界时延 | critical delay \(\tau^\star\) | 共识失稳的延迟阈值 \(\pi/(2\lambda_N)\) |
| 时滞微分方程 | delay differential equation | 含延迟的动力学 \(\dot x=-Lx(t-\tau)\) |
| 非均匀延迟 | heterogeneous delay | 各链路延迟不同;稳定性用 \(\tau_{\max}<\pi/(2\lambda_N)\) 保守卡 |
| 非对称延迟 | asymmetric delay | 同链路两方向延迟不同;破坏对称性、像有向图拉偏收敛值 |
| 联合连通性 | jointly connected | 切换拓扑下时间窗内并集连通即可收敛 |
| ADMM | alternating direction method of multipliers | 分布式优化标准框架;本地优化+协调+对偶三步 |
| 增广拉格朗日 | augmented Lagrangian | 拉格朗日 + 二次罚项;ADMM 的基础 |
| 罚参数 | penalty parameter \(\rho\) | ADMM 权衡旋钮;平衡原始/对偶残差 |
| 原始残差 / 对偶残差 | primal / dual residual | \(x_i-z\) / \(\rho(z^k-z^{k-1})\);ADMM 收敛诊断 |
| 一致性约束 | consensus constraint | \(x_i=z\);把本地子问题耦合起来的纽带 |
| 缩放对偶变量 | scaled dual \(u=y/\rho\) | ADMM 的简洁等价写法 |
| 共识型 ADMM | consensus ADMM | \(z\)-更新也分布式(邻居平均/边一致性),无中央节点 |
| 边一致性 | edge consistency | 把 \(z_i=z_j\) 沿边作约束;去中心化 ADMM 的骨架 |
| warm-start | warm-start | 用上周期解作初值;让实时 MPC 每周期只跑几轮 ADMM |
| 最快分布式线性平均 | FDLA | 求最快共识权重的 SDP;Xiao-Boyd 2004 |
| 对偶分解 | dual decomposition | ADMM 的前辈;无二次罚项,要求严格凸、收敛慢 |
| sharing 形式 | sharing form | ADMM 协调"各 agent 贡献之和"的耦合(对比 consensus 形式) |
| 过松弛 | over-relaxation | ADMM 加速,松弛因子 \(\alpha\in[1.5,1.8]\),几乎免费 |
| proximal 算子 | proximal operator | \(\operatorname{prox}_{f/\rho}(v)=\arg\min f(x)+\frac\rho2\|x-v\|^2\);ADMM 的 x-更新本质 |
| 投影(到可行集) | projection | 简单集合约束(盒/球)的 proximal 退化形式;先求解再 clip/归一化 |
| 随机 gossip | randomized gossip | 异步共识:随机选边做平均;Boyd 2006 |
| 二阶共识 | second-order consensus | 双积分器共识;需速度差(阻尼)项防振荡 |
| 编队机动 | formation maneuver | 编队整体平移/旋转/缩放;用时变期望队形携带 |
| 编队范式 | formation paradigm | position / displacement / distance-based 三类 |
| 图刚性 | graph rigidity | 距离约束唯一确定队形(差刚体运动)的条件 |
| 刚性矩阵 | rigidity matrix \(R(p)\) | 关联矩阵的几何加权版;满秩 \(\iff\) 无穷小刚性 |
| 距离误差势函数 | distance-error potential | distance-based 控制律取其负梯度(式 2.27) |
| 锚定 leader | anchoring / leader | 把编队钉到绝对位置的机制 |
| 动态共识 | dynamic (average) consensus | 输入时变时实时跟踪瞬时平均 \(\bar r(t)=\frac1N\sum_i r_i(t)\) |
| 输入增量注入 | input increment injection | 离散动态共识的前馈项 \(r_i(k{+}1)-r_i(k)\),保证跟踪不滞后 |
| 内部模型原理 | internal model principle | 无误差跟踪某类信号须控制器内含该信号动力学;定动态共识前馈阶数 |
| 分布式估计 | distributed estimation | 各 agent 本地传感+邻居通信得到全局一致估计;噪声方差按 \(1/N\) 缩减 |
| 共识卡尔曼滤波 | consensus Kalman filter | 本地 KF + 动态共识对估计/信息量达成一致;无中央节点的协同滤波 |
| 比例型动态共识 | proportional (P) dynamic consensus | 无积分;鲁棒、抗丢包,但对时变输入有稳态误差 |
| 比例-积分型动态共识 | proportional-integral (PI) dynamic consensus | 带积分;对常值/匀速输入零稳态误差,但会累积漂移 |
| 信息形式 | information form | 卡尔曼测量更新写成信息向量/矩阵相加;融合即求和,适合共识分布式化 |
| 分布式平均原语 | distributed averaging primitive | 共识的本质角色:任何"把分散量平均/融合成一致结果"的任务都能用它分布式实现 |
| 优雅降级 | graceful degradation | 局部失效只致局部、可预测的性能下降而非系统崩溃;分布式相对集中式的可靠性优势 |
| 时间尺度分离 | time-scale separation | 分层系统各层收敛速度需匹配:感知 ≫ 决策 ≥ 队形 ≥ 轨迹 |
| 分层数据流 | layered data flow | 感知→决策→队形→轨迹四层各用一件分布式工具,逐层加工成可执行指令 |
知识点总表¶
下表的"对应节"列指明每个知识点首次系统讲解的位置;带字母后缀(如 2.6c、2.12d)的是在主条目同节内补充的扩展/进阶知识点,可按难度标记选学。
| 编号 | 知识点 | 核心要点 | 对应节 | 难度 |
|---|---|---|---|---|
| 2.1 | 连续共识 | \(\dot x=-Lx\);由"向邻居靠拢"叠加而来 | §2.1 | ⭐⭐⭐ |
| 2.2 | 连续共识收敛证明 | 模态展开;收敛到初始平均,速率 \(\lambda_2\) | §2.1 | ⭐⭐⭐ |
| 2.3 | 平均值守恒 | \(\mathbf 1^\top\dot x=0\);解释为何收敛到平均 | §2.1 | ⭐⭐ |
| 2.4 | 离散共识 | \(x(k{+}1)=Wx(k)\);需 \(W\) 双随机+连通 | §2.1 | ⭐⭐⭐ |
| 2.5 | 双随机的双重意义 | 行和→一致是不动点;列和→平均守恒 | §2.1 | ⭐⭐⭐ |
| 2.6 | \(\lambda_2\) vs \(\lambda_N\) | 速度 vs 步长/延迟容限;比值 \(\lambda_2/\lambda_N\) 是关键 | §2.1 | ⭐⭐⭐ |
| 2.6b | 有向图共识 | 收敛到左 Perron 向量 \(\gamma\) 加权平均;平衡图退回平均 | §2.1 | ⭐⭐⭐ |
| 2.6c | 最优权重 (FDLA) | 最快共识权重是 SDP;最优权重可为负(反直觉) | §2.1 | ⭐⭐⭐⭐ |
| 2.6d | 有限时间共识 | 分数次幂反馈 \(\operatorname{sig}(\cdot)^\alpha\),\(\alpha<1\);有限时间精确一致 | §2.1 | ⭐⭐⭐⭐ |
| 2.7 | 临界时延 | \(\tau^\star=\pi/(2\lambda_N)\);频域+模态解耦推导 | §2.2 | ⭐⭐⭐ |
| 2.8 | 联合连通性 | 切换拓扑下时间窗并集连通即收敛 | §2.2 | ⭐⭐⭐ |
| 2.8d | 非均匀/非对称延迟 | 稳定性用 \(\tau_{\max}\) 保守卡;非对称延迟像有向图拉偏收敛值 | §2.2 | ⭐⭐⭐ |
| 2.8b | 二阶共识 | 双积分器;须速度差(阻尼)项,否则振荡 | §2.2 | ⭐⭐⭐ |
| 2.8c | 随机 gossip | 异步边平均;速率由 \(\bar W\) 第二大特征值定;慢但鲁棒 | §2.2 | ⭐⭐⭐ |
| 2.9 | 增广拉格朗日 | 拉格朗日+二次罚;兼顾精确与可分解 | §2.3 | ⭐⭐⭐⭐ |
| 2.10 | ADMM 三步迭代 | \(x\)-更新(并行)→\(z\)-更新(协调)→\(y\)-更新(对偶) | §2.3 | ⭐⭐⭐⭐ |
| 2.11 | 罚参数 \(\rho\) | 平衡原始/对偶残差;自适应调节 | §2.3 | ⭐⭐⭐ |
| 2.12 | ADMM 收敛性 | 凸→全局最优;非凸→无保证(至多 KKT) | §2.3 | ⭐⭐⭐⭐ |
| 2.12b | 共识型 ADMM | \(z\)-更新分布式(邻居平均/边一致);warm-start 保实时 | §2.3 | ⭐⭐⭐⭐ |
| 2.12c | ADMM 家族 | 对偶分解→ADMM→过松弛;consensus vs sharing 两形式 | §2.3 | ⭐⭐⭐ |
| 2.12d | x-更新含约束 | x-更新=proximal 算子;凸约束用内层 QP,简单集合用投影 | §2.3 | ⭐⭐⭐ |
| 2.13 | 编队三范式 | position/displacement/distance;信息需求递减 | §2.4 | ⭐⭐ |
| 2.14 | displacement 控制律 | \(\dot{\tilde p}=-L\tilde p\);编队=共识作用在误差上 | §2.4 | ⭐⭐ |
| 2.14b | distance 控制律 | 距离误差势函数负梯度(式 2.27);非线性、局部收敛 | §2.4 | ⭐⭐⭐ |
| 2.15 | 图刚性与锚定 | 刚性矩阵满秩唯一确定队形;锚定 leader 钉绝对位置 | §2.4 | ⭐⭐⭐ |
| 2.16 | 二阶编队与机动 | 双积分器编队需阻尼;时变期望队形实现整体机动 | §2.4 | ⭐⭐⭐ |
| 2.17 | 动态共识 | 时变输入实时跟踪瞬时平均;注入输入增量做前馈 | §2.5 | ⭐⭐⭐ |
| 2.17b | 离散动态共识估计器 | 共识混合 + 输入增量;靠双随机保"估计之和=输入之和" | §2.5 | ⭐⭐⭐ |
| 2.18 | 分布式估计/共识卡尔曼 | 共识作分布式平均原语;噪声按 \(1/N\) 缩减,无中央节点 | §2.5 | ⭐⭐⭐ |
| 2.18b | 动态共识的限制 | 积分型估计器:零稳态误差但对丢包/突变敏感、会漂移 | §2.5 | ⭐⭐⭐ |
| 2.19 | 分层数据流 | 围捕任务=感知→决策→队形→轨迹四层,各用一件工具 | §2.6 | ⭐⭐⭐ |
| 2.19b | 时间尺度匹配 | 分层系统性能受最慢层与层间快慢匹配制约 | §2.6 | ⭐⭐⭐ |
| 2.19c | 分布式 vs 集中权衡 | 小队伍/好通信优先集中;大集群/弱通信/高鲁棒才分布式 | §2.6 | ⭐⭐ |
| 2.19d | 共识=分布式平均原语 | 融合/优化/学习里"求平均"都可用共识;谱隙决定快慢,跨领域可迁移 | §2.5/§2.6 | ⭐⭐⭐ |
累积项目:本章新增模块¶
本章给 Mini-MultiBot 加入**通信与协调的算法内核**——这是后续所有分布式控制器的底层依赖。
本章新增两个模块:communication/consensus.py(共识工具)和 controllers/distributed_mpc/admm_coordinator.py(ADMM 协调器内核,抽象出本地求解接口,供第 4 章接入真实 MPC)。仓库进展:
mini-multibot/
├── communication/
│ ├── ros2_multi_ns.launch.py # Ch1
│ ├── world_anchor.py # Ch1
│ └── consensus.py # 本章:Laplacian 构造、Metropolis 权重、静态/动态共识迭代、λ2 监控、分布式估计
├── controllers/
│ └── distributed_mpc/
│ └── admm_coordinator.py # 本章:ADMM 三步迭代框架(本地求解为抽象接口)
├── planning/ # Ch3 起
├── envs/ # Ch4/Ch8 起
└── evaluation/ # Ch13
admm_coordinator.py 的设计要点:把 ADMM 的"协调骨架"(z-更新、对偶更新、残差监控、自适应 \(\rho\))与"本地子问题求解"解耦——本地求解定义成一个抽象接口 local_solve(z, u, rho) -> x_i,本章用二次代价的闭式解占位,第 4 章把它替换成真实的单体 SRB-MPC(OCS2/OSQP)。这样第 4 章只需实现 local_solve,协调逻辑直接复用。
import numpy as np
class ADMMCoordinator:
"""一致性 ADMM 协调器(缩放形式)。本地求解为抽象接口,子类/外部注入。
解 min Σ f_i(x_i) s.t. x_i = z。"""
def __init__(self, n_agents, dim, rho=1.0, mu=10.0, tau=2.0):
self.N, self.dim, self.rho = n_agents, dim, rho
self.mu, self.tau = mu, tau # 残差平衡参数
self.z = np.zeros(dim)
self.u = [np.zeros(dim) for _ in range(n_agents)]
def local_solve(self, i, z, u_i, rho):
"""本地子问题 argmin f_i(x)+ (rho/2)||x - z + u_i||^2。
本章占位:二次代价闭式解;第 4 章 override 为 SRB-MPC。"""
raise NotImplementedError
def step(self):
# ① x-更新(各 agent 并行)
x = [self.local_solve(i, self.z, self.u[i], self.rho)
for i in range(self.N)]
# ② z-更新(平均,分布式实现时用共识)
z_new = np.mean([x[i] + self.u[i] for i in range(self.N)], axis=0)
# 残差
r = np.sqrt(sum(np.sum((x[i] - z_new) ** 2) for i in range(self.N))) # 原始
s = self.rho * np.linalg.norm(z_new - self.z) * np.sqrt(self.N) # 对偶
# ③ u-更新(对偶,各 agent 并行)
self.u = [self.u[i] + x[i] - z_new for i in range(self.N)]
self.z = z_new
# 自适应 rho(残差平衡)
if r > self.mu * s: self.rho *= self.tau
elif s > self.mu * r: self.rho /= self.tau
return x, self.z, (r, s)
consensus.py 在本章除静态共识外还新增**动态共识估计器**(式 2.31 的实现:共识混合 + 输入增量注入 + 守恒自检),供第 6 章的协同感知融合与去中心化 ADMM 的分布式 \(z\)-更新复用:
class DynamicConsensus:
"""离散动态平均共识估计器(式 2.31)。各 agent 实时跟踪时变输入的瞬时平均。
用法:init 时给双随机权重 W 与初始输入 r0(必须 x=r0);每步喂当前输入 r。"""
def __init__(self, W, r0):
self.W = W
self.x = r0.copy() # 关键:初始化 x_i(0)=r_i(0),否则守恒不成立
self.r_prev = r0.copy()
def step(self, r_now):
# 共识混合步 + 输入增量注入(前馈)
self.x = self.W @ self.x + (r_now - self.r_prev)
self.r_prev = r_now.copy()
return self.x
def conservation_gap(self):
"""漂移自检:估计之和应恒等于输入之和;返回偏离量(应≈0)。"""
return abs(self.x.sum() - self.r_prev.sum())
到本章末,Mini-MultiBot 已具备"多机通信底座(Ch1)+ 共识/动态共识/ADMM 协调内核(Ch2)"——第 4 章把单体 MPC 接进 admm_coordinator 就能跑分布式编队,第 6 章把传感读数接进 DynamicConsensus 就能跑分布式协同估计。
延伸阅读¶
教材(打地基): - Boyd, Parikh, Chu, Peleato, Eckstein, Distributed Optimization and Statistical Learning via ADMM, Foundations and Trends in Machine Learning 3(1):1-122, 2011(⭐⭐⭐):ADMM 的标准参考,§2.3 全部内容的源头,含大量分布式优化范例与 \(\rho\) 调节细节。Stanford 有免费 PDF 与配套代码。 - Bullo, Lectures on Network Systems, 2019(免费在线,⭐⭐):共识与分布式控制的最佳入门,§2.1-2.2 的内容在这里有完整且更深的展开。
综述/经典论文(看脉络): - Xiao & Boyd, Fast Linear Iterations for Distributed Averaging, Systems & Control Letters 53(1):65-78, 2004(⭐⭐⭐⭐):§2.1 最优权重设计的源头,把"最快共识"化归为 SDP,并揭示最优权重可为负的反直觉结果。 - Boyd, Ghosh, Prabhakar, Shah, Randomized Gossip Algorithms, IEEE Trans. Information Theory 52(6):2508-2530, 2006(⭐⭐⭐⭐):§2.2 异步 gossip 共识的奠基,平均时间由双随机矩阵第二大特征值决定,并联系随机游走混合时间。 - Olfati-Saber & Murray, Consensus Problems in Networks of Agents with Switching Topology and Time-Delays, IEEE TAC 49(9):1520-1533, 2004(⭐⭐⭐⭐):共识奠基,§2.1 的收敛速率-\(\lambda_2\) 联系与 §2.2 的临界时延 \(\tau^\star=\pi/(2\lambda_N)\) 都出自这里。 - Ren & Beard, Consensus Seeking in Multiagent Systems under Dynamically Changing Interaction Topologies, IEEE TAC 50(5):655-661, 2005(⭐⭐⭐):切换拓扑与联合连通性的源头。 - Olfati-Saber, Fax, Murray, Consensus and Cooperation in Networked Multi-Agent Systems, Proc. IEEE 95(1):215-233, 2007(⭐⭐⭐):把共识、编队、同步统一起来的综述,适合鸟瞰全貌。 - Oh, Park, Ahn, A Survey of Multi-Agent Formation Control, Automatica 53:424-440, 2015(⭐⭐⭐):§2.4 编队三范式分类的系统综述。 - Kia, Van Scoy, Cortés, Freeman, Lynch, Martínez, Tutorial on Dynamic Average Consensus: The Problem, Its Applications, and the Algorithms, IEEE Control Systems Magazine 39(3):40-72, 2019(⭐⭐⭐⭐):§2.5 动态共识的系统综述,涵盖各类估计器、稳态误差分析与分布式估计应用。 - Olfati-Saber, Distributed Kalman Filtering for Sensor Networks, IEEE CDC 2007(⭐⭐⭐):§2.5 共识卡尔曼滤波的奠基之一,把动态共识嵌入分布式滤波。
前沿(看标杆): - Keviczky, Borrelli 等, Decentralized Receding Horizon Control for Large Scale Dynamically Decoupled Systems, Automatica/IEEE T-CST 2008(⭐⭐⭐⭐):分布式 MPC 用于编队的早期标杆,第 4 章精读。 - Zeng, Sambhus, Imran, Kim, Pastore, Akbari Hamed, ADMM-Based Distributed MPC with Control Barrier Functions for Safe Multi-Robot Quadrupedal Locomotion, 2026(⭐⭐⭐⭐):node-edge splitting 的 consensus ADMM,含 CBF 耦合,两台 Go2 实机,预告第 12 章。 - Zhou 等, ACLM: ADMM-Based Distributed MPC for Collaborative Loco-Manipulation, arXiv 2603.07095, 2026(⭐⭐⭐⭐):共享负载星形耦合 + wrench 一致性 ADMM,预告第 5 章。
拓展视野(把共识放进更大图景): - Nedić & Ozdaglar, Distributed Subgradient Methods for Multi-Agent Optimization, IEEE TAC 54(1):48-61, 2009(⭐⭐⭐):分布式(次)梯度法的奠基,把共识与分布式优化结合,是理解"共识 + 本地梯度"这类算法(含分布式 SGD、联邦平均的理论雏形)的入口。 - Bullo, Cortés, Martínez, Distributed Control of Robotic Networks, Princeton, 2009(免费在线,⭐⭐⭐):把共识、覆盖、聚合等机器人网络协调任务统一在一个框架下,适合看本章工具与更广分布式机器人学的联系。
工程(动手查):
- Boyd ADMM 配套代码:stanford.edu/~boyd/papers/admm/——ADMM 在各类问题上的示例实现。
- OSQP 文档:稀疏 QP 求解器,ADMM 子问题(QP)的高效求解,第 4 章会用;注意它内部也是 ADMM,故有"外层协调 ADMM + 内层 OSQP"的嵌套结构。
本章与后续章节的关系¶
| 后续章节 | 关系 | 本章铺垫的知识点 |
|---|---|---|
| 第 3 章 任务分配与 MAPF | CBBA 用共识/拍卖解决分布式任务分配的冲突裁决 | 共识、双随机 |
| 第 4 章 分布式 MPC 编队 | 单体 MPC 接入 ADMM 协调器;displacement 编队落地;锚定 leader | ADMM 三步、\(\rho\)、编队=共识、\(\boldsymbol\lambda\) 耦合 |
| 第 5 章 协同搬运与力控 | wrench 一致性正是 ADMM 的 \(x_i=z\) 在"力"上的具体化(ACLM) | ADMM、一致性约束、共享负载星形耦合 |
| 第 6 章 异构多机协同 | 异构编队的共识需处理不同动力学;协同感知用动态共识/共识卡尔曼融合 | 共识、编队三范式、动态共识、分布式估计 |
| 第 10 章 MARL 基础 | CTDE 的"集中训练"可类比集中协调,执行靠局部 | 共识(局部信息)、\(\lambda_2\) |
| 第 12 章 MARL+规控混合 | 在通信图上叠加 ADMM-CBF 安全层(Zeng-Hamed) | ADMM、CBF 耦合分解、共识 |
| 第 13 章 综合实战 | 任务A(双 Go2 搬运 MPC/ADMM)直接复用 admm_coordinator;§2.6 围捕分层骨架是综合任务的结构模板 |
ADMM 协调器、共识工具、§2.6 分层数据流 |
🔧 故障排查手册¶
| 症状 | 可能原因 | 排查步骤 | 相关节 |
|---|---|---|---|
| 共识不收敛 / 发散 | 拓扑不连通(\(\lambda_2=0\));或离散步长 \(\varepsilon\ge 2/\lambda_N\) | 1. 算 \(\lambda_2\) 查连通 2. 算 $\max | \text{eig}(W) |
| 共识收敛了但值不对(非平均) | \(W\) 非双随机(常见度归一化只满足行和) | 1. 打印 W.sum(0)、W.sum(1) 都应全 1 2. 改用 Metropolis 权重 |
§2.1 |
| 共识在实机上振荡(仿真却正常) | 通信延迟超临界 \(\tau^\star=\pi/(2\lambda_N)\) | 1. 测实际延迟 2. 算 \(\tau^\star\) 3. 降延迟或用稀疏拓扑(减小 \(\lambda_N\)) | §2.2 |
| 分布式估计稳定但收敛值有系统偏差 | 链路非对称延迟(\(\tau_{ij}\ne\tau_{ji}\)),像有向图拉偏平均 | 1. 检查双向延迟是否对称 2. 时间戳对齐/双向延迟补偿 3. 用 \(\tau_{\max}\) 保守卡稳定 | §2.2 |
| 移动编队偶发协调失败 | 拓扑瞬时分裂且时间窗内并集也不连通 | 1. 监控窗口并集 \(\lambda_2\) 2. 调整通信范围/轮转保证联合连通 | §2.2 |
| ADMM 震荡不收敛 | \(\rho\) 太大(对偶残差主导)或非凸子问题 | 1. 同时看原始/对偶残差 2. 减小或自适应 \(\rho\) 3. 确认子问题凸性 | §2.3 |
| ADMM 收敛极慢(几百轮) | \(\rho\) 太小(原始残差降得慢) | 1. 看原始残差是否远大于对偶 2. 增大 \(\rho\) 或启用残差平衡 | §2.3 |
| ADMM 收敛到错误点 | \(z\)-更新漏了对偶项 \(u_i\);或分布式平均用了非双随机共识 | 1. 检查 \(z=\frac1N\sum(x_i+u_i)\) 2. 检查共识权重双随机 | §2.3 |
| ADMM 解出的轨迹违反本地约束(超饱和/穿障) | \(x\)-更新含不等式约束却用了无约束闭式解 | 1. \(x\)-更新改用 QP 求解器或投影 2. 检查每步 \(x_i\) 是否在可行集内 | §2.3 |
| 编队发散 / 收敛到错误构型 | 控制律相对量符号写反 | 1. 验证 \(p=p^\*\) 时 \(u_i=0\) 2. 用矩阵形式 \(u=-L(p-p^\*)\) | §2.4 |
| distance-based 编队形状对但朝向乱 | 图非刚性,存在旋转/镜像歧义 | 1. 检查图刚性 2. 加边或锚定节点消除歧义 | §2.4 |
| 异步 gossip 收敛极慢 | 图稀疏(如环),gossip 平均时间随 \(N\) 超线性增长 | 1. 估 \(\bar W\) 第二大特征值 2. 加边或改用同步共识 3. 评估是否值得用异步换鲁棒 | §2.2 |
| 有惯性的编队持续振荡不收敛 | 二阶编队律缺速度阻尼项(\(\gamma_d=0\)) | 1. 加入速度差耦合 \(\gamma_d(\dot p_i-\dot p_j)\) 2. 调 \(\gamma_d\) 到临界阻尼附近 | §2.4 |
| 分层围捕系统队形追不上目标 | 感知层(动态共识)收敛慢于目标移动,下游用过时估计 | 1. 加快感知层(减小 $ | \rho_2(W) |
| 分层系统某机器人故障后全队失效 | 误用集中式或各层耦合过紧,无优雅降级 | 1. 确认感知用分布式(动态共识)2. 故障机器人退出后检查图仍联合连通 3. 各层用本机估计解耦 | §2.6 |
| 过松弛 ADMM 反而发散 | 松弛因子 \(\alpha\) 超出 \((0,2)\) 或问题非凸 | 1. 把 \(\alpha\) 收回 \([1.5,1.8]\) 2. 非凸问题谨慎用过松弛 3. 退回 \(\alpha=1\) 标准 ADMM | §2.3 |
| 动态共识跟踪移动目标持续滞后 | 漏注入输入增量(退回静态共识),或目标动得快过共识收敛 | 1. 确认每步加了 \(r_i(k{+}1)-r_i(k)\) 2. 减小 \(\|\rho_2(W)\|\)(更快混合)3. 评估目标速度 vs 共识速度 | §2.5 |
| 动态共识估计长期缓慢漂移 | 积分型估计器 + 丢包/噪声破坏双随机守恒,误差累积 | 1. 监控"全体估计之和 vs 输入之和"偏离 2. 加遗忘因子/周期重置 3. 改纯比例型换鲁棒 | §2.5 |
| 分布式估计收敛到有偏值(非真平均) | 忘记初始化 \(x_i(0)=r_i(0)\);或共识权重非双随机 | 1. 检查初始化 2. 打印 \(W\) 行和列和应全 1 3. 改用 Metropolis 权重 | §2.5 |
| 多机"同时触发"动作时序错开 | 用线性共识(只渐近),预定时刻仍残留不一致 | 1. 改用有限时间共识(\(\alpha<1\))2. 或按 \(e^{-\lambda_2T}<\epsilon\) 留够裕量 | §2.1 |
| 有限时间共识接近一致时剧烈抖振 | 分数次幂反馈非光滑 + \(\alpha\) 太小 + 步长太大 | 1. 增大 \(\alpha\)(靠近 1)2. 减小积分步长 3. 末段切回线性或加边界层 | §2.1 |
API 速查表¶
| API / 工具 | 用途 |
|---|---|
numpy.linalg.eigvalsh(L) |
对称 \(L\) 的特征值,取 \(\lambda_2\)(第 2 小)、\(\lambda_N\)(最大) |
numpy.linalg.eigvals(W) |
一般矩阵特征值,取 $ |
| Metropolis 权重 \(w_{ij}=\frac{1}{1+\max(d_i,d_j)}\) | 构造双随机共识权重(局部可算) |
| \(W=I-\varepsilon L,\ \varepsilon<2/\lambda_N\) | 由 \(L\) 构造双随机 \(W\) 的捷径 |
osqp.OSQP() / setup / solve |
稀疏 QP 求解器,ADMM 本地子问题(QP)求解 |
scipy.sparse |
稀疏矩阵存储 \(L\)、KKT,大规模高效 |
| ADMM 残差判据 | 原始 \(\|x_i-z\|\)、对偶 \(\rho\|z^k-z^{k-1}\|\) 都 < 阈值(绝对+相对容差) |
| 自适应 \(\rho\) 规则 | \(\|r\|>\mu\|s\|\Rightarrow\rho\!\times\!\tau\);反之 \(\div\tau\)(\(\mu{=}10,\tau{=}2\)) |
| 过松弛 \(\hat x=\alpha x+(1-\alpha)z\) | ADMM 加速,\(\alpha\in[1.5,1.8]\);近乎免费 |
| x-更新含约束 = proximal | 凸约束用内层 QP(OSQP);盒/球约束用投影(np.clip/归一化) |
cvxpy 解 FDLA SDP |
求图上最快共识的最优对称权重(离线、集中) |
| gossip 边平均 \(x_i,x_j\!\leftarrow\!\frac12(x_i{+}x_j)\) | 异步共识更新;随机选边、保总和守恒 |
np.sign(y)*np.abs(y)**alpha |
有限时间共识的分数次幂反馈 \(\operatorname{sig}(y)^\alpha\)(\(0<\alpha<1\)) |
| 动态共识 \(x\!\leftarrow\!Wx+(r_k{-}r_{k-1})\) | 实时跟踪时变输入的瞬时平均;须初始化 \(x_0=r_0\)、双随机 \(W\) |
| 共识卡尔曼(信息形式) | 本地 \(\iota_i,\Omega_i\) 求和(乘 \(N\) 即平均)→ 动态共识达成一致 → 转回状态空间 |
| 动态共识守恒自检 | abs(x.sum() - r.sum()) 应 \(\approx 0\);偏离即漂移报警(丢包/漏初始化) |
| 分层时间尺度准则 | 感知 ≫ 决策 ≥ 队形 ≥ 轨迹;内层在外层一周期内跑够轮数收敛 |
研究实践建议¶
给初学者:务必**亲手把 §2.1 的共识和 §2.3 的 ADMM 都跑通并验证数值**——本章所有代码都给了可验证的闭式答案(共识收敛到初始平均、ADMM-QP 收敛到加权平均),跑出来对上,你才真正建立了"\(\lambda_2\) 管速度、双随机管正确平均、\(\rho\) 管收敛进度"的体感。重点踩两个坑:用度归一化的 \(W\) 看它收敛到错误值、把 \(\rho\) 取极端看它震荡或龟速,亲手踩过比看十遍陷阱记得牢。这个阶段先不必深究非凸 ADMM 的收敛理论(那是开放问题),把凸情形吃透。学有余力,跑一遍 §2.5 的动态共识(用静态共识喂时变输入对比它的滞后)和 §2.6 的围捕骨架(看五件工具如何串成一条数据流),你对"共识是分布式平均原语"的理解会从单点上升到系统。
给有经验者:把 \(\lambda_2\) 与 \(\lambda_N\) 当作设计通信拓扑的一对指标——\(\lambda_2\) 要够大(收敛快)、\(\lambda_N\) 别太大(延迟鲁棒、步长不必太小),关注比值 \(\lambda_2/\lambda_N\)。实现分布式 MPC 时,\(z\)-更新优先用分布式平均共识(避免引入中央协调器),但注意共识本身要双随机;\(\rho\) 一律上自适应残差平衡,别手调固定值。关注 ADMM-MPC 的前沿(Zeng-Hamed 的 node-edge splitting、ACLM 的 wrench 一致性)——它们展示了如何把"耦合结构"(CBF 耦合、共享负载)映射成合适的 ADMM 分解,这是把标准 ADMM 用到具体多机问题的关键手艺。异步 ADMM(各 agent 计算速度不同)在非凸下仍是开放问题,实机部署留意同步假设。
给做系统集成的(§2.5/§2.6 视角):真实多机系统不是单用一件工具,而是把感知(动态共识/共识卡尔曼)、决策(共识)、队形(编队)、轨迹协调(ADMM)分层串联(§2.6)。集成时三条经验:(1) 时间尺度分离——感知层动态共识要快到目标移动看起来"准静态",轨迹层 ADMM 要在队形层一个周期内跑够轮数;调不好整体性能受最慢层拖累,且故障难定位。(2) 单机内部一致——同一台机器人的各层必须用它自己同一份目标估计 \(\hat q_i\),不要混用不同 agent 或不同时刻的估计,否则各层对"世界在哪"认知不一致导致队形散乱。(3) 动态共识是积分型估计器——长期运行警惕丢包/噪声导致的误差累积漂移,加遗忘因子或周期重置,并监控"估计之和 vs 输入之和"作漂移报警。最后,不要为分布式而分布式:\(N\) 小、通信好、有算力时,集中式往往更简单更优;分布式的价值在大集群、弱通信、高鲁棒要求时才兑现——这是贯穿第 1 章到本章的根本权衡。
一个落地清单(把本章工具组装成系统时按此自检):(1) 通信图设计——\(\lambda_2\) 够大(收敛/感知够快)、\(\lambda_N\) 不过大(延迟容限 \(\tau^\star=\pi/(2\lambda_N)\) 够、且实际延迟 < \(0.5\tau^\star\))、保证联合连通;(2) 共识/动态共识——一律用双随机权重(Metropolis 或 \(I-\varepsilon L\)),动态共识记得初始化 \(x_0=r_0\) 并加守恒自检;(3) ADMM——\(\rho\) 上自适应残差平衡,\(z\)-更新优先用分布式平均共识,带约束子问题用 OSQP 解 \(x\)-更新,实时场景配 warm-start + 限轮数;(4) 编队——按可获取的传感信息选范式(无 GPS 用 displacement),二阶系统记得加速度阻尼项;(5) 系统集成——做时间尺度分离、单机内部用同一份估计、长期运行防动态共识漂移、验证优雅降级。把这五条逐项过一遍,本章的工具就能稳妥地拼成一个可上实机的分布式多机系统。
回到本章开头那两个会让人栽跟头的场景——离散共识用了非双随机权重导致收敛值悄悄漂移、分布式 MPC 的 \(\rho\) 没调好导致震荡却被当成 bug。读完本章,你已经握有完整的工具:共识的双随机条件与 \(\lambda_2/\lambda_N\) 谱分析、ADMM 的三步迭代与 \(\rho\) 的残差平衡调节。更重要的是,你看清了一条贯穿全章的主线——共识、编队、分布式优化、动态估计,本质上都是"图上的协调过程",而这张图的谱(\(\lambda_2\) 与 \(\lambda_N\))就是它们共同的 DNA。无论是静态收敛(§2.1)、延迟容限(§2.2)、ADMM 协调速度(§2.3)、编队收敛(§2.4),还是动态共识的跟踪能力(§2.5),最终都落回这对特征值——这就是把全章五节统一起来看的视角。而 §2.6 的协同围捕则把这五件工具串成一条完整数据流,让你看清它们在一个真实任务里如何分层协作、如何交接——这正是后续实战章节(第 4、5、6 章)的骨架。
第 2 章完结。 下一章我们转向多机协调的另一个支柱——任务分配与路径规划:当 \(N\) 个机器人面对 \(M\) 个任务、要决定"谁干什么、怎么不撞上"时,用什么算法?我们会看到 CBBA(基于共识的拍卖)如何用本章的共识来裁决分布式拍卖的冲突,以及 CBS/MAPF 如何在第 1 章的图上做多机路径规划——本章的共识(尤其是 §2.1 的平均共识与 §2.5 的分布式估计)会再次出场。再往后,第 4 章把 §2.3 的 ADMM、§2.4 的编队律落到双 Go2 分布式 MPC,第 5 章把 §2.3 的 sharing 形式落到协同搬运的力一致性,第 6 章把 §2.5 的动态共识/共识卡尔曼落到异构协同感知——本章的每件工具都将在后续被"加重"成实机可跑的系统。
版本信息速查¶
本章涉及的工具与算法参考(截至 2026 年中):
| 项目 | 版本 / 出处 | 说明 |
|---|---|---|
| ADMM 标准参考 | Boyd et al. 2011, Found. Trends ML 3(1) | §2.3 全部公式与 \(\rho\) 调节的源头 |
| OSQP | 稳定版(operator-splitting QP) | ADMM 子问题(QP)求解,第 4 章接入;本身基于 ADMM,故有"外层 ADMM 协调 + 内层 OSQP 解带约束 x-更新"的层次 |
| cvxpy | 稳定版 | 求 FDLA SDP(§2.1 最优权重)、带约束 x-更新原型验证 |
| NumPy | ≥ 1.24 | 本章共识/ADMM/编队仿真代码 |
| SciPy | ≥ 1.10 | scipy.sparse 稀疏 \(L\)/KKT 存储 |
| 共识奠基 | Olfati-Saber & Murray 2004, IEEE TAC 49(9) | 收敛速率-\(\lambda_2\)、临界时延 \(\tau^\star\) |
| 切换拓扑 | Ren & Beard 2005, IEEE TAC 50(5) | 联合连通性 |
| 编队综述 | Oh, Park, Ahn 2015, Automatica 53 | 三范式分类 |
| 动态共识综述 | Kia et al. 2019, IEEE CSM 39(3) | 动态平均共识、分布式估计 |
| 分布式优化奠基 | Nedić & Ozdaglar 2009, IEEE TAC 54(1) | 共识 + 本地梯度;分布式 SGD/联邦平均的理论雏形 |
| 最优权重 SDP | Xiao & Boyd 2004, Syst. Control Lett. 53(1) | §2.1 六 FDLA 最快共识权重 |
| 异步 gossip | Boyd et al. 2006, IEEE T-IT 52(6) | §2.2 六随机 gossip、平均时间 |
说明:论文的作者、年份、期刊以正文引用与延伸阅读为准;工具版本随上游更新,复现时以官方发行说明为准。