引用

视觉SLAM中Bundle Adjustment(BA)问题旨在同时优化相机位姿和三维地图点,以最小化重投影误差。与之前文章中提到的最小化重投影的区别是:BA同时优化相机位姿和三维空间点,并且最小化k时刻之前所有数据的重投影误差;而视觉里程计中的方法仅优化空间点,且只有两帧之间的数据。

详细推导过程:


1. 问题定义与目标函数

  • 重投影误差:
    对于第iii个相机位姿(参数化为李代数ξi∈se(3)\boldsymbol{\xi}_i \in \mathfrak{se}(3)ξise(3))和第jjj个三维点Xj∈R3\mathbf{X}_j \in \mathbb{R}^3XjR3,其投影到图像的观测像素坐标为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=uijpij

  • 目标函数:
    最小化所有观测的重投影误差平方和:
    min⁡ξi,Xj∑i,j∣∣eij∣∣2\min_{\boldsymbol{\xi}_i, \mathbf{X}_j} \sum_{i,j} ||\mathbf{e}_{ij} ||^2ξi,Xjmini,j∣∣eij2


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=ξieij是误差对相机位姿的雅可比矩阵。
  • Jjpoint=∂eij∂Xj\mathbf{J}_{j}^{\text{point}} = \frac{\partial \mathbf{e}_{ij}}{\partial \mathbf{X}_j}Jjpoint=Xjeij 是误差对三维点的雅可比矩阵。
    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Δx2
其中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}}(HccHcpHpp1Hpc)Δξ=bcHcpHpp1bp
求解后回代得到点变量的增量:
Δ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=Hpp1(bpHpcΔξ)
这一步将计算复杂度从 O(n3)O(n^3)O(n3) 降低到O(m3+n)O(m^3 + n)O(m3+n),( mmm 为相机数量,nnn 为地图点数量)


5. 迭代更新与收敛

重复以下步骤直至收敛:

  1. 线性化误差:计算雅可比矩阵和残差。
  2. 构建并求解增量方程:利用稀疏求解器(如Cholesky分解)高效计算。
  3. 更新变量:
    ξ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,XjXj+ΔXj

6. 关键优化技巧- 鲁棒核函数:

使用Huber或Cauchy核函数抑制外点影响。

  • 参数化选择:三维点可选用逆深度参数化以改善数值稳定性。
  • 稀疏求解库:借助Ceres Solver、g2o等工具实现高效计算。

总结

Bundle Adjustment通过非线性优化联合调整相机位姿与三维点,是视觉SLAM后端优化的核心。其核心步骤包括误差建模、雅可比计算、稀疏矩阵分解及迭代更新。理解BA的数学推导与实现细节,对提升SLAM系统的精度与鲁棒性至关重要。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