VINS_MONO marginalization机制


假设WINDOW_SIZE=5(代码中为10),则buffer大小为6(WINDOW_SIZE+1),最新来的帧放到WINDOW_SIZE的位置,记作X,但是WINDOW_SIZE位置的帧不参与优化。如图:

estimator::processImage()中首先检查新的到帧与前一帧之间的视差,如果视差大于阈值,则新来的帧会作为LoopClosure中的KeyFrame,把滑窗中最早的一帧移出去丢掉,X加入优化的滑窗,marginalization_flag记作MARGIN_OLD。
移除之后buffer状态如图:

如果新来的帧与前一帧间的视差较小,新来的帧不作为KeyFrame,把WINDOW_SIZE-1位置处的帧丢掉,X加入优化的滑窗,marginalization_flag记作MARGIN_SECOND_NEW。如图:

需要注意的是,放进LoopClsoure buffer中的KeyFrame是WINDOWS_SIZE-2处的帧,因为WINDOW_SIZE-1处的帧不一定是关键帧。
具体代码参考:
Estimator::processImage()
Estimator::slideWindow()
FeatureManager::addFeatureCheckParallax()。

比较奇怪的一点是Estimator::slideWindow()中对MARGIN_OLD,移除最早一帧时的循环里面不是用赋值而是用swap,虽然逻辑上没有问题,但是会更消耗资源吧,不知道是基于什么原因考虑的。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM