ORB-SLAM2 论文阅读笔记 + 无痛复现

2023-10-30 21:40

本文主要是介绍ORB-SLAM2 论文阅读笔记 + 无痛复现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ORB-SLAM2: 用于单目、双目和RGB-D 相机的开源SLAM系统

  • 一、原文简译
    • 摘要
    • I. INTRODUCTION 介绍
    • II. RELATED WORK 相关工作
      • A. 双目SLAM
      • B. RGB-D SLAM
    • III. ORB-SLAM2
      • A. 单目,远、近立体关键点
      • B. System Bootstrapping 系统引导
      • C. 用单目和双目约束 进行BA
      • D. 循环关闭和全BA
      • E. 关键帧插入
      • F. 定位模式
    • IV. EVALUATION 评估
      • A. KITTI 数据集
      • B. EuRoC 数据集
      • C. TUM RGB-D 数据集
      • D. 计时结果
    • V. CONCLUSION 结论
  • 二、ORB-SLAM2 代码复现
    • 1. 环境配置
    • 2. 源码下载
      • 报错:error: ‘usleep’ was not declared in this scope
      • 报错:error: static assertion failed: std::map must have the same value_type as its allocator static_assert(is_same<typename _Alloc::value_type, value_type>::value,
    • 3. 小跑数据集
    • 4. 佩奇踩水坑
      • 报错:核心已转储 + 一大段opencv的东西

一、原文简译

摘要

本文提出了一个包括 地图重用闭环重定位 功能的完整SLAM系统 ORB-SLAM2,适用于单目、双目和 RGB-D像机。该系统可在标准cpu上实时工作,适用于各种环境,从小型手持室内序列,到工业环境中飞行的无人机 和 在城市中行驶的汽车。我们的后端基于使用单双目观测的BA,这允许公制尺度下的精确轨迹估算。系统包含一个轻量级定位模式,利用视觉里程计跟踪未映射区域,并匹配地图点,允许零漂移定位。

对29个常用公共序列的评估表明,ORB-SLAM2 的精度达到了 state-of-the-art,在大多数情况下是最准确的SLAM解决方案。我们发布源代码不仅是为了SLAM社区利益,而且是为了成为其他领域研究人员开箱即用的SLAM解决方案。

I. INTRODUCTION 介绍

SLAM (Simultaneous Localization and Mapping,同步定位与建图) 是近二十年计算机视觉和机器人领域的热门研究课题,近来也吸引了高科技公司的研究。SLAM 技术 构建未知环境地图,并在地图中 实时 定位传感器

在不同的传感器形式中,相机价格便宜并能提供丰富的环境信息,允许强大准确的位置识别。因此,视觉SLAM解决方案的主要传感器是一个像机。位置识别是 SLAM 系统用于 关闭循环 (即检测传感器何时返回映射区域 并 纠正探测中的累积误差) 的一个关键模块,以及在 跟踪失败后重新定位像机 (跟踪失败可能由遮挡、剧烈运动 或 系统重新初始化造成)。

视觉 SLAM 可通过单目像机执行,但由于单目无法观测深度,所以无法获知 地图规模轨迹估计。此外,系统引导 需要 多视图滤波技术 来生成初始地图,因为它不能从第一帧开始进行 三角测量单目不能从第一帧开始三角测量,这与 单目三角测量原理 有关。 单目 SLAM 存在 尺度漂移,如果在探测中进行纯旋转,可能会导致失败。通过使用双目或 RGB-D 相机,这些问题得到了解决,由此产生了最可靠的视觉SLAM解决方案。

单目三角测量 https://www.yii666.com/blog/372267.html
系统引导:
三角测量:已知三角形的底边和两邻角,求▲第三点(目标点位置)的方法。
比如有左右两台相机,中间是显示屏,前面是object,调整两个相机使其同时对准object。这时候在显示屏上就会出现一个三角形,三角形的底边和两个底角是已知的,这样就可以计算出目标球距离我们的距离了。

本文在单目 ORB-SLAM 的基础上提出了 ORB-SLAM2,并做出以下贡献:
• 是首个单目、双目和 RGB-D像机都能够使用的开源SLAM系统,包括回环关闭、重定位和地图复用。
• 我们的 RGB-D 结果表明,通过使用 BA,我们获得了比基于 ICP/光度深度误差最小化 的最新方法更高的精度。
• 通过使用远近立体点单目观测,我们的双目结果比最先进的直接双目 SLAM 更准确。
• 轻量级的本地化模式,可以通过 地图禁用 的方法有效地重用地图。

图 1 为双目和RGB-D输入下 ORB-SLAM2 的输出示例。双目的例子显示了KITTI数据集00序列的 最终轨迹 和 稀疏重建。这是 ORB-SLAM2 能够成功检测到的具有多个闭环的城市序列。
在这里插入图片描述
RGB-D 的例子显示了 TUM RGB-D 数据集中 fr1_room序列 估计的关键帧位姿,以及由 估计的关键帧位姿中 反向投影传感器深度图 渲染的稠密点云。ORB-SLAM2 不执行任何类似于KinectFusion的融合,但良好的清晰度表明 关键帧位姿 的准确性。
更多例子在所附视频中,文章结构:2相关工作,3系统概述,4评估结果,5结论

II. RELATED WORK 相关工作

在本节中,我们将讨论关于 双目 和 RGB-D SLAM 的相关工作。第四节的讨论和评价只对于SLAM方法。

A. 双目SLAM

一个优秀的早期 双目SLAM系统是 Paz 等人的作品。基于条件独立分治法EKF-SLAM(扩展卡尔曼滤波) 比当时的其他方法在大环境中运行的效果更好。最重要的是,这是第一个同时利用 近点和远点(由于双目像机时差较小而无法可靠估计深度的点) 的双目SLAM,对后者使用 逆深度参数化。他们的经验表明,如果点的深度小于双目基线的约40倍,则可以进行可靠的 三角测量。我们借鉴了这种 采用不同方法处理远近点 的策略,详见 III-A。

当下大多数双目SLAM都是基于关键帧的,并在局部区域进行BA优化,以实现可扩展性。Strasdat 等人的工作是 在关键帧内部窗口中执行BA(点-位姿约束) 和 在外部窗口中执行位姿-图(位姿-位姿约束) 的 联合优化。通过限制这些窗口的大小,该方法实现了恒定的时间复杂度,代价是不能保证全局一致性。Mei 等人的 RSLAM 使用地标和位姿的相对表示,并在活动区域执行相对BA,将BA时间限制到常值。RSLAM 能够关闭循环,允许在循环两侧扩展活动区域,但 没有实现全局一致性。Pire等人最近的 S-PTAM 执行局部BA,但它 缺乏大的循环关闭

[与这些方法类似,我们在一组本地关键帧中执行BA,这样复杂性就与地图大小无关,便于在大型环境中操作。然而,我们的目标是构建一个全局一致的地图。
当关闭一个循环时,我们的系统首先对齐两边 (类似于RSLAM),这样跟踪就能够继续使用旧地图定位。然后执行一个位姿图优化,最小化循环中的累积漂移。然后是完整的BA]

Engel 等人最近提出的双目LSD-SLAM是一种半稠密直接法,可以 最大限度地减小高梯度图像区域的光度误差。该方法不依赖于特征,对运动模糊或纹理较差的环境具有更强的鲁棒性。然而作为一种直接法,它的性能可能会受到未建模的影响,如滚动快门或 非朗伯反射率 的严重影响。

B. RGB-D SLAM

最早和最著名的 RGB-D SLAM系统之一是 Newcombe等人的 KinectFusion。该方法 将来自传感器的所有深度数据融合到一个容积稠密模型中,该模型使用 ICP跟踪相机位姿。由于其容积表示和缺乏循环关闭,该系统 仅限于小型工作空间。Whelan等人的 Kintinuous通过使用 滚动循环缓冲器 而能够在大型环境中运行,并 具有使用位置识别和位姿图优化的循环关闭

第一个流行的开源系统可能是 Endres等人的 RGB-D SLAM。这是一个基于特征的系统,其 前端通过 特征匹配 和 ICP 来计算帧间运动后端使用 启发式搜索的闭环约束 执行 位姿图优化。 类似地,Kerl 等人的 DVO-SLAM 后端优化了一个位姿图,通过视觉里程计计算关键帧间的约束,最小化了光度和深度误差。DVO-SLAM 还在所有之前帧中启发式 搜索循环候选,而非依赖于位置识别。

Whelan 等人最近的 ElasticFusion 构建了一个基于面元的环境地图。这是一种以地图为中心的方法,忘记位姿,并对地图应用非刚性变形来执行循环关闭,而非标准的位姿图优化。该系统的详细重建和定位精度令人印象深刻,但当前实现仅限于房间大小的地图,因为复杂度随地图中的面元数量有关。

如 Strasdat 那样,ORB-SLAM2 使用深度信息为图像上提取的特征合成立体坐标,这样我们的系统就不知道是双目还是RGB-D输入。不同于上述所有方法,我们的后端基于BA 并 能够建立全局一致的稀疏重建。因此,ORB-SLAM2 是一个适用于标准cpu的轻量级方法,目的是长期和全局一致的本地化,而不是构建详尽的稠密重建。然而,从高度精确的关键帧位姿中,可以融合深度图并在局部区域获得精确的实时重建(on-the-fly),或者 在完整的BA之后 后处理所有关键帧的深度图以获得整个场景的精确3D模型。

III. ORB-SLAM2

用于双目和RGB-D相机的 ORB-SLAM2是在我们的单目特征 ORB-SLAM基础上构建的,便于读者这里总结了主要组件。系统概述见图2,主要有三个并行线程:
(1) 跟踪,通过寻找局部地图的特征匹配 来定位每一帧的像机,并使用仅运动的BA最小化重投影误差
(2) 局部映射,管理和优化本地地图,执行局部BA
(3) 循环关闭,检测大循环,并通过执行位姿图优化来纠正累积漂移。
在位姿图优化之后,该线程启动完整BA的第4个线程,计算最优结构和运动解决方案。
在这里插入图片描述
该系统嵌入了一个基于 DBoW2的位置识别模块,用于 跟踪失败 (例如遮挡) 时重新定位已映射场景中重新初始化,以及循环检测
系统维持了一个 连接任意两个有共同观察点的关键帧的 共视图 和 一个连接所有关键帧的最小生成树。这些图结构允许检索关键帧的本地窗口,以便 跟踪和局部映射在本地操作,允许在大型环境中工作,并作为关闭循环时执行的位姿图优化的结构。
该系统 使用相同的ORB 特征来完成跟踪、映射和位置识别的任务。ORB特征对图片的旋转和缩放具有鲁棒性,对相机的自动增益、自动曝光 以及照度变化具有良好的不变性。它们可以 快速提取和匹配,允许 实时操作,并 在词袋位置识别中显示了良好的精度/召回率

本节其余部分,我们将介绍如何利用双目/深度信息 以及系统的哪些元素受到影响。系统每个模块的详细描述请参阅前一篇论文 ORB-SLAM: a V ersatile and Accurate Monocular SLAM System

A. 单目,远、近立体关键点

ORB-SLAM2是一种基于特征的方法,预处理 输入以提取明显关键点处的特征,如图2b所示。然后丢弃输入图像,基于这些特征进行所有的系统操作,这样一来,系统就能够兼容双目和RGB-D传感器。随后,系统处理单目关键点和立体关键点,这些关键点进一步被分为近点或远点。

1)双目关键点
双目关键点由三个坐标 xs = (uL,vL,uR) 定义,其中 (uL,vL) 是左图坐标,uR 是右图水平坐标。对于双目相机,我们在两图中提取ORB,每个左侧ORB都需要在右侧图像中搜索匹配。假设是立体校正的图像,可以高效地完成,这使得极线是水平的。然后,用左侧ORB坐标 和 右侧匹配的水平坐标 生成双目关键点,并通过斑块相关对其进行亚像素细化。
对于RGB-D相机,我们在RGB图像上提取ORB特征。对于坐标为 (uL, vL) 的每个特征,我们 将其深度值d转换为虚拟右坐标,如Strasdat等人提出的那样:
在这里插入图片描述
fx 为水平焦距,b 是结构光投影仪和红外像机之间的基线 (Kinect 和 Asus Xtion的基线约为8cm),深度传感器的不确定性 用 虚拟右坐标的不确定性 来表示。通过这种方式,来自双目和RGB-D输入的特征由系统其余部分相同地处理。
如果一个双目关键点的相关深度小于立体/RGB-D基线的40倍,那么它就被分类为 近点,否则被视为 远点。近点可以稳定地从一帧当中进行三角测量,因为深度估计准确,且提供了尺度、平移和旋转信息。远点提供准确的旋转信息,但较弱的尺度和平移信息。当远点有多个视图支持时,我们对远点进行三角测量。

