基于图的SLAM1
使用因子图表示,节点表示状态,边表示约束,通常形式为:
zij=hij(xi,xj)+nij(1)
其中hij是状态到测量的映射,nij是零均值白噪声
nij∼N(0,Λij−1)(2)
这就变成了MLE问题:
x^=argxmin(i,j)∈supp(z)∑∥zij−hij(xi,xj)∥Λij2(3)
然后就是使用马氏距离,利用迭代的方式求解这个问题。但是由于地图的增长,节点和边增加,变得耗费计算资源。
马尔科夫毯上通过边缘化移除节点
- 最好的线性化点应该是 local state estimate
为了减少代价,使用马尔科夫毯的概念,将节点分为以下几个类别:
x=[xmTxbTxrT]T(4)
其中,xm表示要边缘化掉的节点,xb表示马尔科夫毯中与边缘化节点直接相连的节点,xr表示这个图中剩余的节点。
将观测划分为:
{zb,zr}={zm,zc,zr}(5)
其中zm是直接约束xm的测量,zb表示马尔科夫毯中所有的约束,zc表示马尔科夫毯中除了zm其他的约束,zr表示剩下的约束。
举例,Fig1:

xmxbxrzmzczr=x1=[x0T,x2T,x3T]T=x4={z01,z12,z13}={z0,z03,z23}={z04,z34}(6)
边缘化之后的节点会产生一个先验约束xb
p(xb∣zm)=∫xmp(xb,xm∣zm)dxm=:N(x^b,Λt−1)(7)
边缘化之后,除了由于线性化导致的误差外,所有的信息都在zm中,没有损失。
边缘化后的先验分布
为了得到公式(7)的分布参数( mean and covariance),求解一个最大后验问题:
maxp(xb∣zm)=∫xmmaxp(xb,xm∣zm)dxm(8)
对于xb,xm一般没有先验信息,在马尔科夫毯上求解下面的 local MLE 问题:
{x^b,x^m}=argxb,xmmaxp(zm∣xb,xm)=argxb,xmmin(i,j)∈supp(zm)∑∥zij−hij(xi,xj)∥Λij2(9)
公式(9)最终得到的信息矩阵为
Λ=(i,j)∈supp(zm)∑Hij⊤ΛijHij=:[ΛmmΛbmΛmbΛbb](10)
对其进行边缘化得到信息矩阵:
Λt=Λbb−ΛbmΛmm−1Λbm⊤(11)
先验信息确定之后,MLE 问题就可以转化为最小二乘问题:
x^=argxmin∥x^b−xb∥Λt2+(i,j)∈supp(zr,zc)∑∥zij−hij(xi,xj)∥Λij2(12)
到这为止的理解:可以分为两步考虑
- 第一,只有节点xm和xb节点,约束是他们之间的zm,进行公式(9)的求解。这时得到了均值{x^b,x^m},信息矩阵公式(10)。对xm进行边缘化,这样就得到了xb的先验。
- 第二,这时节点xr加入,进行公式(12)的优化,将之前优化得到的结果作为先验,利用剩余的约束进行优化。
*Lemma 4.1:*如果公式(10)中测量方程雅克比,以及公式(11)中的信息矩阵是 local MLE 估计的结果。那么公式(12)是原来边缘化结果的二阶最优近似。
对Lemma 4.1的证明:
可以将节点划分为:
c(x)=cm(xm,xb)+cr(xb,xr)(13)
因此有:
xminc(x)=xb,xrmin(xmminc(xm,xb,xn))=xb,xrmin(cr(xb,xr)+xmmincm(xm,xb))(14)
将cm进行二阶展开得到:
cm≃cm(x^m,x^b)+gT[xm−x^mxb−x^b]+21[xm−x^mxb−x^b]TΛ[xm−x^mxb−x^b](15)
其中g=[gmmgmb],$
\boldsymbol{\Lambda}=\left[ \begin{array}{ll}{\boldsymbol{\Lambda}{m m}} & {\boldsymbol{\Lambda}{m b}} \ {\boldsymbol{\Lambda}{b m}} & {\boldsymbol{\Lambda}{b b}}\end{array}\right]
,线性化点是[\hat{\bf x}_m, \hat{\bf x}_b]$。
对公式(15)求关于xm的最小值得到:
xm=x^m−Λmm−1(gmm+Λmb(xb−x^b))(16)
把公式(16)带入公式(15)得到,使用二次函数最低点公式:
xmmincm(xm,xb)≃ζ+gtT(xb−x^b)+21(xb−x^b)TΛt(xb−x^b)(17)
其中ζ是常数项,其中:
gtΛt=gmb−ΛbmΛmm−1gmm=Λbb−ΛbmΛmm−1Λmb(18)
将公式(17)代入公式(14)之中就可以得到,与原问题等价的:
cr′(xb,xr)=gtT(xb−x^b)+21(xb−x^b)TΛt(xb−x^b)+21(i,j)∈supp(zr,zc)∑∥zij−hij(xi,xj)∥Λij2(19)
如果线性展开点是局部最小值,这样公式(19)的一阶梯度项就消失了,因为极值点处的导数为0!因此这也公式(19)就变成了公式(12)。
得证。
相对MLE公式
马尔科夫毯的测量提供的只是关于节点的相关信息,如果想得到全局状态估计,局部 MLE 问题即公式(9)是缺少约束的。为了得到完全约束,我们把相对状态估计进行重新参数化,如同得到先验一样。就是把MLE问题转移到某个节点的参考帧上进行计算。
如图Fig1所示,我们就是把该问题公式(9)转换到为相对于节点x0的局部参考帧上:
{0x^i}i=13=arg{0xi}i=13maxp(zm∣0x1,0x2,0x3)(20)
边缘化掉x1之后,这部分以公式(21)的形式对公式(12)的第一项有贡献。
∥∥∥∥[0x^20x^3]−[x2⊖x0x3⊖x0]∥∥∥∥0Λt2(21)
也就是从global变换到了local帧。这个测量就是在local帧上线性化,global上非线性化。
备注
GLC方法中将参考帧转移到任意一个节点,使用的是节点的全局估计,根据Lemma4.1,说明这个不是最优的近似,导致了不一致的结果。NFR 使用局部线性化点,通过固定节点的估计找到全局帧下局部线性化点。
注意的是,边缘化子图的选择只使用与被边缘化节点直接相连的因子(约束)就可以,不需要zb,但是GLC和NFR为了边缘化过程有更好的稀疏性,包含了这些节点,并且在后续的优化中不进行重新的线性化。
在代码中注意,这几种的处理方式!!
边的稀疏化
边缘化破坏了稀疏性,提出了在线的稀疏拓扑求解,使用稀疏因子代替稠密测量。
在线确定稀疏拓扑
使用l1正则化KLD来求解稀疏信息矩阵。使用的是局部,转移到参考帧的信息矩阵LΛt。
推断测量增加到具有非零条目的节点间,另外局部先验测量也被增加到每个节点。如下图

