视觉SLAM笔记--第6篇: 单目初始化和三角测量

参考博客

参考博客:https://blog.youkuaiyun.com/llfjcmx/article/details/83410318

1. 三角测量

在得到了相机的运动之后,下一步我们需要用相机的运动来估计特征点的空间位置,但是在单目SLAM中,仅通过单张图像是无法获得像素的深度信息的,需要用三角测量(三角化)的方法来估计地图点的深度。

三角测量是指通过在两处观察同一个点的夹角,来确定该点的距离。

在这里插入图片描述
考虑图像 I 1 , I 2 I_{1},I_{2} I1,I2,相机的光心为 o 1 , o 2 o_{1},o_{2} o1,o2,以左图为参考,右图的变换矩阵为 R , t R, t R,t

假设在 I 1 I_{1} I1中有特征点 p 1 p_{1} p1,对应到 I 2 I_{2} I2中的特征点 p 2 p_{2} p2,理论上讲 o 1 p 1 和 o 2 p 2 o_{1}p_{1}和o_{2}p_{2} o1p1o2p2会相交于某一点P,该点即是两个特征点所对应的地图点在三维场景中的位置,但是由于噪声的影响,这两条直线往往无法相交,因此可以通过最小二乘法来求解出距离最近的那个点作为相交点。

按照对极几何中的定义,如果设 x 1 , x 2 x_1,x_{2} x1,x2为两个特征点的归一化坐标,于是有下列关系式:
s 1 x 1 = s 2 x 2 R + t s_{1}x_{1}=s_{2}x_{2}R+t s1x1=s2x2R+t已知:坐标系 o 到 o 1 o到o_{1} oo1的变换矩阵 R 、 t R、t Rt归一化坐标 x 1 , x 2 x_{1},x_{2} x1,x2,现在要求的就是两个特征点的深度 s 1 , s 2 s_{1},s_{2} s1,s2

左乘 [ x 1 ] × [x_{1}]_{\times} [x1]×可得 s 1 [ x 1 ] × x 1 = 0 s_{1}[x_{1}]_{\times}x_{1}=0 s1[x1]×x1=0
s 2 [ x 1 ] × x 2 R + [ x 1 ] × t = 0 s_{2}[x_{1}]_{\times}x_{2}R+[x_{1}]_{\times}t =0 s2[x1]×x2R+[x1]×t=0可以解出 s 2 s_{2} s2, 将其带入原来的式子可解出 s 1 s_{1} s1.
但是,由于噪声的存在,我们求出来的R,t不一定能够使得上式精确等于0,因此在实际情况中,更常见的做法是求最小二乘解而不是零解。

2. 单目初始化

由于 E(本质矩阵)本身具有尺度等价性,它分解得到的 R 、 t R、t Rt也有一个尺度等价性。而本身具有约束,所以我们认为 t t t 具有一个尺度。换言之,在分解过程中,对t乘以任意非零常数,分解都是成立的。因此,我们通常把t进行归一化,让它的长度等于1.

t t t 长度的归一化,直接导致了单目视觉的尺度不确定性。因为对t乘以任意一个比例常数后,对极约束仍然是成立的。换言之,在单目SLAM中,对轨迹和地图同时缩放任意倍数,我们得到的图仍然是一样的。

单目视觉的初始化问题

在单目视觉中,我们对两张图像的t进行归一化,相当于固定了一个尺度。虽然我们不知道它的实际长度是多少,但是我们可以以这时的 t t t 为单目1,计算相机运动和特征点的3D位置,这一步称为单目SLAM的初始化。

在初始化之后,就可以用3D-2D来计算相机的运动了,初始化之后的轨迹和地图的单位,就是初始化时固定的尺度。因此,初始化也是单目SLAM中不可避免的一个步骤。

初始化的两张图片必须要有一定程度的平移,而后的轨迹和地图都将会以这一步的平移为单位。单目初始化不能只有纯旋转,必须要有一定程度的平移,如果没有平移,单目将无法初始化