2)单目关键点
单目关键点由左图的两个坐标 xm = (uL, vL) 定义,并对应于 找不到双目匹配具有无效深度值 的那些ORB的情况。这些点仅从多个视图进行三角测量,不提供尺度信息,但有助于旋转和平移估计。

B. System Bootstrapping 系统引导

使用双目或RGB-D像机的一个主要的好处是,只要一帧就能获得深度信息,不需要像单目那样的 从运动中初始化的特定结构。 系统启动时,我们用第一帧创建一个关键帧,将它的位姿设为原点,并从所有立体关键点中创建一个初始地图

C. 用单目和双目约束 进行BA

系统执行BA来优化跟踪线程中的相机位姿(仅运动BA),从而优化局部映射线程中 关键帧和点 的本地窗口(局部BA),并在循环关闭后优化所有的 关键帧和点(完整BA)。我们使用了在 g2o中实现的 Levenberg-Marquardt 方法。

在这里插入图片描述

在这里插入图片描述

D. 循环关闭和全BA

循环关闭分两步进行,首先对循环进行检测和验证,其次对循环进行校正,优化位姿图。与可能发生 尺度漂移 的单目 ORBSLAM相比,立体/深度信息 使得尺度可观测,几何验证和位姿图优化也不再需要处理尺度漂移,而是基于刚体变换而不是相似度。

