SLAM中的Bundle Adjustment

Bundle Adjustment

反对称符号的定义

  两个向量的內积,內积可以描述向量间的投影关系:
a ⋅ b = a T b = ∑ i = 1 3 a i b i = ∣ a ∣ ∣ b ∣ cos ⁡ ⟨ a , b ⟩ a , b ∈ R 3 a \cdot b = a^T b=\sum^3_{i=1} a_i b_i= \left| a \right| \left| b \right| \cos \langle a, b\rangle \qquad a, b \in \mathbb{R}^3 ab=aTb=i=13aibi=abcosa,ba,bR3
  两个向量的外积,外积的方向垂直于这两个向量,大小为 ∣ a ∣ ∣ b ∣ sin ⁡ ⟨ a , b ⟩ \left| a \right| \left| b \right| \sin \langle a, b \rangle absina,b,是两个向量张成的四边形的有向面积。外积只对三维向量存在定义,还能用外积表示向量的旋转。
a × b = [ i j k a 1 a 2 a 3 b 1 b 2 b 3 ] = [ a 2 b 3 − a 3 b 2 a 3 b 1 − a 1 b 3 a 1 b 2 − a 2 b 1 ] = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] b ≜ a ∧ b a \times b = \begin{bmatrix} i & j & k \\ a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \end{bmatrix} = \begin{bmatrix} a_2 b_3 - a_3 b_2 \\ a_3 b_1 - a_1 b_3 \\ a_1 b_2 - a_2 b_1 \end{bmatrix} = \begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix} b \triangleq a ^{\wedge} b a×b=ia1b1ja2b2ka3b3=a2b3a3b2a3b1a1b3a1b2a2b1=0a3a2a30a1a2a10bab
   可以将 ∧ ^\wedge 符号记成反对称符号。这样就把外积写成了矩阵与向量的乘法,把外积运算变成了线性运算。还可以用外积表示向量的旋转。同理,对于任意反对称矩阵,亦能找到一个与之对应的向量。把这个运算用符号 ∨ ^\vee 表示。
[ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] = A \begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix} = A 0a3a2a30a1a2a10=A
A ∨ = a A^{\vee} = a A=a
   考虑两个不平行的向量 a , b a, b a,b,要描述从 a a a b b b之间是如何旋转的?可以用一个向量描述三维空间中两个向量的旋转关系。在右手法则下,右手的4个手指从 a a a转向 b b b,大拇指朝向就是旋转向量的方向,也是 a × b a \times b a×b的方向,大小则由 a a a b b b的夹角决定。通过这种方式,构造了从 a a a b b b的一个旋转向量,这个向量同样位于三维空间中,在此坐标系下可以用3个实数来描述。

李代数 s o ( 3 ) \mathfrak{so}\left(3\right) so(3)

  任意旋转矩阵 R R R满足(旋转矩阵为正交矩阵, R T = R − 1 R^T=R^{-1} RT=R1):
R R T = I R R^T=I RRT=I
   R R R是某个相机的旋转,会随时间连续地变化,即为时间的函数:
R ( t ) R ( t ) T = I R\left( t \right) {R\left( t \right)}^T = I R(t)R(t)T=I
  两边同时对时间求导:
R ˙ ( t ) R ( t ) T + R ( t ) R ˙ ( t ) T = 0 \dot R \left( t \right) {R \left( t \right)}^T + R \left( t \right) {\dot R \left( t \right)}^T = 0 R˙(t)R(t)T+R(t)R˙(t)T=0
  整理得:
R ˙ ( t ) R ( t ) T = − ( R ˙ ( t ) R ( t ) T ) T \dot R \left( t \right) {R \left( t \right)}^T = -\left( \dot R \left( t \right) {R \left( t \right)}^T \right)^T R˙(t)R(t)T=(R˙(t)R(t)T)T
  根据上式可以看出 R ˙ ( t ) R ( t ) T \dot R \left( t \right) {R \left( t \right)}^T R˙(t)R(t)T是一个反对称矩阵。因此可以找到一个三维向量 ϕ ( t ) ∈ R 3 \phi \left( t \right) \in \mathbb{R}^3 ϕ(t)R3与之对应。于是有:
R ˙ ( t ) R ( t ) T = ϕ ( t ) ∧ \dot R \left( t \right) {R \left( t \right)}^T = \phi \left( t \right)^{\wedge} R˙(t)R(t)T=ϕ(t)
  等式两边右乘 R ( t ) R\left( t \right) R(t),由于 R R R为正交阵,有:
R ˙ ( t ) = ϕ ( t ) ∧ R ( t ) = [ 0 − ϕ 3 ϕ 2 ϕ 3 0 − ϕ 1 − ϕ 2 ϕ 1 0 ] R ( t ) \dot R \left( t \right) = \phi \left( t \right)^{\wedge} R \left( t \right)= \begin{bmatrix} 0 & -\phi_3 & \phi_2 \\ \phi_3 & 0 & -\phi_1 \\ -\phi_2 & \phi_1 & 0 \end{bmatrix} R\left( t \right) R˙(t)=ϕ(t)R(t)=0ϕ3ϕ2ϕ30ϕ1ϕ2ϕ10R(t)
  根据上式可以看出,每对旋转矩阵求一次导数,只需要左乘一个 ϕ ∧ ( t ) \phi^{\wedge}\left( t \right) ϕ(t)矩阵即可。设 t 0 = 0 t_0 = 0 t0=0,同时设此时的旋转矩阵为 R ( 0 ) = I R\left( 0 \right) = I R(0)=I,按照导数的定义,可以把 R ( t ) R\left( t \right) R(t) 0 0 0附近进行一阶泰勒展开:
R ( t ) ≈ R ( t 0 ) + R ˙ ( t 0 ) ( t − t 0 ) = I + ϕ ( t 0 ) ∧ ( t ) R\left( t \right) \approx R\left( t_0 \right) + \dot R \left( t_0 \right)\left( t - t_0 \right) = I + \phi \left(t_0 \right)^{\wedge} \left( t \right) R(t)R(t0)+R˙(t0)(tt0)=I+ϕ(t0)(t)
  根据上式可以看到 ϕ \phi ϕ反映了 R R R的导数性质,同时在 t 0 t_0 t0附近,设 ϕ \phi ϕ保持为常数 ϕ ( t 0 ) = ϕ 0 \phi \left( t_0 \right) = \phi_0 ϕ(t0)=ϕ0有:
R ˙ ( t ) = ϕ ( t 0 ) ∧ R ( t ) = ϕ 0 ∧ R ( t ) \dot R \left( t \right) = \phi \left( t_0 \right)^{\wedge} R \left( t \right)=\phi_0^{\wedge}R\left( t \right) R˙(t)=ϕ(t0)R(t)=ϕ0R(t)
  上式是一个关于 R R R的微分方程,而且知道初始值 R ( t 0 ) = I R\left( t_0 \right) = I R(t0)=I,解之得:
d R ( t ) d t = ϕ 0 ∧ R ( t ) \frac{d R\left( t \right)}{d t}=\phi_0^{\wedge} R \left( t \right) dtdR(t)=ϕ0R(t)
d R ( t ) R ( t ) = ϕ 0 ∧ d t \frac{d R\left( t \right)}{R\left( t \right)} = \phi_0^{\wedge} dt R(t)dR(t)=ϕ0dt
  两边积分:
l n ( R ( t ) ) = ϕ 0 ∧ t ln\left(R \left( t \right) \right) = \phi_0^{\wedge} t ln(R(t))=ϕ0t
R ( t ) = e x p ( ϕ 0 ∧ t ) R\left( t \right) = exp\left( \phi_0^{\wedge}t \right) R(t)=exp(ϕ0t)
  之前提到的 ϕ \phi ϕ,是 S O ( 3 ) SO\left( 3 \right) SO(3)对应的李代数 s o ( 3 ) \mathfrak{so} \left( 3 \right) so(3) s o ( 3 ) \mathfrak{so} \left( 3 \right) so(3)定义在 R 3 \mathbb{R}^3 R3上的向量,记作 ϕ \phi ϕ,每一个 ϕ \phi ϕ都可以生成一个反对称矩阵:
