视觉SLAM位姿优化时误差函数雅克比矩阵的计算

概述

欢迎访问 持续更新:https://cgabc.xyz/posts/6a2809e2/

SLAM,即 同时定位与建图,视觉SLAM的 定位 即 求取相机位姿(旋转和平移 [ R t ] [\mathbf{R} \quad \mathbf{t}] [Rt]);在SLAM中,我们一般使用 李代数 ξ \boldsymbol{\xi} ξ 来表示 旋转和平移。

  • 记 相机内参矩阵 K \mathbf{K} K,相机位姿 T = [ R t ] \mathbf{T} = [\mathbf{R} \quad \mathbf{t}] T=[Rt] (or ξ \boldsymbol{\xi} ξ)
  • I 1 I_1 I1 的图像坐标系下,一像素点 p ( u , v ) \mathbf{p}(u,v) p(u,v);在 O 1 O_1 O1 相机坐标系下,其对应的 三维点 P ( X , Y , Z ) \mathbf{P}(X,Y,Z) P(X,Y,Z)
  • I 2 I_2 I2 的图像坐标系下,一像素点 p ′ ( u ′ , v ′ ) \mathbf{p'}(u',v') p(u,v);在 O 2 O_2 O2 相机坐标系下,其对应的 三维点 P ′ ( X ′ , Y ′ , Z ′ ) \mathbf{P'}(X',Y',Z') P(X,Y,Z),归一化坐标为 p ′ n o r m \mathbf{p'}_{norm} pnorm

