ROS 视觉SLAM 6 | ORBSLAM2建图定位
注意!该教程对应ROS套件用户
视觉SLAM仅用一个单目摄像头来实现是最便宜的,也是最小的传感器设备。然而,单目的深度是不能直接获得深度,这导致地图尺度和轨迹估计结果是不明的。而且初始化地图需要使用多视角,单目相机不能从第一帧三角化获得。最后,单目SLAM还有尺度漂移、在探索运动中纯旋转可能导致失败。使用双目或RGB-D相机,全部的问题都能避免,是最可靠的视觉SLAM解决方案。
ORB-SLAM2是一个开源的能同时用于单目、双目和RGB-D摄像头的SLAM系统,包括闭环、重定位、地图重用。其核心是使用 ORB (Orinted FAST and BRIEF) 作为整个视觉 SLAM 中的核心特征。
ORB-SLAM2 基本简介
ORB-SLAM是西班牙 Zaragoza 大学的 Raúl Mur-Arta 编写的视觉 SLAM 系统。它是一种适用于单目、双目和 RGB-D 相机的多功能且准确的 SLAM 解决方案。它能够在各种环境中实时计算相机轨迹和场景的稀疏 3D 重建,从办公桌的小型手持SLAM到在几个城市街区周围行驶的汽车。它能够关闭大循环并从广泛的基线实时执行全局重新定位。它包括来自平面和非平面场景的自动和稳健的初始化。
ORB-SLAM 基本延续了 PTAM 的算法框架,但对框架中的大部分组件都做了改进, 归纳起来主要有 4 点:
- ORB-SLAM 选用了 ORB 特征, 基于 ORB 描述量的特征匹配和重定位, 都比 PTAM 具有更好的视角不变性。此外, 新增三维点的特征匹配效率更高, 因此能更及时地扩展场景。扩展场景及时与否决定了后续帧是否能稳定跟踪。
-
ORBSLAM 加入了循环回路的检测和闭合机制, 以消除误差累积。系统采用与重定位相同的方法来检测回路(匹配回路两侧关键帧上的公共点), 通过方位图 (Pose Graph) 优化来闭合回路。
-
PTAM 需要用户指定 2 帧来初始化系统, 2 帧间既要有足够的公共点, 又要有足够的平移量. 平移运动为这些公共点提供视差 (Parallax) , 只有足够的视差才能三角化出精确的三维位置。ORB-SLAM 通过检测视差来自动选择初始化的 2 帧。
-
PTAM 扩展场景时也要求新加入的关键帧提供足够的视差, 导致场景往往难以扩展. ORB-SLAM 采用一种更鲁棒的关键帧和三维点的选择机制——先用宽松的判断条件尽可能及时地加入新的关键帧和三维点, 以保证后续帧的鲁棒跟踪; 再用严格的判断条件删除冗余的关键帧和不稳定的三维点,以保证 BA 的效率和精度。
引自《基于单目视觉的同时定位与地图构建方法综述》
ORB-SLAM2项目地址为:https://github.com/raulmur/ORB_SLAM2
具体论文ORB-SLAM2:用于单目、立体和 RGB-D 相机的开源 SLAM 系统
ORB-SLAM2 系统框架
上面是ORB-SLAM总体系统概要展示,这个系统有三个主要的线程模块:
- 跟踪 (Tracking)
这一部分主要工作是从图像中提取ORB特征,根据上一帧进行姿态估计,或者进行通过全局重定位初始化位姿,然后跟踪已经重建的局部地图,优化位姿,再根据一些规则确定新的关键帧。 -
局部建图(LocalMapping)
这一部分主要完成局部地图构建。包括对关键帧的插入,验证最近生成的地图点并进行筛选,然后生成新的地图点,使用局部捆集调整(Local BA),最后再对插入的关键帧进行筛选,去除多余的关键帧。 -
闭环检测(LoopClosing)
这一部分主要分为两个过程,分别是闭环探测和闭环校正。闭环检测先使用WOB进行探测,然后通过Sim3算法计算相似变换。闭环校正,主要是闭环融合和Essential Graph的图优化。
ORB-SLAM2 单目相机运行
-
机器人本地端启动摄像头、ORB-SLAM单目节点
roslaunch lingao_vslam lingao_orb_slam2_mono.launch
单目摄像头启动后会出现Map point vector is empty!
这是因为需要移动单目摄像头获取足够的视差从而三角化出精确的三维位置
- 在远程rviz端查看
roscd lingao_rviz/vslam/ rviz -d orb_slam2.rviz
此时可看到MAP没有显示,使用遥控控制小车多角度慢速移动完成三角化定位
现在可看到定位地图已出,可看到稀疏点云图,慢速移动小车完成建立地图和定位
单目摄像头需要校准后定位才准确,这边是简单校准,距离可能不太准确
ORB-SLAM2 RGB-D深度相机运行
该例程使用RGB-D相机运行,由于Astra驱动不支持RGB-D因此只用到深度
- 机器人本地端启动摄像头、ORB-SLAM RGB-D节点
roslaunch lingao_vslam lingao_orb_slam2_rgbd.launch
- 在远程rviz端查看
roscd lingao_rviz/vslam/ rviz -d orb_slam2.rviz
深度相机由于不需要进行获取足够的视差而直接启动
上面是建图的结果,可见深度相机效果比单目准确和快速