构建一致稀疏因子
稀疏因子不仅要符合稀疏拓扑,还要和原局部目标信息一致。
推断因子有以下形式:
z˘ij=h˘ij(xi,xj)+n˘ij(22)
其中噪声的信息矩阵需要确定。
首先,构建公式(22)的期望值和相应的雅克比,使用Lx^作为线性化点。即
z˘^ij=h˘ij(Lx^i,Lx^j), and H˘ij=∂x∂h˘ij∣x=Lx^(23)
我们希望新的测量不比原因子包含额外的信息,是一致的。使用最小化KLD来求解。使得稀疏化之后,不会变得过度自信(协方差变小)。
解耦稀疏化和边缘化
边缘化之后推迟稀疏化,先边缘化再稀疏化。
- 直到稀疏化之前,剩余节点的信息都包含在稠密因子中,可以重用。
- 稀疏化之前可以重新线性化内部的非线性化测量,保证精度。
- 交错边缘化和稀疏化,分配计算量。
总结,首先在马尔科夫毯上进行局部相对优化,并计算边缘分布。然后进行边的稀疏化,找到新的稀疏因子代替稠密的内部因子。
VO中的滑窗介绍2
滑窗的方式在计算量和精度进行了折中,在边缘化之后如何对丢弃状态的不确定性进行建模是精度的关键。标准边缘化导致了不一致性,同一状态的不同估计被用来了计算雅克比矩阵。这导致了把不是测量实际提供的信息计算出来的状态空间方向加入到了状态中,就是沿着不可观测方向前进了。这进而导致了估计的协方差被错误估计,变得不一致,精度不准确。
提出一种方法,保证计算雅克比时,只有一种估计被利用。
一致性: A recursive estimator is termed consistent when the state estimation errors are zero mean, and their covariance equals the one reported by the estimator
滑窗VO
BA
相机相对于全局参考帧的姿态:
ci=[qCipCi](24)
观测模型:
zij=h(C(qCi)(pLj−pCi))+nij(25)
其中nij∼N(02×1,Rij).
优化的概率密度函数为:
p(xk∣z0:k)=p(xk)(i,j)∈Sa(k)∏p(zij∣ci,pLj)(26)
其中p(xk)是状态先验信息的,例如第一帧添加全局尺度信息。建模为:f(xk)∼N(f^,Rp)
公式(26)变成最小化cost function
c(xk)=21∥∥∥f(xk)−f^∥∥∥Rp+21(i,j)∈Sa(k)∑∥∥zij−h(ci,pLj)∥∥Rij(27)
求解:
A(ℓ)Δx(ℓ)=−b(ℓ)(28)
其中
A(ℓ)=FTRp−1F+(i,j)∈Sa(k)∑Hij(ℓ)TRij−1Hij(ℓ)(29)
b(ℓ)=FTRp−1(f(xk(ℓ))−f^)−(i,j)∈Sa(k)∑Hij(ℓ)TRij−1(zij−h(ci(ℓ),pLj(ℓ)))(30)
雅克比矩阵为
Hij(ℓ)=[0...HLij(xk(ℓ))...HCij(xk(ℓ))...0](31)
其中对相机位姿和点位置的雅克比:
HCij(xk)HLij(xk)Γij=ΓijC(qCi)[⌊(pLj−pCi)×⌋CT(qCi)−I3]=ΓijC(qCi)=∂p∂h(p)∣∣∣∣p=C(qCi)(pLj−pCi)(32)
这里求导需要会,使用了(Rp)∧=Rp∧RT
旧状态边缘化
要边缘化的旧的状态:
xm={c0,…,cm−1,pL1,…,pLq}(33)
滑窗中的活动状态:
xr={cm,…,ck,pLq+1,⋯,pLn}(34)
边缘化:
bp(k)=bmr(k)−Arm(k)Amm(k)−1bmm(k)(35)
Ap(k)=Arr(k)−Arm(k)Amm(k)−1Amr(k)(36)
这里
bm(k)==[bmm(k)bmr(k)]FTRp−1(f(x^k(k))−f^)−(i,j)∈Sm∑HijT(k)Rij−1(zij−h(c^i(k),p^Lj(k)))(37)
Am(k)=[Amm(k)Arm(k)Amr(k)Arr(k)]=FTRp−1F+(i,j)∈Sm∑Hij(k)Rij−1Hij(k)(38)
注意上面的矩阵都是针对要被边缘化的状态Sm,因为有共视关系所以有r状态。
Ap(k)代表了提供给估计xr的所有先验和被抛弃的测量信息。
之后继续运行到k′时刻,包含了xr,xn状态,进行优化第ℓ次迭代:
b(ℓ)=ΠrTbp(k)+ΠrTAp(k)(xr(ℓ)−x^r(k))−(i,j)∈Sa(k′)∑Hij(ℓ)TRij−1(zij−h(ci(ℓ),pLj(ℓ)))(39)
A(ℓ)=ΠrTAp(k)Πr+(i,j)∈Sa(k′)∑Hij(ℓ)TRij−1Hij(ℓ)(40)
公式(39)(40)优化的就是状态xr,xn,其中Πr=[Idimxr0]
然后重复之前的边缘化步骤。
估计的一致性
证明了特征测量的信息矩阵的秩错误的增加了。
普通的BA中在[0,k′]内的信息矩阵
Jba(k′)=(i,j)∈S∑HijT(k′)Rij−1Hij(k′)(41)
这里的雅克比线性展开点在K′
滑窗算法中的信息矩阵,要包含与公式(41)相同的项,使用相同的测量。
Jmar(k′)=(i,j)∈Sm∑HijT(k)Rij−1Hij(k)+(i,j)∈Sa(k′)∑HijT(k′)Rij−1Hij(k′)(42)
这里的雅克比线性展开点,前半部分在k,后半部分在k′。这两个不同状态使得某些可以消去的项变得不行。因此两个矩阵的秩变得不一样。
rank(Jmar(k′))=rank(Jba(k′))+3(43)
这使得信息矩阵包含了更多的信息(沿着状态空间的更多方向),因此低估了状态的不确定性。使得该问题变得不一致且是次优的。其它方式的边缘化也有这个问题。
公式(43)证明,参考论文2中的3.1使用双目作为例子。
物理解释
正常的零空间(不可观的状态)是6 个维度,是全局旋转和全局平移。但是边缘化发生后,零空间缺少了3个维度,是全局的角度。这使得全局方向变得可观。
性能改进办法
出现这个问题的主要原因是,在测量雅克比中出现了两个不同的某些状态估计。特别是某些边缘化掉的测量和当前剩余状态xr相连。例如,相机位姿在边缘化后留在了滑窗中,但是其观测的某个点在k时刻被边缘化掉。这样它的信息矩阵就会出现在公式(36)中,而当我们在k′时刻对该相机位姿进行优化使用的是k′的状态计算雅克比。
为了解决这个问题,只能改变用于计算雅克比的状态估计。**在当前状态和边缘化状态相连时,使用边缘化时刻的状态来计算后面的雅克比。**这样保证了信息矩阵只有一个状态。注意,旧的状态只用来计算雅克比。
诚然,这样导致了线性展开的误差,因此使用时还是要保证在较好的状态下。
比较有意思的一个公式:
rank(AB)=rank(B)−dim(N(A)⋂R(B))(44)
举例



