COLMAP-SLAM:一个视觉里程计的框架

文章:COLMAP-SLAM: A FRAMEWORK FOR VISUAL ODOMETRY

作者:L. Morelli , F. Ioli, R. Beber , F. Menna, F. Remondino , A. Vitti

编辑:点云PCL

代码:https://github.com/3DOM-FBK/COLMAP_SLAM

欢迎各位加入知识星球,获取PDF论文,欢迎转发朋友圈。文章仅做学术分享,如有侵权联系删文。

公众号致力于点云处理,SLAM,三维视觉,高精地图等领域相关内容的干货分享,欢迎各位加入,有兴趣的可联系dianyunpcl@163.com。侵权或转载联系微信cloudpoint9527。

摘要

SLAM技术越来越多地与其他传感器集成,用于室内和室外的导航。在这个研究领域中,特别关注使用深度学习局部特征进行图像匹配、关键帧选择方法,以及对新的IMU和GNSS解决方案进行测试。在其他广泛使用的SLAM实现(如ORB-SLAM)上集成和测试新的方法可能并不是一项简单的任务。因此,我们提出了对COLMAP的扩展,以实时作为基于特征的视觉SLAM,并可以与其他传感器配合使用,选择COLMAP是因为其模块化性和庞大的社区,这确保了仓库的持续性。本文提出了一个主要用于实时评估基于学习的配准点和新SLAM特征的流程,适用于单目、双目和多摄像机系统。还展示了基于深度学习局部特征的关键帧选择算法的示例,以及IMU集成的简单示例。GitHub仓库:

https://github.com/3DOM-FBK/COLMAP_SLAM。

主要贡献

为促进新的图像匹配算法在SLAM中的集成,本文提出了COLMAP-SLAM,这是一个基于COLMAP API的Python开源框架。它提供了一个用于开发新SLAM算法的模块化软件,特别适用于快速集成和评估基于特征的SLAM/VO的新本地特征。实现了单目和立体/多摄像机情况,支持人工制作和基于深度学习的局部特征。关键帧选择基于使用ORB或ALIKE特征计算的光流的创新,但其他特征也可以轻松集成。目前,仅支持单目场景的闭环检测。如果GNSS数据存储在图像的EXIF标签中,将用于地理参考相机轨迹。该工程是模块化的,允许独立研究每个单一任务。主要框架使用Python编写,新功能也可以使用其他语言添加,然后通过Python作为包装器调用。所提出的方案在EuRoC Machine Hall数据集上进行了评估,并与基于ORBSLAM2的VSLAM框架OpenVSLAM进行了比较。

本文的目的是了解COLMAP在实时运行时的潜力,重点关注计算工作量和恢复的相机姿势的准确性,据作者所知,这是COLMAP的首个开源实现,用于执行V-SLAM任务,包括多摄像机支持、对不同局部特征的支持以及GNSS数据的集成。类似地,Nocerino等人提出了一个3D重建流程,用于在多用户同时或分离采集会话期间使用智能手机进行视频采集和云中的几何3D重建。另一个类似的项目是使用COLMAP的离线Python SLAM的项目,但尚未公开发布。最后虽然我们依赖于COLMAP API,但基于PYCOLMAP的类似工作最近在GitHub上发布,但尚未与我们的方法进行比较。

内容概述

提出的用于实时导航和建图的流程建立在COLMAP的基础上。具体而言,利用其API来提取RootSIFT本地特征、进行GPU匹配以及增量束调整/重建。选择COLMAP引擎是因为其模块化性和易于集成自定义本地特征和匹配。

图片

图1:拟提出的COLMAP-SLAM方案概述

总体流程的流程图如图1所示,其关键点包括:

 • 从单个摄像机或同步的多摄像机系统中保存的帧被本地保存,按摄像机分组。尽管COLMAP可以进行自校准,为了限制计算时间并提高准确性,应提供每个摄像机的校准参数。 

