这篇博客专门介绍一下MarkerMapper的实现原理,不了解MarkerMapper的可以先看一下我的上一篇博客:基于ArUco的视觉定位(三)

Paper:Mapping and localization from planar markers (很重要)

  这不是一篇翻译,而是博主对上述论文的总结,理解之中难免有不到位的地方,不足之处还请参看原文。


〇、MarkerMapper干了啥?

  这里再陈述一遍MarkerMapper到底干了些什么事:

  • 根据我们指定的空间中任意一个ID的marker,MakerMapper将整个空间中任意分布的所有marker以指定marker为参考坐标系构建marker的分布图,生成一个二维码分布文件。二维码的分布体现在每个marker的四个角点相对指定marker坐标系的三维坐标,即得到所有marker在参考世界坐标系下的位姿分布。其实最重要的也是我们最想得到的,就是所有marker的角点在世界坐标系下的三维坐标,因为有了这些角点的三维坐标,我们就可以用PnP算法估计相机的位姿。
  • 在构建二维码分布图的过程中,MarkerMapper同时对相机的运行轨迹进行了估计,记录了关键帧在参考世界坐标系下的位姿。这里的关键帧是指那些至少观察到两个marker的帧。
  • 除了优化了二维码的位姿分布和相机的运行轨迹,MarkerMapper还优化了相机的内参数。
  • MakerMapper为我们生成了一个包含二维码位姿分布以及关键帧轨迹的可视化点云图。

一、基本原理

1、基本思路

  

  按照上面的思路,我们可以得到空间中所有二维码任意两两之间的相对位姿关系。指定其中一个二维码坐标系作为参考世界坐标系,就可以求得所有二维码相对于参考坐标系的位姿,进而得到所有二维码的角点在世界坐标系下的三维坐标。

  道理我们都懂,但实现起来远非这么简单。
  

2、核心问题

  经过上面的分析,我们知道,问题的关键在于如何在相机不准确的观测数据下估计出二维码准确的位姿分布。了解SLAM的同学应该都知道,要解决这个问题最终不得不使出我们的杀手锏——非线性优化。好吧,MarkerMapper最终也要归结到一个优化问题上,基本手段就是最小化重投影误差

解释一下这个重要的公式:

二、确定优化变量的初始值

  其实这一步的最终目的并不是计算 ,而是要得到满足上述条件的最小生成树 mst 。另外,如果我们在MarkerMapper的入口参数中没有指定参考marker,那么程序就会根据上述原则利用弗洛伊德算法从所有的marker中选择一个合适的参考节点,使得生成的 mst 最优。