RTAB从2013年开始作为开源库,作为一个基于外观(appearance-based)闭环检测方法,同时拥有一个内存管理(memory management)在线处理大尺度、长时间(large-scale and long-term)定位和建图问题。由于每个应用程序都对传感器,处理能力和运动带来了一系列限制,因此它提出了在成本,准确性,计算能力和集成简易性方面最适合使用哪种SLAM方法的问题。很多SLAM系统都是基于视觉或者雷达信息的,因此很难对比它们的性能。因此,我们决定扩展RTAB-Map以支持视觉和激光雷达SLAM,在一个软件包中提供一个工具,允许用户使用不同的机器人和传感器实现和比较各种3D和2D解决方案,适用于各种应用。本文介绍了RTAB-Map的这一扩展版本,以及它在定量和定性地比较大量流行的真实数据集, 从自主导航应用的实用角度概述视觉和激光雷达SLAM配置的优势和局限性。
rtab的发展流程,2009年开始设计,2013年首次开源,2016年完全基于图优化,2017年扩展了很多新应用,目前被发展成跨平台独立的C++库和一个ROS功能包。能满足以下实际需求。
由于SLAM方法的多样性,在特定的平台和场景中决定使用哪一种成了一个困难任务,因为缺乏各种算法之间的对比分析。SLAM方法通常基于视觉(Fuentes‐Pacheco, Ruiz‐Ascencio, & Rendón‐Mancha, 2015),或者基于雷达(Thrun,2002),并且仅使用一个相机或者雷达在数据集上测试,很难有一个有意义的对比。尤其是算法只能离线运行或者缺少机器人平台上所需的输入格式时,情况变得更加困难。当前,在ROS中集成的视觉SLAM算法通常不在自主机器人上测试,只是通过手持传感器的方法,这样测试省去了一些SLAM之外的研究(路径规划,障碍规避等),但是,这同时也限制了各种SLAM方法的比较。
因此,自从RTAB-Map向解决实际问题发展,我们决定去扩展rtab的功,对比视觉和雷达SLAM配置解决机器人自主导航。rtab是一个闭环方法,以内存管理作为核心,它独立于所使用的里程计方法,这意味着它可以使用视觉、雷达甚至是车轮里程计。也就是rtab可以应用于视觉、雷达或者二者结合的方法,使在一个真实机器人上对比不用传感器配置成为可能。这篇论文描述了rtab库的扩展版本,并陈述了与当前主流方法的使用情况对比,最后列出提纲,说明两种范例在实际应用中的限制。
基于粒子滤波方法并且有回环检测过程,是ROS默认的SLAM方法,广泛应用于生成2D栅格地图,地图建好后,可以配合蒙特卡洛定位方法使用。
快速,低计算资源的建立2D栅格地图,被证实在真实环境中产生很低的定位漂移,也可以加入IMU来估计机器人的3D位置,但是它不算一个完整的SLAM算法,因此没有回环检测。同时,该算法不需要里程计,在没有很多几何约束的环境下效果受限。
可以创建2D栅格地图和点云图,和Hector相似,没有闭环检测。
都是基于图的雷达SLAM方法,在mapping时,它们创建由图中的约束连接的submap,当检测到闭环时,submap的位置被重优化来修正误差(由传感器噪声和扫描匹配的精度引起),与Hector不同的是,它们可以接收其他外置里程计,在低几何复杂度的环境中,得到更鲁棒的扫描匹配。
基于图的雷达SLAM方法,且仅支持3D雷达。当机器人出现在之前访问过的位置时,通过scan matching局部地进行闭环检测(全局优化效果一般)。
3D雷达闭环检测,基于图。闭环检测通过匹配3D分割信息(车辆,建筑,树木等)。在这些方法中,仅SegMatch方法支持multisession或multirobot mapping。
关于视觉SLAM,有很多开源方法存在,但在机器人上使用起来并不容易。对于导航功能,为了避免处理尺度不确定性问题,我们将综述的范围限制在能估计环境真实尺度的方法上(双目相机、RGBD相机或者VIO)。
二者都是视觉-惯导,基于图的视觉SLAM方法。maplab的工作流程分为两部分:
(1)仅使用VIO记录开环数据;
(2)离线完成地图管理(闭环检测,图优化,稠密建图等)。
得到的视觉地图可以在之后的定位模式中使用。相反,vins-mono的地图管理进程是在线的,TSDF可以在GPU上实时计算来提供障碍规避和路径规划。为了保持大尺度环境的处理时间,vins-mono限制了graph的尺寸,首先移除没有闭环的节点,然后根据graph的稠密度移除其他节点。
这两个算法是目前视觉SLAM中的state-of-the-art。二者都是基于图的算法,闭环基于DBoW2,map优化使用BA。在单独的线程中对闭环后的graph进行优化,以避免影响相机跟踪帧率性能。 对于ProSLAM,通过直接比较map中的描述子来检测循环闭包,而不是使用词袋的方法。闭环检测和图优化进程的耗时随着map的增长会产生明显延迟,并且map是稀疏特征,没有占用栅格和稠密地图,因此很难用在实际平台上。
估计运动时不使用特征(feature)而是使用所有像素的光度和深度误差。DVO没有闭环检测,大尺度建图劣势。
可以在线重建surfel-based地图,需要GPU提供计算力。建图比较精细,但是不支持ROS。
之前提出的SLAM方法假设相机从未被遮挡,或者图像中一直有足够多的特征。这两个假设在实际飞行中不可能一直满足,以下两种方法在实际中的鲁棒性更好一些:
(1)多相机PTAM:使用多个相机来增大FOV,至少一个相机感知到视觉特征,该方法就可以完成位置追踪。
(2)RGBDSLAMV2:
多种传感器的里程计信息融合(通过EKF),同时生成稠密地图和3D占用栅格地图。
rtab基于graph,流程如图1所示。
这个流程图是一个标准的基于图的SLAM架构,传感器信息经过时间对准之后,进入STM模块,然后进行前端处理(和VO那套差不多),后端进行图优化和全局地图维护。论文中提到一个参数“rtabmap/DetectionRate”,原文“according to how much data created from nodes should overlap each other”,根据从节点创建的数据应该彼此重叠多少(翻译的感觉很怪)。但是举了一个例子:当机器人运动快并且相机视场小的时候,这个值应该被提高,来保证连续节点的数据有重叠,但是设置太大会占用内存和耗费时间。link(链接)包含了两个节点之间的刚性变换(rigid transform),在这里有三种链接:邻居,闭环,相似。“邻居”连接是在STM里面通过odom转换建立的,“闭环”和“相似”也是通过闭环检测和相似性检测实现的。这些连接都用作图优化的约束条件。当一个新闭环或者相似产生时,图优化将计算误差传播到全图来减小里程计漂移。伴随着优化过程,Octomap,点云,2D栅格地图都在被全局更新。
对于SLAM的常规操作就不多说了,接下来说rtab比较有特点的内存管理方法(Labbé & Michaud,2013)。
为了防止地图变大带来的问题,rtab的内存被分成工作内存(WM)和长期内存(LTM),当一个节点被分到LTM中后,WM的流程对其不再起作用。当rtab的更新时间超过固定阈值“Rtabmap/TimeThr”,在WM的节点会被转换成LTM中来限制WM的size。同样,还有一个阈值“Rtabmap/MemoryThr”,可以设置WM中最大保持的节点数。
为了决定哪个节点被分到LTS中,一个权重机制决定了“哪个位置”更重要,使用一种启发式的方法:一个位置被观测的越长,它越重要,就应该放在WM中。 因此,当一个新的节点到来时,初始化它的权重为0,并且与上一个节点进行可视化比较(我感觉计算一个相似度的意思),如果它们很相似(对应的视觉单词超过相似阈值“Mem/RehearsalSimilarity“),新节点的权重等于旧节点权重加上1,同时将旧的节点权重置为零(我觉得就是一个权重传递过程),如果机器人没有移动,直接将旧的节点删除避免扩大graph的size。当时间或者内存满了,优先将权重最低的旧节点放到LTM里面。
当WM的一个位置发生闭环检测时,这个position的相邻节点(neighbor nodes)会被从LTM调回WM,当机器人在之前到过的地方移动时,它可以增量地记住过去的位置以扩展当前map并使用过去的位置进行定位。
里程计节点可以使用任何一种简单的里程计方式(车轮、IMU、单相机、单雷达)。独立于使用的传感器,里程计为rtab提供至少一种位姿估计信息,以odometry message形式配合tf使用(例如/odom to /base_link),当本体传感器不准确时,视觉和雷达传感器是必需的。视觉里程计方面,rtab应用了两种标准的里程计方法,Frame-to-Map(F2M)和Frame-to-Frame(F2F)。
F2M就是当前帧和一张特征图进行关联,当然特征图有之前很多帧图像的特征(有用的、显著的)。F2F就是当前帧和上一帧进行关联。雷达传感器的scan-to-scan和scan-to-map同理于视觉(雷达的point cloud可以认为和视觉的3D visual features在前端等价)。
贴个大图,很清晰的结构,有slam基础的看起来应该很轻松。
先放一张雷达里程计的流程图
使用类似于视觉里程表的术语,关键帧指的是点云(point cloud,3D雷达)或激光扫描(laser scan,2D雷达)。当机器人在scan过程中移动时,激光扫描会产生一些运动畸变(motion distortions),这里假定在将扫描提供给RTAB‐Map之前纠正了这种畸变。注意:如果激光扫描仪的旋转频率相对于机器人速度较高,激光扫描的运动畸变非常小,因此可以忽略校正,而不会显著降低配准精度。(我觉得北洋的雷达好像不进行畸变校准就挺好用的,包括之前cartographer上的测试)。
如果ICP找不到转换,里程计就会丢失。与视觉里程计不同,当运动预测为零时,激光雷达测程无法从丢失中恢复。为了避免了较大的测程误差,然后必须重置激光雷达测程。然而,只要激光雷达能够感知环境结构,机器人就很少会迷路。注意,如果使用外部里程计,运动预测仍然会给出一个有效的估计,因此,如果机器人回到丢失跟踪的位置,ICP配准可以从丢失中恢复。
传感器种类多了之后涉及到ROS环境中的时钟同步问题,没太细看。不过这部分按照说明进行配置,使用起来效果还不错,毕竟都是常用的传感器和ros包。
第一段说明当新节点在STM里生成时,会得到一个局部占用栅格(local occupancy grid),基于地图的图位姿(pose of the map‘s graph)能把局部的栅格图拼成全局的,并且经过优化后的graph对建立全局栅格图很有帮助。
第二段说明了根据传感器的不同格式可以生成不同的栅格地图,简单说就是2D数据只能生成2D栅格,3D数据可以生成2D或者3D。
闭环检测是基于2013年提出的基于词袋(bag-of-words)方法,STM提取新节点的视觉特征,并将它们量化为一个递增的视觉单词词汇表。特征可以用opencv中的SURF,SIFT,ORB等表示。当视觉里程计F2F或F2M被使用时,我们可以使用里程计中提取出来的特征来进行闭环检测。这节省了提取两次特征的时间。闭环检测需要的特征不需要想里程计中那么多,因此只需要之前特征集合的一个子集(典型特征组成的子集)来完成闭环检测。新建立的node和WM(work memory保留着整个过程中重要的nodes)中的nodes进行比较来检测闭环,STM里面的nodes都是最近才加入map的,因此这些节点不会用来去进行闭环检测。STM可以作为一个buffer在节点被移动至WM中,为了计算新节点和WM中所有节点的相似性(likelihood),Tf-IDF方法被使用去建立一个贝叶斯滤波器估计闭环假设。
如果闭环检测满足闭环条件,此时有里程计解算出来的转换关系就可以作为一个新的link加到graph中。
2017年提出的proximity detection是基于雷达scan来定位接近当前位置的nodes。 举例:在以不同的方向穿越长廊时,相机没法找到闭环,这时proximity detection就有帮助了。闭环检测的复杂度取决于WM的size,proximity detection的复杂度取决于靠近机器人的nodes数量。这些nodes在graph中必须很靠近(机器人运动增量很小),也就是说,这些nodes和最新node的连接(links)数必须小于一个阈值(原因绿色部分有说明)。
这段主要说明了视觉和雷达在SLAM后端过程的两种策略。
闭环检测和近似检测之后,图优化方法开始最小化map中的误差(errors)。rtab集成了三种图优化方法(1)TORO(2)G2O(3)GTSAM,(2)和(3)比(1)快,但是鲁棒性略差。但是经验表明,在6DoF的maps中G2O和GTSAM效果更好。
视觉闭环检测不是完全准确的,在相似的地方会触发无效的闭环检测,这反倒增加了map中的误差。为了检测到这些无效的处理,rtab使用了一个新参数,如果经过优化后,link的转换改变大于平移方差的一个因子“RGBD/optimizemaxerror”(假设两个节点理论上的link距离分布为N(0.5,0.2),而结果得到了2,明显就是优化错误。),所有基于新节点的闭环检测结果都被reject,保持闭环检测之前的graph。
在局部栅格地图信息上先“拼成”全局地图,然后根据后端优化结果对map进行修正。然后map发布在ros标准格式(sensor_msgs/pointcloud2)上。方便其他算法的开发和调试。
数据集
数据集
感觉这部分的总结都比较常规,简单说一些结论:
(1)室内导航,双目精度高,但是更推荐RGBD相机,因为可以检测到纹理特征少的表面来规避障碍。如果室内有玻璃等反射物品,视觉不再安全。
(2)多相机模式能增大FOV,但是有标定和计算载荷问题,对于2D环境使用有点冗余。
(3)对于无人机的3D导航,多相机模式比3D雷达模式在成本上更有优势。
举例子也没有举无人机应用的例子……