在ORB-SLAM2中,我们在姿态图之后加入了一个Full BA优化,以获得最优解。这种优化可能非常耗时,因此我们开了一个单独的线程来执行它,允许系统继续创建地图和循环检测。然而,这带来了将完整BA输出与地图的当前状态合并的挑战。如果优化时检测到新的循环,我们将中止优化并继续关闭循环,这将再次启动完整的BA优化。当完整的BA完成时,我们需要 将更新的关键帧子集和由完整的BA优化的点与未更新的关键帧和在优化运行时插入的点合并在一起。这是通过生成树将更新的关键帧的校正 (即从非优化到优化位姿的转换) 传播到未更新的关键帧来完成的。未更新的点根据应用于其参考关键帧的校正进行转换。

E. 关键帧插入

ORB-SLAM2 沿用了单目 ORB-SLAM中插入和剔除冗余关键帧的策略。远近立体点之间的区别允许我们引入关键帧插入的新条件,这在大部分场景远离立体传感器的挑战性环境中是至关重要的,如图3所示。
在这种环境下,我们需要有足够数量的闭合点来准确估计平移,因此,如果所跟踪的闭合点的数量低于 τt,并且帧至少可以创建新的闭合立体点 τc,系统将插入一个新的关键帧。经验发现 τt =100 和 τc =70 在所有实验中都很好。
在这里插入图片描述
KITTI数据集序列01的跟踪点。绿色点的深度小于立体基线的40倍,蓝色点的深度更小。在这类序列中,重要的是要足够经常地插入关键帧,以便近点的数量允许准确的平移估计。远点有助于估计方向,但对平移和尺度提供的信息较弱。

