DSO 中的Windowed Optimization

Posted 白巧克力亦唯心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DSO 中的Windowed Optimization相关的知识,希望对你有一定的参考价值。

该博客内容发表在泡泡机器人公众号上,请尊重泡泡机器人公众号的版权声明

DSO中除了完善直接法估计位姿的误差模型外(加入了仿射亮度变换,光度标定,depth优化),另一个核心就是像okvis一样使用sliding window来优化位姿,Engel也专门用了一节来介绍它。sliding window 就像c++中的队列,队首进来一个新人,队尾出去一个老人,它更像王朝中武将的新老交替,老将解甲归田,新人受window大王的重用,然而安抚老将不得当,会使得SLAM王朝土崩瓦解。对于初次接触sliding window的初学者来说,window大王安抚老将,振兴SLAM王朝的三件法宝“First Estimate Jacobians”,“Marginalization”,“Schur complement”实在让人有点摸不清头脑。原谅我的口水话,接下来我将用尽量直观简洁的方式进行描述。

在此之前,泡泡群里王京和张腾在知乎写过First Estimate Jacobians的回答,范帝楷也在《OKVIS的理论推导(下)》中对marginalization进行了描述,这些都可以在泡泡历史推文中找到,我也写过一篇《SLAM中的marginalization 和 Schur complement》的博客。虽然资料已经很全了,这里还是想结合DSO[1],以及另一篇文献[2]对windowed optimization涉及到的知识点进行一个全面的讲解。

本文将包括如下三个方面:
1. 为什么要使用sliding window ?
2. 什么是sliding window? Marginalization, Schur Complement, First Estimate Jacobians
3. DSO中是如何使用windowed optimization的?

为什么要使用sliding window?

在基于图优化的SLAM技术中,无论是pose graph还是bundle adjustment都是通过最小化损失函数来达到优化位姿和地图的目的。然而,当待优化的位姿或特征点坐标增多时,优化过程的计算量也随着增大。因此不能无限制的添加待优化的变量,而是使用滑动窗口技术来限制计算量在一定范围。比如,一开始有三个关键帧 kf1,kf2,kf3 在窗口里,经过时间t,第四个关键帧 kf4 加入优化,此时我们需要去掉 kf1 ,只对关键帧 kf2,kf3,kf4 进行优化。这样就始终保持待优化变量的个数,而固定了计算量。在上面的过程中,新的关键帧到来时,我们直接丢弃了关键帧1和关键帧2,3之间的约束,直接只用新的关键帧4和2,3构建的约束来对帧2,3,4的位姿进行新的优化,因此一个很自然的问题是,优化后的 kf2,kf3 的位姿和原来 kf1 的约束肯定就被破坏了,原来 kf1 的一些约束信息就被损失了。那么,我们如何做到即使用滑动窗口固定计算量又充分保留信息呢?因此下面我们要对sliding window进行一个彻底的分析。额,感觉有点水深,像一个坑,别急,喝口水,后面不是一个坑是一个湖在等你。

sliding window技术

在这部分,我们从基本的graph based slam出发,逐步分析当新的优化变量加入时,如何优雅的去掉旧变量,在固定计算量的同时又保留信息并且不破坏系统的一致性。
我们知道图优化SLAM问题中两个顶点之间的边有如下的形式:

zij=hij(xi,xj)+nij 公式中 xi,xj 表示图优化的顶点,比如相机位姿或三维坐标点, zij 表示两个顶点之间相对关系的测量值。 nij 是一个零均值的测量高斯噪声 nijN(0,Λ1ij) ,我们通过最大似然估计来优化变量: x^=argmaxxp(z|x)=argmaxxp(zij|xi,xj) 由于服从高斯分布,所以上述问题近似于求解下面的最小二乘问题:
x^=argminx||zijhij(xi,xj)||2Λij(1) 由于 hij() 非线性,上面的方程我们需要对 hij() 进行泰勒展开,然后使用Gauss-Newton迭代法来求解,在第k次迭代中,能够通过求解下面方程得到迭代增量 δx δx=argminδx||zijhij(x^(k)i,以上是关于DSO 中的Windowed Optimization的主要内容,如果未能解决你的问题,请参考以下文章

DSO windowed optimization 代码

DSO windowed optimization 代码

REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 触发但无提示

Kafka Stream Suppress session-windowed-aggregation

How a non-windowed component can receive messages from Windows

conan入门(二十一):解决MinGW编译Openssl的编译错误:crypto/dso/dso_win32.c