• 以固定时间间隔搜索新帧,并且关键帧选择模块仅选择在关键点分布方面提供足够新的帧,关键帧选择仅在选择为主摄像机的摄像机上执行。在未来,我们计划将关键帧选择扩展到其他从摄像机。实际上,可能在主摄像机上关键点分布方面不足够新,而在其他摄像机上创新可能显著不同,例如由于不同的视角。为了节省计算时间,一个选项是在主摄像机上对所有帧运行关键帧选择,并在其他摄像机上以较低的帧速率运行。

 • 主摄像机的关键帧在不同时间中依次匹配,而从摄像机的帧仅与同步的主关键帧匹配。 

• 所有匹配都保存在SQLite数据库中,然后使用COLMAP映射器API注册新关键帧,三角测量新的关键点,最后调整3D点和相机姿势。该过程不断重复:在新可用的帧中搜索新关键帧,并使用新的特征和相机姿势更新先前的地图。

 • 在关键帧选择期间提取关键点的算法可以与用于增量注册新关键帧的算法不同。如果关键帧选择所需的特性(精度、计算资源等)与图像注册期间所需的特性不同,则这可能是有用的。 

• 支持不同的摄像机传感器配置,例如单目、立体和多摄像机。目前,当使用RootSIFT本地特征时,仅支持单目情况下的闭环检测。 

• 图像的第一批定义了参考系统。如果在EXIF数据中提供了GNSS数据,它将用于地理参考轨迹,目前,尺度因子是仅从GNSS数据或立体基线中的初始图像批次计算的。如果仅使用一个摄像机而没有来自其他传感器的附加信息,则摄像机轨迹已知,但尺度因子是未知的。

• 对于实时应用程序中的匹配,可以选择RootSIFT、ORB或ALIKE,而对于离线模拟或后处理的图像序列,可以使用其他本地特征。目前,支持SuperPoint和Key.Net + HardNet。引入离线选项是为了测试在实时提取速度太慢的本地特征,或作为集成和测试局部特征的更简便的方法。实际上,可以事先提取目标文件夹中所有帧的本地特征,然后在需要时COLMAP-SLAM将查找关键点。 

• COLMAP的sequential_matcher API用于在k个图像的自定义窗口上进行匹配,对于n个非定向图像,匹配窗口扩展到k+n,以增加确保图像跟踪不受图像方向失败中断的机会,这种方法通过自适应匹配增加了重新定位的能力,克服了场景中可能的临时障碍或照明突变。

关键帧选择 

关键帧选择基于最后一个关键帧与当前帧之间的光流创新,基于相应的局部特征。因此,关键点的光流被定义为最后一个关键帧中关键点的坐标与当前帧中相同关键点的坐标之间的2D欧氏距离(以像素为单位)。在SLAM循环的每次迭代中,当有新帧可用时,使用传统的ORB检测器或ALIKE,一种先进的可微分关键点检测算法,能够实现亚像素精度并且在商业级GPU上以每秒95帧的速度运行,提取局部特征。然后,通过使用余弦相似性方法对检测到的局部特征进行匹配,该方法评估提取的描述符的n维向量的相似性。然后基于极线约束使用Pydegensac过滤对应的匹配。为了决定新帧是否为SLAM定位带来足够创新并且因此应选择为关键帧,计算中位匹配距离(MMD)(见图2)并与阈值进行比较。这是当前帧和上一个关键帧中匹配的关键点之间的2D欧氏距离的中值。此外,算法还检查当前帧中是否找到足够的新匹配特征,以避免将其拒绝。ORB和ALIKE的性能相似:使用ORB和ALIKE,关键帧选择算法大约需要0.05秒来评估新帧并确定是否应将其指定为关键帧。

图片

图2: (a) 从EuRoC Machine Hall (MH) 02数据集中选择的关键帧示例,相对于上一个关键帧的中位匹配距离(MMD)为105.74像素。红色点表示当前帧中特征的位置,而绿色矢量表示上一个关键帧中相应特征的位置;(b) 未被选择为关键帧的帧示例(MMD = 11.05像素),因此被剔除。

