假设WINDOW_SIZE=5(代码中为10),则buffer大小为6(WINDOW_SIZE+1),最新来的帧放到WINDOW_SIZE的位置,记作X,但是WINDOW_SIZE位置的帧不参与优化。如图:
VINS_MONO marginalization机制
estimator::processImage()中首先检查新的到帧与前一帧之间的视差,如果视差大于阈值,则新来的帧会作为LoopClosure中的KeyFrame,把滑窗中最早的一帧移出去丢掉,X加入优化的滑窗,marginalization_flag记作MARGIN_OLD。
移除之后buffer状态如图:
VINS_MONO marginalization机制
如果新来的帧与前一帧间的视差较小,新来的帧不作为KeyFrame,把WINDOW_SIZE-1位置处的帧丢掉,X加入优化的滑窗,marginalization_flag记作MARGIN_SECOND_NEW。如图:
VINS_MONO marginalization机制

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

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

相关文章:

  • 2022-12-23
  • 2021-11-04
  • 2022-12-23
  • 2022-02-06
  • 2021-05-19
  • 2021-09-12
  • 2021-10-22
  • 2021-11-01
猜你喜欢
  • 2021-04-11
  • 2021-09-12
  • 2021-05-11
  • 2021-10-24
  • 2021-07-03
  • 2021-06-20
相关资源
相似解决方案