VSLAM中因子图的进阶(DSO因子图拆解)

发布于:2023-01-13 ⋅ 阅读:(469) ⋅ 点赞:(0)

之前写了一篇VIO因子图的,感觉写得不好,今天搞个进阶

以DSO作为蓝本来做说明,图源是东北大学龚益群同学的,他对因子图的讲解稍笼统了一些,今天完整地拆解一下DSO因子图。

DSO是一个很有意思的系统,先看看H矩阵的整体构成:

这个H矩阵和我们传统看到的H矩阵是有很大不同的,其中f表示状态量,d表示逆深度,还多了一个相机内参的优化c。这也是DSO比较独特的地方,同时优化位姿/逆深度/光度误差

Hff: 状态的Hession

Hcc:相机内参的Hession

Hdd:特征点逆深度Hession

Hfc:状态量与相机内参联合Hession

Hcd:逆深度与相机内参的联合Hession

Hfd:状态量与逆深度的联合Hession

第一张图的理解是整个因子图拆解中最重要的,起始位姿起始点f1/x1关联着先验p1与p2.F和R分别对应当前状态的估计残差值

这里面需要认真理解的是F和R后续的数字,其中第一个1,2,3指的是对应状态或残差序号,第二个数字指的是第几次优化,如0是每一个状态出现时的第一次优化,与第一个线性化点。数字向后则顺延。总体理解的话,整个DSO的滑窗为7,那当f7第一次出现时,f1对应的F/R一共有7组,分别对应F10-F16,R10-R16。其他递减。

这是图2,颜色和图1都是一一对应,一目了然了,加上的是初始先验p1/p2

图2/3对应,图4/5对应

这里需要理解为何F12/R12.F21/R21,F30/R30这3个因为f3新出现而形成的新因子,需要通过F10和F20/ 残差R11和R20这2种不对应的状态量与残差来计算呢?

DSO优化符合FEJ原则:不同残差对同一状态量求Jacobian时,线性化点必须一致,以避免Null space(零空间)退化而使不可观变量变可观。7个关键帧滑窗优化的Hession运算都来自于F(1-7)0

首先我们要注意f1和f2唯一没有共视关系的是x5,f2和f3对x5有共视关系。我们需要更新的包含了f3x5的所有相关信息

在计算F30这个新的状态量时,从F10/F20构成的Hession矩阵(包含所有状态和点)结合初始先验来进行舒尔补,结合最近一次优化后的残差R11/R20解出了F30/R30,在这个过程中同时解出了新的F12/R12,F21/R21供下一次使用。

上一步完成后,这一步计算Hession就可以使用F10/F20/F30构成的先验矩阵来计算了。选用的残差用了各自帧最早的残差R10/R20/R30来计算。边缘化掉x1,x2,x4,这里x3及其相关信息被丢掉是因为其质量不好?(我也有疑问,但不影响理解),也未使用x5相关信息(x5与需要边缘化的f1无关)。

先加入点的先验进行舒尔补,再加上状态先验把最老帧的f1边缘化,最终解出HM, bM(包含f2/f3信息)。

这个就比较容易理解了,通过边缘化f1后的HM,bM(图上描述也有误)求解出F22/R22,F31/R31(并固定下来?)供后续使用,这里也体现了x5对应的共视关系,最后一图是计算过程:

使用F20/F30的Hession结合了x5的相关信息(包含图1对应的共视信息,关联了f2和f3),舒尔补之后加上了上一步的信息求解出F22/R22,F31/R31。(注意这里用的残差又是最近一次的残差R21和R30了哦!)

 DSO的因子图拆解相对复杂,是因为本身的优化逻辑就是各类视觉里程计比较复杂的一种。但还是那句话,因子图本身是VSLAM或VIO落地的基础。DSO中状态和点的计算都相对独立。

 

 

 

 

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到