最近百度开源了个slam系统ice-ba,测试发现性能强大,代码方面工程优化做了很多,总的来说前端使用了光流,后端正是论文提出上的增量式BA了。
这个增量式的ice-BA主要分为三个部分,全局BA,局部BA以及relative-marg,前两者采用了增量式方法提升了后端速度,后者保证了local-BA和global-BA的一致性对精度有所贡献。
Global BA
论文最先提及的是他们先前已经在Robust Keyframe-based Dense SLAM with an RGB-D Camera发表过的Global BA方法,这个方法认为在BA的时候,之前已经算过的那些量再次计算对精度并不会有太大的改善,从而没必要重新线性化(因为即使线性化了,算出来的雅可比矩阵也没啥变化),更进一步,没必要每次在求解线性方程组的时候还去把那些没有重新线性化的部分做舒尔消元,只需要挑选一部分算一下即可。
之后求解舒尔消元完毕那个线性方程组的的时候,使用PCG进行计算。更多的算法细节不再过多的说明,仅仅对挑选策略简单说明一下,总的来说有两个:
- 新加入的一些桢和点,无脑线性化
- 如果点的更新量大于某个阈值,更新点,并对那个点连接的一部分重新线性化
Local BA
对于local-BA,上诉方法带来的提升就有限了,由于几乎每个点都被window里面所有的桢看到,因此即使只重新线性化一部分点,也会带来很大的改动,因此在local-ba这个环节,提出了一个更高效的针对local-ba的后端设计Sub-Track based IBA (ST-IBA)。这个方法的主要思路是把长期跟踪的点分成很多短期跟踪段。
这样每次重新算点的时候,重新线性化的区域减小,而且做了舒尔消元后,引入的稠密矩阵快也有限,因此提高了效率。
relative-marginalization
对于vio系统,在local-window中,往往都有marg这一步,把有些本应该出了window的信息以另一种形式存储下来。但是有global-ba存在时,marg的效果未必有很大的提升,反而可能会下降,一方面global-ba本身就会利用那些没在window中的信息,另一方面,由于误差的累计,反而marg带来的先验可能反而会最终的精度,原因如下:
浩敏师兄这篇论文提出了一种marg的方法,保持了 marginalization prior和global BA的一致性,具体操作如图所示,我就不做过多的翻译
基本思想其实比较简单,之前做marg的时候,考虑的坐标系都是全局坐标系,或者说选定的Identity坐标系,这个会导致每次的先验信息在“告诉”local-ba:“我在哪里”。长期不断积累的误差,会导致这个先验越来越差,于是为了避免这个误差因为原因积累,只需要把每次相对与Identity变成相对于最新的global坐标就行了,也就是需要让这个先验相对量转化为相对于刚刚出窗口的那个关键帧,从而避免了误差的累积。