重新温习SLAM的一些基本知识

经典特征提取与匹配

ORB 特征

ORB 特征亦关键点描述子两部分组成。

FAST 关键点

FAST 是一种角点,主要检测局部像素灰度变化明显的地方,以速度快著称。它的思想是:如果 一个像素与邻域的像素差别较大(过亮或过暗),那么它更可能是角点。相比于其他角点检测算法, FAST 只需比较像素亮度的大小,十分快捷。

在 FAST-12 算法中,为了更高效,可以添加一项预测试操作,以快速地排除绝大多数不是角点 的像素。

原始的 FAST 角点经常出现“扎堆”的现象。所以在第一遍检测之后,还需要用非极大值抑制(Non-maximal suppression),在一定区域内仅保留 响应极大值的角点,避免角点集中的问题。 针对 FAST 角点不具有方向性和尺 度的弱点,ORB 添加了尺度和旋转的描述。尺度不变性由构建图像金字塔,并在金字塔的每一层上检测角点来实现。通过矩可以找到图像块的质心,连接图像块的几何中心 O 与质心 C,得到特征点的方向。

BRIEF 描述子

BRIEF 是一种二进制描述子,其描述向量由许多个 0 和 1 组成,这里的 0 和 1 编码了关键点附 近两个随机像素(比如 p 和 q)的大小关系:如果 p 比 q 大,则取 1,反之就取 0。如果我们取了 128 个这样的 p; q,最后就得到 128 维由 0、1 组成的向量。

特征匹配

如果没有其他约束,在BRIEF 汉明距离极小的计算量下,通常可以使用暴力匹配(BruteForce Matcher)。

2D−2D: 对极几何

对极约束

这时候点 O1; O2; P 三个点可以确定一个平面,称为极平面(Epipolar plane)。O1O2 连 线与像平面 I1; I2 的交点分别为 e1; e2。e1; e2 称为极点(Epipoles),O1O2 被称为基线(Baseline)。 我们称极平面与两个像平面 I1; I2 之间的相交线 l1; l2 为极线(Epipolar line)

p_2^{\mathrm{T}}K^{-\mathrm{T}}t^{\wedge}RK^{-1}p_1=0.

这个式子称为对极约束,它以形式简洁著名。它的几何意义是 O1; P; O2 三者共面。

极约 束中同时包含了平移和旋转。我们把中间部分记作两个矩阵:基础矩阵(Fundamental Matrix)F 和 本质矩阵(Essential Matrix)E,于是可以进一步简化对极约束:

E=t^{\wedge}R,\quad F=K^{-\mathrm{T}}EK^{-1},\quad x_2^\mathrm{T}Ex_1=p_2^\mathrm{T}Fp_1=0.

由于 E 和 F 只相差了相机内参,而内参在 SLAM 中通常是已知的,所以实践当中往往使用形式更简单的E

本质矩阵

如何求E?——八点法。八点法只利用了 E 的线性性质,因此可 以在线性代数框架下求解。

\begin{pmatrix} u_2^1u_1^1 & u_2^1v_1^1 & u_2^1 & v_2^1u_1^1 & v_1^1v_1^1 & v_2^1 & u_1^1 & v_1^1 & 1 \\ u_2^2u_1^2 & u_2^2v_1^2 & u_2^2 & v_2^2u_1^2 & v_2^2v_1^2 & v_2^2 & u_1^2 & v_1^2 & 1 \\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \\ u_2^8u_1^8 & u_2^8v_1^8 & u_2^8 & v_2^8u_1^8 & v_2^8v_1^8 & v_2^8 & u_1^8 & v_1^8 & 1 \end{pmatrix} \begin{pmatrix} e_1 \\ \\ e_2 \\ \\ e_3 \\ \\ e_4 \\ \\ e_5 \\ \\ e_6 \\ \\ e_7 \\ \\ e_8 \\ \\ e_9 \end{pmatrix}=0.

如何根据已经估得的本质矩阵 E,恢复出相机的运动 R; t

E=U\mathrm{diag}(\frac{\sigma_1+\sigma_2}{2},\frac{\sigma_1+\sigma_2}{2},0)\boldsymbol{V}^\mathrm{T}.

更简单的做法是将奇异值矩阵取成 diag(1; 1; 0),因为 E 具有尺度等价性。

