主流多机SLAM框架——分布式状态估计的两种方法

Kimera-Multi

核心状态变量是所有机器人的位姿:

\[X_{\alpha i} = (R_{\alpha i}, t_{\alpha i}) \in SE(3)\]

其中 $\alpha$ 表示机器人编号,$i$ 表示该机器人轨迹中的第 $i$ 个 keyframe。

测量分两类:

第一类是 odometry edges,来自每个机器人自己的 Kimera-VIO。作者认为这些 odometry measurement 基本没有 outlier,所以用普通二次损失。

第二类是 loop closures,包括 intra-robot loop closure 和 inter-robot loop closure。这些可能由于 perceptual aliasing 产生外点,所以需要 robust cost。

因此总优化问题是:

\[\min_{\{X_{\alpha i}\}} \sum_{\alpha \in \mathcal{R}} \sum_{i=1}^{n_{\alpha}-1} r_{\alpha i}(X_{\alpha i}, X_{\alpha,i+1})^2 + \sum_{(\alpha i,\beta j)\in \mathcal{L}} \rho\left( r_{\alpha i}^{\beta j}(X_{\alpha i}, X_{\beta j}) \right)\]

这里 $\mathcal{R}$ 是机器人集合,$\mathcal{L}$ 是所有 loop closures,$\rho$ 是 truncated least squares,TLS robust cost。

loop closure residual 用的是 chordal distance。对一个相对位姿测量:

\[\hat{X}_{\alpha i}^{\beta j} = (\hat{R}_{\alpha i}^{\beta j}, \hat{t}_{\alpha i}^{\beta j})\]

残差写成:

\[r_{\alpha i}^{\beta j} = \left( w_R \left\| R_{\beta j} - R_{\alpha i}\hat{R}_{\alpha i}^{\beta j} \right\|_F^2 + w_t \left\| t_{\beta j} - t_{\alpha i} - R_{\alpha i}\hat{t}_{\alpha i}^{\beta j} \right\|_2^2 \right)^{1/2}\]

这个建模非常典型:多机协同 SLAM 后端本质上就是一个带外点的多机器人相对位姿图优化问题。

多机器人 SLAM = 多机器人局部 odometry + intra/inter-robot loop closures 构成的鲁棒分布式 pose graph optimization。

它的关键难点不是 residual 怎么写,而是:

第一,如何初始化多个机器人之间的坐标系变换。

第二,如何在存在错误 inter-robot loop closures 的情况下鲁棒优化。

第三,如何把 centralized PGO 改造成只依赖局部通信的 distributed PGO。

第四,如何在通信受限下只交换必要的 descriptors、public poses 和 loop closure 信息。

从这个角度看,Kimera-Multi 的真正创新点集中在 robust distributed back-end,尤其是两阶段 D-GNC:先鲁棒初始化机器人坐标系,再用分布式 GNC + RBCD 做鲁棒 PGO。

Kimera-Multi 的 Section V 不是一个“普通 PGO + 分布式通信”的简单组合,而是三层东西叠在一起:

  1. 先解决多机器人没有共同坐标系的问题:鲁棒初始化。
  2. 再解决回环里有错误匹配的问题:逐步非凸鲁棒优化,也就是 GNC。
  3. 最后解决不能集中求解的问题:用 RBCD 做分布式位姿图优化。

论文里把这三件事压得很短,所以读起来会感觉“知道它在做鲁棒分布式 PGO,但不知道它到底怎么动起来”。下面从 Section V 开始,把它拆成一个 3 机器人例子来讲。


1. Kimera-Multi 后端到底在优化什么?

假设有 3 个机器人:

\[R_0,\ R_1,\ R_2\]

每个机器人都有自己的局部轨迹:

\[X_0=\{X_{0,1},X_{0,2},...,X_{0,n_0}\}\] \[X_1=\{X_{1,1},X_{1,2},...,X_{1,n_1}\}\] \[X_2=\{X_{2,1},X_{2,2},...,X_{2,n_2}\}\]

每个 $X_{\alpha,i}$ 是一个三维位姿:

\[X_{\alpha,i}=(R_{\alpha,i},t_{\alpha,i})\in SE(3)\]

其中 $\alpha$ 是机器人编号,$i$ 是这个机器人的第 $i$ 个关键帧。

位姿图里有两类边。

第一类是里程计边。例如 $R_0$ 自己的连续关键帧之间有:

\[X_{0,1}\rightarrow X_{0,2}\rightarrow X_{0,3}\]

这些边来自单机 VIO。Kimera-Multi 默认认为这些里程计边没有严重外点,所以用普通二次损失。

第二类是回环边。回环边又分为单机内部回环和机器人之间的回环。比如:

\[X_{0,5} \leftrightarrow X_{1,8}\]

表示 $R_0$ 的第 5 帧和 $R_1$ 的第 8 帧看到了同一个地方,于是前端估计出一个相对位姿测量。这个测量可能是真的,也可能是错的。Kimera-Multi 的鲁棒性主要就是为了处理这些错误回环。

因此,集中式版本的目标函数可以写成:

\[\min_{\{X_{\alpha,i}\}} \sum_{\alpha} \sum_{i=1}^{n_\alpha-1} r_{\alpha,i}(X_{\alpha,i},X_{\alpha,i+1})^2 + \sum_{(\alpha i,\beta j)\in \mathcal{L}} \rho \left( r_{\alpha i}^{\beta j}(X_{\alpha,i},X_{\beta,j}) \right)\]

这里:

\[\mathcal{L}\]

是所有回环边集合,包括单机内部回环和多机之间回环。

普通里程计边用:

\[r^2\]

回环边用鲁棒损失:

\[\rho(r)\]

Kimera-Multi 里选择的鲁棒损失是 截断最小二乘。直观理解就是:

\[\rho(r)= \begin{cases} r^2, & r^2 \leq \bar c^2 \\ \bar c^2, & r^2 > \bar c^2 \end{cases}\]

如果一条回环残差小,认为它可信,正常优化;如果残差大到超过阈值,就不再让它继续拉扯轨迹。

论文中的回环残差不是普通李代数残差,而是 chordal distance。对一条从 $X_{\alpha,i}$ 到 $X_{\beta,j}$ 的相对位姿测量:

\[\hat X_{\alpha i}^{\beta j}=(\hat R_{\alpha i}^{\beta j},\hat t_{\alpha i}^{\beta j})\]

残差是:

\[r_{\alpha i}^{\beta j} = \left( w_R \|R_{\beta j}-R_{\alpha i}\hat R_{\alpha i}^{\beta j}\|_F^2 + w_t \|t_{\beta j}-t_{\alpha i}-R_{\alpha i}\hat t_{\alpha i}^{\beta j}\|_2^2 \right)^{1/2}\]

这个式子的意思很简单:如果当前估计的两个位姿 $X_{\alpha,i},X_{\beta,j}$ 是对的,那么它们之间推出来的相对旋转和平移,就应该接近前端给出的回环测量。Kimera-Multi 对里程计边用普通二次代价,对回环边用截断最小二乘鲁棒代价。


2. 为什么多机器人问题必须先初始化?

单机器人位姿图有一个天然初值。你从第一帧开始,把 VIO 的相对运动一段一段乘起来,就能得到所有位姿的大致初值。

但 3 个机器人时,每个机器人只知道自己的局部坐标系:

\[A,\ B,\ C\]

例如:

  • $R_0$ 的轨迹在坐标系 $A$ 下;
  • $R_1$ 的轨迹在坐标系 $B$ 下;
  • $R_2$ 的轨迹在坐标系 $C$ 下。

这三个坐标系之间一开始没有关系。你不能直接把 $R_0$、$R_1$、$R_2$ 的位姿放进同一个全局图里优化。

所以 Section V 的第一步是:

先估计机器人局部坐标系之间的相对变换。

比如要把 $R_1$ 的坐标系 $B$ 对齐到 $R_0$ 的坐标系 $A$,我们需要估计:

\[X_B^A\]

也就是“从 $B$ 到 $A$ 的坐标变换”。


3. 一个机器人之间的回环如何推出坐标系变换?

假设 $R_0$ 和 $R_1$ 之间有一条回环:

\[X_{0,i} \leftrightarrow X_{1,j}\]

前端几何验证给出一个相对位姿测量:

\[\hat X_{0i}^{1j}\]

