对于“面向对象”撸代码的程序猿同志们,有本必备的书的叫做《设计模式-可复用面向对象软件的基础》。那么而在slam的实现中有没有这一种或者几种可以总结归纳的设计模式呢?
我们在看一些slam的书的时候,有些要么就是介绍很多状态估计的理论,要么就是介绍很多多视几何的各种视觉理论。那么我们在看了这些理论之后,仍然无法下手,那么一个典型的好的slam的代码的基本结构是什么样的呢?一个slam代码的基本结构是怎样的?有哪些基本要素?
这里一个自然的想法就是从图像中获取想要的定位的信息。在机器人移动的过程中相机捕捉到一个图像序列。在这个图像序列中机器人看到周围的景物是在按照一定的规律移动和变化的,那么景物移动的规律和机器人自身移动的规律有什么关系呢?这个关系可以根据空间变换来确定。
那么如何根据图像序列的内容提取景物的移动规律呢?可以跟踪图像上景物的一些点,图像很多点的统计规律可以表征景物的移动规律。这就是提取特征点进行跟踪或者直接使用灰度点跟踪的意义所在,根据我们使用的点的方式不容,可以看到两种不容的slam前端分方法——直接法和特征法。
那么如何实现这样的跟踪器呢?slam算法在读到一张图像之后,首先把当前图像的点和前一帧图像的点对应起来,那么需要多少个点对应呢?怎么实现点对应呢?基于特征的方法是提取图像中的特征点用于匹配不同图像中相同的点,这是一种思路,常用的有sift orb等。另外一个思路是由于机器人的运动相对于图像的帧率较慢的时候,图像的内容变化较小,因此在局部搜索可以找到上一帧图像的点的位置,这就是直接法的思路。
我们这里引入一个Frame结构,为了实现上述的跟踪器,第一步是读取图像,通过图像的数据估计当前帧对应的位姿状态。场景中相同的点在不同的视角中构成一个基础矩阵的关系,一个图像帧的图像平面和另一帧的图像的平面之间构成单应矩阵的关系。使用最小二乘法通过图像点可以计算得到单应矩阵和基础矩阵,,使用矩阵奇异值分解(SVD)可将单应矩阵或者基础矩阵分解恢复出位姿变化。这些内容的实现可以放到Frame结构,也可以像ORB那样专门放到一个Initializer里边。Fr