这里就能反解出t和R。具体地,我们通过观测和匹配找到多组匹配点,可以通过一下步骤求出E:

\begin{align*} &\text{匹配点} \longrightarrow A\mathbf{e} = 0 \longrightarrow \hat{E} \\ &\hat{E} \xrightarrow{\text{SVD}} U \operatorname{diag}(\sigma_1, \sigma_2, \sigma_3) V^T \\ &\hat{E} \xrightarrow{\text{奇异值修正}} E = U \operatorname{diag}(1, 1, 0) V^T \\ &E \xrightarrow{\text{标准分解}} \begin{cases} R = U W^T V^T \text{ 或 } U W V^T \\ t \propto \pm u_3 \end{cases} \end{align*}

单应矩阵

通常SLAM会同时计算本征矩阵和单应矩阵,单应矩阵在本征矩阵退化时(出现共面点或者纯旋转,噪音主导多出来的自由度)起到重要作用。单应矩阵通常描述处于共同平面上的一些点在两张图像之间的变换关系。

考虑在图像 I1 和 I2 有一对匹配好的特征点 p1 和 p2。这些特征点落在平面 P 上,设这个平面满足方程:

n^\mathrm{T}P+d=0.

整理后得到出如下形式:

p_{2}\simeq K\left(R-\frac{tn^\mathrm{T}}{d}\right)\boldsymbol{K}^{-1}\boldsymbol{p}_1.

两个K之间的部分就记为单应矩阵H:

p_{2}\simeq Hp_{1}.

与本质矩阵相似,求出单应矩阵以后需要对其进行分解,才可以得到相 应的旋转矩阵 R 和平移向量 t。分解的方法包括数值法与解析法。

总结

单应性在 SLAM 中具有重要意义。当特征点共面或者相机发生纯旋转时,基础矩阵的自由度下降,这就出现了所谓的退化(degenerate)。现实中的数据总包含一些噪声,这时候如果继续使用八点法求解基础矩阵,基础矩阵多余出来的自由度将会主要由噪声决定。为了能够避免退化现象造成的影响,通常我们会同时估计基础矩阵F和单应矩阵H,选择重投影误差比较小的那个作为最终的运动估计矩阵。

尺度不确定性

对 t 长度的归一化,直接导致了单目视觉的尺度不确定性(Scale Ambiguity)。在单目 SLAM 中,对轨迹和地图同时 缩放任意倍数,我们得到的图像依然是一样的。

在单目视觉中,我们对两张图像的 t 归一化相当于固定了尺度。虽然我们不知道它的实际长度 是多少,但我们以这时的 t 为单位 1,计算相机运动和特征点的 3D 位置。这被称为单目 SLAM 的 初始化。在初始化之后,就可以用 3D−2D 来计算相机运动了。初始化之后的轨迹和地图的单位,就 是初始化时固定的尺度。因此,单目 SLAM 有一步不可避免的初始化。初始化的两张图像必须有一 定程度的平移,而后的轨迹和地图都将以此步的平移为单位。

初始化的纯旋转问题

从 E 分解到 R; t 的过程中,如果相机发生的是纯旋转,导致 t 为零,那么,得到的 E 也将为 零,这将导致我们无从求解 R。不过,此时我们可以依靠 H 求取旋转,但仅有旋转时,我们无法用 三角测量估计特征点的空间位置(这将在下文提到),于是,另一个结论是,单目初始化不能只有纯旋转,必须要有一定程度的平移。如果没有平移,单目将无法初始化。在实践当中,如果初始化时 平移太小,会使得位姿求解与三角化结果不稳定,从而导致失败。相对地,如果把相机左右移动而不是原地旋转,就容易让单目 SLAM 初始化。因而,有经验的 SLAM 研究人员,在单目SLAM 情况下经常选择让相机进行左右平移以顺利地进行初始化。

多于 8 对点的情况

当给定的点数多于 8 对时,我们可以计算一个最小二乘解。不过,当可能存在误匹配的情况时,我们会更倾向 于使用随机采样一致性(Random Sample Concensus,RANSAC)来求,而不是最小二乘。RANSAC 是一种通用的做法,适用于很多带错误数据的情况,可以处理带有错误匹配的数据。

三角测量