对应的信息矩阵变化为:

第1个矩阵是原始矩阵,对应第一张因子图。将要边缘化的相机状态移动到左上角之后,将其边缘化,对应着第二张因子图。矩阵有2变3了,可以发现它使得矩阵变得稠密了,有3行都出现fill-in了。之后边缘化掉点m1,对应第三张因子图。矩阵由3变成4了。通过这次变换,发现矩阵没有变得稠密。
因此,边缘化要尽量边缘化掉那些不被其它帧观测到的点,观测到的点不边缘化或者直接丢弃。那么问题来了,没观测到的点提供的先验信息不就很少了吗?

利用这张图3可以对公式(42)进行解释,第一个是原始的两个非线性函数组成的能量函数图,深蓝色部分是他的零空间。第二三个是在两个不同的展开点分别进行线性展开。最后加在一起得到第四个,发现原来的零空间变小了,不确定变得确定了,不可观变得可观了。和之前的解释一样。
SLAM中边缘化与高斯推断的边缘概率区别
高斯推断中边缘概率求解,可以发现,是先对协方差矩阵进行LDU分解,然后再求逆的。

而对于SLAM中的边缘化,从公式(11)(36)都可以看出来是直接对信息矩阵进行的分解消元,也就是先求逆再分解。结果是不一样的。它们都使用了舒尔补,具体有啥不同呢,还得再研究。

参考PRML的2.3.1和2.3.2可以明显的发现,边缘化和求条件概率是不一样的!!!
再说一句,边缘化是把另一个变量当做变量积分掉,求条件概率是把另一个变量当做常数忽略掉。
Reference
-
Decoupled, Consistent Node Removal and Edge Sparsification for Graph-based SLAM ↩︎
-
Consistency Analysis for Sliding-Window Visual Odometry ↩︎ ↩︎
-
https://blog.csdn.net/heyijia0327/article/details/52822104 ↩︎