F. 定位模式

我们加入了一个本地化模式,只要环境没有重大变化,它就可以在 地图绘制良好的区域 进行轻量级长期本地化。在这种模式下,本地映射和循环关闭线程被禁用,像机通过跟踪使用重定位持续本地化,如果需要的话。在这种模式下,跟踪利用视觉里程数匹配和匹配地图点。视觉里程表匹配是当前帧中的ORB与前一帧中根据立体/深度信息创建的3D点之间的匹配。这些匹配使得定位对未映射区域具有鲁棒性,但漂移可能会累积。地图点匹配确保现有地图的无漂移本地化。随附的视频演示了这种模式。

IV. EVALUATION 评估

我们在三个流行的数据集中评估了ORB-SLAM2,并与其他最先进的SLAM系统进行了比较,始终使用原始作者发表的结果和文献中的标准评估指标。我们已经在Intel Core i7-4790台式机上运行了ORB-SLAM2,内存为16Gb。为了说明多线程系统的不确定性,我们将每个序列运行5次,并显示估计轨迹精度的中值结果。我们的开源实现包括在所有这些数据集中运行系统的校准和指令。

A. KITTI 数据集

KITTI数据集[2]包含从城市和高速公路环境中的汽车记录的立体序列。立体声传感器的基线为54cm,校正后的分辨率为1240 × 376像素,工作频率为10Hz。序列00、02、05、06、07和09包含循环。我们的ORB-SLAM2检测所有循环,并能够在之后重用它的映射,除了序列09,其中循环发生在序列末尾的极少数帧中。
在这里插入图片描述
表I显示了11个训练序列的结果,这些序列具有公开的ground-truth,与最先进的Stereo LSD-SLAM[11]相比,据我们所知,唯一的立体声SLAM显示了所有序列的详细结果。我们使用了两个不同的指标,[3]中提出的绝对平移RMSE选项卡,以及[2]中提出的平均相对平移trel和旋转rrel误差。系统在大多数序列上优于Stereo LSD-SLAM,总体上相对误差小于1%。
在这里插入图片描述
如图3所示,序列01是训练集中唯一的高速公路序列,平移误差稍差。在这个序列中,平移很难估计,因为由于高速和低帧率,几乎没有接近点可以被跟踪。然而,由于有许多远点可以被长期跟踪,因此可以准确地估计方向,达到每100米0.21度的误差。图4显示了一些估计轨迹的例子。
在这里插入图片描述
与[1]中给出的单眼结果相比,所提出的立体版本能够处理单眼系统失败的序列01。在这个高速公路序列中,见图3,近点只在几帧中出现。
立体版本从一个立体关键帧创建点的能力,而不是延迟初始化的单眼,包括在两个关键帧之间寻找匹配,在这个序列中不丢失跟踪是至关重要的。
另外,立体系统采用公制比例尺对地图和轨迹进行估计,不存在比例尺漂移,如图5所示。
在这里插入图片描述

B. EuRoC 数据集

最近的EuRoC数据集[21]包含11个由微型飞行器(MA V)在两个不同的房间和一个大型工业环境中飞行记录的立体声序列。立体声传感器的基线约为11cm,可在20Hz时提供WVGA图像。这些序列根据MA V的速度、照明和场景纹理分为简单、中等和困难。在所有序列中,MA V重新访问环境,ORB-SLAM2能够重用它的映射,在必要时关闭循环。
在这里插入图片描述
表II显示了[11]中提供的结果,ORB-SLAM2相对于Stereo LSDSLAM的所有序列的绝对平移RMSE。ORB-SLAM2实现了几厘米的定位精度,比Stereo LSD-SLAM更准确。由于严重的运动模糊,我们的跟踪在V2 03的一些地方迷路了。如[22]所示,可以使用IMU信息对该序列进行处理。
图6显示了计算轨迹与实际情况比较的例子。
在这里插入图片描述

C. TUM RGB-D 数据集

TUM RGB-D数据集[3]包含来自RGB-D传感器的室内序列,这些传感器分为几类,用于评估不同纹理、照明和结构条件下的对象重建和SLAM/里程计方法。我们在大多数RGB-D方法通常评估的序列子集中显示结果。表 III 中将我们的准确性与当前最先进的方法进行了比较:ElasticFusion,Kintinuous,DVO-SLAM和RGB-D SLAM。
在这里插入图片描述
我们的方法是唯一一种基于束调整的方法,在大多数序列中都优于其他方法。正如我们已经注意到的[1]中的RGB-D SLAM结果,freiburg2序列的深度图有4%的刻度偏差,可能是由于校准错误,我们在运行中进行了补偿,这可以部分解释我们显著更好的结果。无花果。

图7显示了从计算出的关键帧姿态中反向投影传感器深度图所产生的点云。好的清晰度和桌子和海报的直线轮廓证明了我们的方法的高精度定位。
在这里插入图片描述

D. 计时结果

为了完成对所提出的系统的评估,我们在 表 IV 中给出了三个序列的授时结果
不同的图像分辨率和传感器。显示了每个线程任务的平均值和两个标准偏差范围。
在这里插入图片描述
由于这些序列包含一个单独的循环,因此完整的BA和循环关闭线程的一些任务只执行一次,并且只报告一次时间测量。对于每个序列,平均每帧跟踪时间低于相机帧率的倒数,这意味着我们的系统能够实时工作。由于立体图像中的ORB提取是并行化的,可以看出在V2 02的立体WVGA图像中提取1000个ORB特征与在fr3局的单个VGA图像通道中提取相同数量的特征是相似的。

循环中的关键帧数显示为与循环关闭相关的时间的参考。虽然 KITTI 序列07中的环路包含更多的关键帧,但为室内fr3办公室构建的共视图密度更大,因此环路融合、姿态图优化和全BA任务更昂贵。

高密度的共视图使得局部地图包含更多的关键帧和点,因此局部地图跟踪和局部BA也更昂贵。

V. CONCLUSION 结论

我们已经提出了一个完整的SLAM系统的单目,立体和RGB-D传感器,能够执行重新定位,循环在标准cpu上实时关闭并重用它的映射。我们专注于构建全球一致的地图,以便在广泛的环境中进行可靠和长期的定位,这在实验中得到了证明。所提出的定位模式与系统的重新定位能力产生了一个非常鲁棒的,零漂移,轻量级的定位方法,为已知环境。这种模式对于某些应用程序非常有用,例如在映射良好的空间中跟踪虚拟现实中的用户观点。
与最先进技术的比较表明,ORBSLAM2在大多数情况下实现了最高的精度。

在KITTI视觉测程基准ORB-SLAM2是目前最好的立体声SLAM解决方案。关键的是,与近年来蓬勃发展的立体视觉测程方法相比,ORB-SLAM2在已经绘制的区域实现了零漂移定位。

令人惊讶的是,我们的RGB-D结果表明,如果需要最精确的相机定位,束调整比直接方法或ICP执行得更好,具有计算成本更低的额外优势,不需要GPU处理实时操作。

我们已经发布了我们系统的源代码,包括示例和说明,以便其他研究人员可以轻松使用。据我们所知,ORB-SLAM2是第一个开源视觉SLAM系统,可以使用单眼、立体声和RGB-D输入。此外,我们的源代码包含一个使用单目像机的增强现实应用程序2的示例,以显示我们的解决方案的潜力。