Φ = ϕ ∧ = [ 0 − ϕ 3 ϕ 2 ϕ 3 0 − ϕ 1 − ϕ 2 ϕ 1 0 ] ∈ R 3 × 3 \Phi = \phi^{\wedge}= \begin{bmatrix} 0 & -\phi_3 & \phi_2 \\ \phi_3 & 0 & -\phi_1 \\ -\phi_2 & \phi_1 & 0 \end{bmatrix} \in \mathbb{R}^{3 \times 3} Φ=ϕ=0ϕ3ϕ2ϕ30ϕ1ϕ2ϕ10R3×3
  由于 ϕ \phi ϕ与反对称矩阵关系很紧密,在不引起歧义的情况系,就说 s o ( 3 ) \mathfrak{so}\left( 3 \right) so(3)的元素是三维向量或者三维反对称矩阵:
s o ( 3 ) = { ϕ ∈ R 3 , Φ = ϕ ∧ ∈ R 3 × 3 } \mathfrak{so}\left( 3 \right) = \left \{ \phi \in \mathbb{R}^3, \Phi = \phi^{\wedge} \in \mathbb{R}^{3 \times 3}\right\} so(3)={ϕR3,Φ=ϕR3×3}

S O ( 3 ) SO\left( 3 \right) SO(3)上的指数映射

  由于 ϕ \phi ϕ是三维向量,可以定义它的模长和它的方向,分别记作 θ \theta θ a a a,于是有 ϕ = θ a \phi=\theta a ϕ=θa,这里的 a a a是一个长度为 1 1 1的向量,首先对于 a ∧ a^{\wedge} a,有以下两条性质:
a ∧ a ∧ = a a T − I a^{\wedge}a^{\wedge}=aa^T - I aa=aaTI
a ∧ a ∧ a ∧ = − a ∧ a^{\wedge}a^{\wedge}a^{\wedge} = -a^{\wedge} aaa=a
  任意矩阵的指数映射可以写成一个泰勒展开,只有在收敛的情况下才会有结果,其结果仍是一个矩阵。
e x p ( A ) = ∑ n = 0 ∞ 1 n ! A n exp\left( A \right) = \sum_{n=0}^{\infty}\frac{1}{n!}A^n exp(A)=n=0n!1An
  同样的,对 s o ( 3 ) \mathfrak{so}\left( 3 \right) so(3)中的任意元素 ϕ \phi ϕ,也可以用此方式定义它的指数映射:
e x p ( ϕ ∧ ) = ∑ n = 0 ∞ 1 n ! ( ϕ ∧ ) n exp\left( \phi^{\wedge} \right) = \sum_{n=0}^{\infty}\frac{1}{n!}\left(\phi^{\wedge} \right)^n exp(ϕ)=n=0n!1(ϕ)n
  可以把指数映射写成:
e x p ( ϕ ∧ ) = e x p ( θ a ∧ ) = ∑ n = 0 ∞ 1 n ! ( θ a ∧ ) n exp\left( \phi^{\wedge} \right)=exp\left( \theta a^{\wedge} \right)=\sum_{n=0}^{\infty}\frac{1}{n!}\left( \theta a^{\wedge} \right)^n exp(ϕ)=exp(θa)=n=0n!1(θa)n
= I + θ a ∧ + 1 2 ! θ 2 a ∧ a ∧ + 1 3 ! θ 3 a ∧ a ∧ a ∧ + 1 4 ! θ 4 ( a ∧ ) 4 + ⋯ =I + \theta a^{\wedge} + \frac{1}{2!} \theta^2 a^{\wedge} a^{\wedge} + \frac{1}{3!} \theta^3 a^{\wedge} a^{\wedge} a^{\wedge} + \frac{1}{4!} \theta^4 \left(a^{\wedge}\right)^4 + \cdots =I+θa+2!1θ2aa+3!1θ3aaa+4!1θ4(a)4+
= a a T − a ∧ a ∧ + θ a ∧ + 1 2 ! θ 2 a ∧ a ∧ − 1 3 ! θ 3 a ∧ − 1 4 ! θ 4 ( a ∧ ) 2 + ⋯ =aa^T - a^{\wedge} a^{\wedge} + \theta a^{\wedge} + \frac{1}{2!} \theta^2 a^{\wedge} a^{\wedge} - \frac{1}{3!} \theta^3 a^{\wedge} - \frac{1}{4!} \theta^4 \left(a^{\wedge}\right)^2 + \cdots =aaTaa+θa+2!1θ2aa3!1θ3a4!1θ4(a)2+
= a a T + ( θ − 1 3 ! θ 3 + 1 5 ! θ 5 − ⋯   ) a ∧ − ( 1 − 1 2 ! θ 2 + 1 4 ! θ 4 − ⋯   ) a ∧ a ∧ =aa^T + \left( \theta - \frac{1}{3!} \theta^3 + \frac{1}{5!} \theta^5 - \cdots\right)a^{\wedge} - \left( 1 - \frac{1}{2!} \theta^2 + \frac{1}{4!} \theta^4 - \cdots\right)a^{\wedge} a^{\wedge} =aaT+(θ3!1θ3+5!1θ5)a(12!1θ2+4!1θ4)aa
= a ∧ a ∧ + I + sin ⁡ θ a ∧ − cos ⁡ θ a ∧ a ∧ =a^{\wedge}a^{\wedge} + I + \sin \theta a^{\wedge} - \cos \theta a^{\wedge}a^{\wedge} =aa+I+sinθacosθaa
= ( 1 − cos ⁡ θ ) a ∧ a ∧ + I + sin ⁡ θ a ∧ =\left( 1 - \cos \theta \right)a^{\wedge}a^{\wedge} + I + \sin \theta a^{\wedge} =(1cosθ)aa+I+sinθa
= cos ⁡ θ I + ( 1 − cos ⁡ θ ) a a T + sin ⁡ θ a ∧ =\cos \theta I + \left( 1 - \cos \theta \right)aa^T + \sin \theta a^{\wedge} =cosθI+(1cosθ)aaT+sinθa
  罗德里格斯公式: R = cos ⁡ θ I + ( 1 − cos ⁡ θ ) n n T + sin ⁡ θ n ∧ R=\cos \theta I + \left( 1 - \cos \theta \right)nn^T + \sin \theta n^{\wedge} R=cosθI+(1cosθ)nnT+sinθn

  表明 s o ( 3 ) \mathfrak{so}\left( 3\right) so(3) 实际上就是由旋转向量组成的空间,指数映射即罗德里格斯公式。通过它们我们把 s o ( 3 ) \mathfrak{so}\left(3\right) so(3)中任意一个向量对应到一个位于 S O ( 3 ) SO\left(3\right) SO(3)中的旋转矩阵。反之,如果定义对数映射,也能把 S O ( 3 ) SO\left(3\right) SO(3)中的元素对应到 s o ( 3 ) \mathfrak{so}\left(3\right) so(3)中:
ϕ = ln ⁡ ( R ) ∨ = ( ∑ n = 0 ∞ ( − 1 ) n n + 1 ( R − I ) n + 1 ) ∨ \phi = \ln \left( R \right)^{\vee} = \left( \sum_{n=0}^{\infty} \frac{\left( -1 \right)^n}{n+1}\left(R - I \right)^{n+1}\right)^{\vee} ϕ=ln(R)=(n=0n+1(1)n(RI)n+1)

  由以上可得,它与 S O ( 3 ) SO\left(3\right) SO(3)(特殊正交群—旋转矩阵群)的关系由指数映射给定:
R = e x p ( ϕ ∧ ) R = exp\left( \phi^{\wedge} \right) R=exp(ϕ)

李代数 s e ( 3 ) \mathfrak{se}\left( 3 \right) se(3)

  与 s o ( 3 ) \mathfrak{so}\left(3\right) so(3)相似, s e ( 3 ) \mathfrak{se}\left(3\right) se(3)位于 R 6 \mathbb{R}^6 R6空间中:
s e ( 3 ) = { ξ = [ ρ ϕ ] ∈ R 6 , ρ ∈ R 3 , ϕ ∈ s o ( 3 ) , ξ ∧ = [ ϕ ∧ ρ 0 T 0 ] ∈ R 4 × 4 } \mathfrak{se}\left(3\right)=\left \{ \xi = \begin{bmatrix} \rho \\ \phi \end{bmatrix} \in \mathbb{R}^6, \rho \in \mathbb{R}^3 , \phi \in \mathfrak{so}\left(3 \right), \xi^{\wedge}= \begin{bmatrix} \phi^{\wedge} & \rho \\ 0^T & 0 \end{bmatrix} \in \mathbb{R}^{4 \times 4} \right\} se(3)={ξ=[ρϕ]R6,ρR3,ϕso(3),ξ=[ϕ0Tρ0]R4×4}
  在 s e ( 3 ) \mathfrak{se}\left(3\right) se(3)中扩展了 ∧ ^{\wedge} 符号的含义,将一个6维向量转换成四维矩阵,但这里不再表示反对称:
ξ ∧ = [ ϕ ∧ ρ 0 T 0 ] ∈ R 4 × 4 \xi^{\wedge}= \begin{bmatrix} \phi^{\wedge} & \rho \\ 0^T & 0 \end{bmatrix} \in \mathbb{R}^{4 \times 4} ξ=[ϕ0Tρ0]R4×4

S E ( 3 ) SE\left( 3 \right) SE(3)上的指数映射

exp ⁡ ( ξ ∧ ) = [ ∑ n = 0 ∞ 1 n ! ( ϕ ∧ ) n ∑ n = 0 ∞ 1 ( n + 1 ) ! ( ϕ ∧ ) n ρ 0 T 1 ] ≜ [ R J ρ 0 T 1 ] = T \exp \left( \xi^{\wedge} \right) = \begin{bmatrix} \sum_{n=0}^{\infty}\frac{1}{n!}\left( \phi^{\wedge} \right)^n & \sum_{n=0}^{\infty}\frac{1}{\left( n + 1 \right)! }\left( \phi^{\wedge} \right)^n \rho \\ 0^T & 1 \end{bmatrix} \triangleq \begin{bmatrix} R & J\rho \\ 0^T & 1 \end{bmatrix} = T exp(ξ)=[n=0n!1(ϕ)n0Tn=0(n+1)!1(ϕ)nρ1][R0TJρ1]=T
  右上角的 J J J可以整理为(设 ϕ = θ a \phi=\theta a ϕ=θa
J = sin ⁡ θ θ I + ( 1 − sin ⁡ θ θ ) a a T + 1 − cos ⁡ θ θ a ∧ J = \frac{\sin \theta}{\theta}I + \left( 1 - \frac{\sin \theta}{\theta}\right)aa^T + \frac{1 - \cos \theta}{\theta}a^{\wedge} J=θsinθI+(1θsinθ)aaT+θ1cosθa

S E ( 3 ) SE\left( 3 \right) SE(3)上的李代数求导

  假设某空间点 p W p^W pW经过一次变换 T T T(对应李代数为 ξ \xi ξ),得到 T P W TP^W TPW,现在给 T T T左乘一个扰动 Δ T = exp ⁡ ( δ ξ ∧ ) \Delta T = \exp \left( \delta \xi^{\wedge}\right) ΔT=exp(δξ),设扰动项的李代数为 δ ξ = [ δ ρ , δ ϕ ] T \delta \xi = \left[\delta \rho, \delta \phi \right]^T δξ=[δρ,δϕ]T,有:
∂ ( T P W ) ∂ δ ξ = lim ⁡ ∂ ξ → 0 exp ⁡ ( δ ξ ∧ ) exp ⁡ ( ξ ∧ ) P W − exp ⁡ ( ξ ∧ ) P W δ ξ \frac{\partial \left(T P^W\right)}{\partial \delta \xi}=\lim_{\partial \xi \rightarrow 0}\frac{\exp\left(\delta \xi^{\wedge}\right)\exp\left(\xi^{\wedge}\right)P^W - \exp\left( \xi ^ {\wedge}\right)P^W}{\delta \xi} δξ(TPW)=ξ0limδξexp(δξ)exp(ξ)PWexp(ξ)PW
≈ lim ⁡ ∂ ξ → 0 ( I + δ ξ ∧ ) exp ⁡ ( ξ ∧ ) P W − exp ⁡ ( ξ ∧ ) P W δ ξ \approx \lim_{\partial \xi \rightarrow 0}\frac{\left(I + \delta \xi^{\wedge}\right)\exp\left(\xi^{\wedge}\right)P^W - \exp\left(\xi^{\wedge}\right)P^W}{\delta \xi} ξ0limδξ(I+δξ)exp(ξ)PWexp(ξ)PW
= lim ⁡ ∂ ξ → 0 δ ξ ∧ exp ⁡ ( ξ ∧ ) P W δ ξ =\lim_{\partial \xi \rightarrow 0}\frac{\delta \xi ^{\wedge}\exp\left(\xi^{\wedge}\right)P^W}{\delta \xi} =ξ0limδξδξexp(ξ)PW
= lim ⁡ ∂ ξ → 0 [ δ ϕ ∧ δ ρ 0 T 0 ] [ R P W + t 1 ] δ ξ =\lim_{\partial \xi \rightarrow 0}\frac{ \begin{bmatrix} \delta \phi^{\wedge} & \delta \rho \\ 0^T & 0 \end{bmatrix} \begin{bmatrix} RP^W + t \\ 1 \end{bmatrix} }{\delta \xi} =ξ0limδξ[δϕ0Tδρ0][RPW+t1]
= lim ⁡ ∂ ξ → 0 [ δ ϕ ∧ ( R P W + t ) + δ ρ 0 ] δ ξ = [ I − ( R P W + t ) ∧ 0 T 0 T ] ≜ ( T P W ) =\lim_{\partial \xi \rightarrow 0}\frac{ \begin{bmatrix} \delta \phi^{\wedge}\left(RP^W + t\right) + \delta \rho \\ 0 \end{bmatrix} }{\delta \xi}= \begin{bmatrix} I & -\left(RP^W + t\right)^{\wedge} \\ 0^T & 0^T \end{bmatrix}\triangleq\left(TP^W\right) =ξ0limδξ[δϕ(RPW+t)+δρ0]=[I0T(RPW+t)0T](TPW)
  观察上式其中 P C = R P W + t P^C = RP^W + t PC=RPW+t

BA

  有 n n n个三维空间点 P W P^W PW及其投影 p p p(像素坐标),和对应通过匹配得到像素坐标 P i x e l = [ U , V ] Pixel=\left[U, V\right] Pixel=[U,V], 希望计算相机的位姿 R , t R, t R,t,它的李代数表示为 ξ \xi ξ
  相机内参:
K = [ f x 0 c x 0 f y c y 0 0 1 ] K= \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K=fx000fy0cxcy1
  由以上信息可得,世界坐标系下三维点转到相机坐标系下 P C P^C PC
[ P C 1 ] = e x p ( ξ ∧ ) [ P W 1 ] \begin{bmatrix} P^C \\ 1 \end{bmatrix} = exp\left( \xi ^{\wedge} \right) \begin{bmatrix} P^W \\ 1 \end{bmatrix} [PC1]=exp(ξ)[PW1]
  相机坐标系 P C P^C PC到相机坐标系归一化平面 P n o r m a l C P^C_{normal} PnormalC
P n o r m a l C = [ P x C P z C P y C P z C 1 ] P^C_{normal} = \begin{bmatrix} \frac{P^C_x}{P^C_z} \\ \frac{P^C_y}{P^C_z} \\ 1 \end{bmatrix} PnormalC=PzCPxCPzCPyC1
  相机坐标系归一化平面到图像 p p p
[ p 1 ] = K P n o r m a l C = [ f x P n o r m a l C x + c x f y P n o r m a l C y + c y 1 ] \begin{bmatrix} p \\ 1 \end{bmatrix}=KP^C_{normal}= \begin{bmatrix} f_x {P^C_{normal}}_{x} + c_x \\ f_y {P^C_{normal}}_{y} + c_y \\ 1 \end{bmatrix} [p1]=KPnormalC=fxPnormalCx+cxfyPnormalCy+cy1
  由于相机位姿未知和观测点的噪声, P i x e l − p Pixel - p Pixelp存在一个误差。为了使的误差最小化,我们把每个点的误差求和,构建最小二乘问题(列文伯格—马夸尔特方法),然后调整相机位姿世界点的坐标使得误差尽量的小:
   h ( ξ , P W ) h\left( \xi, P^W\right) h(ξ,PW)为世界点到投影点 p p p的过程,需要解决的问题,使得下式最小 (误差为 2 × 1 2 \times 1 2×1矩阵):
f ( ξ , P W ) = ∑ i = 0 m ∑ j = 0 n h ( ξ i , P j W ) − P i x e l i , j f\left( \xi, P^W \right) = \sum_{i=0}^m \sum_{j=0}^n h\left( \xi_i, P^W_j\right) - Pixel_{i,j} f(ξ,PW)=i=0mj=0nh(ξi,PjW)Pixeli,j
  列文伯格—马夸尔特方法公式,令 D = I D=I D=I
( J T J ( x ) + λ D T D ) Δ x = − J ( x ) T f ( x ) \left( J^TJ\left(x\right) + \lambda D^TD\right)\Delta x = -{J\left(x\right)}^Tf\left(x\right) (JTJ(x)+λDTD)Δx=J(x)Tf(x)
( J T J ( x ) + λ d i a g ( J T J ) ) Δ x = − J ( x ) T f ( x ) \left( J^TJ\left(x\right) + \lambda diag\left( J^TJ\right)\right)\Delta x = -{J\left(x\right)}^Tf\left(x\right) (JTJ(x)+λdiag(JTJ))Δx=J(x)Tf(x)
  像素误差值 e = f ( ξ , P W ) e=f\left( \xi, P^W \right) e=f(ξ,PW) 对相机姿态的偏导矩阵 F i j F_{ij} Fij
∂ e ∂ δ ξ = ∂ e ∂ p ∂ p ∂ P C ∂ P C ∂ δ ξ \frac{\partial e}{\partial \delta \xi}=\frac{\partial e}{\partial p} \frac{\partial p}{\partial P^C}\frac{\partial P^C}{\partial \delta \xi} δξe=pePCpδξPC
= [ f x 0 0 f y ] [ 1 P z C 0 − P x C P z C 2 0 1 P z C − P y C P z C 2 ] [ 1 0 0 0 P z C − P y C 0 1 0 − P z C 0 P x C 0 0 1 P y C − P x C 0 ] = \begin{bmatrix} f_x & 0 \\ 0 & f_y \end{bmatrix} \begin{bmatrix} \frac{1}{P^C_z} & 0 & -\frac{P^C_x}{{P^C_z}^2} \\ 0 & \frac{1}{P^C_z} & -\frac{P^C_y}{{P^C_z}^2} \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 & P^C_z & -P^C_y \\ 0 & 1 & 0 & -P^C_z & 0 & P^C_x \\ 0 & 0 & 1 & P^C_y & -P^C_x & 0 \end{bmatrix} =[fx00fy]PzC100PzC1PzC2PxCPzC2PyC1000100010PzCPyCPzC0PxCPyCPxC0
  像素误差值 e = f ( ξ , P W ) e=f\left( \xi, P^W \right) e=f(ξ,PW)对世界点的偏导矩阵 E i j E_{ij} Eij
∂ e ∂ P W = ∂ e ∂ p ∂ p ∂ P C ∂ P C ∂ P W \frac{\partial e}{\partial P^W}=\frac{\partial e}{\partial p}\frac{\partial p}{\partial P^C}\frac{\partial P^C}{\partial P^W} PWe=pePCpPWPC
= [ f x 0 0 f y ] [ 1 P z C 0 − P x C P z C 2 0 1 P z C − P y C P z C 2 ] R =\begin{bmatrix} f_x & 0 \\ 0 & f_y \end{bmatrix} \begin{bmatrix} \frac{1}{P^C_z} & 0 & -\frac{P^C_x}{{P^C_z}^2} \\ 0 & \frac{1}{P^C_z} & -\frac{P^C_y}{{P^C_z}^2} \end{bmatrix}R =[fx00fy]PzC100PzC1PzC2PxCPzC2PyCR
  待优化的相机位姿集合:
Ξ = [ ξ 1 , ξ 2 , ξ 3 , ⋯   , ξ m ] \Xi=\left[\xi_1,\xi_2,\xi_3,\cdots, \xi_m\right] Ξ=[ξ1,ξ2,ξ3,,ξm]
  待优化的世界点集合:
P W = ( P 1 W , P 2 W , P 3 W , ⋯   , P n W ) P^W = \left( P^W_1, P^W_2, P^W_3, \cdots, P^W_n\right) PW=(P1W,P2W,P3W,,PnW)
  带入列文伯格—马夸尔特方法公式:
( J T J + λ ∗ d i a g ( J T J ) ) [ Δ Ξ Δ P W ] = − J T e \left(J^TJ + \lambda * diag\left(J^TJ\right)\right) \begin{bmatrix} \Delta \Xi \\ \Delta P^W \end{bmatrix} = -J^T e (JTJ+λdiag(JTJ))[ΔΞΔPW]=JTe
  令 G = ( J T J + λ ∗ d i a g ( J T J ) ) G=\left(J^TJ + \lambda * diag\left(J^TJ\right)\right) G=(JTJ+λdiag(JTJ)) G G G为:
G = [ F T F F T E E T F E T E ] G= \begin{bmatrix} F^TF & F^TE \\ E^TF& E^TE \end{bmatrix} G=[FTFETFFTEETE]
− J T e = [ − F T e − E T e ] = [ e c e p ] -J^Te= \begin{bmatrix} -F^T e \\ -E^T e \end{bmatrix}= \begin{bmatrix} e_c \\ e_p \end{bmatrix} JTe=[FTeETe]=[ecep]
Δ Ξ = ( F T F − F T E ( E T E ) − 1 E T F ) − 1 ( e c − F T E ( E T E ) − 1 e p ) \Delta \Xi = \left(F^TF - F^TE \left(E^TE\right)^{-1}E^TF\right)^{-1}\left(e_c - F^TE\left(E^TE\right)^{-1}e_p\right) ΔΞ=(FTFFTE(ETE)1ETF)1(ecFTE(ETE)1ep)
Δ P W = ( E T E ) − 1 ( e p − E T F Δ Ξ ) \Delta P^W = \left(E^TE\right)^{-1}\left(e_p-E^TF\Delta \Xi\right) ΔPW=(ETE)1(epETFΔΞ)
  注意:此时 Δ Ξ \Delta \Xi ΔΞ为李代数形式,需要使用指数映射转换到 S E ( 3 ) SE\left(3\right) SE(3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Bundle Adjustment是一种优化算法,可以在三维重建、SLAM、机器人导航等领域得到广泛应用。Python可以使用多种优化库来实现Bundle Adjustment算法,比如Scipy、PyTorch等。下面是一个使用Scipy实现Bundle Adjustment的示例代码: ```python import numpy as np from scipy.optimize import least_squares # 定义优化函数 def fun(params, n_cameras, n_points, camera_indices, point_indices, points_2d): # 相机参数和三维点的参数 camera_params = params[:n_cameras * 6].reshape((n_cameras, 6)) points_3d = params[n_cameras * 6:].reshape((n_points, 3)) # 初始化误差 err = [] # 循环计算重投影误差 for i in range(len(camera_indices)): # 获取相机和三维点的索引 camera_index = camera_indices[i] point_index = point_indices[i] # 获取相机和三维点的参数 R = cv2.Rodrigues(camera_params[camera_index][0:3])[0] t = camera_params[camera_index][3:6] point_3d = points_3d[point_index] # 计算重投影误差 point_2d = np.dot(R, point_3d) + t point_2d = point_2d / point_2d[2] err.append(point_2d[:2] - points_2d[i]) # 返回误差 return np.concatenate(err) # 定义函数调用 def bundle_adjustment(camera_params, points_3d, camera_indices, point_indices, points_2d): n_cameras = camera_params.shape[0] n_points = points_3d.shape[0] # 初始化优化参数 params = np.hstack((camera_params.ravel(), points_3d.ravel())) # 调用优化函数 res = least_squares(fun, params, args=(n_cameras, n_points, camera_indices, point_indices, points_2d)) # 返回优化后的相机参数和三维点参数 return res.x[:n_cameras * 6].reshape((n_cameras, 6)), res.x[n_cameras * 6:].reshape((n_points, 3)) ``` 其,`camera_params`表示所有相机的参数,`points_3d`表示所有三维点的参数,`camera_indices`和`point_indices`分别表示每个观测点对应的相机和三维点的索引,`points_2d`表示所有观测点的二维坐标。在优化函数`fun`,通过计算重投影误差来最小化优化目标。最后,通过调用`least_squares`函数进行优化,得到最优的相机参数和三维点参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值