3. 单目-双目/RGB-D初始化的比较

  1. 初始化的目的是建立三维的空间点和地图并为之后的计算提供初始值;
  2. 同双目/RGB-D SLAM不同,单目SLAM无法从一帧图片中计算出深度,因此初始化需要两帧连续满足条件的图片来进行初始化;
  3. 单目SLAM初始化计算位姿是一个对极约束问题,而双目/RGB-D SLAM的初始化计算位姿是一个PnP问题;
  4. 在初始化成功后单目SLAM和双目SLAM一样是通过PnP来求解相机位姿的;
  5. 单目SLAM尺度不确定性的原因是因为在通过SVD分解E矩阵求解R,t时计算的t是没有单位的;
  6. 单目SLAM初始化的过程中对t进行了归一化来固定尺度,即以求解的初始帧的t为单位1,而后的轨迹和平移都将以这个t为单位;
  7. 单目SLAM的初始化一定要有一定程度的平移,纯旋转是无法完成初始化的。

4. 单目初始化两种方法

单目初始化的两种方法:使用基本矩阵F(极限约束),或是单应性矩阵H(平面结构)进行初始化。

从 E 分解到 R; t 的过程中,如果相机发生的是纯旋转,导致 t 为零,那么,得到的E 也将为零,这将导致我们无从求解 R。不过,此时我们可以依靠 H 求取旋转,但仅有旋转时,我们无法用三角测量估计特征点的空间位置(这将在下文提到),于是,另一个结论是, 单目初始化不能只有纯旋转,必须要有一定程度的平移。如果没有平移,单目将无法初始化。