意思是:从 $R_0$ 的第 $i$ 帧看,$R_1$ 的第 $j$ 帧大概在哪里。

同时,两个机器人各自在自己的局部坐标系里有 VIO 初值:

\[\tilde X_{0,i}^{A}\] \[\tilde X_{1,j}^{B}\]

那么这一条回环可以推导出一个 $B$ 到 $A$ 的坐标系对齐候选值:

\[\tilde X_{B,ij}^{A} = \tilde X_{0,i}^{A} \hat X_{0i}^{1j} (\tilde X_{1,j}^{B})^{-1}\]

这个式子可以这样理解:

从 $B$ 坐标系下的 $R_1$ 第 $j$ 帧出发,先变到这个帧本身,再通过回环测量变到 $R_0$ 的第 $i$ 帧,最后再变到 $A$ 坐标系。

所以,每一条机器人之间的回环,都可以给出一个机器人坐标系之间的对齐候选。

如果 $R_0$ 和 $R_1$ 之间有 10 条回环,那么我们就有 10 个候选:

\[\tilde X_{B,1}^{A},\tilde X_{B,2}^{A},...,\tilde X_{B,10}^{A}\]

如果其中 8 条是真回环,它们推出的坐标系变换应该非常接近;如果 2 条是错回环,它们推出的变换会偏得很离谱。

这正是论文 Fig. 4 的核心意思:正确回环会给出彼此一致的坐标系对齐,错误回环会给出离群的对齐结果。


4. 鲁棒初始化:先做“坐标系对齐的鲁棒平均”

于是 $R_0$ 和 $R_1$ 的初始化问题变成:

\[X_B^A = \arg\min_{X\in SE(3)} \sum_{(i,j)\in\mathcal{L}_{01}} \rho \left( r_{ij}(X) \right)\]

其中:

\[r_{ij}(X) = \|X \ominus \tilde X_{B,ij}^{A}\|_{\Sigma}\]

也就是说,我们要在所有候选坐标系变换里面,找一个最一致的平均值,同时把离群候选降权或剔除。

这一步本质上不是完整的轨迹优化,而是:

在机器人对之间做一个鲁棒的相对坐标系估计。

以 3 个机器人为例:

  • $R_0$ 和 $R_1$ 之间估计 $X_B^A$
  • $R_1$ 和 $R_2$ 之间估计 $X_C^B$
  • $R_0$ 和 $R_2$ 之间如果有回环,也可以估计 $X_C^A$

然后构建一个机器人级别的图。节点是机器人,边是“这两个机器人之间有回环”。在这个机器人图上选一棵生成树。

比如选择:

\[R_0 \longleftrightarrow R_1 \longleftrightarrow R_2\]

把 $R_0$ 的坐标系 $A$ 当作全局坐标系,那么:

\[X_B^A\]

可以直接把 $R_1$ 初始化到 $A$ 下。

对 $R_2$,先有:

\[X_C^B\]

再组合:

\[X_C^A = X_B^A X_C^B\]

于是 3 个机器人的所有局部轨迹都被放进了同一个全局坐标系。

这就是 Kimera-Multi 的第一阶段。多机器人不像单机器人那样可以简单通过里程计链得到全局初值,所以 D-GNC 第一阶段要用鲁棒、通信高效的方法把所有机器人轨迹初始化到共同坐标系中;第二阶段才真正做完整的分布式鲁棒优化。


5. 什么是 GNC?先从普通鲁棒优化说起

现在假设 3 个机器人已经在同一个坐标系下了。接下来我们要优化完整位姿图。

如果所有回环都是对的,直接最小二乘就行:

\[\min_X \sum_i r_i(X)^2\]

但实际中会有错误回环。错误回环的问题是:它的残差很大,如果仍然用 $r^2$,它会强行把两个本来不该对齐的地方拉到一起,导致整张图被扯坏。

所以我们希望用截断最小二乘:

\[\rho(r)=\min(r^2,\bar c^2)\]

这个代价函数的图像是:小残差时是二次函数,大残差时直接封顶。

这就带来一个问题:它是非凸的。

非凸意味着优化很容易陷入错误局部最优。比如刚开始轨迹还没对齐时,某些正确回环的残差也可能很大,如果你一开始就用强鲁棒核,它可能会误判这些正确回环是外点,然后永远用不上它们。

GNC 的思想就是:

不要一开始就使用很硬的截断鲁棒核,而是从一个更平滑、更容易优化的近似问题开始,然后逐渐变成真正的截断最小二乘。

GNC 的核心是先从鲁棒代价函数的凸近似开始,再逐渐引入非凸性,从而避免收敛到错误解;每一步优化一个更容易的替代代价函数,最后逐渐逼近原始鲁棒代价函数。


6. GNC 的数学重写:给每条回环加一个权重

GNC 通过 Black–Rangarajan 对偶,把鲁棒优化写成带权重的形式:

\[\min_{X,\ w_i\in[0,1]} \sum_i \left[ w_i r_i(X)^2 + \Phi_{\rho_\mu}(w_i) \right]\]

这里每个回环约束都有一个权重:

\[w_i\in[0,1]\]

它的物理意义非常直观:

  • $w_i=1$:这条回环基本可信;
  • $w_i=0$:这条回环基本是外点;
  • $0<w_i<1$:暂时不确定,先部分相信。

于是原来的“非凸鲁棒优化”被改写成两个子问题交替做:

固定权重,优化轨迹:

\[X \leftarrow \arg\min_X \sum_i w_i r_i(X)^2\]

固定轨迹,更新权重:

\[w_i \leftarrow f(r_i,\mu,\bar c)\]

然后更新控制参数:

\[\mu \leftarrow \text{new }\mu\]

这就是 GNC 的主要结构。


7. GNC 权重更新到底怎么判断内点和外点?

Kimera-Multi 对截断最小二乘使用下面的权重更新规则:

\[w_i \leftarrow \begin{cases} 0, & \tilde r_i^2 \in \left[ \frac{\mu+1}{\mu}\bar c^2,\ +\infty \right] \\[4pt] \frac{\bar c}{\tilde r_i}\sqrt{\mu(\mu+1)}-\mu, & \tilde r_i^2 \in \left[ \frac{\mu}{\mu+1}\bar c^2,\ \frac{\mu+1}{\mu}\bar c^2 \right] \\[4pt] 1, & \tilde r_i^2 \in \left[ 0,\ \frac{\mu}{\mu+1}\bar c^2 \right] \end{cases}\]

这个公式看起来复杂,但意思非常简单。它有两个门槛:

低门槛:

\[\frac{\mu}{\mu+1}\bar c^2\]

高门槛:

\[\frac{\mu+1}{\mu}\bar c^2\]

如果残差平方低于低门槛,权重设为 1;如果高于高门槛,权重设为 0;如果在中间,就给一个 0 到 1 之间的软权重。

这个权重更新只依赖当前残差、控制参数 $\mu$ 和截断阈值 $\bar c$,因此特别适合分布式并行计算。

举一个数值例子。设:

\[\bar c=1\]

初期取:

\[\mu=0.1\]

则:

\[\frac{\mu}{\mu+1}\bar c^2 = \frac{0.1}{1.1} \approx 0.091\] \[\frac{\mu+1}{\mu}\bar c^2 = \frac{1.1}{0.1} = 11\]

这时候只有特别离谱的残差才会直接被置零。很多约束即使残差偏大,也只是被部分降权。这对应“先温和一点,不要太早杀死回环”。

后期如果:

\[\mu=10\]

则:

\[\frac{\mu}{\mu+1}\bar c^2 = \frac{10}{11} \approx 0.91\] \[\frac{\mu+1}{\mu}\bar c^2 = \frac{11}{10} \approx 1.1\]

这时候两个门槛非常接近 $\bar c^2=1$。残差小于阈值的基本保留,残差大于阈值的基本剔除。也就是说,GNC 后期才变成真正“硬”的截断最小二乘。

这就是“逐步非凸”的含义:一开始问题比较平滑,后面逐渐接近真正的鲁棒核。


8. 什么是 RBCD?先看固定权重后的问题

GNC 的每一轮都有一个“固定权重后优化轨迹”的步骤。

固定所有 $w_i$ 后,问题变成普通加权位姿图优化:

\[\min_{\{X_{\alpha,i}\}} \sum_{\alpha} \sum_{i=1}^{n_\alpha-1} r_{\alpha,i}(X_{\alpha,i},X_{\alpha,i+1})^2 + \sum_{(\alpha i,\beta j)\in\mathcal{L}} w_{\alpha i}^{\beta j} \cdot r_{\alpha i}^{\beta j}(X_{\alpha,i},X_{\beta,j})^2\]

这一步没有鲁棒核了,因为鲁棒性已经通过权重 $w$ 体现出来了。

现在问题是:这个加权 PGO 怎么分布式求?


9. RBCD 的核心:每个机器人只优化自己的轨迹块

RBCD 可以翻译成 流形块坐标下降

“块”的意思是:把变量按机器人分块。

\[X_0 = \{R_0 \text{ 的所有位姿}\}\] \[X_1 = \{R_1 \text{ 的所有位姿}\}\] \[X_2 = \{R_2 \text{ 的所有位姿}\}\]

全局目标函数可以写成:

\[F(X_0,X_1,X_2)\]

它由几部分组成:

\[F(X_0,X_1,X_2) = F_0(X_0) + F_1(X_1) + F_2(X_2) + F_{01}(X_0,X_1) + F_{02}(X_0,X_2) + F_{12}(X_1,X_2)\]

其中:

  • $F_0(X_0)$:机器人 0 自己的里程计边和内部回环;
  • $F_1(X_1)$:机器人 1 自己的里程计边和内部回环;
  • $F_2(X_2)$:机器人 2 自己的里程计边和内部回环;
  • $F_{01}(X_0,X_1)$:机器人 0 和机器人 1 之间的回环;
  • $F_{02}(X_0,X_2)$:机器人 0 和机器人 2 之间的回环;
  • $F_{12}(X_1,X_2)$:机器人 1 和机器人 2 之间的回环。

RBCD 的一次循环可以写成:

\[X_0^{k+1} = \arg\min_{X_0} F(X_0,X_1^k,X_2^k)\] \[X_1^{k+1} = \arg\min_{X_1} F(X_0^{k+1},X_1,X_2^k)\] \[X_2^{k+1} = \arg\min_{X_2} F(X_0^{k+1},X_1^{k+1},X_2)\]

也就是说:

先固定 $R_1,R_2$,让 $R_0$ 优化自己的整条轨迹。

再固定 $R_0,R_2$,让 $R_1$ 优化自己的整条轨迹。

最后固定 $R_0,R_1$,让 $R_2$ 优化自己的整条轨迹。

这就是“块坐标下降”。

为什么叫“流形”?因为 $X_{\alpha,i}$ 不是普通欧氏向量,而是在 $SE(3)$ 上的位姿。更新不能简单做:

\[X \leftarrow X+\Delta X\]

而要在位姿流形上做更新:

\[X \leftarrow X \oplus \delta\]

其中 $\delta$ 是切空间里的小增量。

更严格地说,Kimera-Multi 使用的 RBCD 是在位姿图的秩限制松弛上操作,然后再投影回 $SE(3)$,论文实现里默认松弛秩是 5;但从算法结构上,可以先把它理解成“每次只优化一个机器人自己的轨迹块,其他机器人的轨迹暂时固定”。


10. 3 个机器人通信时,RBCD 到底交换什么?

假设有下面几条机器人之间的回环:

\[X_{0,5} \leftrightarrow X_{1,8}\] \[X_{0,12} \leftrightarrow X_{2,3}\] \[X_{1,10} \leftrightarrow X_{2,6}\]

当 $R_0$ 更新自己的轨迹 $X_0$ 时,它需要计算和 $R_1,R_2$ 之间的回环残差。

对于边:

\[X_{0,5} \leftrightarrow X_{1,8}\]

$R_0$ 需要知道 $X_{1,8}$ 当前是多少。

对于边:

\[X_{0,12} \leftrightarrow X_{2,3}\]

$R_0$ 需要知道 $X_{2,3}$ 当前是多少。

但它不需要知道 $R_1$ 和 $R_2$ 的完整轨迹,只需要这些与自己有回环连接的关键帧位姿。

论文把这些叫作 public poses,可以翻译成“公开位姿”或“边界位姿”。RBCD 中每个机器人只负责估计自己的轨迹;当某个机器人更新时,它只需要与存在机器人间回环的邻居通信,并且只需要接收邻居机器人那些参与跨机器人回环的公开位姿。

