重投影误差

**重投影误差(Reprojection error)**是视觉SLAM中最基本的几何残差:它衡量一个假设的三维点和相机位姿在多大程度上能够解释一次实际的二维特征观测。取一个三维点 Xj\mathbf{X}_j(世界坐标系)、一个相机位姿 TiSE(3)T_i \in SE(3)(世界到相机),以及该点在图像 ii 中被观测到的像素位置 zij\mathbf{z}_{ij}

eij=zijπ ⁣(TiXj)\mathbf{e}_{ij} = \mathbf{z}_{ij} - \pi\!\left(T_i \mathbf{X}_j\right)

其中 π:R3R2\pi : \mathbb{R}^3 \to \mathbb{R}^2 是相机投影函数。对于内参为 (fx,fy,cx,cy)(f_x, f_y, c_x, c_y) 的针孔相机,以及相机坐标系下的点 Xc=(X,Y,Z)T=TiXj\mathbf{X}^c = (X, Y, Z)^T = T_i \mathbf{X}_j

π(Xc)=[fxX/Z+cxfyY/Z+cy]\pi(\mathbf{X}^c) = \begin{bmatrix} f_x \, X / Z + c_x \\ f_y \, Y / Z + c_y \end{bmatrix}

该误差以像素为单位——可以直接与特征检测器的定位噪声(通常约为一个像素)相比较,这使得设置阈值和协方差变得容易。

从残差到代价函数

在观测噪声为高斯分布 zijN(π(TiXj),Σij)\mathbf{z}_{ij} \sim \mathcal{N}\left(\pi(T_i\mathbf{X}_j), \Sigma_{ij}\right) 的假设下,对位姿和地图点的最大似然估计恰好就是加权非线性最小二乘问题

C=(i,j)OeijTΩijeijC = \sum_{(i,j) \in \mathcal{O}} \mathbf{e}_{ij}^T \, \Omega_{ij} \, \mathbf{e}_{ij}

其中 Ωij=Σij1\Omega_{ij} = \Sigma_{ij}^{-1}信息矩阵,O\mathcal{O} 是(位姿,地图点)观测对的集合。每一项都是一个平方马氏距离;实践中 Σij\Sigma_{ij} 通常是各向同性的,并根据该特征被检测到的图像金字塔层级进行缩放(层级越粗糙=噪声越大=权重越低)。

由于错误匹配会产生巨大的残差,足以主导二次代价函数,实际系统会将每一项包裹在一个鲁棒核函数 ρ\rho(Huber、Cauchy)中,得到 ρ(eijTΩijeij)\sum \rho\left(\mathbf{e}_{ij}^T \Omega_{ij} \mathbf{e}_{ij}\right),并剔除卡方值超过阈值的观测。

优化

该代价函数在位姿上是非线性的(通过 SE(3)SE(3) 作用以及透视除法)。围绕当前估计将 e(x+Δx)e(x)+JΔx\mathbf{e}(\mathbf{x} + \Delta\mathbf{x}) \approx \mathbf{e}(\mathbf{x}) + J \Delta\mathbf{x} 线性化,并迭代求解高斯-牛顿正则方程 (JTΩJ)Δx=JTΩe\left(J^T \Omega J\right)\Delta\mathbf{x} = -J^T \Omega\, \mathbf{e},是标准做法。根据链式法则,雅可比矩阵可分解为

e()=πXcXc()\frac{\partial \mathbf{e}}{\partial (\cdot)} = -\frac{\partial \pi}{\partial \mathbf{X}^c} \cdot \frac{\partial \mathbf{X}^c}{\partial (\cdot)}

其中 π/Xc\partial \pi / \partial \mathbf{X}^c 是一个 2×32 \times 3 矩阵,包含 1/Z1/Z 以及 X/Z2-X/Z^2Y/Z2-Y/Z^2 项;第二个因子则根据我们对位姿求导(通过李代数扰动,得到 2×62 \times 6)还是对地图点求导(得到 2×32 \times 3)而有所不同。

哪些问题在最小化它

可供对比的替代方案:光度误差(直接法比较像素强度而非特征位置)以及三维点到点/点到面误差(ICP)。当存在可靠的特征对应关系时,重投影误差是首选,因为它的像素空间噪声模型与测量实际产生的方式相匹配。

对SLAM的意义

相关条目