Visual Odometry技术 (Of VSLAM)
[toc]
什么是SLAM
SLAM是Simultaneous localization and mapping缩写,意为“同步定位与建图”。它是指搭载了特定传感器的主体,如机器人或者无人机等,在没有关于环境的先验知识的情况下,在运动的过程中建立环境的模型。SLAM的概念早在1986年就提出了。然而,早期的SLAM往往依赖价格昂贵或专门定制的传感器,例如激光雷达,声呐或立体相机,这项技术并未走入市场。随着算法和算力的不断发展,廉价的相机逐渐成为一种取代激光雷达等复杂设备进行SLAM的可能 。那么,如果涉及到的传感器主要为相机,那么就称为“视觉(Visual)SLAM”, 也就是标题所叙述的、这篇博客主要探讨的VSLAM。
经典视觉SLAM框架
如图1所示,下面是经典视觉SLAM框架的主要组成结构:一个SLAM系统主要由Visual Odometry(视觉里程计,VO),Optimization(后端优化),Loop Closing(回环检测), Mapping(建图)这四个部分组成。

图1 经典视觉SLAM框架 其中,VO能够通过相邻帧间的图像估计相机运动,并回复场景的空间结构。然而,仅仅有VO是不够的。VO其实就有点像马尔科夫链(Markov Chain)那样,只关注当前状态和未来状态的基本联系,不具有记忆性。这样一来,VO由于只有🐟的记忆,而每次的估计又会有一定偏差,每次估计的相机位姿运动偏差在机器人或者无人机运动过程中不断累加,形成累计偏移(Accumulating Drift)这些累计偏移有的时候会带来极为糟糕的后果。
如图2所示,设想一下,如果在估计的时候认为相机顺时针运动了90度,而实际上相机仅仅运动了89度,这样一来在一个空的矩形的房间里所作出的定位可能会因此不断远离相机的实际位置,而建立出来的地图也很可能会无法封闭。

