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基准的可能性。
5.1 数据集集合
运行SLAM系统总是需要具有相应配置的传感器数据流。为了让开发人员专注于核心SLAM插件的开发,GSLAM提供了一个标准的数据集接口,开发人员不需要处理SLAM输入。在线传感器输入和流量数据都是通过不同的数据集插件提供的,正确的插件通过识别给定的数据集路径suf fix动态加载。数据集实现应提供所有请求的传感器流和相关配置,因此不同数据集不需要额外设置。所有不同的传感器流都是通过在Sec中引入的Messenger发布的。具有标准主题名称和数据格式。GSLAM已经实现了表中列出的几个流行的visual SLAM数据集表4。对于用户来说,实现一个仅基于头的GSLAM核心的数据集插件并将其作为插件发布或与应用程序一起编译也是非常容易的。此外,我们还提供了ORBSLAM可以在不同数据集上运行的屏幕截图,图2中只修改了一个参数。
5.2 SLAM实现
图3展示了一些使用内置Qt可视化工具运行的开源SLAM和SfM插件的截图。该框架支持SLAM系统的不同体系结构,包括直接的、半直接的、基于特征的、甚至SfM方法和基于学*的密集深度估计。应该提到的是,由于SVO、ORBSLAM和TheiaSfM利用了Sec中介绍的地图数据结构。可视化是自动支持的。DSO实现需要发布点云、相机姿态、轨迹和姿态图等结果,以便进行可视化,就像基于ROS的实现一样。用户可以使用UNI框架访问不同的SLAM插件,根据C++、Python和节点JS接口开发基于SLAM的应用程序非常方便。由于许多研究人员使用ROS进行开发,GSLAM还提供ROS可视化工具插件来无缝传输ROS定义的消息,开发人员可以利用Rviz进行显示或继续开发其他基于ROS的应用程序。
5.3 评价
因为大多数基准测试只提供有或没有基本事实的数据集,供用户自己执行评估。GSLAM为计算性能和准确性评估提供了内置插件和脚本工具。使用TUMRGBD数据集中的序列nostructure纹理near withloop来演示计算的执行方式。并采用三个开源的单目SLAM插件DSO、SVO和ORBSLAM进行后续实验。所有实验都使用了一台运行64位Ubuntu 16.04的i7-6700cpu、GTX 1060 GPU和16gbram的计算机。计算性能评估包括内存使用率、malloc数、CPU使用率和每帧统计使用的时间,如图4所示。结果表明,SVO占用的内存、CPU资源最少,速度最快。所有的成本都保持稳定,因为SVO是一个可视的里程表,并且在实现中只维护一个本地地图。DSO内存块数较少,但占用的内存超过100MB,增长缓慢。DSO的一个问题是当帧数小于500时,处理时间急剧增加,另外,关键帧的处理时间甚至更长。ORBSLAM占用的CPU资源最多,计算时间稳定,但由于bundle调整使用了G2O库,没有采用增量优化方法,内存利用率增长较快,分配和释放了大量内存块。里程表轨迹评估如图5所示。如我们所见,SVO速度更快,但漂移更大,而ORBSLAM在绝对位姿误差(APE)方面达到最佳精度。也提供了相对位姿误差(RPE),但由于图中,补充材料中提供了更多的实验结果。由于集成评估是一个可插入的插件应用程序,因此可以使用更多的评估指标(如pointcloud的精度)重新实现它。
Conclusions
本文介绍了一种新型通用的SLAM平台GSLAM,它提供了从开发、评估到应用的支持。常用的工具包由插件表单提供,用户也可以方便地开发自己的模块。为了使平台易于使用,我们只允许接口依赖于C++ 11。此外,还提供了Python和JavaScript接口,以便更好地集成传统的和基于深度学*的SLAM或分布式web。
SLAM的通用框架:GSLAM的更多相关文章
- Android通用框架设计与完整电商APP开发系列文章
作者|傅猿猿 责编|Javen205 有福利 有福利 有福利 鸣谢 感谢@傅猿猿 邀请写此系列文章 Android通用框架设计与完整电商APP开发 课程介绍 [导学视频] [课程详细介绍] 以下是部分 ...
- TCP粘包处理通用框架--C代码
说明:该文紧接上篇博文“ linux epoll机制对TCP 客户端和服务端的监听C代码通用框架实现 ”讲来 (1)TCP粘包处理数据结构设计 #define MAX_MSG_LEN 65535 ty ...
- linux epoll机制对TCP 客户端和服务端的监听C代码通用框架实现
1 TCP简介 tcp是一种基于流的应用层协议,其“可靠的数据传输”实现的原理就是,“拥塞控制”的滑动窗口机制,该机制包含的算法主要有“慢启动”,“拥塞避免”,“快速重传”. 2 TCP socket ...
- Tensorflow实现Mask R-CNN实例分割通用框架,检测,分割和特征点定位一次搞定(多图)
Mask R-CNN实例分割通用框架,检测,分割和特征点定位一次搞定(多图) 导语:Mask R-CNN是Faster R-CNN的扩展形式,能够有效地检测图像中的目标,同时还能为每个实例生成一个 ...
- 赢友网络通用框架V10.0.0(WinuAppSoft) 基础框架设计表
/* * 版权所有:赢友网络(http://www.winu.net/) * 开发人员:新生帝(JsonLei) * 设计名称:赢友网络通用框架V10.0.0(WinuAppSoft) * 设计时间: ...
- C++通用框架和库
C++通用框架和库 来源 https://www.cnblogs.com/skyus/articles/8524408.html 关于 C++ 框架.库和资源的一些汇总列表,内容包括:标准库.Web应 ...
- OPCUA+MQTT构建物联网通用框架
写在前面: 为了应对标准化和跨平台的趋势,更好的推广OPC,OPC基金会在OPCDA成功应用的基础上推出了一个新的OPC标准——OPC UA,OPCUA不再基于分布式组件对象模型(DCOM),而是以面 ...
- Cocos Creator 通用框架设计 —— 资源管理优化
接着<Cocos Creator 通用框架设计 -- 资源管理>聊聊资源管理框架后续的一些优化: 通过论坛和github的issue,收到了很多优化或bug的反馈,基本上抽空全部处理了,大 ...
- 鸿蒙开发板外设控制 之 实现物理按键的“长按事件”(按键通用框架 V0.0.2)
我在之前的帖子<实现按键"按下事件"和"释放事件"的通用框架(V0.0.1)>中阐述了DTButton-V0.0.1的设计思路,并且也在帖子中开源了 ...
随机推荐
- 本地使用apache设置绑定多个域名
Apache开启了使用虚拟主机的功能: 打开Apache安装目录下conf/httpd.conf文件,找到 #LoadModule vhost_alias_module modules/mod_vho ...
- hdu4284 dfs+floyd
题意: 给你n个城市,m条边,要有h个必须旅游和打工的城市,问你能不能从1把所有必须的h个城市全部旅游并且打工完... 思路: 先一遍floyd跑出全局最短路,然后暴力枚举出打 ...
- Linux日志分析和管理
目录 日志的作用.分类.管理.轮转和级别 rsyslog服务 Journal守护进程 /var/log下相关的日志文件 日志服务器的建立 日志的作用.分类.管理.轮转和级别 日志的作用: 用于记录系统 ...
- POJ2406简单KMP
题意: 给一个字符串,求最大的前缀循环周期,就是最小的循环节对应的最大的那个周期. 思路: KMP的简单应用,求完next数组后有这样的应用:next[i] :是最大循环节的第几位 ...
- UVA10341解方程(二分)
题意: 给你一个方程 F[x] = pe^-x + qsin(x) + rcos(x) + stan(x) + tx^2 + u = 0(0<=p,r<=20,-20<= ...
- 基于 RTF specification v1.7 的 RTF 文件解析及 OLE 对象提取(使用 Python 开发)
0x01 Office RTF 文件介绍 RTF 文件也称富文本格式(Rich Text Format, 一般简称为 RTF),意为多文本格式是由微软公司开发的跨平台文档格式.大多数的文字处理软件都能 ...
- 密码学系列之:NIST和SHA算法
目录 简介 SHA1 SHA2 SHA3 简介 SHA算法大家应该都很熟悉了,它是一个用来计算hash的算法,目前的SHA算法有SHA1,SHA2和SHA3种.这三种算法都是由美国NIST制定的. N ...
- 在微信框架模块中,基于Vue&Element前端,通过动态构建投票选项,实现单选、复选的投票操作
最近把微信框架的前端改造一下,在原来基于Bootstrap框架基础上的微信后台管理,增加一套Vue&Element的前端,毕竟Vue的双向绑定开发起来也还是很方便的,而且Element本身也提 ...
- 普里姆(Prim)算法
概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(即"带权图")里搜索最小生成树.即此算法搜索到的边(Edge)子集所构成的树中,不但包括了连通图里的所有顶点(V ...
- Java线程池的工作流程
线程池刚被创建的时候,只是向系统里申请一个用于执行流程队列和管理线程池的线程资源.在调用execute()添加一个任务时,线程池会按照以下流程执行: 1.如果正在运行的线程数少于corePoolSiz ...