IT教程 ·

ORB-SLAM2 论文&代码进修 —— 单目初始化

使用docker创建MySQL容器,并在springboot中使用

 

本文要点:

  • ORB-SLAM2 单目初始化部份 论文内容引见
  • ORB-SLAM2 单目初始化部份 代码构造引见

写在前面

之前的 ORB-SLAM2 系列文章中,我们已对 Tracking 线程做了引见,然则当时我们跳过了 Tracking 线程中一个很主要的部份 —— 单目初始化。我们将在本文中,对 ORB-SLAM2 体系的单目初始化部份举行引见。

照旧祭出该图,轻易检察:

ORB-SLAM2 论文&代码进修 —— 单目初始化 IT教程 第1张

也再次献上我绘制的程序导图全图:

老例子,照样分两部份:以 ORB-SLAM 论文为参考 和 以 ORB-SLAM2 代码(程序导图)为参考。

以 ORB-SLAM 论文为参考

关于任何一个单目 SLAM 体系来讲,在体系运转之初都要举行初始化,其目标在于,要盘算出某两帧的相对位姿,以此来经由历程三角化获得一些初始 MapPoints,从而获得一个初始的 Map,如许以后的跟踪也好优化也好都在这个基本上举行。在 ORB-SLAM 之前的单目 SLAM 体系的初始化,每每须要依靠实在场景中某样肯定的物体(eg. MonoSLAM)或许须要人工参与(eg. PTAM),而 ORB-SLAM 的单目初始化是完整自动的。

对 SLAM 基本知识有过相识的同学会晓得,恢复两帧之间的相对活动,有两种模子:基本矩阵(Fundamental)(等同于实质矩阵)模子和单应矩阵(Homography)模子。一般情况下基本矩阵模子应当能够敷衍,但假如特性点共面(初始化场景中主如果一个平面),或许两帧之间的相对位姿未纯扭转时,基本矩阵的自由度会下落,也就是所谓的退步,类似于方程数少于变量数。此时为了保证活动恢复的精度,就不能再用基本矩阵模子。由此提出了单应矩阵,其假定特性点落在统一平面上,从而适用于这类场景下的活动恢复。

ORB-SLAM 在初始化时,它也不晓得场景中的特性点在不在统一平面,所以它挑选两种模子各自算一遍(开两个线程同时算),以后盘算两种模子各自举行活动恢复的得分,取得分高的模子,再依据该模子,盘算两帧之间的相对位姿并举行初始化。

单目初始化具体步骤

1. 提取 ORB 特性点

在当前帧和参考帧中提取 FeaturePoints(只在最优的标准),同时将当前帧和参考帧的 FeaturePoints 做婚配。假如婚配点不够多,从新初始化。

2. 同时盘算两种模子

  • 单应矩阵 (H_{cr}):DLT 算法 + RANSAC 迭代
  • 基本矩阵 (F_{cr}):8点法 + RANSAC 迭代

同时盘算两种模子各自的得分,盘算公式以下(个中 M 能够示意 H (Homography),也能够示意 F (Fundamental)):

(S_{M}=sum_{i}left(rho_{M}left(d_{c r}^{2}left(mathbf{x}_{c}^{i}, mathbf{x}_{r}^{i}, Mright)right)+rho_{M}left(d_{r c}^{2}left(mathbf{x}_{c}^{i}, mathbf{x}_{r}^{i}, Mright)right)right))

(rho_{M}left(d^{2}right)=left{begin{array}{ll} {Gamma-d^{2}} & {text { if } quad d^{2}<T_{M}} {0} & {text { if } quad d^{2} geq T_{M}} end{array}right.)

个中 (d_{c r}^{2}) (d_{r c}^{2}) 是对称转换偏差。(rho_{M}()) 的作用是令大的偏差对低的得分,个中 (T_M) 阈值是算出来的:假定测量值偏差的标准差为1像素,经由历程95%的 (chi^{2}) 磨练获得的。关于每种模子,在 RANSAC 迭代历程当中保存得分最高的模子。假如终究没能求出解(关于 RANSAC,inliers不够多),则从新初始化。

3. 挑选适宜的模子

依据两种模子各自的得分:

(R_{H}=frac{S_{H}}{S_{H}+S_{F}})

假如 (R_H) > 0.45(代码中是 0.4),则选用单应矩阵;反之则选基本矩阵模子。也许就是选得分高的,此处的 0.4 应当是经验值。

4. 举行活动恢复,求解两帧相对位姿((R, t))并经由历程三角化获得初始 MapPoints

在求出 (H_{cr}) 或 (F_{cr}) 后,就要依据该矩阵求出相对位姿((R, t))。但这个历程的求出的解不是唯一的。ORB-SLAM 采用的挑选方法是:对这些解悉数举行三角化恢复 MapPoints,哪一个解恢复出来的 MapPoints 大部份都在相机前方且重投影偏差小,就选哪一个解。假如不能明白选出一个最适宜的,则从新初始化。

5. BA 优化

末了,举行一次全局 BA,优化以下,获得终究的初始化效果。

从以上步骤能够看出,ORB-SLAM 在单目初始化花了许多心机。有一个很明显的特性:只需涌现一点不妥,ORB-SLAM 就会挑选从新初始化。论文中说,这类高标准严要求的初始化原则,是 ORB-SLAM 体系鲁棒性非常好的主要原因之一。由于假如初始化就不适宜或失足,背面的跟踪只会一错再错,错上加错。

以 ORB-SLAM2 代码(程序导图为参考)

ORB-SLAM2 论文&代码进修 —— 单目初始化 IT教程 第2张

在上图中 MonocularInitialization() 就是初始化的程序,我们能够看到它在 Tracking 线程中的位置。

上图是 MonocularInitialization() 部份的程序框图,其大致和论文中引见的步骤是完整一致的,如许图已很清楚了,这里就不多形貌了。

假如嫌这张图不够清楚的话,能够点击 ORB-SLAM2 程序导图链接(文首)检察清楚全图

PS: 从中上图我们能够看到,在恢复出两帧之间的相对活动后,程序中还要运用 Tracking::CreateInitialMapMonocular() 来竖立初始化的舆图。这部份在论文里几乎没有翰墨提到,但在程序里须要很大篇幅来完成。这个细节就反应了我在本系列博文开篇就提到过的读通 ORB-SLAM2 代码的难题的地方。以我如今小菜鸡的程度,我基础设想不出 ORB-SLAM2 如许庞杂而环环相扣的工程是怎样写出来的(堕泪)。

ORB-SLAM2 系列博文

国内jenkins搭建不再龟速的方式

参与评论