图2 逐渐增大的偏移和无法闭合的地图 因此,我们需要在一个更宏观的视角下审视并且修正这些偏移。这样就引入了后端优化和回环检测这两个部分。
在后端优化中,则需要考虑相对更加长远的目标:在解决“如何从图像估计相机运动”的基础上从带有噪声的数据中估计整个系统的状态,以及这个状态估计的不确定性有多大,同时使得得到的相机位姿在全局上尽可能保持一致。相比于VO部分,Optimization往往没有那么可见,面对的只有数据,而不必关心数据的来自于激光雷达还是单目相机,又在视觉里程计之后,因此叫做后端。但是还是要注意的是,这里的前后端和web应用(如J2EE中的Servlet)中的前后端有所不同,要分清楚两者之间的区别。
在回环检测部分,最主要判断的还是机器人或者无人机是否达到之前到过的位置,如果检测到了闭环(往往是通过图像相似度判断实现),就会把信息提供给后端进行处理来得到一个全局一致的估计。用一个不太准确但是我自己觉得非常形象的比喻来说,这个过程就像是用把一个个用小棍子(预测的轨迹)穿起来的珠子(估计的点)头尾相接到一起保持中间各个珠子距离不变一样。现阶段应用最广的回环检测方法是词袋模型(Bag-of-Words),之后会详细介绍。
下面将对VSLAM框架中的VO技术进行具体介绍。
Visual Odometry
如上所述,Visual Odometry主要是计算图像帧之间 的相机位姿关系,也即通过拍摄图像,估计出相机的运行位置和姿态信息。根据所使用相机的类型,我们可以把VO分为单目VO和立体VO,其中单目VO主要使用单目相机来获取环境的2D信息;而立体VO如RGB-D相机和双目相机在获取画面外能够直接通过结构光或者ToF获取场景深度信息或通过计算获得的场景深度信息(类似人眼)
在实际操作中,由于RGB-D相机由于很容易受到自然光的干扰,同时对于噪声的鲁棒性较差,本身价格也比较高不利于推广,因此主要用于室内SLAM;而双目相机的精度和深度方向上的量程受到基线长度,也即两个相机间距离的影响(但是做的宽一个是容易形变导致误差,一个是相机太宽影响运动),同时disparity map的计算要消耗大量的资源,往往需要GPU或者FPGA来加速,在深度上的测量很难达到令人满意的效果。
因此,单目相机SLAM技术便是这篇博客所要探讨的主要内容。在实践中,VO算法主要分为特征点法和直接法两类。
特征点法是通过汇总图像中所有有代表性的点的移动来预测相机的整体移动情况。由于通过矩阵在整个图像的层面来判断运动是十分困难的(LK光流需要强假设),因此我们可以用另一种图像的表现形式,也就是图像的特征来描述图片,减少不必要的信息(特征也可以看作是图像的主成分)。尽管特征点在面对墙体或者其他角点不显著(salient)的区域时可能难以识别,但是在绝大多数场景下都能够找到充足的特征点来对帧间运动做出一个大致的估计。
传统的寻找特征点的方法主要包括Harris角点(参考BUAASE_CV_hw_set2)、FAST角点等,这些经典的角点识别算法提出的时间较早,在图像变化幅度较大的情况下不够稳定。近年来不断发展的局部特征识别往往不仅匹配角点(或者也可以说兴趣点)本身,还会为角点提供相应的描述子(descriptor)来说明特征点的朝向和大小等信息。例如,SIFT就是一个十分经典的算法,能够对关照、尺度以及旋转都有很好的鲁棒性。然而,随着识别效果而来的还有巨大的计算量。与SfM不同,SLAM要求实时性,因此在课上熟知的SIFT很少被应用到SLAM的实际应用中。
那么有没有什么能够协调好准确率、鲁棒性以及计算量,使之能够适配SLAM的算法呢?当然有!这就是在SLAM中大名鼎鼎的ORB-SLAM,如图所示,就像YOLO一样,ORB也更新了很多版,证明了其强大的生命力。

图3 orb各个版本的论文(图源本人) ORB(Oriented FAST and Rotated BRIEF),是目前最快速稳定的特征点检测和提取算法,许多图像拼接和目标追踪技术利用ORB特征进行实现。ORB-SLAM 是西班牙 Zaragoza 大学的 Raúl Mur-Arta 编写的视觉 SLAM 系统,目前开源在raulmur/ORB_SLAM: A Versatile and Accurate Monocular SLAM (github.com)上。正如GitHub上的md所述, ORB是一个通用高效的单目SLAM解决方案(后面的ORB2、ORB3支持了更多相机,但是这里先讨论单目的ORB)。
就像刚刚提到的,FAST角点以速度快而著称。已FAST-9为例,在像素点为中心的一个半径等于3像素的离散化的Bresenham圆找9个连续的像素点,如果它们们的像素值要么都比中心点加上一个阈值t大,要么都比中心点减去一个阈值t小,那么这个点就是一个角点。注意到FAST只用到了一个圆而没有具体的方向,事实上对于旋转缺乏鲁棒性;此外,由于它固定取半径为3的圆,因此存在尺度问题:可能一些在远处看是角点的位置放大后周围像素趋于一致而不再是角点了。ORB对FAST的改进或者拓展,主要是为其增加了其尺度不变性以及旋转不变性。
尺度不变性主要是通过图像金字塔例如Gaussian pyramid向下采样(使用高斯核对其进行卷积,然后对卷积后的图像进行下采样,反复迭代),是一种从粗糙到不断精细的过程。图像金字塔是单个图像的多尺度表示法,由一系列原始图像的不同分辨率版本组成。金字塔的每个级别都由上个级别的图像下采样版本组成。下采样是指图像分辨率被降低,比如图像按照 1/2 比例下采样。因此一开始的 4x4 正方形区域现在变成 2x2 正方形。图像的下采样包含更少的像素,并且以 1/2... read more