SLAM学习笔记3: 源码分析ORB_SLAM中后端图构建

本文详细解析了ORB_SLAM中的五个关键优化函数:GlobalBundleAdjustment、PoseOptimization、LocalBundleAdjustment、OptimizeEssentialGraph及OptimizeSim3的工作原理。通过图文并茂的方式,阐述了这些函数如何构建图模型并进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨晚把ORB_SLAM中构图部分好好看了看, 不知道理解是否正确, 写出来希望得到指正.
因为代码实在太长, 贴在这里不合适, 我就用文字概述思想, 之后有时间会补上一些图解说明.


ORB_SLAM中使用到g2o进行优化的函数有四个:
GlobalBundleAdjustemnt
PoseOptimization
LocalBundleAdjustment
OptimizeEssentialGraph
OptimizeSim3.

下面对这几个不同的函数进行逐一分析:

1. GlobalBundleAdjustment

这个函数的作用是对全局的地图点和keyframe位姿进行优化. 即大图优化, 非常费时.
(1) 提取出所有的keyframes和所有的地图点.
(2) 把keyframe设置为图中的节点
(3) 把每一个地图点设置为图中的节点, 然后对于每一个地图点, 找出所有能看到这个地图点的keyframe.
(4) 对每一个keyframe, 建立边:
边的两端分别是地图点的SE3位姿与当前keyframe的SE位姿.
边的观测值为该地图点在当前keyframe中的二维位置.
信息矩阵(权重)是观测值的偏离程度, 即3D地图点反投影回地图的误差.

(5) 构图完成, 进行优化.
(6) 把优化后的地图点和keyframe位姿全部放回原本的地图中.

2. PoseOptimization

对于每一个keyframe, 进行位姿的局部优化.
(1) 直接把当前keyframe设为地图中的节点
(2) 找出所有在当前keyframe中可见的的三维地图点, 对每一个地图点, 建立边:
边的两端分别是keyframe的位姿与当前地图点为位姿.
边的观测值为该地图点在当前keyframe中的二维位置.
信息矩阵(权重)是观测值的偏离程度, 即3D地图点反投影回地图的误差.
(3) 构图完成,进行优化. 这里的优化要做四次, 没搞明白为什么.
(4) 把优化后的keyframe位姿放回去.

3. LocalBundleAdjustment

(1) 找到Local Keyframe, 即那些共享CovisbilityMap的Keyframes. 存入lLocalKeyFrames.
(2) 找到所有Local Keyframes都能看到的地图点, 其实就是CovisbilityMap的地图点. 存入lLocalMapPoints.
(3) 再找出能看到上面的地图点, 却不在Local Keyframe范围内的keyframe(为什么??). 存入lFixedCameras.
(4) 把上面的Local Keyframe, Map Point, FixedCamera都设置为图节点.
(5)对于lLocalMapPoints中的每一个地图点及能看到它的所有keyframes, 建立边:
边的两端分别是keyframe的位姿与当前地图点为位姿.
边的观测值为该地图点在当前keyframe中的二维位置.
信息矩阵(权重)是观测值的偏离程度, 即3D地图点反投影回地图的误差.
(6) 去除掉一些不符合标准的边.
(7) 把优化后地图点和keyframe位姿放回去.

4. OptimizeEssentialGraph

这个函数应该是这几个之中最重要的一个.
(1) 首先获取所有keyframes和地图点.
(2) 把keyframe都设为图节点, 剔除不好的keyframe. 这里的frame位姿为Sim3.
(3) 添加边
<1> Loop edge: LoopConnections 是一个Map, Map中第一个元素是有loop的keyframe, 第二个元素是与第一个元素形成loop的keyframe集合. 给它们全部添加边进行连接.
边的观测值是后一帧的SIM3位姿乘以前一帧的SIM3位姿的逆. (为什么??)
<2> Normal edge: 遍历所有的keyframe,
- 找到当前keyframe的parent keyframe, 建立边连接. 边的观测值为parent keyframe的位姿乘以keyframe位姿的逆(为什么??). 信息矩阵为单位矩阵.
- 找到与当前keyframe形成Loop的所有keyframe, 如果找到成Loop的keyframe在当前keyframe之前, 则在两个keyframe之间添加一个边连接. 观测值为Loop keyframe的位姿乘以keyframe位姿的逆(为什么??). 信息矩阵为单位矩阵.
- 找到当前keyframe的covisibility graph 中的每一个keyframe, 建立边连接. 观测值为covisibility graph keyframe位姿乘以keyframe位姿的逆(为什么??). 信息矩阵为单位矩阵.

(4) 构图完成, 进行优化.
(5) 更新EssentialGraph中的所有位姿.

5. OptimizeSim3

(1) 把输入的KF1到KF2的位姿变换SIM3加入图中作为节点0.
(2) 找到KF1中对应的所有map点, 放在vpMapPoints1中. vpMatches1为输入的匹配地图点, 是在KF2中匹配上map点的对应集合.
(3) Point1是KF1的Rotation matrix*map point1的世界坐标+KF1的Translation matrix. Point2是KF2的Rotation matrix*map point2的世界坐标+KF2的Translation matrix.
把Point1 Point2作为节点加入图中
(4) 在节点0与Point1, Point2之间都建立边连接. 测量值分别是地图点反投影在图像上的二维坐标, 信息矩阵为反投影的误差.
(5) 图构建完成, 进行优化!
(6) 更新两帧间转换的Sim3.