<think>嗯,用户让我介绍一下ORB-SLAM2的学习笔记。我需要先回忆一下ORB-SLAM2的基本框架核心部分。ORB-SLAM2是一个比较经典的视觉SLAM系统,分为几个主要模块:特征提取、跟踪、局部建图、回环检测地图管理。首先,我应该从系统架构开始介绍,说明各个模块的作用相互关系。 接下来,用户可能需要了解ORB特征的相关内容。ORB特征结合了FAST关键点检测BRIEF描述子,具有旋转不变性一定的尺度不变性。这部分需要详细解释ORB特征的提取过程,包括如何构建图像金字塔,计算方向,生成描述子等步骤。 然后是跟踪线程,也就是Tracking部分。这里需要说明如何通过帧间匹配、运动模型或重定位来估计相机位姿。可能需要提到初始化的过程,比如使用单应矩阵或基础矩阵来恢复运动,以及如何三角化初始地图点。 局部建图模块负责处理新的关键帧,剔除冗余点,进行局部BA优化。这部分需要解释BA(Bundle Adjustment)的概念,以及如何优化相机位姿地图点。同时,还要提到关键帧的选择策略,比如根据共视点数量或时间间隔来决定是否插入新的关键帧。 回环检测地图融合部分也是重点。这里需要讲DBoW2的词袋模型,如何通过视觉词典检测回环,然后进行Sim3优化来校正漂移。此外,还要说明全局BA优化在回环校正后的作用,以及如何优化整个地图的一致性。 ORB-SLAM2支持单目、双目RGB-D相机,需要比较不同传感器下的系统表现。比如单目初始化困难,存在尺度不确定性,而双目RGB-D可以直接获取深度信息,初始化更简单。 在优缺点分析方面,优点包括实时性高、支持多传感器、具备回环检测重定位能力。缺点可能有对动态环境敏感,单目模式下尺度问题,以及特征提取在纹理缺失区域效果差。可以提到后续的ORB-SLAM3在IMU融合多地图系统上的改进。 最后,学习建议部分应该推荐一些资源,比如论文、代码库、书籍课程。同时建议从基础开始,动手实践,并参与社区讨论。 需要注意的是,用户可能希望了解实际应用中的问题,比如如何调整参数,处理特定场景的挑战,或者如何扩展ORB-SLAM2的功能。不过根据用户的问题,主要是介绍学习笔记,所以需要结构清晰,分点说明,确保覆盖主要模块关键点。 可能还需要检查LaTeX格式是否正确,比如公式是否用$或$$包裹,变量是否正确。例如,提到BA优化时,可以写目标函数是$$\min \sum \| \pi(X, T) - x \|^2$$,其中$T$是位姿,$X$是地图点。确保这些公式的格式正确。 总之,我需要按照系统架构、特征提取、跟踪、局部建图、回环检测、多传感器支持、优缺点、学习建议的结构来组织内容,使用清晰的中文,正确插入公式,并确保技术细节准确。</think>以下为ORB-SLAM2学习笔记的整理,按模块分阶段说明: --- ### 一、系统架构 $$ \text{ORB-SLAM2} = \text{Tracking} + \text{Local Mapping} + \text{Loop Closing} + \text{Map} $$ 三大线程并行运行: 1. **Tracking线程**:实时估计相机位姿($T_{cw} \in SE(3)$) 2. **Local Mapping线程**:局部BA优化与地图点维护 3. **Loop Closing线程**:回环检测与全局优化 --- ### 二、ORB特征提取 - **FAST关键点检测**:阈值化像素差异($|I_p - I_{center}| > \delta$) - **BRIEF描述子**:二进制编码(256-bit,汉明距离匹配) - **改进特性**: - 图像金字塔实现尺度不变性($n$层缩放,比例因子$s=1.2$) - 灰度质心法计算方向($m_{10}=\sum xI(x,y), m_{01}=\sum yI(x,y)$) --- ### 三、跟踪线程(Tracking) 1. **初始位姿估计**: - 通过上一帧运动模型预测:$T_{k} = T_{k-1} \cdot T_{k-1}^{k}$ - 或通过特征匹配与PnP求解:$\min_T \sum \| \pi(T \cdot X_i) - x_i \|^2$ 2. **关键帧判定**: - 跟踪质量下降(匹配点 < 阈值) - 距离上一关键帧超过20帧 --- ### 四、局部建图(Local Mapping) 1. **局部BA优化**: $$ \min_{T_i, X_j} \sum \| \pi(T_i \cdot X_j) - x_{ij} \|^2 + \rho(\| T_i^{-1}T_j \|) $$ - 仅优化当前关键帧及其共视关键帧 2. **地图点剔除**: - 观测次数 < 2次 - 重投影误差 > $\chi^2$阈值($\chi^2_{0.95}=5.991$) --- ### 五、回环检测(Loop Closing) 1. **词袋模型(DBoW2)**: - 离线训练视觉词典(k-means树结构) - 计算相似性得分:$s = \frac{\langle v_q, v_t \rangle}{\|v_q\| \|v_t\|}$ 2. **Sim3优化**: $$ \min_{S} \sum \| \pi(S \cdot X_i) - x_i \|^2 + \| \pi(S^{-1} \cdot X_j') - x_j' \|^2 $$ - 解决尺度漂移问题($S \in Sim(3)$) --- ### 六、多传感器支持 | 传感器类型 | 初始化方式 | 深度获取方法 | |------------|---------------------|-----------------------| | 单目 | 分解H/F矩阵 | 三角化(需运动) | | 双目/RGB-D | 直接构造深度图 | 视差/深度传感器 | --- ### 七、优缺点分析 - **优点**: - 实时性(30fps,GTX 1070) - 支持重定位与动态场景处理 - **缺点**: - 依赖特征匹配(纹理缺失易失效) - 单目模式需10秒以上初始化 --- ### 八、学习建议 1. **必读文献**: - 原论文《ORB-SLAM2: An Open-Source SLAM System for Monocular, Stereo and RGB-D Cameras》 - 《Multiple View Geometry in Computer Vision》 2. **代码实践**: ```bash git clone https://github.com/raulmur/ORB_SLAM2 cd ORB_SLAM2 && chmod +x build.sh && ./build.sh ``` 3. **调试工具**: - 使用g2o_viewer可视化优化结果 - 分析`KeyFrame::EraseMapPointMatch()`等关键函数 --- 以上内容需结合代码阅读(推荐使用CLion或VSCode调试),重点关注`Tracking.cc``Optimizer.cc`模块。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值