引入
在SLAM的优化过程中,特征点在优化问题中消耗了绝大部分时间。实际上,经过若干次迭代之后,收敛的特征点位置变化很小,发散的外点则已被剔除。对收敛点再进行优化,似乎是有些费力不讨好的。因此,我们更倾向于在优化几次之后就把特征点固定住,而不再实际地优化它们的位置估计。
这种把优化变量去除特征点,只剩下位姿的优化问题就构成了位姿图优化。
问题建模
在两个位姿 T i T_i Ti和 T j T_j Tj之间有一个过度位姿 T i j T_{ij} Tij即满足以下关系:
T i T i j = T j T_iT_{ij}=T_j TiTij=Tj
两个位姿构成了结点,过度位姿构成了位姿图的边。
由于存在噪声,这个式子不会严格相等,于是上式两边左乘 T i − 1 T i j − 1 T_i^{-1}T_{ij}^{-1} Ti−1Tij−1:
I = T i − 1 T i j − 1 T j I=T_i^{-1}T_{ij}^{-1}T_j I=Ti−1Tij−1Tj
之后转换成李代数,定义误差:
e i j = l n ( T i − 1 T i j − 1 T j ) ∨ e_{ij}=ln(T_i^{-1}T_{ij}^{-1}T_j)^\vee eij=ln(Ti−1Tij−1Tj)∨
理论 e i j = 0 e_{ij}=0 eij=0,但由于噪声等误差的存在而并不等于0。
分析计算
使用李代数求导的扰动模型:
e ^ i j = ln ( T i j − 1 T i − 1 exp ( ( − δ ξ i ) ∧ ) exp ( δ ξ j ∧ ) T j ) ∨ \hat{e}_{ij} = \ln \left( \boldsymbol{T}_{ij}^{-1} \boldsymbol{T}_i^{-1} \exp\left((-\delta \boldsymbol{\xi}_i)^\wedge\right) \exp\left(\delta \boldsymbol{\xi}_j^\wedge\right) \boldsymbol{T}_j \right)^\vee e^ij=ln(Tij−1Ti−1exp((−δξi)∧)exp(δξj∧)Tj)∨
为了使用BCH近似,想把扰动项移到左边或者右边,使用以下的伴随公式:
exp ( ( Ad ( T ) ξ ) ∧ ) = T exp ( ξ ∧ ) T − 1 \exp\left((\text{Ad}(\boldsymbol{T})\boldsymbol{\xi})^\wedge\right) = \boldsymbol{T} \exp\left(\boldsymbol{\xi}^\wedge\right) \boldsymbol{T}^{-1} exp((Ad(T)ξ)∧)=Texp(ξ∧)T−1
即:
{ T j exp ( ( − Ad ( T j − 1 ) δ ξ i ) ∧ ) T j − 1 = exp ( − δ ξ i ∧ ) T j exp ( ( Ad ( T j ) ξ j ) ∧ ) = exp ( δ ξ j ∧ ) T j \begin {cases} \boldsymbol{T_j} \exp\left((-\text{Ad}(\boldsymbol{T_j^{-1}})\boldsymbol{\delta\xi_i})^\wedge\right)\boldsymbol{T_j}^{-1} = \exp\left(\boldsymbol{-\delta\xi_i}^\wedge\right) & \\ \boldsymbol{T_j} \exp\left((\text{Ad}(\boldsymbol{T_j})\boldsymbol{\xi_j})^\wedge\right)= \exp\left(\boldsymbol{\delta\xi_j}^\wedge\right)\boldsymbol{T_j} & \end {cases} {Tjexp((−Ad(Tj−1)δξi)∧)Tj−1=exp(−δξi∧)Tjexp((Ad(Tj)ξj)∧)=exp(δξj∧)Tj
代入计算得:
e ^ i j = ln ( T i j − 1 T i − 1 T j exp ( ( − Ad ( T j − 1 ) δ ξ i ) ∧ ) exp ( ( Ad ( T j − 1 ) δ ξ j ) ∧ ) ) ∨ ≈ ln ( T i j − 1 T i − 1 T j [ I − ( Ad ( T j − 1 ) δ ξ i ) ∧ + ( Ad ( T j − 1 ) δ ξ j ) ∧ ] ) ∨ ≈ e i j + ∂ e i j ∂ δ ξ i δ ξ i + ∂ e i j ∂ δ ξ j δ ξ j \hat{e}_{ij}= \ln \left( T_{ij}^{-1} T_i^{-1} T_j \exp \left( (-\text{Ad}(T_j^{-1}) \delta \xi_i)^\wedge \right) \exp \left( (\text{Ad}(T_j^{-1}) \delta \xi_j)^\wedge \right) \right)^\vee \\ \approx \ln \left( T_{ij}^{-1} T_i^{-1} T_j \left[ I - (\text{Ad}(T_j^{-1}) \delta \xi_i)^\wedge + (\text{Ad}(T_j^{-1}) \delta \xi_j)^\wedge \right] \right)^\vee\\ \approx e_{ij} + \frac{\partial e_{ij}}{\partial \delta \xi_i} \delta \xi_i + \frac{\partial e_{ij}}{\partial \delta \xi_j} \delta \xi_j e^ij=ln(Tij−1Ti−1Tjexp((−Ad(Tj−1)δξi)∧)exp((Ad(Tj−1)δξj)∧))∨≈ln(Tij−1Ti−1Tj[I−(Ad(Tj−1)δξi)∧+(Ad(Tj−1)δξj)∧])∨≈eij+∂δξi∂eijδξi+∂δξj∂eijδξj
通过比较最后两行的式子,我们求出了误差关于两个位姿的雅可比矩阵:
{ ∂ e i j ∂ δ ξ i = − J r e i j Ad ( T j − 1 ) ∂ e i j ∂ δ ξ j = J r e i j Ad ( T j − 1 ) \begin {cases} \frac{\partial e_{ij}}{\partial \delta \xi_i} = - J_re_{ij}\text{Ad}(T_j^{-1}) & \\ \frac{\partial e_{ij}}{\partial \delta \xi_j} = J_re_{ij}\text{Ad}(T_j^{-1}) & \end {cases} {∂δξi∂eij=−JreijAd(Tj−1)∂δξj∂eij=JreijAd(Tj−1)
由于se(3)上的左右雅可比 J r / J l J_r/J_l Jr/Jl形式过于复杂,我们通常取它们的近似。如果误差接近零就可以认为它们近似为I或:
J r − 1 ( e i j ) ≈ I + 1 2 [ ϕ e ∧ ρ e ∧ 0 ϕ e ∧ ] . J_{r}^{-1}(e_{ij}) \approx I + \frac{1}{2} \begin{bmatrix} \phi_{e}^{\wedge} & \rho_{e}^{\wedge} \\ 0 & \phi_{e}^{\wedge} \end{bmatrix}. Jr−1(eij)≈I+21[ϕe∧0ρe∧ϕe∧].
记 E \mathcal{E} E为所有边的集合,那么总体目标函数为:
E i j = min 1 2 ∑ i , j ∈ E e i j T Σ i j − 1 e i j . E_{ij}=\min \frac{1}{2} \sum_{i,j \in \mathcal{E}} e_{ij}^T \Sigma_{ij}^{-1} e_{ij}. Eij=min21i,j∈E∑eijTΣij−1eij.
接下来就可以按照前面的最小二乘问题的方法进行求解。用高斯牛顿法等方法。