之前写了一篇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有共视关系。我们需要更新的包含了f3和x5的所有相关信息
在计算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中状态和点的计算都相对独立。