P ′ = R ⋅ P + t \mathbf{P'} = \mathbf{R} \cdot \mathbf{P} + \mathbf{t} P=RP+t

p ′ ~ n o r m = ( X ′ n o r m , Y ′ n o r m , 1 ) = P ′ Z ′ = ( X ′ Z ′ , Y ′ Z ′ , 1 ) \tilde{\mathbf{p'}}_{norm} = ({X'}_{norm},{Y'}_{norm},1) = \frac{\mathbf{P'}}{Z'} = (\frac{X'}{Z'}, \frac{Y'}{Z'}, 1) p~norm=(Xnorm,Ynorm,1)=ZP=(ZX,ZY,1)

p ′ ~ = K ⋅ p ′ ~ n o r m \tilde{\mathbf{p'}} = \mathbf{K} \cdot \tilde{\mathbf{p'}}_{norm} p~=Kp~norm

优化位姿 时,其思想是构造一个关于位姿变化的误差函数,当这个误差函数最小时,认为此时估计的位姿最优。视觉SLAM主要分为 直接法 和 特征点法,但无论是直接法还是特征点法,位姿的迭代优化都是求解一个 最小二乘问题

min ⁡ ξ 1 2 ∥ r ( ξ ) ∥ 2 \min_{\boldsymbol{\xi}} \frac{1}{2} \left\| r(\boldsymbol{\xi}) \right\|^2 ξmin21r(ξ)2

  • 直接法 最小化 光度误差,即 前后帧像素的灰度误差

r ( ξ ) = I 2 ( p ′ ) − I 1 ( p ) = I 2 ( u ′ , v ′ ) − I 1 ( u , v ) \begin{aligned} r(\boldsymbol{\xi}) &= \mathbf{I}_2(\mathbf{p}') - \mathbf{I}_1(\mathbf{p}) \\ &= \mathbf{I}_2(u',v') - \mathbf{I}_1(u,v) \end{aligned} r(ξ)=I2(p)I1(p)=I2(u,v)I1(u,v)

  • 特征点法 最小化 重投影误差,即地图点到当前图像投影点与匹配点的坐标误差

r ( ξ ) = p ′ − p = ( u ′ , v ′ ) − ( u , v ) \begin{aligned} r(\boldsymbol{\xi}) &= \mathbf{p}' - \mathbf{p} \\ &= (u',v') - (u,v) \end{aligned} r(ξ)=pp=(u,v)(u,v)

误差函数对于位姿的 雅可比矩阵(Jacobian Matrix),决定着下一步最优迭代估计时 位姿增量的方向。

J ( ξ ) = ∂ r ( ξ ) ∂ ξ \mathbf{J}(\boldsymbol{\xi}) = \frac{\partial{r(\boldsymbol{\xi})}}{\partial \boldsymbol{\xi}} J(ξ)=ξr(ξ)

根据上面位姿变换的流程,我们可以用 链式法则 来表示 J \mathbf{J} J

J ( ξ ) = ∂ r ( ξ ) ∂ ξ = ∂ r ( ξ ) ∂ p ′ ⋅ ∂ p ′ ∂ p n o r m ′ ⋅ ∂ p n o r m ′ ∂ P ′ ⋅ ∂ P ′ ∂ ξ = J 0 ⋅ J 1 ⋅ J 2 ⋅ J 3 \begin{aligned} \mathbf{J}(\boldsymbol{\xi}) &= \frac{\partial{r(\boldsymbol{\xi})}}{\partial \boldsymbol{\xi}} \\ &= \frac{\partial{r(\boldsymbol{\xi})}}{\partial \mathbf{p}'} \cdot \frac{\partial \mathbf{p}'}{\partial \mathbf{p}_{norm}'} \cdot \frac{\partial \mathbf{p}_{norm}'}{\partial \mathbf{P'}} \cdot \frac{\partial \mathbf{P'}}{\partial \boldsymbol{\xi}} \\ &= \mathbf{J}_0 \cdot \mathbf{J}_1 \cdot \mathbf{J}_2 \cdot \mathbf{J}_3 \end{aligned} J(ξ)=ξr(ξ)=pr(ξ)pnormpPpnormξP=J0J1J2J3

由此,直接法 与 特征点法 雅克比矩阵 只区别于 J 0 \mathbf{J}_0 J0

本文主要介绍 SLAM优化位姿时误差函数对位姿雅可比矩阵的推导。

雅克比矩阵 推导

Jacobian 0

J 0 = ∂ r ( ξ ) ∂ p ′ \mathbf{J}_0 = \frac{\partial{r(\boldsymbol{\xi})}}{\partial \mathbf{p}'} J0=pr(ξ)

直接法

我们已知, 在直接法中,单像素点的误差函数是关于像素值的函数,即 光度误差

r ( ξ ) = I 2 ( u ′ , v ′ ) − I 1 ( u , v ) r(\boldsymbol{\xi}) = \mathbf{I}_2(u',v') - \mathbf{I}_1(u,v) r(ξ)=I2(u,v)I1(u,v)

由于对于一个特定的像素点, I 1 ( p ) \mathbf{I}_1(\mathbf{p}) I1(p) 是关于 ξ \boldsymbol{\xi} ξ 的常量,所以

J 0 = ∂ I 2 ( p ′ ) ∂ p ′ = [ I 2 ( u ′ + 1 , v ′ ) − I 2 ( u ′ − 1 , v ′ ) 2 , I 2 ( u ′ , v ′ + 1 ) − I 2 ( u ′ , v ′ − 1 ) 2 ] \begin{aligned} \mathbf{J}_0 &= \frac{\partial \mathbf{I}_2(\mathbf{p}')}{\partial \mathbf{p}'} \\ &= \bigg[ \frac{\mathbf{I}_2(u'+1,v')-\mathbf{I}_2(u'-1,v')}{2}, \frac{\mathbf{I}_2(u',v'+1)-\mathbf{I}_2(u',v'-1)}{2} \bigg] \end{aligned} J0=pI2(p)=[2I2(u+1,v)I2(u1,v),2I2(u,v+1)I2(u,v1)]

为 图像 I 2 \mathbf{I}_2 I2 p ′ \mathbf{p}' p 点处的 像素梯度

特征点法

我们已知, 在直接法中,单像素点的误差函数是关于像素坐标的函数

r ( ξ ) = p ′ − p r(\boldsymbol{\xi}) = \mathbf{p}' - \mathbf{p} r(ξ)=pp

由于对于一个特定的像素点, p \mathbf{p} p 是关于 ξ \boldsymbol{\xi} ξ 的常量,所以

J 0 = ∂ p ′ ∂ p ′ = I ∈ R 2 × 2 \mathbf{J}_0 = \frac{\partial \mathbf{p}'}{\partial \mathbf{p}'} = \mathbf{I} \in \mathbb{R}^{2 \times 2} J0=pp=IR2×2

Jacobian 1

J 1 = ∂ p ′ ∂ p n o r m ′ = ∂ ( u , v ) ∂ ( X n o r m ′ , Y n o r m ′ ) \mathbf{J}_1 = \frac{\partial \mathbf{p}'}{\partial \mathbf{p}_{norm}'} = \frac{\partial (u,v)}{\partial (X_{norm}',Y_{norm}')} J1=pnormp=(Xnorm,Ynorm)(u,v)

由于

p ′ ~ = K ⋅ p ′ ~ n o r m \tilde{\mathbf{p'}} = \mathbf{K} \cdot \tilde{\mathbf{p'}}_{norm} p~=Kp~norm

J 1 \mathbf{J}_1 J1 的计算跟 相机投影模型 有关,本文以 针孔相机模型 (不考虑畸变)为例 对其进行计算。

针孔相机模型(不考虑畸变) 的 数学模型 为

K = [ f x 0 c x 0 f y c y 0 0 1 ] \mathbf{K} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K= fx000fy0cxcy1

所以

J 1 = [ f x 0 0 f y ] ∈ R 2 × 2 \mathbf{J}_1 = \begin{bmatrix} f_x & 0 \\ 0 & f_y \end{bmatrix} \in \mathbb{R}^{2 \times 2} J1=[fx00fy]R2×2

Jacobian 2

J 2 = ∂ p n o r m ′ ∂ P ′ = ∂ ( X n o r m ′ , Y n o r m ′ ) ∂ ( X ′ , Y ′ , Z ′ ) \begin{aligned} \mathbf{J}_2 &= \frac{\partial \mathbf{p}_{norm}'}{\partial \mathbf{P'}} \\ &= \frac{\partial (X_{norm}',Y_{norm}')}{\partial (X',Y',Z')} \end{aligned} J2=Ppnorm=(X,Y,Z)(Xnorm,Ynorm)

根据

p ′ ~ n o r m = P ′ Z ′ \tilde{\mathbf{p'}}_{norm} = \frac {\mathbf{P'}} {Z'} p~norm=ZP

计算得

J 2 = [ 1 Z ′ 0 − X ′ Z ′ 2 0 1 Z ′ − Y ′ Z ′ 2 ] = [ 1 0 − X ′ Z ′ 0 1 − Y ′ Z ′ ] ⋅ 1 Z ′ ∈ R 2 × 3 \begin{aligned} \mathbf{J}_2 &= \begin{bmatrix} \frac{1}{Z'} & 0 & -\frac{X'}{Z'^2} \\ 0 & \frac{1}{Z'} & -\frac{Y'}{Z'^2} \end{bmatrix} \\ &= \begin{bmatrix} 1 & 0 & -\frac{X'}{Z'} \\ 0 & 1 & -\frac{Y'}{Z'} \end{bmatrix} \cdot \frac{1}{Z'} \in \mathbb{R}^{2 \times 3} \end{aligned} J2=[Z100Z1Z′2XZ′2Y]=[1001ZXZY]Z1R2×3

Jacobian 3

J 3 = ∂ P ′ ∂ ξ = ∂ ( T ⋅ P ) ∂ ξ = ∂ ( exp ⁡ ( ξ ∧ ) P ) ∂ ξ \begin{aligned} \mathbf{J}_3 &= \frac{\partial \mathbf{P'}}{\partial \boldsymbol{\xi}} \\ &= \frac{\partial (\mathbf{T} \cdot \mathbf{P})}{\partial \boldsymbol{\xi}} \\ &= \frac{\partial ( \exp(\boldsymbol{\xi}^{\wedge}) \mathbf{P}) }{\partial \boldsymbol{\xi}} \end{aligned} J3=ξP=ξ(TP)=ξ(exp(ξ)P)

其中

ξ = [ ρ ϕ ] ∈ R 6 \boldsymbol{\xi} = \begin{bmatrix} \boldsymbol{\rho} \\ \boldsymbol{\phi} \end{bmatrix} \in \mathbb{R}^6 ξ=[ρϕ]R6

类似高数中,求取 f ( x ) f(x) f(x) 的导数

d f d x = lim ⁡ Δ x → 0 f ( x + Δ x ) − f ( x ) Δ x \frac{df}{dx} = \lim_{\Delta x \rightarrow 0} \frac{f(x+\Delta x) - f(x)}{\Delta x} dxdf=Δx0limΔxf(x+Δx)f(x)

我们可以 根据李代数加法来对李代数进行求导,计算雅克比矩阵。

一般更使用的,利用李群来左乘或者右乘微小扰动,在对这个扰动的李代数进行求导,利用 扰动模型 δ ξ = [ δ ρ δ ϕ ] \delta \boldsymbol{\xi} = [\delta \boldsymbol{\rho} \quad \delta \boldsymbol{\phi}] δξ=[δρδϕ],计算如下

∂ P ′ ~ ∂ ξ = ∂ ( T ⋅ P ~ ) ∂ ξ = ∂ ( exp ⁡ ( ξ ∧ ) P ~ ) ∂ δ ξ (左扰动模型) = lim ⁡ δ ξ → 0 exp ⁡ ( δ ξ ∧ ) exp ⁡ ( ξ ∧ ) P ~ − exp ⁡ ( ξ ∧ ) P ~ δ ξ ≈ lim ⁡ δ ξ → 0 ( I + δ ξ ∧ ) exp ⁡ ( ξ ∧ ) P ~ − exp ⁡ ( ξ ∧ ) P ~ δ ξ = lim ⁡ δ ξ → 0 δ ξ ∧ exp ⁡ ( ξ ∧ ) P ~ δ ξ = lim ⁡ δ ξ → 0 [ δ ϕ ∧ δ ρ 0 T 0 ] [ R ⋅ P + t 1 ] δ ξ = lim ⁡ δ ξ → 0 [ δ ϕ ∧ ( R ⋅ P + t ) + δ ρ 0 ] δ ξ = [ I − ( R ⋅ P + t ) ∧ 0 T 0 T ] = [ I − P ′ ∧ 0 T 0 T ] \begin{aligned} \frac{\partial \tilde{\mathbf{P'}}}{\partial \boldsymbol{\xi}} &= \frac{\partial (\mathbf{T} \cdot \tilde{\mathbf{P}})}{\partial \boldsymbol{\xi}} \\ &= \frac{\partial ( \exp(\boldsymbol{\xi}^{\wedge}) \tilde{\mathbf{P}} ) }{\partial \delta \boldsymbol{\xi}} \quad \text{(左扰动模型)} \\ &= \lim_{\delta \boldsymbol{\xi} \rightarrow 0} \frac { \exp(\delta \boldsymbol{\xi}^{\wedge}) \exp(\boldsymbol{\xi}^{\wedge}) \tilde{\mathbf{P}} - \exp(\boldsymbol{\xi}^{\wedge}) \tilde{\mathbf{P}} } { \delta \boldsymbol{\xi} } \\ &\approx \lim_{\delta \boldsymbol{\xi} \rightarrow 0} \frac { (\mathbf{I}+ \delta \boldsymbol{\xi}^{\wedge}) \exp(\boldsymbol{\xi}^{\wedge}) \tilde{\mathbf{P}} - \exp(\boldsymbol{\xi}^{\wedge}) \tilde{\mathbf{P}} } { \delta \boldsymbol{\xi} } \\ &= \lim_{\delta \boldsymbol{\xi} \rightarrow 0} \frac { \delta \boldsymbol{\xi}^{\wedge} \exp(\boldsymbol{\xi}^{\wedge}) \tilde{\mathbf{P}} } { \delta \boldsymbol{\xi} } \\ &= \lim_{\delta \boldsymbol{\xi} \rightarrow 0} \frac { \begin{bmatrix} \delta \boldsymbol{\phi}^{\wedge} & \delta \boldsymbol{\rho} \\ \mathbf{0}^{T} & 0 \end{bmatrix} \begin{bmatrix} \mathbf{R} \cdot \mathbf{P} + \mathbf{t} \\ 1 \end{bmatrix} } { \delta \boldsymbol{\xi} } \\ &= \lim_{\delta \boldsymbol{\xi} \rightarrow 0} \frac { \begin{bmatrix} \delta \boldsymbol{\phi}^{\wedge} (\mathbf{R} \cdot \mathbf{P} + \mathbf{t}) + \delta \boldsymbol{\rho} \\ 0 \end{bmatrix} } { \delta \boldsymbol{\xi} } \\ &= \begin{bmatrix} \mathbf{I} & -(\mathbf{R} \cdot \mathbf{P} + \mathbf{t})^{\wedge} \\ \mathbf{0}^{T} & \mathbf{0}^{T} \end{bmatrix} \\ &= \begin{bmatrix} \mathbf{I} & -\mathbf{P}'^{\wedge} \\ \mathbf{0}^{T} & \mathbf{0}^{T} \end{bmatrix} \end{aligned} ξP~=ξ(TP~)=δξ(exp(ξ)P~)(左扰动模型)=δξ0limδξexp(δξ)exp(ξ)P~exp(ξ)P~δξ0limδξ(I+δξ)exp(ξ)P~exp(ξ)P~=δξ0limδξδξexp(ξ)P~=δξ0limδξ[δϕ0Tδρ0][RP+t1]=δξ0limδξ[δϕ(RP+t)+δρ0]=[I0T(RP+t)0T]=[I0TP0T]

所以

J 3 = [ I − P ′ ∧ ] = [ 1 0 0 0 Z ′ − Y ′ 0 1 0 − Z ′ 0 X ′ 0 0 1 Y ′ − X ′ 0 ] ∈ R 3 × 6 \begin{aligned} \mathbf{J}_3 &= \begin{bmatrix} \mathbf{I} & -\mathbf{P}'^{\wedge} \end{bmatrix} \\ &= \begin{bmatrix} 1 & 0 & 0 & 0 & Z' & -Y' \\ 0 & 1 & 0 & -Z' & 0 & X' \\ 0 & 0 & 1 & Y' & -X' & 0 \end{bmatrix} \in \mathbb{R}^{3 \times 6} \end{aligned} J3=[IP]= 1000100010ZYZ0XYX0 R3×6

注意:

  • 上面的 ξ \boldsymbol{\xi} ξ 中 平移 ρ \boldsymbol{\rho} ρ 在前, 旋转 ϕ \boldsymbol{\phi} ϕ 在后;如果 旋转在前,平移在后,则 J 3 \mathbf{J}_3 J3 的前三列与后三列须对调。
  • ch4 为什么能用左扰动模型来求导啊?[gaoxiang12/slambook Issues #183]

    按照定义,左乘一个扰动,然后令扰动趋于零,求目标函数相对于扰动的变化率,作为导数来使用。同时,在优化过程中,用这种导数算出来的增量,以左乘形式更新在当前估计上,于是使估计值一直在SO(3)或SE(3)上。这种手段称为“流形上的优化”。

  • 四元数矩阵与 so(3) 左右雅可比

总结

直接法

J ( ξ ) = J 0 ⋅ J 1 ⋅ J 2 ⋅ J 3 = ∂ I 2 ( p ′ ) ∂ p ′ ⋅ [ f x 0 0 f y ] ⋅ [ 1 0 − X ′ Z ′ 0 1 − Y ′ Z ′ ] ⋅ [ 1 0 0 0 Z ′ − Y ′ 0 1 0 − Z ′ 0 X ′ 0 0 1 Y ′ − X ′ 0 ] ⋅ 1 Z ′ \begin{aligned} \mathbf{J}(\boldsymbol{\xi}) &= \mathbf{J}_0 \cdot \mathbf{J}_1 \cdot \mathbf{J}_2 \cdot \mathbf{J}_3 \\ &= \frac{\partial \mathbf{I}_2(\mathbf{p}')}{\partial \mathbf{p}'} \cdot \begin{bmatrix} f_x & 0 \\ 0 & f_y \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & -\frac{X'}{Z'} \\ 0 & 1 & -\frac{Y'}{Z'} \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & 0 & 0 & Z' & -Y' \\ 0 & 1 & 0 & -Z' & 0 & X' \\ 0 & 0 & 1 & Y' & -X' & 0 \end{bmatrix} \cdot \frac{1}{Z'} \end{aligned} J(ξ)=J0J1J2J3=pI2(p)[fx00fy][1001ZXZY] 1000100010ZYZ0XYX0 Z1

特征点法

J ( ξ ) = J 0 ⋅ J 1 ⋅ J 2 ⋅ J 3 = I ⋅ [ f x 0 0 f y ] ⋅ [ 1 0 − X ′ Z ′ 0 1 − Y ′ Z ′ ] ⋅ [ 1 0 0 0 Z ′ − Y ′ 0 1 0 − Z ′ 0 X ′ 0 0 1 Y ′ − X ′ 0 ] ⋅ 1 Z ′ = [ f x Z ′ 0 − X ′ f x Z ′ 2 − X ′ Y ′ f x Z ′ 2 f x + X ′ 2 f x Z ′ 2 − Y ′ f x Z ′ 0 f y Z ′ − Y ′ f y Z ′ 2 − f y − Y ′ 2 f y Z ′ 2 X ′ Y ′ f y Z ′ 2 X ′ f y Z ′ ] \begin{aligned} \mathbf{J}(\boldsymbol{\xi}) &= \mathbf{J}_0 \cdot \mathbf{J}_1 \cdot \mathbf{J}_2 \cdot \mathbf{J}_3 \\ &= \mathbf{I} \cdot \begin{bmatrix} f_x & 0 \\ 0 & f_y \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & -\frac{X'}{Z'} \\ 0 & 1 & -\frac{Y'}{Z'} \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & 0 & 0 & Z' & -Y' \\ 0 & 1 & 0 & -Z' & 0 & X' \\ 0 & 0 & 1 & Y' & -X' & 0 \end{bmatrix} \cdot \frac{1}{Z'} \\ &= \begin{bmatrix} \frac{f_x}{Z'} & 0 & -\frac{X'f_x}{Z'^2} & -\frac{X'Y'f_x}{Z'^2} & f_x+\frac{X'^2f_x}{Z'^2} & -\frac{Y'f_x}{Z'} \\ 0 & \frac{f_y}{Z'} & -\frac{Y'f_y}{Z'^2} & -f_y-\frac{Y'^2f_y}{Z'^2} & \frac{X'Y'f_y}{Z'^2} & \frac{X'f_y}{Z'} \end{bmatrix} \end{aligned} J(ξ)=J0J1J2J3=I[fx00fy][1001ZXZY] 1000100010ZYZ0XYX0 Z1=[Zfx00ZfyZ′2XfxZ′2YfyZ′2XYfxfyZ′2Y′2fyfx+Z′2X′2fxZ′2XYfyZYfxZXfy]

注意事项

  • J 1 \mathbf{J}_1 J1 的计算是根据 针孔相机模型(不考虑畸变) 进行计算的
  • 本文的 ξ \boldsymbol{\xi} ξ 中 平移 ρ \boldsymbol{\rho} ρ 在前, 旋转 ϕ \boldsymbol{\phi} ϕ 在后;如果 旋转在前,平移在后,则 J 3 \mathbf{J}_3 J3 的前三列与后三列须对调
  • 本文定义的 误差函数 r ( ξ ) r(\boldsymbol{\xi}) r(ξ)预测值减观测值;如果定义成 观测值减预测值,本文计算的结果 J \mathbf{J} J 前须加 负号

参考文献

  • 15
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨光ABC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值