总结一下, ORB_SLAM中的优化分为多个层次, 从低到高为:

  1. PoseOptimization: 优化单帧位姿. 每个帧可见多个地图点, 可以建立多个边连接, 构成图进行优化. 优化单一帧的SE3位姿.
  2. OptimizeSim3: 优化两帧之间的位姿变换, 因为两帧之间可以看到多个相同的地图点, 可以构成一个超定方程组, 可以最小化误差优化. 优化帧间变化的SIM3位姿与地图的VertexSBAPointXYZ位姿
  3. LocalBundleAdjustment: 在一个CovisbilityMap内进行优化. 在一定范围的keyframe中,可以看到同一块地图, 即是CovisbilityMap. 连接CovisbilityMap内的每一个map点与可见它的所有keyframe, 放在一起进行优化. 这个优化是双向的, 既优化地图点的VertexSBAPointXYZ位姿, 又优化Camera的SE3位姿.
  4. OptimizeEssentialGraph: 加入Loop Closure的考虑, Covisbility图中的keyframe相互连起来, Keyframe之间有前后相连, 于是不同的Covisbility图也可以联系起来. 这是一个大范围的优化, 主要是加入了Loop Closure约束. 优化的是Camera的SIM3位姿.
  5. GlobalBundleAdjustment: 最大范围的优化, 优化所有Camera的SE3位姿与地图点的XYZ位姿.
<think>好的,我需要帮助用户找到关于ORB-SLAM3算法框架的中文资料或教程。首先,我应该回顾用户提供的引用内容,看看是否有相关的信息。根据引用[1],提到了ORB-SLAM3的配置文件和使用指南,但主要是安装和配置方面的信息。引用[2]和[3]讨论了ORB-SLAM2在Windows上的部署和应用场景,虽然ORB-SLAM3是后续版本,但可能有相似之处。 接下来,我需要考虑用户需要中文资料,所以应该优先推荐中文资源。可能的方向包括官方文档的中文翻译、社区教程、博客文章、视频教程以及GitHub项目的中文说明。由于ORB-SLAM3相对较新,中文资料可能不如英文多,但ORB-SLAM2的资料可能仍有参考价值,因为两者在核心算法上相似。 然后,我需要检查提供的引用中是否有直接的中文教程。引用[1]提到了ORB-SLAM3_ROS的安装与使用指南,可能包含中文内容。引用[3]提到ORB_SLAM2_Windows有详尽的文档和步骤指导,适用于Windows平台,虽然针对的是ORB-SLAM2,但用户可能从中获得一些帮助,尤其是在部署方面。 另外,用户可能对学术论文感兴趣,但需要中文的综述或解读。此外,GitHub的中文README文件或Wiki页面也可能有用。社区如知乎、优快云、博客园可能有开发者分享的经验。视频平台如Bilibili可能有相关教程。 需要确保推荐的中文资料是可靠和最新的,避免推荐过时的内容。同时,要提醒用户ORB-SLAM3的中文资料较少,可能需要结合英文资源学习。此外,建议用户参考官方文档和论文作为基础,再辅以社区资源。 最后,生成相关问题,帮助用户深入理解,比如框架结构、与ORB-SLAM2的区别、多传感器融合的具体实现等。</think>### ORB-SLAM3 中文资料与教程整理 #### 1. 官方文档与开源项目 - **官方GitHub仓库** ORB-SLAM3的[GitHub页面](https://github.com/UZ-SLAMLab/ORB_SLAM3)提供了完整的代码和英文文档。虽然中文内容较少,但可通过浏览器翻译工具辅助阅读[^1]。 - **中文翻译项目** 部分开发者社区(如Gitee)有对官方文档的中文翻译尝试,可搜索关键词“ORB-SLAM3 中文文档”查找类似项目。 #### 2. 中文社区教程 - **优快云博客与知乎专栏** 国内开发者常在这些平台分享实践笔记,例如: - [《ORB-SLAM3 原理与代码解析》系列文章](https://blog.youkuaiyun.com/xxx)(需自行搜索最新链接) - 知乎专栏“SLAM技术漫谈”中对多地图系统的分析[^3] - **B站视频教程** 搜索“ORB-SLAM3 实战教程”可找到从环境配置到实际运行的完整视频,例如: - 《ORB-SLAM3 Windows编译指南》(基于引用[3]的衍生内容) - 《如何用TUM数据集测试ORB-SLAM3》(参考引用[2]的数据集使用方法) #### 3. 关键文档重点解读(基于引用内容) 1. **配置文件说明** - **词典文件**:`Vocabulary/ORBvoc.txt`是特征匹配的核心,直接影响闭环检测效果 - **参数文件**:如`EuRoC.yaml`需根据传感器类型调整特征点数量、匹配阈值等 2. **运行流程** ```bash # 单目示例(参考引用[2]) ./Examples/Monocular/mono_euroc Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml /数据集路径 ``` 3. **多传感器支持** ORB-SLAM3新增的**IMU融合**和**多地图系统**可通过修改配置文件启用,需注意时间戳同步问题 #### 4. 实践建议 - **从ORB-SLAM2入手**:引用[3]的Windows部署经验对V3版本仍有参考价值 - **调试技巧**:若出现特征点丢失,可尝试: - 增加配置文件中的`nFeatures`参数值 - 调整`scaleFactor`金字塔缩放因子 - 使用`ROS`可视化工具实时观察特征匹配情况 #### 5. 延伸阅读推荐 - 《视觉SLAM十四讲》(高翔著):包含ORB特征原理详解 - 《多传感器融合SLAM技术综述》(《自动化学报》中文论文)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值