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问题中两个顶点之间的边有如下的形式:
以上是关于DSO 中的Windowed Optimization的主要内容,如果未能解决你的问题,请参考以下文章
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 触发但无提示
Kafka Stream Suppress session-windowed-aggregation
How a non-windowed component can receive messages from Windows