视觉SLAM中Bundle Adjustment(BA)问题
重投影误差:对于第iii个相机位姿(参数化为李代数ξi∈se3ξi∈se3)和第jjj个三维点Xj∈R3Xj∈R3,其投影到图像的观测像素坐标为uijuij。pijπexpξi∧Xjpijπexpξi∧Xj其中π⋅\pi(\cdot)π⋅eijuij−pijeijuij−pij目标函数:minξ。
引用
视觉SLAM中Bundle Adjustment(BA)问题旨在同时优化相机位姿和三维地图点,以最小化重投影误差。与之前文章中提到的最小化重投影的区别是:BA同时优化相机位姿和三维空间点,并且最小化k时刻之前所有数据的重投影误差;而视觉里程计中的方法仅优化空间点,且只有两帧之间的数据。
详细推导过程:
1. 问题定义与目标函数
-
重投影误差:
对于第iii个相机位姿(参数化为李代数ξi∈se(3)\boldsymbol{\xi}_i \in \mathfrak{se}(3)ξi∈se(3))和第jjj个三维点Xj∈R3\mathbf{X}_j \in \mathbb{R}^3Xj∈R3,其投影到图像的观测像素坐标为uij\mathbf{u}_{ij}uij。
投影过程为:
pij=π(exp(ξi∧)Xj)\mathbf{p}_{ij} = \pi\left( \exp(\boldsymbol{\xi}_i^\wedge) \mathbf{X}_j \right)pij=π(exp(ξi∧)Xj)
其中π(⋅)\pi(\cdot)π(⋅)为针孔相机模型,重投影误差为:
eij=uij−pij\mathbf{e}_{ij} = \mathbf{u}_{ij} - \mathbf{p}_{ij}eij=uij−pij -
目标函数:
最小化所有观测的重投影误差平方和:
minξi,Xj∑i,j∣∣eij∣∣2\min_{\boldsymbol{\xi}_i, \mathbf{X}_j} \sum_{i,j} ||\mathbf{e}_{ij} ||^2ξi,Xjmini,j∑∣∣eij∣∣2
2. 非线性优化方法
采用高斯-牛顿法或列文伯格-马夸尔特法进行迭代优化,步骤如下:
2.1 误差函数的线性化
对误差项进行一阶泰勒展开:
eij(ξi+Δξi,Xj+ΔXj)≈eij+JiposeΔξi+JjpointΔXj\mathbf{e}_{ij}(\boldsymbol{\xi}_i + \Delta\boldsymbol{\xi}_i, \mathbf{X}_j + \Delta\mathbf{X}_j) \approx \mathbf{e}_{ij} + \mathbf{J}_{i}^{\text{pose}} \Delta\boldsymbol{\xi}_i + \mathbf{J}_{j}^{\text{point}} \Delta\mathbf{X}_jeij(ξi+Δξi,Xj+ΔXj)≈eij+JiposeΔξi+JjpointΔXj
其中:
- Jipose=∂eij∂ξi\mathbf{J}_{i}^{\text{pose}} = \frac{\partial \mathbf{e}_{ij}}{\partial \boldsymbol{\xi}_i}Jipose=∂ξi∂eij是误差对相机位姿的雅可比矩阵。
- Jjpoint=∂eij∂Xj\mathbf{J}_{j}^{\text{point}} = \frac{\partial \mathbf{e}_{ij}}{\partial \mathbf{X}_j}Jjpoint=∂Xj∂eij 是误差对三维点的雅可比矩阵。
2.2 雅可比矩阵计算 - 相机位姿导数(左扰动模型):
设ξi\boldsymbol{\xi}_iξi的左扰动为Δξ\Delta\boldsymbol{\xi}Δξ
投影点对位姿的导数为:
Jipose=−∂π∂p⋅∂(TiXj)∂Δξ∣Δξ=0\mathbf{J}_{i}^{\text{pose}} = -\frac{\partial \pi}{\partial \mathbf{p}} \cdot \frac{\partial ( \mathbf{T}_i \mathbf{X}_j)}{\partial \Delta\boldsymbol{\xi}} \bigg|_{\Delta\boldsymbol{\xi}=0}Jipose=−∂p∂π⋅∂Δξ∂(TiXj) Δξ=0
其中∂π∂p\frac{\partial \pi}{\partial \mathbf{p}}∂p∂π为投影函数对三维点的导数,与直接法类似;
∂(TiXj)∂ξi=[I3×3,−(TiXJ)∧]\frac{\partial (\mathbf{T}_i \mathbf{X}_j)}{\partial \boldsymbol{\xi}_i}=[I_{3\times3, -(\mathbf{T}_i\mathbf{X}_J)^\wedge}]∂ξi∂(TiXj)=[I3×3,−(TiXJ)∧]在直接法等文章中已经推导过。 - 三维点导数:
Jjpoint=−∂π∂p⋅Ri\mathbf{J}_{j}^{\text{point}} = -\frac{\partial \pi}{\partial \mathbf{p}} \cdot \mathbf{R}_iJjpoint=−∂p∂π⋅Ri
其中Ri\mathbf{R}_iRi为相机的旋转矩阵。
3. 构建增量方程
将优化变量组合为
Δx={Δξ1,…,Δξm,ΔX1,…,ΔXn}T\Delta\mathbf{x} = \{ \Delta\boldsymbol{\xi}_1, \dots, \Delta\boldsymbol{\xi}_m, \Delta\mathbf{X}_1, \dots, \Delta\mathbf{X}_n \}^TΔx={Δξ1,…,Δξm,ΔX1,…,ΔXn}T
目标函数变为:
∑i,j∣∣eij+JijΔx∣∣2\sum_{i,j} || \mathbf{e}_{ij} + \mathbf{J}_{ij} \Delta\mathbf{x} ||^2i,j∑∣∣eij+JijΔx∣∣2
其中Jij\mathbf{J}_{ij}Jij为对应误差项的雅可比块。
整体增量方程为:JTJΔx=−JTe\mathbf{J}^T \mathbf{J} \Delta\mathbf{x} = -\mathbf{J}^T \mathbf{e}JTJΔx=−JTe
其中J\mathbf{J}J为稀疏雅可比矩阵,e\mathbf{e}e为所有误差项堆叠的向量。
4. 利用稀疏性加速求解
由于每个误差项仅关联一个相机和一个点,JTJ\mathbf{J}^T \mathbf{J}JTJ具有分块对角结构,可分解为:
H=[HccHcpHpcHpp]\mathbf{H} = \begin{bmatrix}\mathbf{H}_{\text{cc}} & \mathbf{H}_{\text{cp}} \\\mathbf{H}_{\text{pc}} & \mathbf{H}_{\text{pp}}\end{bmatrix}H=[HccHpcHcpHpp]
代入增量方程得到方程组:
{HccΔξ+HcpΔP=−bcHpcΔξ+HppΔP=−bp \begin{cases} \mathbf{H}_{cc} \Delta \xi + \mathbf{H}_{cp} \Delta P = -\mathbf{b}_c \\ \mathbf{H}_{pc} \Delta \xi + \mathbf{H}_{pp} \Delta P = -\mathbf{b}_p \end{cases} {HccΔξ+HcpΔP=−bcHpcΔξ+HppΔP=−bp
通过舒尔补(Schur Complement)消去三维点变量ΔP\Delta PΔP:
(Hcc−HcpHpp−1Hpc)Δξ=bc−HcpHpp−1bp\left( \mathbf{H}_{\text{cc}} - \mathbf{H}_{\text{cp}} \mathbf{H}_{\text{pp}}^{-1} \mathbf{H}_{\text{pc}} \right) \Delta\boldsymbol{\xi} = \mathbf{b}_{\text{c}} - \mathbf{H}_{\text{cp}} \mathbf{H}_{\text{pp}}^{-1} \mathbf{b}_{\text{p}}(Hcc−HcpHpp−1Hpc)Δξ=bc−HcpHpp−1bp
求解后回代得到点变量的增量:
ΔP=Hpp−1(bp−HpcΔξ)\Delta\mathbf{P} = \mathbf{H}_{\text{pp}}^{-1} \left( \mathbf{b}_{\text{p}} - \mathbf{H}_{\text{pc}} \Delta\boldsymbol{\xi} \right)ΔP=Hpp−1(bp−HpcΔξ)
这一步将计算复杂度从 O(n3)O(n^3)O(n3) 降低到O(m3+n)O(m^3 + n)O(m3+n),( mmm 为相机数量,nnn 为地图点数量)
5. 迭代更新与收敛
重复以下步骤直至收敛:
- 线性化误差:计算雅可比矩阵和残差。
- 构建并求解增量方程:利用稀疏求解器(如Cholesky分解)高效计算。
- 更新变量:
ξi←ξi+Δξi,Xj←Xj+ΔXj\boldsymbol{\xi}_i \leftarrow \boldsymbol{\xi}_i + \Delta\boldsymbol{\xi}_i, \quad \mathbf{X}_j \leftarrow \mathbf{X}_j + \Delta\mathbf{X}_jξi←ξi+Δξi,Xj←Xj+ΔXj
6. 关键优化技巧- 鲁棒核函数:
使用Huber或Cauchy核函数抑制外点影响。
- 参数化选择:三维点可选用逆深度参数化以改善数值稳定性。
- 稀疏求解库:借助Ceres Solver、g2o等工具实现高效计算。
总结
Bundle Adjustment通过非线性优化联合调整相机位姿与三维点,是视觉SLAM后端优化的核心。其核心步骤包括误差建模、雅可比计算、稀疏矩阵分解及迭代更新。理解BA的数学推导与实现细节,对提升SLAM系统的精度与鲁棒性至关重要。
更多推荐
所有评论(0)