后端-1

概述

状态估计的概率介绍

SLAM过程可由运动方程和观测方程来描述。那么,假设在t=0到t=N的时间内,有 x0 x 0 xN x N 那么多个位姿,并且有 y1,...,yM y 1 , . . . , y M 那么多个路标。运动和观测方程为:

{xk=f(xk1,uk)+wkzk,j=h(yj,xk)+vk,jk=1,...,N,j=1,...,M { x k = f ( x k − 1 , u k ) + w k z k , j = h ( y j , x k ) + v k , j k = 1 , . . . , N , j = 1 , . . . , M

注意:

  1. 观测方程中,只有当 xk x k 看到 yj y j 时,才会产生观测数据,否则就没有。事实上,在一个位置上通常只能观测到一小部分路标。而且,由于视觉SLAM特征点众多,所以实际当中观测方程数量远远大于运动方程数量。
  2. 可能没有测量运动的装置,所以也有可能没有运动方程。在这种情况下,有若干种处理方式:认为确实没有运动方程,或假设相机不动,或者假设相机匀速运动。这几种方式都是可行的。在没有运动运动方程的情况下,整个优化问题就只由许多观测方程组成。这种就非常类似于SfM(structure from motion)问题,就相当于我们通过一组图像恢复运动和结构。与SfM不同的是,SLAM中的图像有时间上的先后顺序,而SfM允许使用完全无关的图像。
    由于位姿和路标点都是待估计的变量,改变一下记号,令 xk x k 为k时刻所有的未知量。它包含当前时刻的相机位姿和m个路标点。在这种记号的意义下,写成:
    xk{xk,y1,,ym} x k ≜ { x k , y 1 , ⋯ , y m }

同时,把k时刻的所有观测基座 zk z k 。于是,运动方程与观测方程的形式更加简洁。

{xk=f(xk1,uk)+wkzk=h(xk)+vk,j { x k = f ( x k − 1 , u k ) + w k z k = h ( x k ) + v k , j

现在考虑第k时刻的情况。我们希望通过0到k时刻中的数据,来估计现在的状态分布:
P(xk|x0,u1:k,z1:k) P ( x k | x 0 , u 1 : k , z 1 : k )

下表0:k表示0时刻到k时刻的所有数据。按照Bayes法则,把 zk z k xk x k 交换位置,有:
P(xk|x0,u1:k,z1:k)P(zk|xk))P(xk|x0,u1:k,z1:k1) P ( x k | x 0 , u 1 : k , z 1 : k ) ∝ P ( z k | x k ) ) P ( x k | x 0 , u 1 : k , z 1 : k − 1 )

第一项成为似然,第二项称为先验。似然由观测方程给出,而先验部分, xk x k 是基于所有过去状态估计得来的。至少它会受 xk1 x k − 1 影响,于是按照 xk1 x k − 1 时刻条件概率展开:
P(xk|x0,u1:k,z1:k1)=P(xk|xk1,u1:k,z1:k1)P(xk1|x0,u1:k,z1:k1)dxk1 P ( x k | x 0 , u 1 : k , z 1 : k − 1 ) = ∫ P ( x k | x k − 1 , u 1 : k , z 1 : k − 1 ) P ( x k − 1 | x 0 , u 1 : k , z 1 : k − 1 ) d x k − 1

如果我们考虑更久之前的状态,也可以继续对此式进行展开,但现在我们只关心k时刻和k-1时刻的情况。后续处理,存在若干种选择:其一是假设马尔可夫性,简单的一阶马氏性认为,k时刻状态只与k-1时刻状态有关,而与再之前的无关。如果做出这样的假设,我们就会得到以扩展卡尔曼滤波(EKF)为代表的滤波器方法。在滤波方法中,我们会从某时刻的状态估计,推导到下一时刻。另一种方法是依然考虑k时刻状态与之前所有状态的关系,此时将得到非线性优化为主题的优化框架。

线性系统和KF

当我们假设了马尔可夫性,从数学角度会发生哪些变化呢?

P(xk|xk1,u1:k,z1:k1)=P(xk|xk1,uk) P ( x k | x k − 1 , u 1 : k , z 1 : k − 1 ) = P ( x k | x k − 1 , u k )

P(xk1|x0,u1:k,z1:k1)=P(xk1|x0,u1:k1,z1:k1) P ( x k − 1 | x 0 , u 1 : k , z 1 : k − 1 ) = P ( x k − 1 | x 0 , u 1 : k − 1 , z 1 : k − 1 )

我们从形式最简单的线性高斯系统开始,最后会得到卡尔曼滤波器。线性高斯系统是说,运动方程和观测方程可以由线性方程来描述:

{xk=Akxk1+uk+wkzk=Ckxk+vkk=1,,N { x k = A k x k − 1 + u k + w k z k = C k x k + v k k = 1 , ⋯ , N

并假设所有的状态和噪声均满足高斯分布。记这里的噪声服从零均值高斯分布:
wkN(0,R).vkN(0,Q) w k ∼ N ( 0 , R ) . v k ∼ N ( 0 , Q )

现在,利用马尔可夫性,假设我们知道了k -1时刻的后验(在 k - 1 时刻看来)状态估计: x^k1 x ^ k − 1 和它的协方差 P^k1 P ^ k − 1 ,现在要根据 k 时刻的输入和观测数据,确定 xk x k 的后验分布。为区分推导中的先验和后验,我们在记号上作一点区别:以尖帽子 x^k x ^ k 表示后验,以横线 x¯¯¯k x ¯ k 表示先验分布。
卡尔曼滤波器的第一步,通过运动方程确定 xk x k 的先验分布。根据高斯分布的性质,显然有:

P(xk|x0,u1:k,z1:k1)=N(Akx^k1+uk,AkP^k1ATk+R) P ( x k | x 0 , u 1 : k , z 1 : k − 1 ) = N ( A k x ^ k − 1 + u k , A k P ^ k − 1 A k T + R )

这一步成为预测,它显示了如何从上一时刻的状态,根据输入信息,推测当前时刻的状态的分布。这个分布也就是先验。记这里的:
x¯¯¯k=Akx^k1+ukP¯¯¯¯k=AkP^k1ATk+R x ¯ k = A k x ^ k − 1 + u k P ¯ k = A k P ^ k − 1 A k T + R

另一方面,由观测方程,我们可以计算在某个状态下,应该产生怎样的观测数据:

P(zk|xk)=N(Ckxk,Q) P ( z k | x k ) = N ( C k x k , Q )

为了得到后验概率,我们想要计算它们的乘积。虽然我们知道最后得到一个关于 xk x k 的高斯分布,但是计算上很麻烦,我们先把结果设为 xkN(x^k,P^k) x k ∼ N ( x ^ k , P ^ k ) ,那么:
N(x^k,P^k)=N(Ckxk,Q).N(x¯¯¯k,P¯¯¯¯k) N ( x ^ k , P ^ k ) = N ( C k x k , Q ) . N ( x ¯ k , P ¯ k )

这里我们稍微用点讨巧的方法。既然我们已经知道等式两侧都是高斯分布,那就只需比较指数部分即可,而无须理会高斯分布前面的因子部分。指数部分很像是一个二次型的配方,我们来推导一下。首先把指数部分展开,有:
(xkx^k)TP^1k(xkx^k)=(zkCkxk)TQ1(zkCkxk)+(xkx¯¯¯k)TP1k(xkx¯¯¯k) ( x k − x ^ k ) T P ^ k − 1 ( x k − x ^ k ) = ( z k − C k x k ) T Q − 1 ( z k − C k x k ) + ( x k − x ¯ k ) T P k − 1 ( x k − x ¯ k )

为了求左侧的 x^k x ^ k P^k P ^ k ,我们把两边展开,并比较 xk 的二次和一次系数。对于二次系数,有:
P^1k=CTkQ1Ck+P¯¯¯¯1k P ^ k − 1 = C k T Q − 1 C k + P ¯ k − 1

该式给出了协方差的计算过程。为了便于后边列写式子,定义一个中间变量:
K=P^kCTkQ1 K = P ^ k C k T Q − 1


P^kP^1k=I=P^kCTkQ1Ck+P^kP¯¯¯¯1k=KCk+P^kP¯¯¯¯1k P ^ k P ^ k − 1 = I = P ^ k C k T Q − 1 C k + P ^ k P ¯ k − 1 = K C k + P ^ k P ¯ k − 1

于是有:
P^k=(IKCk)P¯¯¯¯k P ^ k = ( I − K C k ) P ¯ k

然后再比较一次项的系数,有:
2x^TkP^1kxk=2zTkQ1Ckxk2x¯¯¯TkP¯¯¯¯1kxk − 2 x ^ k T P ^ k − 1 x k = − 2 z k T Q − 1 C k x k − 2 x ¯ k T P ¯ k − 1 x k

整理得:
P^1kx^k=CTkQ1zk+P¯¯¯¯1kx¯¯¯k P ^ k − 1 x ^ k = C k T Q − 1 z k + P ¯ k − 1 x ¯ k

两侧乘以 P^k P ^ k 得:
x^k=P^kCTkQ1zk+P^kP¯¯¯¯1kx¯¯¯k=Kzk+(IKCk)x¯¯¯k=x¯¯¯k+K(zkCkx¯¯¯k) x ^ k = P ^ k C k T Q − 1 z k + P ^ k P ¯ k − 1 x ¯ k = K z k + ( I − K C k ) x ¯ k = x ¯ k + K ( z k − C k x ¯ k )

总结为预测和更新两步:

  1. 预测:
    x¯¯¯k=Akx^k1+ukP¯¯¯¯k=AkP^k1ATk+R x ¯ k = A k x ^ k − 1 + u k P ¯ k = A k P ^ k − 1 A k T + R
  2. 更新:先计算K,它又称为卡尔曼增益:
    K=P¯¯¯¯kCTk(CkP¯¯¯¯kCTk+Q)1 K = P ¯ k C k T ( C k P ¯ k C k T + Q ) − 1
    然后就算后验概率的分布:
    x^k=x¯¯¯k+K(zkCkx¯¯¯k) x ^ k = x ¯ k + K ( z k − C k x ¯ k )
    P^k=(IKCk)P¯¯¯¯k P ^ k = ( I − K C k ) P ¯ k

卡尔曼滤波器构成了线性系统的最优无偏估计。

非线性系统和EKF

SLAM中的运动方程和观测方程通常是非线性函数,尤其是视觉中的相机模型,需要使用相机内参模型以及李代数表示位姿,更不可能是一个线性系统。一个高斯分布,经过非线性变换后,往往不再是高斯分布,所以在非线性系统中,我们必须取得一定的近似,将一个非高斯的分布近似成一个高斯分布。把卡尔曼滤波器的结果拓展到非线性系统中来,称为扩展卡尔曼滤波器(Extended Kalman Filter,EKF)。通常的做法是,在某个点附近考虑运动方程和观测方程的一阶泰勒展开,只保留一阶项,即线性部分,然后按照线性系统进行推导。令k-1时刻的均值和协方差矩阵为 x^k1,P^k1 x ^ k − 1 , P ^ k − 1 。在k时刻,我们把运动方程和观测方程,在 x^k1,P^k1 x ^ k − 1 , P ^ k − 1 处进行线性化(相当于一阶泰勒展开),有:

xkf(x^k1,uk)+fxk1|x^k1(xk1x^k1)+wk x k ≈ f ( x ^ k − 1 , u k ) + ∂ f ∂ x k − 1 | x ^ k − 1 ( x k − 1 − x ^ k − 1 ) + w k

记这里的偏导数:
F=fxk1|x^k1 F = ∂ f ∂ x k − 1 | x ^ k − 1

同样的,对于观测方程:
zkh(x¯¯¯k)+hxk|x¯¯¯k+nk z k ≈ h ( x ¯ k ) + ∂ h ∂ x k | x ¯ k + n k

记这里的偏导数
H=hxk|x¯¯¯k H = ∂ h ∂ x k | x ¯ k

预测步骤中,根据运动方程有
P(xk|x0,u1:k,z0:k1)=N(f(x^k1,uk),FP^k1FT+Rk) P ( x k | x 0 , u 1 : k , z 0 : k − 1 ) = N ( f ( x ^ k − 1 , u k ) , F P ^ k − 1 F T + R k )

这里的先验和协方差为
x¯¯¯k=f(x^k1,uk),P¯¯¯¯k=FP^k1FT+Rk x ¯ k = f ( x ^ k − 1 , u k ) , P ¯ k = F P ^ k − 1 F T + R k

考虑观测中,我们有
P(zk|xk)=N(h(x¯¯¯k)+H(xkx¯¯¯k),Qk) P ( z k | x k ) = N ( h ( x ¯ k ) + H ( x k − x ¯ k ) , Q k )

根据Bayes展开式,可以推导 xk x k 的后验概率形式。
我们先定义一个卡尔曼增益 Kk K k
Kk=P¯¯¯¯kHT(HP¯¯¯¯kHT+Qk)1 K k = P ¯ k H T ( H P ¯ k H T + Q k ) − 1

在卡尔曼增益的基础上,后验概率的形式为:
x^k=x¯¯¯k+Kk(zkh(x¯¯¯k)),P^k=(IKkH)P¯¯¯¯k x ^ k = x ¯ k + K k ( z k − h ( x ¯ k ) ) , P ^ k = ( I − K k H ) P ¯ k

在线性系统和高斯噪声情况下,卡尔曼滤波给出了无偏最优估计。而在SLAM这种非线性的情况下,他给出了单次线性近似下最大后验估计(MAP)。

EKF的讨论

非线性优化比滤波器占有明显的优势,但是在计算资源受限,带估计量比较简单的场合,EKF仍不失为一种有效的方式。
EKF有哪些局限性?

  1. 首先,滤波器方法在一定程度上假设了马尔可夫性,也就是k时刻的状态只与k-1时刻相关,而与k-1之前的状态与观测无关(或者和前几个有限时间的状态相关)。这里有点类似于视觉里程计,只考虑相邻两帧关系一样。如果当前帧真的与很久之前的数据相关,那么滤波器很难处理这种情况。而非线性优化则倾向于使用所有的历史数据。它不光考虑临近时刻的特征点与轨迹关系,更会吧考虑很久之前的状态考虑进来,称为全体时间上的SLAM(FULL SLAM)。在这种意义下,非线性优化算法使用更多的信息,当然也需要更多的计算。
  2. EKF滤波器仅在 x^k1 x ^ k − 1 出做了一次线性化,存在非线性误差。
  3. 从程序实现上来说,EKF需要存储状态量的均值和方差,并对他们进行维护和更新。如果把路标也放进状态的话,由于视觉SLAM中路标数量很大,这个数量是相当大的,且与状态呈平方增长。因此EKF SLAM被普遍认为不可适用于大型场景。

BA与图优化

Bundle Adjustment,是指从视觉重建中提取最优的3D模型和相机参数(内参数和外参数)。从每一个特征点反射出来的技术光线,在我们把相机姿态和特征点空间位置做出最优的调整后,最后收束到相机光心的过程,我们简称BA。
在以图优化框架的视觉SLAM算法中,BA起到了核心作用。它类似于求解只有观测方程的SLAM问题。

投影模型和BA代价函数

从一个世界坐标系中的点 p p 出发,把相机的内外参数和畸变都考虑进来,最后投影成像素坐标,一共需要以下几步:

  1. 首先,把世界坐标转换到相机坐标,这里将用到相机外参数(R,t)

    P=Rp+t=[X,Y,Z]T. P ′ = R p + t = [ X ′ , Y ′ , Z ′ ] T .
    • 然后将 P P ′ 投至归一化平面,得到归一化坐标:
      Pc=[uc,vc,1]T=[X/Z,Y/Z,1]T P c = [ u c , v c , 1 ] T = [ X ′ / Z ′ , Y ′ / Z ′ , 1 ] T
    • 对归一化坐标去畸变,得到几畸变后坐标。这里暂时只考虑镜像畸变:
      {uc=uc(1+k1r2c+k2r4c)vc=vc(1+k1r2c+k2r4c) { u c ′ = u c ( 1 + k 1 r c 2 + k 2 r c 4 ) v c ′ = v c ( 1 + k 1 r c 2 + k 2 r c 4 )
    • 最后,根据内参模型,计算相机坐标:
      {us=fxuc+cxvs=fyvc+cy { u s = f x u c ′ + c x v s = f y v c ′ + c y

      这一系列过程的流程图,如下:
      这里写图片描述
      这个过程也就是前面讲的观测方程,之前把他抽象的记成:
      z=h(x,y) z = h ( x , y )

      现在给出他的详细参数化过程。具体的说,这里的x指代此时相机的位姿,即外参 R,t R , t ,它对应的李代数为 ξ ξ .路标 y y 即这里的三维点p,而观测数据则是像素坐标 z[us,vs]T z ≜ [ u s , v s ] T 。以最小二乘的角度来考虑,可以列写此次观测的误差:
      e=zh(ξ,p) e = z − h ( ξ , p )

      然后,把其他时刻的观测量也考虑进来,给误差添加一个下标。设 zij z i j 为位姿 ξi ξ i 处观察路标 pj p j 产生的数据,那么整体的代价函数(Cost Function)为:
      12i=1mj=1n||zijh(ξi,pj)||2. 1 2 ∑ i = 1 m ∑ j = 1 n | | z i j − h ( ξ i , p j ) | | 2 .

      对这个最小二乘进行求解,相当于对位姿和路标同时作了调整,也就是所谓的BA。
    • BA的求解

      观察观测模型 h(ξ,p) h ( ξ , p ) ,其不是线性函数,所以我们通过一些非线性手段来优化他。根据非线性优化的思想,我们应该从某个初始值开始,不断的寻找下降方向 x △ x 来找到目标函数的最优解,即不断地求解增量方程中的增量 x △ x 。尽管误差项都是针对单个位姿和路标点的,但在整体BA目标函数上必须把自变量定义成所有待优化的变量:

      x=[ξ1,,ξm,p1,,pn]T. x = [ ξ 1 , ⋯ , ξ m , p 1 , ⋯ , p n ] T .

      相应的,增量方程中的 x △ x 则是对整体自变量的增量。在这个意义下,当我们给出自变量的一个增量时,目标函数变为:
      12||f(x+x)||212i=1mj=1n||eij+Fijξi+Eijpj||2 1 2 | | f ( x + △ x ) | | 2 ≈ 1 2 ∑ i = 1 m ∑ j = 1 n | | e i j + F i j △ ξ i + E i j △ p j | | 2

      其中, Fij F i j 表示整个代价函数在当前状态下对相机姿态的偏导数,而 Eij E i j 标识该函数对路标点位置的偏导。
      把相机位姿点放在一起:
      xc=[ξ1,ξ2,,ξm]TR6m, x c = [ ξ 1 , ξ 2 , ⋯ , ξ m ] T ∈ R 6 m ,

      把空间点的变量也放在一起:
      xp=[p1,p2,,pn]TR3n x p = [ p 1 , p 2 , ⋯ , p n ] T ∈ R 3 n

      那么可以得到如下
      12||f(x+x)||2=12||e+Fxc+Exp||2 1 2 | | f ( x + △ x ) | | 2 = 1 2 | | e + F △ x c + E △ x p | | 2

      需要注意的是,该式从一个由很多小型二次型之和,变成了一个更整体的样子。这里的雅克比矩阵 E E F必须是整体目标函数对整体变量的导数,它将是一个很大块的矩阵,而里头的每个小分块,需要由每个误差项的导数 Fij F i j Eij E i j “拼凑起来”,然后无论我们使用 GN G − N 还是 LM L − M 方法,最后都将面对增量线性方程:
      Hx=g H △ x = g

      我们知道 GN G − N LM L − M 的主要区别在于,这里的 H H 是取JTJ还是 JTJ+λI J T J + λ I 的形式。由于我们把变量归类成位姿和空间点两种,所以雅克比矩阵可以分块为:
      J=[FE] J = [ F E ]

      那么以 GN G − N 为例,则 H H 矩阵为:
      H=JTJ=[FTFFTEETFETE]

      当然 LM L − M 中我们也需要计算这个矩阵,不难发现,因为考虑了所有的优化变量,这个线性方程的维数将非常大,包含了所有的相机位姿和路标点。尤其是在视觉SLAM中,一个图像就会提取数百个特征点,大大增加了这个线性方程的规模。如果直接对 H H 求逆来计算增量方程,由于矩阵求逆是复杂度为O(n3)的操作,这是非常消耗计算资源的。幸运的是,这里的 H H 矩阵是有一定特殊结构的。利用这个特殊结构我们可以加速求解过程。

      稀疏性和边缘化

      H矩阵的稀疏性是由雅克比 J(x) J ( x ) 引起的。考虑这些代价函数中的其中一个 eij e i j 。注意到这个误差项只描述了在 ξi ξ i 看到 pj p j 这件事,只涉及到第 i i 个相机位姿和第j个路标点,对其余变量的导入都为0。所以该误差对应的雅克比矩阵有下面的形式:

      Jij(x)=(02×6,02×6,eijξi,02×6,02×3,02×3,eijpj,02×3,02×3) J i j ( x ) = ( 0 2 × 6 , ⋯ 0 2 × 6 , ∂ e i j ∂ ξ i , 0 2 × 6 , ⋯ 0 2 × 3 , ⋯ 0 2 × 3 , ∂ e i j ∂ p j , 0 2 × 3 , ⋯ 0 2 × 3 )

      其中 02×6 0 2 × 6 表示为纬度为 2×6 2 × 6 0 0 矩阵,同理02×3也一样。该误差对相机姿态的偏导 eij/ξi ∂ e i j / ∂ ξ i 的维度为 2×6 2 × 6 对路标点的偏导 eij/pj ∂ e i j / ∂ p j 的维度为 2×3 2 × 3 。这个误差项的雅克比矩阵,除了这两处为非零块之外,其余地方都为零。这体现了该误差项与其他路标与轨迹无关的特性。那么,他对增量方程有什么影响呢? H H 矩阵为什么会产生稀疏性呢?
      当某个误差项$J$具有稀疏性时,它对$H$的贡献也具有稀疏形式

      当某个误差项J具有稀疏性时,它对 H H 的贡献也具有稀疏形式

      Jij只在 i,j i , j 处有非零块,那么它对 H H 的贡献为JijTJij,具有示意图上所显示的稀疏形式。这个 JTijJij J i j T J i j 仅有四个非零块,位于 (i,i),(i,j),(j,i),(j,j) ( i , i ) , ( i , j ) , ( j , i ) , ( j , j ) 。对于整体 H H ,由于:

      H=i,jJijTJij

      请注意 i i 在所有的相机的位姿中取值,j在左右路标点中取值。我们把 H H 进行分块:
      H=[H11H12H21H22]

      这里的 H11 H 11 只和位姿点有关, H22 H 22 只和路标点有关。当我们遍历 i,j i , j 时,下列事实总是成立的:

      1. 不管 i,j i , j 怎么变, H11 H 11 都是对角阵,只有 Hii H i i 处有非零块。
      2. 同理, H22 H 22 都是对角阵, Hjj H j j 处有非零块。
      3. 对于 H12 H 12 H21 H 21 ,有可能稀疏有可能稠密,视具体的情况而定。

      这显示了矩阵的稀疏结构,之后对线性方程的求解,也是利用它的稀疏结构。
      我们这里简单举例说明。假设一个场景里面有2个相机位姿 (C1,C2) ( C 1 , C 2 ) 和6个路标 (P1,P2,P3,P4,P5,P6) ( P 1 , P 2 , P 3 , P 4 , P 5 , P 6 ) 。相机位姿和路标点所对应的变量分别为 ξi,i=1,2 ξ i , i = 1 , 2 , Pj,j=1,,6 P j , j = 1 , ⋯ , 6 C1 C 1 观测到路标点 P1,P2,P3,P4 P 1 , P 2 , P 3 , P 4 , C2 C 2 观测到路标点 P3,P4,P5,P6 P 3 , P 4 , P 5 , P 6

      点和边组成的示意图
      可以推测BA的目标函数为:

      12(||e11||2+||e12||2+||e13||2+||e14||2+||e23||2+||e24||2+||e25||2+||e26||2) 1 2 ( | | e 11 | | 2 + | | e 12 | | 2 + | | e 13 | | 2 + | | e 14 | | 2 + | | e 23 | | 2 + | | e 24 | | 2 + | | e 25 | | 2 + | | e 26 | | 2 )

      这里的 eij e i j 使用之前定义过的代价函数。以 e11 e 11 为例,它描述在 C1 C 1 看到 P1 P 1 这件事,与其它的相机位姿和路标无关。记 J11 J 11 e11 e 11 对应的雅克比矩阵,不难看出 e11 e 11 ξ2 ξ 2 P2,,P6 P 2 , ⋯ , P 6 的偏导数都为0。我们把所有变量以 (ξ1,ξ2,p1,,p6)T ( ξ 1 , ξ 2 , p 1 , ⋯ , p 6 ) T 的顺序摆放,则有:
      J11=e11x=(e11x11,02×6,e11p1,02×3,02×3,02×3,02×3,02×3) J 11 = ∂ e 11 ∂ x = ( ∂ e 11 ∂ x 11 , 0 2 × 6 , ∂ e 11 ∂ p 1 , 0 2 × 3 , 0 2 × 3 , 0 2 × 3 , 0 2 × 3 , 0 2 × 3 )

      为例方便表示稀疏性,使用带有颜色的方块表示矩阵在该方块内有数值,其余没有颜色的区域表示矩阵在该处数值都为0,那么 J11 J 11 可以表示成下面的图案:
      J11 矩阵的非零块分布图

      为了得到该目标函数对应的雅可比矩阵,我们可以将这些 Jij J i j 按照一定顺序列为向量,那么整体雅可比矩阵以及相应的H 矩阵的稀疏情况就是图所展示的那样。
      这里写图片描述
      也许你已经注意到了,邻接矩阵(Adjacency Matrix)和上图中的 H H 矩阵,除了对角元素以外的其余部分有着完全一致的结构。事实上的确如此。上面的H 矩阵一共有 8×8 8 × 8 的矩阵块,对于 H H 矩阵中处于非对角线的矩阵来说,如果该矩阵块非零,则在其位置所在的变量之间存在一条边。如下图所示。所以,H矩阵中的非对角阵中的非零矩阵块可以理解为对应的两个变量之间存在联系,或者称之为约束,我们发现图优化结构和增量方程的稀疏性存在明显的联系。
      这里写图片描述
      现在考虑更一般的情况,假设有m个位姿点和m个路标点。由于通常路标数量远远比位姿数量多得多,即n>>m。由上面的矩阵推理过程,可以知道H矩阵大致的样子。它的左上角块非常小,而右下角对角块占据大量的地方。除此之外,非对角部分,分布着算乱的观测数据。由于它的形状很像箭头,又称箭头形矩阵。
      对于具有这种矩阵结构 H H ,线性方程组Hx=g的求解有何不同?现实当中存在多种利用 H H 的稀疏性加速计算的方法。这里介绍SLAM中一种常用的手段Schur消元,又叫边缘化。
      观察下图,我们不难发现,该矩阵可以分成4块,左上角为对角矩阵,每个对较块的维度与相机位姿的维度相等,且是一个对角块矩阵。右下角也是对角矩阵,每个对角块维度是路标的维度。非对角块的结构与具体的观测数据有关,我们首先划分区域B,E,C:
      这里写图片描述
      这里写图片描述
      于是对应的线性方程组由 Hx=g H △ x = g 变为如下形式:

      [BETEC][xcxp]=[vw] [ B E E T C ] [ △ x c △ x p ] = [ v w ]

      其中B为对角块矩阵,每个对角块的维数与相机参数相同,对角块的个数是相机变量的个数。由于路标的个数要远远大于相机位姿的个数,所以C要远远大于B。三维空间中每个路标点位3维,所以C矩阵为对角块矩阵,每个对角块为 3×3 3 × 3 。对角块矩阵逆的求解难度远远小于一般矩阵的求逆难度,因为我们只需要对矩阵块分别求逆。考虑这个特性,我们考虑对上面的方程进行高斯消元,目标是消去右上角的非对角元素。得:
      [I0EC1I][BETEC][xcxp]=[I0EC1I][vw] [ I − E C − 1 0 I ] [ B E E T C ] [ △ x c △ x p ] = [ I − E C − 1 0 I ] [ v w ]

      整理得:
      [BEC1ETET0C][xcxp]=[vEC1ww] [ B − E C − 1 E T 0 E T C ] [ △ x c △ x p ] = [ v − E C − 1 w w ]

      经过一次消元之后,第一个方程组变成了和 xp △ x p 无关的项。单独把它拿出来得到了关于位姿部分的增量方程:

      [BEC1ET]xc=vEC1w [ B − E C − 1 E T ] △ x c = v − E C − 1 w

      这个线性方程组的维度和 B B 矩阵一样。我们的做法是先解出这个方程组,求得xc,然后再讲 xc △ x c 带入原方程求得 xp △ x p 。 这个过程称称作Marginalization 或者称作Schur消元(Schur Elimination)。相比于直接求解线性方程组,它的优势在于:

      1. 在消元过程中,因为 C C 为对角块,所以C1容易求得。
      2. 求解 xc △ x c 之后,路标部分的增方程由 xp=C1(wETxc) △ x p = C − 1 ( w − E T △ x c ) ,也会利用到 C1 C − 1 易于求逆。

      边缘化的主要计算量在于上式上, 它紧是一个普通的线性方程,没有特殊的结构可以利用。系数记为S,它的稀疏性是不规则的。
      这里写图片描述
      前面说过,非对角元素代表着相机与路标之间的关联。那么进行消元之后的S矩阵是否具有物理意义。答案是肯定的。S矩阵非对角线上的非零矩阵块表示该处对应的两个相机变量存在共同观测路标点,有时称为共视。反之,如果该块为零,则表示两个相机没有共同观测。
      这里写图片描述
      于是,S矩阵的稀疏性结构取决于实际观测的结果,我们无法提前预知。在实践当中,例如ORB_SLAM中的Local Mapping环节,在做BA的时候可以选择那些具有共同观测的帧作为关键帧,在这种情况下Schur消元后得到的矩阵就是稠密矩阵。不过,这种做法也不是实时进行,所以这种做法也是可以接受的。但在另一些方法里面,例如DSO、
      ,OKVIS等,他们采用了滑动窗口方法。这类方法对每一帧都要求做一次BA来防止误差的累积,因此他们也必须采取一定的技巧来保持S矩阵的稀疏性。
      从概率角度来说,我们称这一步为边缘化,是因为我们实际上把求( xc,xp △ x c , △ x p )的问题,转化成先求 xc △ x c ,再求 xp △ x p 的过程。这一步相当于做了条件概率展开:

      P(xc,xp)=P(xc).P(xp|xc) P ( x c , x p ) = P ( x c ) . P ( x p | x c )

      结果是求出了关于 xc x c 的边缘分布,故称边缘化。在上面的边缘化过程中,我们实际上把所有的路标点都给边缘化了。在实际情况下,我们也能选择一部分进行边缘化。同时,Schur消元只是实现边缘化的一种方式,同样也可以选择Cholesky分解进行边缘化。

      鲁棒核函数

      在前面的BA问题中,我们最小化误差的二范数平方和,作为目标函数。这种做法虽然很直观,但存在一个严重的问题:如果出现无匹配等原因,某个误差项给的数据是错误的,会发生什么呢?我们把一条原本不应该加到图中的边给加进去了,然而优化算法并没能辨别出这是个错误数据,他会把所有数据都当作误差来处理,这时,算法会看到一条误差很大的边,他的梯度也很大,意味着调整与他相关的变量会使目标函数下降更多。所以算法将试图调整这条边所连接节点的估计值,使他们顺应这条边的无理要求由于这条边的误差真的很大,往往会抹平了其他正确边的影响,使优化算法专注于调整一个错误的值。这当然不是我们希望看到的。
      出现这种问题的原因是,当误差很大时,二范数增长得太快了。于是有了核函数的存在。核函数保证每条边的误差不会打的没边,掩盖掉其他的边。具体的方式是,把原先误差的二范数度量,替换成一个增长没那么快的函数,同时保证自己的光滑性质。因为它们是的整个优化结果更为鲁棒,因此叫做鲁棒核函数(Robust Kernel)。
      鲁棒核函数有许多种,例如最常用的Huber核:

      H(e)={12e2if|e|δδ(|e|12δ)otherwise H ( e ) = { 1 2 e 2 i f | e | ≤ δ δ ( | e | − 1 2 δ ) o t h e r w i s e

      我们看到,当误差 e e 大于某个预知δ后,函数增长形势由二次形势变为一次形式,相当于限制了梯度的最大值。同时,Huber核函数又是光滑的,可以很方便的求导。下图显示了HUber核函数与二次函数的对比,课件误差较大时Huber核函数增长明显低于二次函数。
      这里写图片描述
      除了Huber核之外,还有Cauchy核,Turkey核等等,读者可以参考g2o核Ceres都提供了哪些核函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值