目录
- 一、前言
- 二、关于Orb-SLAM3的代码结构
- 三、关于system
- 3.1 关于摄像头初始化
- 3.2 关于摄像头模型化
- 3.2关于初始化
- 四、关于ORBVocabulary
- 五、关于优化
- 六、小结
一、前言
Orb-SLAM2或者3是一个开源的视觉SLAM框架,里面的一些思想,一些软件工程的设计理念对于从事机器人导航或者视觉导航方面的人们有着较为有益的帮助。网络上,也有很多机构和大牛对其进行了较为详细的解析,但是看过来,可能每个人都有测重点,从0到100的系统化的结构并未找到,一句话概况就是没有谈透。随着ChatGPT的出现,给我们提供了一个好的实时沟通平台,本文记录了作者和ChatGPT关于Orb-SLAM的对话。可以供想入坑人或者提高视觉导航认知的菜鸟们参考。
二、关于Orb-SLAM3的代码结构
- 作者:“请问,Orb-SLAM3的源码程序是怎么构成的?”
- -AI:“ORB-SLAM3是一个使用单目、立体和RGB-D摄像机的开源视觉SLAM(同步定位和测绘)系统。它是用C++编写的,具有模块化结构。
ORB-SLAM3源代码的主要组件包括:
1.核心core
:该组件包含用于特征提取、跟踪、映射和优化的主要类和算法。
2.输入input
:该组件处理来自不同类型摄像头的输入,包括单目摄像头、立体摄像头和RGB-D摄像头。
3.输出output
:该组件提供系统的输出,包括重建的3D地图和相机姿势。
4.查看器viewer
:该组件为重建的3D地图和相机姿势提供了可视化工具。
5.示例example
:本部分包含几个示例,演示如何将ORB-SLAM3系统与不同类型的相机和数据集配合使用。
6.第三方库third-part
:ORB-SLAM3系统依赖于在几个第三方库上获取其功能,包括OpenCV、Eigen和G2O。
总的来说,ORB-SLAM3源代码的模块化结构允许轻松地进行定制和修改,以适应不同的应用程序和需求。这也为视觉SLAM领域未来的发展和研究提供了基础。” - 作者:“请问,Orb-SLAM3的核心是怎么构成的?”
- AI:“ORB-SLAM3源程序的核心包含用于特征提取、跟踪、映射和优化的主要类和算法。以下是其结构的简要概述:
1.特征feature
:该模块负责从摄像头输入中提取特征。它使用ORB(定向快速旋转简要)特征,这些特征是旋转不变的二进制描述符,计算效率很高。
2.跟踪tracking
:跟踪随时间推移的特征,以实时估计摄像头的姿势。它使用局部捆绑调整方法来优化摄像机姿态估计。
3.建图mapping
:该模块构建了摄像头移动时环境的3D地图。它使用几何约束和光度学约束的组合来估计特征的深度和相机的位置。
4.关键帧选择keyframe
:该模块选择代表场景的关键帧并用于初始化新的地图点和优化相机姿势。
5.回环loop closure
:此模块检测环路关闭并从环路关闭中恢复,当相机重新访问已映射的位置时会发生环路关闭。它同时使用几何匹配和基于外观的匹配技术来检测循环并优化地图。
6.优化optimization
:优化摄像机姿态和3D地图点,最小化重投影误差,重投影误差是摄像机图像中观察到的特征位置与其在3D地图中预测位置的差异。
7.本地地图local map
:维护摄像头周围环境的本地地图,用于实时跟踪和地图绘制。
总体而言,ORB-SLAM3源程序的核心被设计为使用基于特征的跟踪、关键帧选择以及环路闭合检测和校正的组合来为视觉SLAM提供健壮而高效的解决方案。”
三、关于system
- 作者:“请问,Orb-SLAM3中有个模块叫
system
,是怎么工作的?” - AI:"是的,ORB-SLAM3中的
System
模块负责设置管道和运行SLAM系统。具体地说,它执行以下功能:
1.对摄像头进行初始化:设置摄像头参数,打开摄像头进行取景。
2.初始化ORB-SLAM3系统:它创建SLAM流水线中各个模块(特征提取、跟踪、映射、关键帧选择、环路闭合检测和优化)的实例,并使用适当的参数进行初始化。
3.加载预计算词汇ORBVocabulary
和设置:系统模块从文件中加载预计算词汇树结构和其他设置,供特征提取和映射模块使用。
4.启动SLAM系统:通过调用TrackMonocular
函数启动SLAM系统,该函数对输入帧进行实时视觉里程数和3D映射。
5.提供视觉效果反馈:system
模块还可以向用户提供视觉反馈,例如显示当前摄像头的姿势和3D地图。这对SLAM系统的调试和监控很有帮助。
6.处理用户输入:system
模块可以处理用户输入,如暂停或退出SLAM系统、调整参数或保存3D地图。
总体而言,`系统‘模块是运行ORB-SLAM3系统的入口点,并为初始化系统、加载预计算设置和向用户提供反馈提供了简化的界面。它封装了可视化SLAM的复杂管道,使其易于研究人员和从业者使用。“
3.1 关于摄像头初始化
- 作者:“请问,Orb-SLAM3中如何对摄像头进行初始化?”
- AI:“ORB-SLAM3有一组可配置的摄像机参数,这些参数取决于用于SLAM任务的摄像机。这些参数包括固有相机矩阵、失真系数和图像分辨率。
本征摄像机矩阵包含摄像机的焦距和主点,这是从图像中的2D特征估计3D姿态所必需的。失真系数对镜头失真进行建模,通常由径向和切向失真引起。
ORB-SLAM3提供了一个配置文件(vocary/ORBvoc.txt
),用户可以在其中为自己的特定摄像头指定摄像头参数。该文件的格式如下:
#摄像头参数
fx 0 cx
0 fy cy
0 0 1
其中fx
、fy
是水平和垂直焦距cx
和cy
是主点的坐标,最后一行固定为[0 0 1]
。这些值可以从摄像机校准过程中获得。
此外,ORB-SLAM3还提供了位于Examples/RGB-D
和Examples/Monocular
文件夹中的几个配置文件。这些文件包含可用作配置系统的起点的不同摄像机和分辨率的预设。
值得注意的是,摄像机参数的准确性对SLAM性能有很大影响。不正确指定的参数可能会导致估计的3D姿势出现错误,并影响重建的比例。因此,拥有准确的校准数据并针对每个应用仔细调整这些参数是至关重要的。
””
3.2 关于摄像头模型化
- 作者:“请问,Orb-SLAM3中摄像头模型
CameraModles
是怎么构建的?” - AI:“在ORB-SLAM3中,CameraModels类定义用于SLAM任务的相机型号。这个类负责将点从3D投射到2D,使图像不失真,并计算重新投影误差。
ORB-SLAM3框架支持不同类型的相机,包括单目相机、立体相机、RGB-D相机、鱼眼相机和全方位相机。具体的摄像头型号由用户在配置阶段确定。
对于每个相机型号,CameraModels类提供以下方法:
-Project
-将3D点投影到图像平面上。
-back Project
-从2D测量中恢复3D点。
-gradientsAtPoint
-计算给定像素位置的图像梯度。
-undistort
-对扭曲的图像矫正。
-distort
-将镜头失真应用于图像点。
-reproject tionError
-计算3D点与其在镜像平面上的投影之间的重投影误差。
这些方法在整个SLAM算法中被广泛使用,以估计相机的姿势并优化地图。例如,在特征提取阶段,在关键点检测和匹配之前,首先使用untort
方法对图像进行去失真。在优化阶段,将重投影误差最小化,以细化相机姿势和地图中的3D点。
抽象的CameraModels
类提供了一个接口,用于定义可以轻松集成到ORB-SLAM3框架中的新相机模型。通过对此类进行子类化并实现所需的方法,用户可以添加对其自定义相机模型的支持。
“
3.2关于初始化
- 作者:“ORB-SLAM3系统各个模块(特征提取、跟踪、映射、关键帧选择、环路闭合检测和优化)的初始化都处理了什么内容?”
- AI:“ORB-SLAM3(同时定位和映射)是一种视觉SLAM算法,它通过连续跟踪相机的位置并实时绘制其周围环境来工作。系统中的每个模块处理不同的任务:
1.特征提取:从输入图像中提取关键点和描述符。
2.跟踪:利用光流和特征匹配跟踪摄像机相对于初始位置的运动。
3.贴图:使用立体或单目视觉构建环境的3D点云地图。
4.关键帧选择:选择要用作贴图关键帧的帧。
5.环路闭合检测:检测摄像机何时重新访问它以前看到的区域,并将新信息与现有地图连接起来。
6.优化:优化摄像头的姿势和地图中的3D点,最大限度地减少重投影误差。
在初始化期间,每个模块设置其内部数据结构和参数,以便为处理传入数据做准备。
初始化后,不同的模块以流水线方式协同工作,以持续更新估计的相机姿势和贴图。特征提取和跟踪模块提供视觉里程估计,用于更新相机姿势。映射模块用新观察到的特征更新地图,关键帧选择模块基于自最后一个关键帧以来的运动量和跟踪的特征的数量来决定是否添加新的关键帧。环路闭合检测模块将当前帧与过去的帧进行比较以检测潜在的环路,如果检测到环路,则优化模块重新估计整个地图以细化摄像机姿势和3D点。总体而言,ORB-SLAM3为使用单目或立体摄像机设置的实时同步定位和地图绘制提供了强大而准确的解决方案。”
四、关于ORBVocabulary
-
作者:“请问,在Orb-SLAM3中,
ORBVocabulary
这个是用来干嘛的?” -
AI:“在ORB-SLAM3中,
ORBVocabulary
是一个表示用于视觉位置识别的ORB特征词汇表的类。词汇由一组视觉单词组成,每个视觉单词都是特征空间中的一个聚类中心。ORBlosumulary
类负责加载训练过程保存的词汇文件,并提供计算要与词汇匹配的一组ORB特征的词袋表示的方法。词袋表示只是每个视觉单词在从图像中提取的特征中出现的次数的直方图。在ORB-SLAM3的操作中,ORBlosumulary
与ORBMatcher
类配合使用来进行位置识别。在给定查询图像的情况下,使用二进制描述符之间的汉明距离来查找其ORB特征与词汇表中的视觉单词之间的候选匹配。然后,计算查询图像的词袋表示,并将其与数据库图像的词袋表示进行比较。具有最接近的词袋表示的数据库图像被认为是查询图像的潜在匹配。总之,`ORB词汇‘是ORB-SLAM3中的一个基本类,它通过使用ORB特征的词汇表来实现视觉位置识别。通过计算图像的词袋表示,并将其与图像数据库的词袋表示进行比较,ORB-SLAM3可以确定相机在环境中相对于先前访问过的地方的位置。” -
作者:“请问,
ORBVocabulary
中的特征词汇是如何更新的?” -
AI:"ORB-SLAM3中使用的词汇是从图像的训练数据集中脱机学习的。当在操作阶段获得新图像时,词汇表不会直接更新,但可以通过一个称为增量学习的过程来适应新的图像集。
增量学习(incremental learning
)是一种技术,它允许词汇表随着时间的推移而适应和扩展,因为系统中添加了新的图像。基本的想法是在新图像到达时考虑它们,并将这些新图像中发现的视觉单词合并到现有词汇中。
在ORB-SLAM3中,增量学习是使用一种称为倒排文件索引的技术实现的。倒排文件索引维护每个视觉单词出现在哪些图像中的列表。随着新图像被添加到系统中,它们的ORB特征将与词汇表进行匹配,并且找到的任何新视觉单词都将添加到词汇表中以及它们对应的倒排文件列表。
除了添加新的视觉单词外,增量学习还可以删除对系统性能没有显著贡献的不常用单词。这是通过对每个视觉单词应该出现在其中的图像数量设置阈值来实现的。如果一个词出现在少于阈值数量的图像中,它被认为是太罕见,并从词汇表中删除。
增量学习的一个重要考虑因素是在吸收来自新图像的新信息和保持词汇一致性之间取得平衡。如果词汇更新过于激进,可能会导致混淆和错误的识别结果。另一方面,如果词汇没有足够的更新,系统可能无法准确识别新的地点。
总体而言,ORB-SLAM3中使用的ORB词汇表可以适应新的环境,并通过增量学习随着时间的推移进行更新,这允许系统提高其性能并适应不断变化的环境。“ -
作者:“请问,
incremental learning
在代码中用哪个函数或者类实现?” -
AI:"在ORB-SLAM3中,词汇的增量学习是在
ORB
类中实现的,它负责ORB特征的提取和匹配以及词汇的更新。
ORB
类包含一个名为AddWordsFromImage
的方法,该方法将图像作为输入并提取其ORB特征。然后将ORB特征与现有词汇表进行匹配,并将找到的任何新视觉单词添加到词汇表中。此方法还更新每个视觉单词的倒排文件列表。
除了添加新单词外,ORB
类还包括一个名为DeleteOldKeyFrames
的方法,用于从词汇表中删除不常用的单词。该方法对每个视觉单词应该出现的图像数量设置一个阈值,并且任何低于该阈值的单词都将从词汇表中删除。
总的来说,ORB-SLAM3中的ORB
类为增量提供了一个框架” -
作者:“请问,
ORBVocabulary
中词汇表的数据结构是怎么样的?” -
AI:“在ORB-SLAM3中,ORB词汇表被表示为称为分层k-均值树(HKM)的二叉树数据结构。
HKM树是使用图像的训练数据集离线构建的。首先使用k-均值聚类对训练图像进行聚类,根据特征相似度将特征空间划分为不相交的类。由此产生的质心形成词汇词。
为了创建HKM树,然后使用k-Means递归地对质心进行聚类,将特征空间划分为越来越小的子空间,直到每个叶节点表示单个词汇。所得到的树形结构允许在运行时高效地搜索和匹配特征。
HKM树中的每个节点由对应于视觉单词的质心向量表示。此外,对于每个视觉单词,都有一个倒排的文件列表,其中包含所有包含该单词的图像。这些倒排的文件列表用于在匹配过程中快速查找包含给定词的图像。
HKM树数据结构允许ORB-SLAM3有效地将ORB特征与词汇表进行匹配,并执行位置识别,即使在具有许多图像的大规模环境中也是如此。此外,数据结构允许增量学习,因为可以将新图像添加到词汇表中,并且可以动态更新树结构。
总体而言,HKM树是在ORB-SLAM3中表示ORB词汇表的有效数据结构,提供了高效的匹配和可伸缩性,同时允许对词汇表进行增量更新。”
作者注:在ORB-SLAM3/2中,词汇数据结构是用第三方的库名字叫做DBoW2
,DBoW2是一个对大量训练图像使用fast关键点+BRIEF描述子的方法提取特征,再将大量特征做K-mean++聚类形成一棵词典树的模型。主要使用DBoW2用来做重定位和闭环检测。
五、关于优化
- 作者:“请问ORB-SLAM3的优化算法是怎样的,提供详细的描述?”
- AI:“ORB-SLAM3使用捆绑调整优化算法来优化估计的相机姿势和地图中的3D点。该优化问题被描述为最小化重新投影误差平方和的问题,该误差平方和衡量了摄像机图像平面中观察到的2D特征位置与投影的3D点之间的差异。这个非线性最小二乘问题是使用Levenberg-MarQuardt算法来解决的,该算法迭代地更新相机姿势和3D点以最小化误差。优化还包括稳健估计技术,如Huber Lost或Tukey的双权重函数,以处理异常值并提高整体精度。在优化过程中,系统还可以更新相机的固有参数,并进行环路闭合校正,以进一步提高地图的精度和一致性。总体而言,优化算法对保证ORB-SLAM3系统的质量和可靠性起着至关重要的作用。
此外,ORB-SLAM3还采用了优化算法的多线程实现,以提高其计算效率。优化与特征提取、跟踪和映射等其他模块并行执行,以确保实时性能。这种多线程方法使系统能够以高精度和健壮性处理大规模环境和复杂的运动。“ - 作者:“请问 ORB-SLAM 是如何处理最小化重新投影误差平方和的问题的?”
-
- AI:“ORB-SLAM使用一个非线性最小二乘优化问题来处理最小化重新投影误差平方和的问题。该问题的目的是最小化所有观测到的特征点的重投影误差,即计算每个特征点从3D点投影到2D图像上与观察到的2D特征点之间的距离。这个问题被描述为一个非线性优化问题,因为在相机姿态和3D点位置的调整中存在许多非线性变量。ORB-SLAM使用Levenberg-Marquardt算法进行迭代优化,并结合鲁棒估计技术来处理异常点并提高整个系统的准确性和可靠性。
另外,ORB-SLAM还使用了一些 tricks 来加速优化过程。例如,在对每个特征点进行求导时,ORB-SLAM使用了一种分割图像的方法,将每个像素点分配给不同的线程,从而并行地计算其梯度和海森矩阵,并将结果同步到一个单独的矩阵中。这样可以充分利用现代多核处理器的并行计算能力,提高系统的运行效率。此外,ORB-SLAM还采用了一些预处理技术,如扰动法、高斯金字塔等,来优化特征提取和匹配的效果,从而进一步提高系统的性除了优化算法和技术,ORB-SLAM还采用了一些先进的硬件和传感器来增强系统的功能。例如,它使用高分辨率的摄像头和快速的图像处理芯片来提高特征点提取和跟踪的速度和精度。此外,ORB-SLAM还支持多种传感器,如惯性测量单元(IMU)、GPS定位、激光雷达等,以获得更准确、更鲁棒的定位和地图重建结果。这些先进的硬件和传感器的集成,是ORB-SLAM在SLAM领域中取得成功的关键因素之一。
- AI:“ORB-SLAM使用一个非线性最小二乘优化问题来处理最小化重新投影误差平方和的问题。该问题的目的是最小化所有观测到的特征点的重投影误差,即计算每个特征点从3D点投影到2D图像上与观察到的2D特征点之间的距离。这个问题被描述为一个非线性优化问题,因为在相机姿态和3D点位置的调整中存在许多非线性变量。ORB-SLAM使用Levenberg-Marquardt算法进行迭代优化,并结合鲁棒估计技术来处理异常点并提高整个系统的准确性和可靠性。
- 作者:“请问,ORB-SLAM中的特征提取和匹配的优化算法是怎么工作的,各自具体作用是什么?"
- AI:“在ORB-SLAM中,特征提取和匹配算法是分离的,分别由ORB特征提取器和ORB描述子匹配器完成。ORB特征提取器使用FAST角点检测算法来快速提取图像中的关键点,并计算每个关键点的尺度和方向信息。而ORB描述子匹配器则使用二进制描述子来描述每个关键点的特征,以便进行后续的匹配。优化算法的作用是对这些特征点进行优化,以最小化它们之间的重投影误差,从而得出相机姿态和3D点位置的最优解。特别地,ORB-SLAM采用了鲁棒的PnP算法来解决由于误匹配或离群点引起的姿态估计错误的问题。PnP算法是一种基于相机内外参数和特征点的3D坐标,同时求解相机位姿的优化算法。ORB-SLAM中,PnP算法使用了RANSAC(随机抽样一致性)方法来剔除误匹配和离群点,并采用迭代最近点(Iterative Closest Point,ICP)算法来进一步精细化姿态估计的结果。通过这些优化技术和算法,ORB-SLAM能够实现鲁棒、高效、正是因为这些特点,ORB-SLAM被广泛应用于机器人自主导航、增强现实、虚拟现实等领域。“
- 作者:“请问,ORB-SLAM中对摄像头、惯性测量单元(IMU)、GPS定位、激光雷达等多源的传感信息是用什么方法融合,达到优化位置估计的目的?"
- AI:“对于多源传感器的信息融合,ORB-SLAM采用了扩展卡尔曼滤波(Extended Kalman Filter,EKF)算法。EKF算法实现了对各个传感器的测量值进行组合,同时将不同传感器之间存在的相关性考虑进去,从而实现位置估计的优化。通过对不同传感器的信息进行有效地融合,ORB-SLAM能够提高定位、建图的准确性和可靠性。此外,ORB-SLAM还利用了视觉惯性里程计(Visual Inertial Odometry,VIO)算法来更好地结合摄像头和IMU的信息。VIO算法能够通过对相机图像和IMU测量值的联合优化,实现对相机位姿的高精度估计。与EKF算法相结合,ORB-SLAM能够充分利用多源传感器的信息,实现更加准确、鲁棒的定位和建图。"
六、小结
以上就是本人同AI的一次对话,总体上AI回答的还是比较靠谱,它对一些开源代码的理解可能超乎了很多人,虽然完全相信它,但是如果作为一个菜鸟想快了解某个开源系统的原理构成,可以通过如上面的对话去跟AI做一些深聊,可能会收到一些启发…
未完待续…