IMU集成 

陀螺仪和加速度计的流行度在过去几年中显著增加,现在它们普遍存在于智能手机、相机和机器人玩具中。通过微机电系统(MEMS)技术的改进,这些传感器的微型化成为可能,从而获得了增强性能的传感器。惯性测量单元(IMU)包括3个测量角速度的陀螺仪和3个测量加速度的加速度计,以及重力方向。虽然IMU参考系统中的角速度和加速度测量作为单独的观测值具有价值,但通过传感器融合算法将它们进行集成可提高IMU机体框架方向的估计准确性,而不仅仅是通过陀螺仪数据进行集成得到的估计。此外,如果磁力计与IMU一起使用,就可以建立相对于磁北的方向的绝对测量,从而便于创建姿态和航向参考系统(AHRS)。

图片

表1. EuRoC Machine Hall数据集的五个子集的示例帧和总帧数

实验

COLMAP-SLAM的准确性已在EuRoC Machine Hall数据集上进行了测试,该数据集由作者根据难度递增分为五个子集,从易到难分别为easy、medium和difficult。这些子集的挑战在于速度变化、高速和慢速移动以及静止序列。为了评估SLAM方法的性能,还提供了精确的地面真实轨迹。图像序列被输入COLMAP-SLAM,模拟实时采集。计算相机位姿的准确性采用了Root Mean Square Error(RMSE),该误差是通过COLMAP-SLAM轨迹与地面真实轨迹之间的Helmert变换获得的。

单目SLAM的准确性评估

首次测试是针对EuRoC Machine Hall 01数据集的单目情况,测试中使用了简单的关键帧选择方法,将20 Hz的流降采样到1 Hz。启用了回环检测时,COLMAP-SLAM的RMSE为3.3厘米,几乎是使用OpenVSLAM时6.2厘米的两倍。这个结果可能归因于COLMAP-SLAM的RootSIFT,据文献报道,与OpenVSLAM中使用的ORB相比,RootSIFT更准确。在没有循环检测的情况下,COLMAP-SLAM的RMSE相对于使用循环检测的情况差了两倍,考虑到没有循环检测,这是可以接受的结果。

单目 vs. 双目 VO的准确性

使用Machine Hall数据集2和3进行了单目和双目的比较,在双目情况下,RMSE是通过cam0的估计轨迹和地面真实轨迹之间的6参数变换计算的,因为已知尺度因子的估计,单目情况下的RMSE是从与立体相同的轨迹计算的,而不修正尺度。该测试对于评估轨迹和尺度估计的准确性非常有用,单目RMSE显示了轨迹形状的质量,即使尺度因子估计不准确。

图片

表3:COLMAP-SLAM单目与双目情况。地面真实轨迹用连续的蓝线表示,而关键帧用红色点表示

关键帧选择

表4对关键帧选择的作用进行了测试,仅使用EuRoC Machine Hall 01的左摄像头。在这个初步测试中,采用了简单的时间选择方法,将20 Hz的初始输入流从1 Hz和5 Hz进行比较。

图片

表4:COLMAP-SLAM在MH_01_easy数据集上处理关键帧数量对比,真值轨迹用连续的蓝线表示

总结

