























首先,解释下SLAM的概念,借鉴高博《视觉 SLAM 十四讲》中的一句话:SLAM 是 Simultaneous Localization and Mapping 的缩写,中文译作“同时定位与地图构建”。它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动。如果这里的传感器主要为相机,那就称为“视觉 SLAM”。
先来张图,下图就是利用相机作为传感器在环境中采集一系列的图像,经过SLAM系统建立的点云图以及相机轨迹。

SLAM自1986年提出之后,一直以来是机器人领域的热点问题。这里总结一些常用开源SLAM方案。
方案名称
传感器形式
地址
MonoSLAM
单目
https://github.com/hanmekim/SceneLib2
PTAM
单目
http://www.robots.ox.ac.uk/~gk/PTAM/
ORB-SLAM
单目
http://webdiis.unizar.es/~raulmur/orbslam/
ORB-SLAM2
单目/双目/RGB-D
https://github.com/raulmur/ORB_SLAM2
LSD-SLAM
单目为主
http://vision.in.tum.de/research/vslam/lsdslam
SVO
单目
https://github.com/uzh-rpg/rpg_svo
DTAM
RGB-D
https://github.com/anuranbaka/OpenDTAM
DVO
RGB-D
https://github.com/tum-vision/dvo_slam
DSO
单目
https://github.com/JakobEngel/dso
RTAB-MAP
双目/RGB-D
https://github.com/introlab/rtabmap
RGBD-SLAM-V2
RGB-D
https://github.com/felixendres/rgbdslam_v2
Elastic Fusion
RGB-D
https://github.com/mp3guy/ElasticFusion
Hector SLAM
激光
http://wiki.ros.org/hector_slam
GMapping
激光
OKVIS
多目+IMU
https://github.com/ethz-asl/okvis
ROVIO
多目+IMU
https://github.com/ethz-asl/rovio
VINS
单目+IMU
https://github.com/HKUST-Aerial-Robotics/VINS-Mono
ORB-SLAM应该是SLAM最具有代表性的算法,ORB-SLAM2: an Open-Source SLAM System for Monocular, Stereo and RGB-D Cameras; code; 主页;
ORB-SLAM 是PTAM 的继承者们中非常有名的一位。它提出于 2015 年,是现代 SLAM 系统中做的非常完善,非常易用的系统之一(如果不是最完善和易用的话)。ORB-SLAM 代表着主流的特征点 SLAM 的一个高峰。相比于之前的工作,ORB-SLAM 具有以下几条明显的优势:
整个ORB-SLAM系统包括三个部分组成,分别是跟踪(Tracking)、局部建图(Local Mapping)以及回环检测(Loop Closing)模块,它们分别被三个线程并行地进行处理。接下来对这个系统进行介绍。

跟踪(Tracking)是在每帧中粗略地定位相机位姿以及决定何时插入新的关键帧。算法设计了运动模型以及跟踪参考帧模型去大致预测出相机的位姿。如相机跟踪失败(由于遮挡、大幅度运动等),就启动重定位模块对相机进行位置查找。如果已经有了初始位姿以及特征匹配,利用关键帧的Covisibility Graph恢复出局部可见图。之后,局部地图点的匹配可利用重投影实现,随后相机的位姿利用BA来优化。最后,Tracking线程决定是否插入新的关键帧。
局部建图(Local Mapping)的主要任务:当跟踪当前帧成功之后,需要利用局部建图更新其运动模型同时更新地图点。等待跟踪过程判断是否应该插入一个新的关键帧,并把关键帧插入到地图中,并对局部地图进行局部BA优化。这个线程能够获得更为精细的相机位姿以及点云。
回环检测(Loop Closing)的主要目标是检测当前关键帧是否经过历史位置。如有经过,则利用回环检测得到的回环帧去修正整个SLAM长期跟踪过程中带来的累积误差、尺度漂移等。如果仅有前两个线程的话,仅仅完成了一个很好的视觉里程计(VO),这个线程会对全局地图以及关键帧进行回环检测,以消除上述累积误差。
牛吹完了,说下缺点。 当然,ORB-SLAM 也存在一些不足之处。首先,由于整个 SLAM 系统都采用特征点进行计算,我们必须对每张图像都计算一遍 ORB 特征,这是非常耗时的。ORB-SLAM 的三线程结构也对 CPU 带来了较重的负担,使得它只有在当前 PC 架构的 CPU 上才能实时运算,移植到嵌入式端则有一定困难。其次,ORB-SLAM 的建图为稀疏特征点,目前还没有开放存储和读取地图后重新定位的功能(虽然从实现上来讲并不困难)。根据我们在建图章节的分析,稀疏特征点地图只能满足我们对定位的需求,而无法提供导航、避障、交互等诸多功能。然而,如果我们仅用 ORB-SLAM 处理定位问题,似乎又嫌它有些过于重量级了。相比之下,另外一些方案提供了更为轻量级的定位,使我们能够在低端的处理器上运行 SLAM,或者让 CPU 有余力处理其他的事务。
在这里下载ORB-SLAM2的源码,然后参考ORB-SLAM2项目的说明文档,安装一些必要的第三方软件:
注意,其中有坑,务必安装正确。安装好之后顺便在Euroc数据集中的MH01上测试,得到下面的轨迹地图。

EuRoC数据集包含11个双目序列,这个序列由小型无人机在两个房间(V1/V2, Vicon Room)以及一个大工厂环境(MH, Machine Hall)中拍摄得到。相机的基线长约为11cm,以20Hz速度拍摄图片。序列被分成了三种(根据MAV的速度,光照以及场景纹理)easy , medium, difficult。 表示绝对轨迹误差,是衡量相机位姿的标准之一。假设有真实位姿序列:以及估计的位姿序列: ,它们已经做了包括时间戳对齐等操作。实际场景中,这两个序列可能有不同的采样率、长度亦或数据可能丢失,此时需要进行数据关联和插值。首先得的在第i时刻的轨迹误差:
其中是从到的最小二乘刚体变换,通过求取以上误差在所有位置时刻的均方根我们得到APE的具体形式:
其中的表示求取该位姿的平移分量算子。
文中大部分内容来自网络以及高博十四讲。因本人水平有限,如有错误,谢谢指出。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。