所以一次 RBCD 循环的通信可以这样理解:

更新 $R_0$:

$R_0$ 向 $R_1$ 请求:

\[X_{1,8}\]

向 $R_2$ 请求:

\[X_{2,3}\]

然后固定它们,优化自己的 $X_0$。

更新 $R_1$:

$R_1$ 向 $R_0$ 请求:

\[X_{0,5}\]

向 $R_2$ 请求:

\[X_{2,6}\]

然后优化自己的 $X_1$。

更新 $R_2$:

$R_2$ 向 $R_0$ 请求:

\[X_{0,12}\]

向 $R_1$ 请求:

\[X_{1,10}\]

然后优化自己的 $X_2$。

这里的关键是:没有任何一个机器人需要拿到全队完整图,也没有中心服务器。


11. 把 GNC 和 RBCD 组合起来,就是 Kimera-Multi 的 D-GNC

现在把前面的东西合起来。

D-GNC 的整体流程是:

第 0 步:每个机器人本地跑 VIO

三个机器人各自得到自己的局部轨迹:

\[\tilde X_0^A,\ \tilde X_1^B,\ \tilde X_2^C\]

这些轨迹还不在同一个坐标系下。

第 1 步:鲁棒初始化

用机器人之间的回环,估计:

\[X_B^A,\ X_C^B,\ X_C^A\]

然后选机器人级生成树,把所有轨迹变到一个全局坐标系里。

比如选 $R_0$ 为全局坐标系:

\[X_0^A=\tilde X_0^A\] \[X_1^A=X_B^A\tilde X_1^B\] \[X_2^A=X_C^A\tilde X_2^C\]

这一步解决“多机器人没有共同坐标系”的问题。

第 2 步:所有回环权重初始化为 1

一开始不急着判断谁是外点:

\[w_i=1\]

这表示暂时相信所有回环。

第 3 步:固定权重,用 RBCD 优化轨迹

固定当前 $w_i$,问题变成加权 PGO:

\[\min_X \sum_{\text{里程计}} r^2 + \sum_{\text{回环}} w_i r_i^2\]

然后 3 个机器人按照块坐标下降更新:

\[R_0 \rightarrow R_1 \rightarrow R_2 \rightarrow R_0 \rightarrow ...\]

论文实现中,并不是每次都把这个加权 PGO 解到完全收敛,而是默认执行固定次数的 RBCD 迭代,默认 $T=15$。这样可以降低分布式求解的通信和计算时间,下一轮 GNC 会用当前结果继续热启动。

第 4 步:固定轨迹,更新每条回环权重

现在有了新的轨迹估计,就可以重新计算每条回环的残差。

比如边:

\[X_{0,5} \leftrightarrow X_{1,8}\]

如果当前轨迹下它残差很小:

\[r_{0,5}^{1,8} \approx 0\]

则:

\[w_{0,5}^{1,8}\rightarrow 1\]

如果残差巨大:

\[r_{0,5}^{1,8} \gg \bar c\]

则:

\[w_{0,5}^{1,8}\rightarrow 0\]

这一步可以分布式完成:

  • 单机内部回环:机器人自己算;
  • 机器人之间回环:两个相关机器人中的一个负责算,然后把新权重发给另一个。

每个回环权重可以独立并行更新;对于机器人之间的回环,由两个相关机器人中的一个计算新权重,然后发给另一个机器人。

第 5 步:更新 $\mu$

让代价函数更加接近真正的截断最小二乘。

也就是从“温和降权”逐渐变成“明确保留或剔除”。

第 6 步:重复 3–5

最终结果是:

  • 正确回环权重接近 1;
  • 错误回环权重接近 0;
  • 每个机器人得到全局一致轨迹;
  • 整个过程不需要中心服务器。

12. 用一个具体小例子串起来

假设三台机器人 $R_0,R_1,R_2$ 各走了一段轨迹。

前端检测到这些机器人之间的回环:

\[e_1: X_{0,5} \leftrightarrow X_{1,8}\] \[e_2: X_{0,10} \leftrightarrow X_{1,15}\] \[e_3: X_{1,6} \leftrightarrow X_{2,4}\] \[e_4: X_{0,20} \leftrightarrow X_{2,2}\]