该论文提出了一个用于开发新型SLAM算法的开源框架,特别关注了学习型检测器和描述符的纳入和评估。该框架采用Python编写,基于COLMAP API进行RootSIFT局部特征的提取、基于GPU的匹配以及增量式的捆绑/重建。它能够实时运行,设计上是模块化的,以便有针对性地开发特定任务。该平台支持单目和多摄像头系统。结果显示,所提出的流程可以取得令人满意的结果,其准确性可与OpenVSLAM相媲美。我们计划在各个方面扩展该框架:

  •  包括合作式SLAM,其中由多个移动平台执行地图构建。

  •  将回环检测扩展到除RootSIFT之外的其他描述符,以及多摄像头系统。目前,仅支持在单目场景下使用RootSIFT进行回环检测。 

  • 改进和扩展GNSS数据的集成,不仅用于初始化图像的尺度定义。 

  • 改进多摄像头系统的尺度估计算法,目前仅利用前30个图像的批次来估计摄像头之间的基线。 

  • 添加与Kornia的兼容性,以使用已有的大量局部特征,并添加更多最新的局部特征。 

  • 目前,关键帧选择仅在主摄像头上执行,我们计划将关键帧选择扩展到其他从摄像头。 

  • 将IMU恢复的方向集成到提出的流程中。 

  • 包括使用扩展卡尔曼滤波器的传感器融合。 

  • 提高效率和计算时间。

资源

自动驾驶及定位相关分享

【点云论文速读】基于激光雷达的里程计及3D点云地图中的定位方法

自动驾驶中基于光流的运动物体检测

基于语义分割的相机外参标定

综述:用于自动驾驶的全景鱼眼相机的理论模型和感知介绍

高速场景下自动驾驶车辆定位方法综述

Patchwork++:基于点云的快速、稳健的地面分割方法

PaGO-LOAM:基于地面优化的激光雷达里程计

多模态路沿检测与滤波方法

多个激光雷达同时校准、定位和建图的框架

动态的城市环境中杆状物的提取建图与长期定位

非重复型扫描激光雷达的运动畸变矫正

快速紧耦合的稀疏直接雷达-惯性-视觉里程计

基于相机和低分辨率激光雷达的三维车辆检测

用于三维点云语义分割的标注工具和城市数据集

ROS2入门之基本介绍

固态激光雷达和相机系统的自动标定

激光雷达+GPS+IMU+轮速计的传感器融合定位方案

基于稀疏语义视觉特征的道路场景的建图与定位

自动驾驶中基于激光雷达的车辆道路和人行道实时检测(代码开源)

用于三维点云语义分割的标注工具和城市数据集

更多文章可查看:点云学习历史文章大汇总

SLAM及AR相关分享

TOF相机原理介绍

TOF飞行时间深度相机介绍

结构化PLP-SLAM:单目、RGB-D和双目相机使用点线面的高效稀疏建图与定位方案

开源又优化的F-LOAM方案:基于优化的SC-F-LOAM

【论文速读】AVP-SLAM:自动泊车系统中的语义SLAM

【点云论文速读】StructSLAM:结构化线特征SLAM

SLAM和AR综述

常用的3D深度相机

AR设备单目视觉惯导SLAM算法综述与评价

SLAM综述(4)激光与视觉融合SLAM

Kimera实时重建的语义SLAM系统

易扩展的SLAM框架-OpenVSLAM

基于鱼眼相机的SLAM方法介绍

以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除

图片

扫描二维码

                   关注我们

让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入知识星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。

分享与合作:微信“cloudpoint9527”(备注:姓名+学校/公司+研究方向) 联系邮箱:dianyunpcl@163.com。

为分享的伙伴们点赞吧!

相关推荐

  1. 《LIO-SAM阅读笔记》-为何要引入增量式里程

    2023-12-07 00:26:03       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 00:26:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 00:26:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 00:26:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 00:26:03       20 阅读

热门阅读

  1. Linux(gRPC):Ubuntu22.04安装gRPC

    2023-12-07 00:26:03       35 阅读
  2. 13 递归求解戳气球

    2023-12-07 00:26:03       36 阅读
  3. 使用Python绘制自定义的水平线条

    2023-12-07 00:26:03       37 阅读
  4. rust和golang的对比

    2023-12-07 00:26:03       31 阅读
  5. 力扣-435.无重叠空间

    2023-12-07 00:26:03       35 阅读
  6. go基础语法10问(1)

    2023-12-07 00:26:03       35 阅读
  7. Vue基础知识点梳理总结归纳

    2023-12-07 00:26:03       49 阅读