本文已参与「新人创作礼」活动,一起开启掘金创作之路。
高斯牛顿求解流程
有如下最小二乘系统,对应的模型如下所示:

ξ=ξargmin21i∑∥ri∥∑i2
对上式展开求导,令其导数为零,可得到Hx=b的形式,上式对应的高斯牛顿求解 normal equation:
HorAJ⊤Σ−1Jδξ=b−J⊤Σ−1r
如果H可逆,则可以直接求解Δx=−H−1b,但其计算量较大。在另一篇关于舒尔补的博客中可以知道,舒尔补从概率上可以加速问题求解,利用SLAM问题的稀疏性。
例如某单目BA问题,其信息矩阵如下所使:

[HppHlpHplHll][Δxp∗Δxl∗]=[−bp−bl]
其中Hpp代表相机pose之间的信息矩阵,Hpl代表相机与路标点之间的信息矩阵,Hll代表路标点之间的信息矩阵。
接下来利用如下舒尔补的操作,使上式信息矩阵变成下三角矩阵。
[I0−BD−1I][ACBD]=[A−BD−1CC0 D]
[I0−HplHll−1I][HppHlpHplHll]=[Hpp−HplHll−1HlpHlp0Hll]
⇓带入到信息矩阵中
[I0−HplHll−1I][HppHlpHplHll][Δxp∗Δxl∗]=[I0−HplHll−1I][−bp−bl]
⟹[Hpp−HplHll−1HlpHlp0Hll][Δxp∗Δxl∗]=[I0−HplHll−1I][−bp−bl]
从而得到:
(Hpp−HplHll−1Hlp)Δxp∗=−bp+HplHll−1bl
求得Δxp∗后再计算Δxl∗:HllΔxl∗=−bl−Hpl⊤Δxp∗
在SLAM中整个solver流程可以总结为:
利用IMU构建残差,重投影误差构建姿态和路标点关系。
构建误差函数rij→计算雅可比Jij→(H+λI)δx=b→利用舒尔补简化求解 →求解出增量Δx作用到之前变量上,更新残差、更新雅可比,不断迭代。
但是在实际情况中,信息矩阵H并不满秩,可使用LM算法,H=H+λI,加阻尼因子使得系统满秩,但是求解的结果可能会往零空间变化。简单来说就是,在残差构建的过程中,得到的是相机pose与路标点landmark之间或者相机之间的相对关系,并没有建立与世界坐标系之间的绝对关系,因此可能因为第一帧的漂移导致整个系统发生漂移。
另一种方法是添加先验,增加系统的可观性。例如约束第一帧相机的pose被固定在(0,0,0)原点,即先验信息。在g2o turorial中对第一个pose的信息矩阵加上单位阵,H[11]+=I,存在(H[11]+I)Δx=b,即IΔx=0,使得第一帧的pose不动。但是尺度依然无法确定,常用的办法可以再固定一个landmark,也可以再固定一个相机pose,固定其相对的位移。
优化过程中处理 H 自由度的不同操作方式可参考博客对《On the comparison of gauge freedom handling in optimization-based visual-inertial state estimation》。