举几个例子,未来的扩展可能包括不重叠的多摄像头、鱼眼或全向摄像头支持、大规模密集融合、协作映射或增强的运动模糊鲁棒性。


二、ORB-SLAM2 代码复现

1. 环境配置

常规的CMake、Git库、 VSCode、g++编译器等就不提了,不会的多多百度。
ORB-SLAM2需要的库其实并不多,但是学视觉嘛,早晚都用得到,以下高博书里用到的所有库无脑全装:
Eigen,Pangolin,Sophus,OpenCV,Ceres,PCL,octomap,g2o,DBoW2

具体的安装方法参考该博主的教程:https://zhuanlan.zhihu.com/p/452256687
全程无痛,还是得感谢师兄提供了宝贝链接。

其中g2o和DBoW3就不必装了,ORB-SLAM2 的文件夹里是有g2o和DBoW2的,build的时候顺便就装好了。至于装不装ROS,看你自己咯。


2. 源码下载

网上有很多版的源码,主流的两个版本分别是 作者开源的 Original 和 高翔(视觉SLAM十四讲作者) 的两个版本。这里用的是作者github上船新的 Original 版本,也是在无ROS的环境下 run 的

高博的代码,与原代码的区别就是增加了 3D点云。回头会试一下,先插个眼吧,跑通了就 T 过来。
回头等到小笔学完了 ROS2,也会在ROS环境下再跑一跑。一样,如有需要的话等跑出来了再补充;

在这里插入图片描述

命令行下载源码

git clone https://github.com/raulmur/ORB_SLAM2

下完了,找到并打开ORB-SLAM2文件夹,右键打开终端,命令行继续输以下代码安装ROB-SLAM2:

chmod +x build.sh
./build.sh

没错,没有人会随随便便成功。

报错:error: ‘usleep’ was not declared in this scope

在这里插入图片描述

反正就很多个usleep,大概是小笔一直熬夜导致的bug。有 带佬 说打开 include/System.h 文件,添加下边这个头文件之后重新 ./build.sh 就好了。

#include <unistd.h>

在这里插入图片描述

