相机模型是理解视觉里程计之前的基础。本文主要是对高翔博士的《SLAM十四讲》的总结。
我们希望测量一个运动物体的轨迹,这可以通过许多不同的手段来实现。例如,我们在汽车轮胎上安装轮式计数码盘,就可以得到轮胎转动的距离,从而得到汽车运动距离的估计。或者,也可以使用IMU来测量汽车的速度、加速度,通过时间积分来计算它的位移。完成这种运动估计的装置(包括硬件和算法)叫做里程计(Odometry)。里程计一个很重要的特性,是它只关心局部时间上的运动,多数时候是指两个时刻间的运动。当我们以某种间隔对时间进行采样时,就可估计运动物体在各时间间隔之内的运动。由于这个估计受噪声影响,先前时刻的估计误差,会累加到后面时间的运动之上,这种现象称为漂移(Drift)。
如果一个里程计主要依靠视觉传感器,比如单目、双目相机,我们就叫它视觉里程计。视觉里程计最主要的问题是如何从几个相邻图像中,估计相机的运动。在SLAM前端的实现主要是视觉里程计,通过多个图片之间的特征值匹配,进行地图重建,同时得到相机机身的定位。视觉里程计(VIO)主要分为特征法和直接法。
如果说特征点法关注的是像素的位置差,那么,直接法关注的则是像素的颜色差。特征点法通常会把图像抽象成特征点的集合,然后去缩小特征点之间的重投影误差;而直接法则通过warp function直接计算像素点在另一张图像上的颜色差,这样就省去了特征提取的步骤。
基于特征的方法是当前视觉里程计的主流方式,特征方法认为,对于两张图像,应该首先选取一些具有代表性的点,称为特征点。之后,仅针对这些特征点估计相机的运动,同时估计特征点的空间位置。图像里其他非特征点的信息,则被丢弃了。
特征法主要解决如下连个问题:
- 我们如何获取图像特征点?如何匹配它们?
- 如何根据已知特征点,计算相机的运动?
人们设计了很多特征点提取方法,包括图像中的角点、色块等。特征法要解决一个重要问题是:在图像发生一定的改变后,特征点提取算法仍能提取出相同的点,并能判别它们之间的相关性。常用的提取和匹配特征点有Harris角点、SIFT、SURF、ORB等。其中ORB是经典的ORB方法。
1、ORB
特征值法首先要找到特征点然后进行匹配。
先了解什么是 特征向量(Feature Vectors)
1.1、地标
一般而言,地标需要满足下面的条件:
- 地标应该可以从不同的位置和角度观察得到;
- 地标应该是独一无二的,从而可以很容易的将底边从其他物体中分辨出来
- 地标不应该过少,从而导致机器人需要花费额外的代价寻找地标;
- 地标应该是静止的,因而,我们最好不要使用一个人作为地标
举例来说,室内环境中的地标,我们可以选择为墙壁与地面之间的连线,以及墙角等。
1.2、特征点
特征点作为路标:可区别性、稳定性、重复性。
1.3、寻找特征点
1、通过FAST找到特征点。周围16个点,比较和中心点的阈值,连续n个超过,则认为是一个特征点;
2、方向不变性:几何中心和质心的连线为方向;
3、尺度不变性:不同分辨率下,使用金字塔方法重新通过FAST获取。
1.4、特征子
对于每一个特征点,为了说明它与其他点的区别,人们还使用“描述子”(Descriptor)对它们加以描述。描述子通常是一个向量,含有特征点和周围区域的信息。如果两个特征点的描述子相似,我们就可以认为它们是同一个点。根据特征点和描述子的信息,我们可以计算出两张图像中的匹配点。
特征子:
通常128个bit,每个bit分别为1,0。
两个点,如果a>b,则为1,否则为0.
两个点为随机获取。
每个特征点对应一个描述子。
1.5、特征点匹配
对于两个特征点之间的距离采用汉明距离,代表他们相似度。汉明距离越短表示越相似。汉明距离就是两个特征子异或后出现1的个数,也就是表