其中 $e_4$ 是错误回环。

初始化阶段

$e_1,e_2$ 都连接 $R_0,R_1$,它们各自推出一个 $B$ 到 $A$ 的坐标系变换:

\[\tilde X_{B,1}^{A},\tilde X_{B,2}^{A}\]

如果它们一致,就得到可靠的:

\[X_B^A\]

$e_3$ 连接 $R_1,R_2$,推出:

\[X_C^B\]

于是:

\[X_C^A=X_B^A X_C^B\]

这样三台机器人进入共同坐标系。

$e_4$ 虽然是错误回环,但如果不在生成树上,初始化阶段可能暂时不影响坐标系传播;即使它参与某个 pairwise 对齐,GNC 也倾向于把它作为离群候选降权。

第一次 GNC 外层循环

所有权重先设为:

\[w_1=w_2=w_3=w_4=1\]

RBCD 优化轨迹时,四条回环都会拉动轨迹。但因为鲁棒初始化已经比较好,正确回环 $e_1,e_2,e_3$ 的残差会变小,错误回环 $e_4$ 仍然很大。

权重更新后:

\[w_1\approx 1,\quad w_2\approx 1,\quad w_3\approx 1,\quad w_4<1\]

后续 GNC 外层循环

随着 $\mu$ 增大,判断越来越硬:

\[w_4\rightarrow 0\]

于是 $e_4$ 在后续 RBCD 优化中几乎不再起作用。

最终优化问题近似变成:

\[\min_X \sum_{\text{里程计}} r^2 + r_{e_1}^2 + r_{e_2}^2 + r_{e_3}^2\]

错误回环被自动剔除。

这就是 D-GNC 的本质:用 GNC 判断哪些回环可信,用 RBCD 在分布式网络里优化可信回环约束下的全局轨迹。


13. 为什么不能只用 RBCD,不用 GNC?

只用 RBCD 的话,固定目标就是普通最小二乘:

\[\min_X \sum_i r_i^2\]

错误回环残差很大,平方之后影响更大,会强行把轨迹拉坏。

RBCD 只是一个分布式求解器,它不负责判断哪条边是错的。它只能优化你给它的目标函数。

所以:

  • RBCD 解决的是“怎么分布式优化”
  • GNC 解决的是“哪些回环该信,哪些不该信”

没有 GNC,RBCD 会被错误回环污染。


14. 为什么不能只用 GNC,不用 RBCD?

只用 GNC 默认是集中式框架。固定权重后的变量更新需要解一个完整加权 PGO:

\[\min_X \sum_i w_i r_i^2\]

如果集中式求解,必须有一个中心节点拿到所有机器人轨迹、所有边、所有回环。

这违反 Kimera-Multi 的分布式设定。

所以:

  • GNC 提供鲁棒框架
  • RBCD 让 GNC 的变量更新步骤分布式化

这就是“分布式 GNC + RBCD”的真实含义。


15. 一句话总结 Kimera-Multi Section V

Kimera-Multi 的 Section V 可以总结成:

先用机器人间回环估计各机器人局部坐标系之间的鲁棒初始对齐;然后把多机器人 SLAM 写成带外点回环的位姿图优化问题;再用 GNC 给每条回环引入可更新权重,实现外点剔除;最后在 GNC 的每次固定权重优化中,用 RBCD 让每个机器人只优化自己的轨迹块,并只和邻居交换公开位姿,从而实现鲁棒分布式位姿图优化。

可以把它记成这个公式关系:

\[\text{D-GNC} = \text{鲁棒初始化} + \text{GNC 外层鲁棒权重更新} + \text{RBCD 内层分布式轨迹优化}\]

其中:

\[\text{GNC}:\quad \text{决定每条回环的可信度}\] \[\text{RBCD}:\quad \text{在固定可信度下分布式优化轨迹}\]

这才是 Kimera-Multi 分布式后端的核心。




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • Google Gemini updates: Flash 1.5, Gemma 2 and Project Astra
  • Displaying External Posts on Your al-folio Blog
  • LLM微调——LoRA
  • 主流多机SLAM框架——多机SLAM问题思考与总结
  • 主流多机SLAM框架3——SlideSLAM