报错:error: static assertion failed: std::map must have the same value_type as its allocator static_assert(is_same<typename _Alloc::value_type, value_type>::value,

在这里插入图片描述

带佬 说只要把

	typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;

改成

	typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,Eigen::aligned_allocator<std::pair<KeyFrame* const, g2o::Sim3> > > KeyFrameAndPose;

重新 ./build.sh 就好了(每次build前记得ctrl+s),就是把下边图里49-50行 改成选中的那两行。
在这里插入图片描述

解决掉上边两个bug就完事了,编译成功之后是这个鸟样:
在这里插入图片描述


3. 小跑数据集

数据集 在这里下,看中哪个就下那个。

建个文件夹,把下载的视频压缩包放进去,用 unzip弄了它。这里展示了几个压缩包和俩解压后的文件夹

在这里插入图片描述
在这里插入图片描述

很好,那么现在就有了 1部分数据集,代码也编译过了,命令行里输入以下命令,开炮!

./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUMX.yaml PATH_TO_SEQUENCE_FOLDER
上述命令中各部分含义:
./Examples/Monocular/mono_tum	不难看出是路径+文件格式吧,Monocular单目,mono_tum模型
Vocabulary/ORBvoc.txt			ORB-SLAM2在运行之前需要预加载一个词袋模型还是啥来着,显然这个就是了
Examples/Monocular/TUMX.yaml	像是个配置文件,反正TUMX中的X跟序列名字中的数字一致就可以了
PATH_TO_SEQUENCE_FOLDER			啊,这就是你下载的视频序列文件夹所在的路径

比如我要用 单目模型mono_tum 跑 TUM数据集 rgbd_dataset_freiburg1_desk序列


看起来成功了的样子

在这里插入图片描述

那如果要用 RGB-D模型rgbd_tum 跑 TUM数据集 rgbd_dataset_freiburg1_desk序列

./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml /home/dasheng/slam_ws/dataset/rgbd_dataset_freiburg1_desk ./Examples/RGB-D/associations/fr1_desk.txt

看起来成功了的样子

在这里插入图片描述

那如果要用 双目模型stereo_euroc 跑EuRoC数据集xxx序列 呢

我是个fw,还没试出来,希望大家都可以举一反三!给你们个参考链接
https://www.cnblogs.com/MingruiYu/p/12286752.html

看起来成功了的样子
在这里插入图片描述


4. 佩奇踩水坑

一开始用的代码是师兄给的一个链接版本,大概率是师兄也踩过坑,具体是哪个版本我不是很清楚,环境配置好了以后卡在build 里各种报错,最后给我整抑郁了。链接顺便放这吧 https://blog.csdn.net/weixin_44436677/article/details/105586820

环境配置是绝对没有问题的,用红色链接里代码的报错如下:

报错:核心已转储 + 一大段opencv的东西

在这里插入图片描述

看起来像是opencv版本过高的问题,然后我就把4.5.0高版本的卸载了。然鹅换上3.4.1还是核心已转储,此外上边的大段文字内容略有变化。百度发现这类报错的处理方式,要么是把 imread函数中的“0"给去掉,要不就是巴拉巴拉的,除了看不懂的都试了,妹整好。钓鱼佬表示非常气愤,就两天没跑这破bug,并约了朋友去钓鱼吃火锅。到了ddl 赶工期的时候大下决心放弃之前改掉的所有 error,换了个ROB-SLAM2的官方源码。芜湖~ bug消失!完美!debug也是一门玄学啊。

——顺便给你们看一下钓的小yui~
在这里插入图片描述

结论定性:推断是链接版本中的例程在读入或处理图片的时候彩图给整成了黑白图,而在调用cv库中某函数的时候,导致了通道数不匹配,那函数传参不对了它不就报错嘛。简言之,链接里版本的例程有问题,但是呢,小笔又是个废物,找了半天也没看出来 imread 图片的过程有啥问题。
解决方法:我只是换成了个官方源码,环境不用动,然后重新 ./build一下,run了!


ORB-SLAM2: 单目、双目和RGB-D相机的开源SLAM系统

  • 一、原文简译
    • 摘要
    • I. INTRODUCTION 介绍
    • II. RELATED WORK 相关工作
      • A. 双目SLAM
      • B. RGB-D SLAM
    • III. ORB-SLAM2
      • A. 单目,远、近立体关键点
      • B. System Bootstrapping 系统引导
      • C. 用单目和双目约束 进行BA
      • D. 循环关闭和全BA
      • E. 关键帧插入
      • F. 定位模式
    • IV. EVALUATION 评估
      • A. KITTI 数据集
      • B. EuRoC 数据集
      • C. TUM RGB-D 数据集
      • D. 计时结果
    • V. CONCLUSION 结论
  • 二、ORB-SLAM2 代码复现
    • 1. 环境配置
    • 2. 源码下载
      • 报错:error: ‘usleep’ was not declared in this scope
      • 报错:error: static assertion failed: std::map must have the same value_type as its allocator static_assert(is_same<typename _Alloc::value_type, value_type>::value,
    • 3. 小跑数据集
    • 4. 佩奇踩水坑
      • 报错:核心已转储 + 一大段opencv的东西

这篇关于ORB-SLAM2 论文阅读笔记 + 无痛复现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/310740

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

AI hospital 论文Idea

一、Benchmarking Large Language Models on Communicative Medical Coaching: A Dataset and a Novel System论文地址含代码 大多数现有模型和工具主要迎合以患者为中心的服务。这项工作深入探讨了LLMs在提高医疗专业人员的沟通能力。目标是构建一个模拟实践环境,人类医生(即医学学习者)可以在其中与患者代理进行医学

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