SLAM的通用框架:GSLAM
Posted wujianming-110117
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SLAM的通用框架:GSLAM相关的知识,希望对你有一定的参考价值。
SLAM的通用框架:GSLAM
GSLAM: A General SLAM Framework and Benchmark
论文链接:
摘要
SLAM技术最近取得了许多成功,吸引了高科技公司的注意。然而,如何统一现有或新兴算法的接口,有效地进行速度、健壮性和可移植性方面的基准测试,仍然是一个难题。本文提出了一种新的SLAM平台GSLAM,它不仅提供了评估功能,而且为研究人员快速开发SLAM系统提供了有用的工具。的核心贡献是为研究和商业应用提供一个通用的、跨平台的、完全开放源码的SLAM接口,旨在在统一的框架中处理与输入数据集、SLAM实现、可视化和应用程序的交互。通过这个平台,用户可以通过插件的形式实现自己的功能,以获得更好的性能,进一步推动应用程序向SLAM的实际应用发展。带有文档wiki的GSLAM源代码已经发布,可以在GitHub上找到。
1. 主要贡献
自20世纪80年代以来,同步定位与映射(SLAM)一直是计算机视觉与机器人领域的研究热点[3,10,14]。SLAM为许多需要实时导航的应用提供了基本功能,如机器人、无人机(UAV)、自动驾驶以及虚拟和增强现实。近年来,SLAM技术发展迅速,提出了多种SLAM系统,包括单目SLAM系统(基于关键点的SLAM系统[12,37,49]、直接的SLAM系统[15,16,53]和半直接的SLAM系统[22,23])、多传感器SLAM系统(RGBD系统[7,36,68]、立体的SLAM系统[17,23,51]和惯性辅助的SLAM系统[45,56,66])、基于学习的SLAM系统(监督的SLAM系统[6,55,67]和无监督方法[71,72]。
随着SLAM技术的迅速发展,几乎所有的研究者都把注意力放在了自己SLAM系统的理论和实现上,使得交换思想变得困难,并且不容易将实现移植到其他系统上。妨碍了快速适用于各种工业领域。目前,SLAM系统的实现方式很多,如何有效地进行速度、健壮性和可移植性方面的基准测试仍然是一个问题。最近,Nardi等人[52]和Bodin等人[4]提出了统一的SLAM基准系统,以进行定量、可比和可验证的实验研究,研究不同SLAM系统之间的权衡。通过这些系统,利用数据集和度量评估模块可以方便地进行评估实验。
由于这些系统只提供评估基准,有可能建立一个平台,服务于SLAM算法的整个生命周期,包括开发、评估和应用阶段。基于SLA的深度学习近年来取得了显著的进展,有必要建立一个既支持C++又支持Python的平台,更好地支持基于SLAM系统的几何和深度学习的集成。本文介绍了一种新的SLAM平台,它不仅提供了评估功能,而且为研究人员快速开发自己的SLAM系统提供了有用的工具。通过该平台,用户可以直接使用常用函数或创建自己的函数来实现自己的项目,从而获得更好的性能。希望这个平台能进一步推动SLAM系统的实际应用。总之,这项工作的主要贡献如下:
1) 为研究和商业应用提供了一个通用的、跨平台的、完全开放源码的SLAM平台,这超出了以前的基准。SLAM接口由几个轻量级的、无依赖项的头文件组成,这使得在一个统一的框架中与不同的数据集、SLAM算法和带有插件表单的应用程序进行交互变得容易。此外,javascript和Python也被提供给基于web和基于深度学习的SLAM应用程序。
2)在GSLAM平台中,引入了三个优化模块作为工具类,包括估计器、优化器和词汇表。估计器的目的是提供一个封闭形式的求解器的集合,涵盖所有有趣的情况和稳健样本一致性(RANSAC);优化器的目的是为流行的非线性SLAM问题提供一个单一的接口;词汇表的目的是提供一个有效和便携式的词汇袋实现与多线程和SIMD优化的地方再电离。
3)得益于上述接口,在一个统一的框架中实现并评估了现有数据集、SLAM实现和可视化应用程序的插件,未来新兴基准或应用程序可以更容易地集成。
General SLAM Framework
GSLAM的核心工作是提供一个通用的SLAM接口和框架。为了更好的体验,界面被设计成轻量级的,它由几个头组成,并且仅依赖于C++ 11标准库。基于该接口,支持JavaScript、Python等脚本语言。在这一部分中,介绍了GSLAM框架,并简要介绍了几个基本接口类。 框架概述
GSLAM的框架如图1所示,一般来说,接口的目的是处理三个部分的交互:
1)SLAM实现的输入
运行SLAM时,需要传感器数据和一些参数。对于GSLAM,Svar类用于参数配置和命令处理。SLAM实现所需的所有传感器数据都由一个数据集实现提供,并使用Messenger进行传输。GSLAM实现了几个流行的visual SLAM数据集,用户可以自由地实现自己的数据集插件。
2)SLAM的实现
GSLAM将每个实现视为一个插件库。开发人员很容易基于GSLAM接口和实用程序类设计SLAM实现。开发人员还可以使用接口包装实现,而不必导入额外的依赖项。用户可以专注于核心算法的开发,而不必关心SLAM实现之外应该处理的输入和输出。
3)使用SLAM结果的可视化部分或应用程序
在SLAM实现处理输入帧之后,用户可能希望演示或利用结果。一般来说,SLAM结果应该以标准格式发布。默认GSLAM使用Qt进行可视化,但是用户可以自由地实现自定义的可视化工具,并添加应用程序插件,如评估应用程序。
该框架被设计为兼容不同种类的SLAM实现,包括但不限于单目、立体、RGBD和具有多传感器融合的多摄像机视觉惯性里程表。现在它最适合基于特征的实现,同时也支持基于直接或深度学习的SLAM系统。由于现代的深度学习平台和开发人员喜欢Python进行编码,GSLAM提供了Python绑定,因此开发人员能够使用Python实现SLAM,并用GSLAM调用它,或者用Python调用基于C++的SLAM实现。此外,GSLAM可以用来训练SLAM模块,其监督过程可以概括为:
1)使用传统SLAM插件计算稀疏深度图和相机姿态;
2)使用深度图和相机姿态作为监督训练估计器。GSLAM还可以应用无监督的方法来联合学习深度和姿态估计器,通过数据集插件只需要不需要地面真实深度的图像序列进行训练。然后,利用多视图几何约束作为损失对网络进行训练。
3.2 基本接口类
SLAM接口通常使用一些数据结构,包括参数设置/读取、图像格式、姿态变换、相机模型和地图数据结构。下面将简要介绍一些基本的接口类。
3.2.1参数设置
GSLAM使用一个小的参数解析和参数设置类Savar,它仅由一个依赖于C++ 11的单个标头组成,其特征如下:
1. 参数解析和配置加载与帮助信息。与Google g flags2等流行的参数解析工具类似,变量配置可以从参数、文件和系统环境中加载。用户还可以通过“帮助”中的“介绍”定义不同类型的参数。
2.一种具有变量、函数和条件的小型脚本语言,使配置更加强大。
3. 线程安全的变量绑定和共享。建议使用非常高频率的变量与指针或引用绑定,这样既方便又高效。
4. C++和纯脚本的简单函数调用和调用。命令和函数之间的绑定有助于开发人员分离文件依赖关系。
5. 支持树结构表示,这意味着很容易加载或保存XML、JSON和YAML格式的配置。
3.2.2进程内消息传递
由于ROS提供了一种非常方便的节点间通信方式,受到了大多数机器人研究人员的青睐。受ROS2消息传递体系结构的启发,GSLAM实现了一个类似的进程内通信实用程序类Messenger。这为在SLAM实现中替换ROS并保持兼容性提供了另一种选择。由于进程内设计,Messenger可以发布和订阅任何类,而不需要额外的成本。下面列出了更多功能:
1. 这个界面保持了ROS的风格,用户可以很容易地开始使用。并且支持所有的ROS-defined消息,这意味着几乎不需要什么工作来取代原来的ROS消息。
2.由于不存在序列化和数据传输,因此可以发送消息而无需等待时间和额外成本。同时,有效载荷不限于ROS定义的消息,但支持任何可复制的数据结构。
3. 源是基于C++ 11的头字号LES,没有额外的依赖性,这使得它是可移植的。 4. API是线程安全的,当队列大小大于零时支持多线程条件通知。主题名和RTTI数据结构检查都在发布服务器和订阅服务器相互连接之前完成,以确保调用正确。
三维变换
旋转、刚性和相似性是SLAM研究中最常用的三种变换。点p=(x,y,z)T的相似变换常用于使用4×4齐次变换矩阵或将该矩阵分解为旋转和平移分量:
3.2.4图像格式
图像数据的存储和传输是视觉SLAM的两个重要功能。为了高效和方便,GSLAM使用了一个与cv::Mat兼容的数据结构框架。它有一个智能点计数器,可以安全地释放内存,而且不需要内存拷贝就可以轻松地传输。并且数据指针是对齐的,这样单指令多数据(SIMD)的速度就更容易提高。用户可以无缝安全地在GImage和cv::Mat之间进行转换,而无需内存拷贝。
3.2.5摄像机型号
摄像机模型应被定义为将三维点pc从摄像机坐标投影到二维像素x。一个最流行的摄像机模型是针孔模型,其中投影可以通过乘以一个称为:
由于SLAM图像可能包含由于制造不完善而产生的径向和切向畸变,或者是用鱼眼或全景相机拍摄的,因此提出了不同的相机模型来描述投影。GSLAM提供的实现包括OpenCV[24](ORBSLAM[51]使用)、ATAN(PTAM[37]使用)和OCamCalib[59](MultiCol SLAM[65]使用)。用户也很容易继承类并实现其他一些相机模型,如Kannala Brandt[35]和等矩形全景模型。
3.2.6 地图数据结构
对于SLAM实现,其目标是定位实时姿势并生成地图。GSLAM提出了一种统一的地图数据结构,由多个地图框架和地图点组成。这种数据结构适用于大多数现有的视觉SLAM系统,包括基于特征的方法和直接方法。图幅用于表示不同时期的位置状态,包括由传感器捕获的各种信息或估计结果,包括IMU或GPS原始数据、深度信息和相机模型。它们之间的关系由SLAM实现来估计,它们之间的连接形成一个姿势图。映射点用于表示帧所观察到的环境,通常用于基于特征的方法。但是,映射点不仅可以表示关键点,还可以表示GCP、边缘线或三维对象。它们与图幅的对应形成一个观察图,通常称为束图。
4. SLAM实现实用程序
为了简化SLAM系统的实现,GSLAM提供了一些实用类。本节将简要介绍三个优化模块:估计器、优化器和词汇表。
4.1. 估计器
纯几何计算仍然是一个需要鲁棒精确实时解的基本问题。经典的视觉SLAM算法[22,37,49]和现代的视觉惯性解[45,56,66]都依赖于几何视觉算法进行初始化、重新定位和环路闭合。OpenCV[5]提供了几个几何图形算法和Kneip提出了一个几何视觉工具箱OpenGV[39],该工具箱仅限于摄像机姿态计算。GSLAM的估计器旨在提供一组用稳健样本一致性(RANSAC)[19]方法覆盖所有有趣案例的闭式解算器。表2列出了估计器支持的算法。根据观察结果,它们被分为三类。利用二维匹配估计外极或单应约束,并从中分解相对位姿。对于单目或多目相机系统,二维-三维对应关系被用来估计中心或非中心绝对位姿,这是著名的PnP问题。还支持三维几何函数,如平面拟合和估计两点云的SIM3变换。大多数算法都是根据线性代数库的特征值来实现的,对于大多数平台来说,特征值只是报头,而且很容易实现。
计算性能评估包括内存使用率、malloc数、CPU使用率和每帧统计使用的时间,如图4所示。结果表明,SVO占用的内存、CPU资源最少,速度最快。所有的成本都保持稳定,因为SVO是一个可视的里程表,并且在实现中只维护一个本地地图。DSO内存块数较少,但占用的内存超过100MB,增长缓慢。DSO的一个问题是当帧数小于500时,处理时间急剧增加,另外,关键帧的处理时间甚至更长。ORBSLAM占用的CPU资源最多,计算时间稳定,但由于bundle调整使用了G2O库,没有采用增量优化方法,内存利用率增长较快,分配和释放了大量内存块。里程表轨迹评估如图5所示。如我们所见,SVO速度更快,但漂移更大,而ORBSLAM在绝对位姿误差(APE)方面达到最佳精度。也提供了相对位姿误差(RPE),但由于图中,补充材料中提供了更多的实验结果。由于集成评估是一个可插入的插件应用程序,因此可以使用更多的评估指标(如pointcloud的精度)重新实现它。
4.2优化器
非线性优化是最先进的几何SLAM系统的核心部分。由于Hessian矩阵的高维性和稀疏性,采用图结构对SLAM的复杂估计问题进行建模。为了解决一般图优化问题,提出了Ceres[1]、G2O[43]和GTSAM[13]等框架。这些框架被不同的SLAM系统广泛使用。ORB-SLAM[49,51],SVO[22,23]使用G2O进行束调整和位姿图优化。OKVIS[45],VINS[56]使用Ceres进行带IMU因子的图优化,并使用滑动窗口控制计算复杂度。Forster等人[21]提出了一种基于SVO的可视化初始方法,并用GTSAM实现了后端。GSLAM的优化器旨在为大多数非线性SLAM问题(如PnP求解器、束调整、位姿图优化)提供一个统一的接口。基于Ceres库实现了一个通用的插件。对于一个特殊的问题,比如包调整,一些更有效的实现,比如PBA[70]和ICE-BA[46]也可以作为插件提供。通过使用优化器实用程序,开发人员可以使用统一的接口访问不同的实现,特别是对于基于深度学习的SLAM系统。
4.3 词汇
位置识别是SLAM重定位和环路检测的重要组成部分。单词包(BoW)方法由于其高效性和性能在SLAM系统中得到了广泛的应用。FabMap[11][30]提出了一种基于位置外观的概率识别方法,RSLAM[47],LSD-SLAM[16]使用了这种方法。由于使用了诸如SIFT和SURF这样的浮动描述符,DBoW2[25]构建了一个用于训练和检测的词汇树,它同时支持二进制和浮动描述符。Rafael提出了DBoW2的两个改进版本DBoW3和FBoW[48],简化了界面,加快了训练和加载速度。在ORB-SLAM[49]采用ORB[58]描述符并使用DBoW2进行环路检测[50]、重新定位和快速匹配之后,ORB-SLAM2[51]、VINS Mono[56]和LDSO[26]等多种SLAM系统使用DBoW3进行环路检测。它已经成为实现SLAM系统位置识别的最流行的工具。受上述工作的启发,GSLAM实现了DBoW3词汇表的header-only实现,具有以下特性:
1. 删除OpenCV依赖性,所有功能都在一个单独的头标题中实现,只依赖于C++ 11。
2. 结合了DBoW2/3和FBoW[48]的优点,这两种方法都非常快速且易于使用。提供了类似于DBoW3的接口,并使用SSE和AVX指令加速二进制和浮点描述符。
3. 我们提高了记忆的利用率,加快了加载、保存或训练词汇以及从图像特征到弓向量的转换的速度。
5. SLAM评估基准
已有的基准测试[2963]需要用户下载测试数据集并上传结果进行精度评估,无法统一运行环境,无法进行性能比较评估。得益于GSLAM的统一接口,对SLAM系统的评估变得更加优雅。在GSLAM的帮助下,开发者只需上传SLAM插件,就可以在固定资源的dockerlized环境中对速度、计算成本和准确性进行各种评估。在本节中,我们将对三种具有代表性的SLAM实现进行速度、精度、内存和CPU使用情况的评估,以证明使用不同SLAM实现插件实现统一SLAM基准的可能性。
Conclusions
本文介绍了一种新型通用的SLAM平台GSLAM,它提供了从开发、评估到应用的支持。常用的工具包由插件表单提供,用户也可以方便地开发自己的模块。为了使平台易于使用,我们只允许接口依赖于C++ 11。此外,还提供了Python和JavaScript接口,以便更好地集成传统的和基于深度学习的SLAM或分布式web。
以上是关于SLAM的通用框架:GSLAM的主要内容,如果未能解决你的问题,请参考以下文章