特征点法的巅峰之作—ORBSLAM2
ORB-SLAM 是西班牙 Zaragoza 大学的 Raúl Mur-Arta 编写的视觉 SLAM 系统。 它是一个完整的 SLAM 系统,包括视觉里程计、跟踪、回环检测,是一种完全基于稀疏特征点的单目 SLAM 系统,同时还有单目、双目、RGBD 相机的接口。其核心是使用 ORB (Orinted FAST and BRIEF) 作为整个视觉 SLAM 中的核心特征。
ORB-SLAM 基本介绍
ORB-SLAM 基本延续了 PTAM 的算法框架,但对框架中的大部分组件都做了改进, 归纳起来主要有 4 点:
- ORB-SLAM 选用了 ORB 特征, 基于 ORB 描述量的特征匹配和重定位, 都比 PTAM 具有更好的视角不变性。此外, 新增三维点的特征匹配效率更高, 因此能更及时地扩展场景。扩展场景及时与否决定了后续帧是否能稳定跟踪。
- ORBSLAM 加入了循环回路的检测和闭合机制, 以消除误差累积。系统采用与重定位相同的方法来检测回路(匹配回路两侧关键帧上的公共点), 通过方位图 (Pose Graph) 优化来闭合回路。
- PTAM 需要用户指定 2 帧来初始化系统, 2 帧间既要有足够的公共点, 又要有足够的平移量. 平移运动为这些公共点提供视差 (Parallax) , 只有足够的视差才能三角化出精确的三维位置。ORB-SLAM 通过检测视差来自动选择初始化的 2 帧。
- PTAM 扩展场景时也要求新加入的关键帧提供足够的视差, 导致场景往往难以扩展. ORB-SLAM 采用一种更鲁棒的关键帧和三维点的选择机制——先用宽松的判断条件尽可能及时地加入新的关键帧和三维点, 以保证后续帧的鲁棒跟踪; 再用严格的判断条件删除冗余的关键帧和不稳定的三维点,以保证 BA 的效率和精度。
引自《基于单目视觉的同时定位与地图构建方法综述》
特点
- 首个支持单目,双目和RGBD相机的完整的开源SLAM方案,能够实现地图重用,回环检测和重新定位的功能
- 能够在CPU上进行实时工作,比如手机、无人机、汽车。
- 特征点法的巅峰之作,定位精度极高。
- 能够实时计出相机的位姿,并生成场景的稀疏三维重建地图。
- 代码非常整洁,包含很多实际应用中的技巧,非常实用。
- 支持仅定位模式,该模式适用于轻量级以及在地图已知情况下长期运行,此时不使用局部建图和回环检测的线程。
- 双目和RGBD相对单目相机的主要优势在于,可以直接获得深度信息,不需要像单目情况中那样做一个特定的SFM初始化
系统框架
ORB-SLAM 它是由三大块、三个流程同时运行的。第一块是跟踪,第二块是建图,第三块是闭环检测。
1. 跟踪(Tracking)
这一部分主要工作是从图像中提取 ORB 特征,根据上一帧进行姿态估计,或者进行通过全局重定位初始化位姿,然后跟踪已经重建的局部地图,优化位姿,再根据一些规则确定新关键帧。
2. 建图(LocalMapping)
这一部分主要完成局部地图构建。包括对关键帧的插入,验证最近生成的地图点并进行筛选,然后生成新的地图点,使用局部捆集调整(Local BA),最后再对插入的关键帧进行筛选,去除多余的关键帧。
3. 闭环检测(LoopClosing)
这一部分主要分为两个过程,分别是闭环探测和闭环校正。闭环检测先使用 WOB 进行探测,然后通过 Sim3 算法计算相似变换。闭环校正,主要是闭环融合和 Essential Graph 的图优化。
优缺点**
优点:
- 一个代码构造优秀的视觉 SLAM 系统,非常适合移植到实际项目。
- 采用 g2o 作为后端优化工具,能有效地减少对特征点位置和自身位姿的估计误差。
- 采用 DBOW 减少了寻找特征的计算量,同时回环匹配和重定位效果较好。重定位:比如当机器人遇到一些意外情况之后,它的数据流突然被打断了,在 ORB-SLAM 算法下,可以在短时间内重新把机器人在地图中定位。
- 使用了类似「适者生存」的方案来进行关键帧的删选,提高系统追踪的鲁棒性和系统的可持续运行。
- 提供最著名的公共数据集( KITTI 和 TUM 数据集)的详尽实验结果,以显示其性能。
- 可以使用开源代码,并且还支持使用 ROS。 (Github: slightech/MYNT-EYE-ORB-SLAM2-Sample)
缺点:
- 构建出的地图是稀疏点云图。只保留了图像中特征点的一部分作为关键点,固定在空间中进行定位,很难描绘地图中的障碍物的存在。
- 初始化时最好保持低速运动,对准特征和几何纹理丰富的物体。
- 旋转时比较容易丢帧,特别是对于纯旋转,对噪声敏感,不具备尺度不变性。
- 如果使用纯视觉 slam 用于机器人导航,可能会精度不高,或者产生累积误差,漂移,尽管可以使用 DBoW 词袋可以用来回环检测。最好使用 VSLAM+IMU 进行融合,可以提高精度上去,适用于实际应用中机器人的导航。
代码解析
associate:深度图与彩色图之间不能超过0.02s。
数据集
- TUM
- EuRoC
- KITTI
地图表示
红色点表示当前追踪的点,黑色点表示剩下的点。
glcloor3f(0.0,0.0,0.0); //黑色
glcloor3f(1.0,0.0,0.0); //红色
入口函数
loadImages(); //读取图片的函数 用来loadframe
System.h
其中包含的系统类非常重要