Reference
- VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator.
- Quaternion Kinematics for Error-State KF.
視覺部分的優化問題建模
視覺部分的問題就是一個BA問題,不過與純視覺不同,這裏涉及到兩個座標系之間的變換,分別是camera座標系C和IMU座標系(通常認爲這個是機體座標系)b,同時因爲整個過程中使用的是逆深度表示空間中的Landmark,因此這個投影過程會變得稍微麻煩一些,但是整個過程還是比較清晰的。
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧PciPbiPwPbjPcjpcjerrorij=ρfci=RcbPci+tcb=RbiwPbi+tbiw=(Rbjw)T(Pw−tbjw)=(Rcb)T(Pbj−tcb)=[Xj,Yj,Zj]T=[ZjXj,ZjYj]T=[ZjXj−uj,ZjYj−vj]T(1)
於是可以逐個求解Jacobian矩陣了:
對第 i 幀的位姿進行求導
∂Tbiw∂eij=[∂tbiw∂eij,∂Rbiw∂eij]=∂pcj∂eij∂Pcj∂pcj∂Pbj∂Pcj∂Pw∂Pbj[∂tbiw∂Pw,∂Rbiw∂Pw]=I2×2⎣⎡Zj100Zj1−Zj2Xj−Zj2Yj⎦⎤2×3(Rcb)3×3T(Rbjw)3×3T[I,−Rbiw[Pbi]×]3×6(2)
對第 j 幀的位姿進行求導
∂Tbjw∂eij=[∂tbjw∂eij,∂Rbjw∂eij]=∂pcj∂eij∂Pcj∂pcj∂Pbj∂Pcj[∂tbjw∂Pbj,∂Rbjw∂Pbj]=I2×2⎣⎡Zj100Zj1−Zj2Xj−Zj2Yj⎦⎤2×3(Rcb)3×3T[−(Rbjw)T,[Pbj]×]3×6(3)
對逆深度ρ進行求導
∂ρ∂eij=∂pcj∂eij∂Pcj∂pcj∂Pbj∂Pcj∂Pw∂Pbj∂Pbi∂Pw∂Pci∂Pbi∂ρ∂Pci=I2×2⎣⎡Zj100Zj1−Zj2Xj−Zj2Yj⎦⎤2×3(Rcb)3×3T(Rbjw)3×3T(Rbiw)3×3(Rcb)3×3(−ρ2fi)3×1(4)
對IMU和Camera的外參進行求導
∂Tcb∂eij=[∂tcb∂eij,∂Rcb∂eij]=∂pcj∂eij∂Pcj∂pcj∂Tcb∂Pcj=∂pcj∂eij∂Pcj∂pcj(∂Tcb∂Pcj+(Rcb)T∂Tcb∂Pbj)=∂pcj∂eij∂Pcj∂pcj(∂Tcb∂Pcj+(Rcb)T∂Pw∂Pbj∂Pbi∂Pw∂Tcb∂Pbi)=I2×2⎣⎡Zj100Zj1−Zj2Xj−Zj2Yj⎦⎤2×3([−(Rcb)T,[Pcj]×]+(Rcb)T(Rbjw)TRbiw[I,−Rcb[Pci]×])3×6=I2×2⎣⎡Zj100Zj1−Zj2Xj−Zj2Yj⎦⎤2×3([(Rcb)T((Rbjw)TRbiw−I),([Pcj]×−(Rcb)T(Rbjw)TRbiwRcb[Pci]×)])3×6(5)
在VINS-Mono的代碼中,作者把[Pci]×給分解了,這塊兒不太理解作者爲什麼要分解開,但是其實展開之後的結果是一樣的。
慣導部分的優化問題建模
慣導部分的建模也是一個最小化誤差的問題,該誤差部分由兩個部分組成,一部分是狀態變量組成的幀間間隔,這部分與位置、角度、速度相關,與bias不相關:
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧pbjbivbjbiqbjbibajbgj=(Rbiw)T[(wpbj−wpbi)−wvbiΔt+21wgΔt2]=(Rbiw)T[(wvbj−wvbi)+wgΔt]=(qbiw)−1⊗(qbjw)=bai=bgi(6)
另一部分是IMU的積分值{pbjbi,vbjbi,qbjbi},這部分因爲是在bi系下的積分,因此與位置、角度、速度(均在世界座標系下)無關,但是這部分與bias息息相關,所以這部分筆者認爲不能叫觀測值;
所以整個問題的誤差爲:
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧epeqevebaebg=pbjbi−pbjbi=(Rbiw)T[(wpbj−wpbi)−wvbiΔt+21wgΔt2]−pbjbi=(Rbiw)TwΔp−pbjbi=2[(qbjbi)−1⊗qbjbi]3×1=vbjbi−vbjbi=(Rbiw)T(wvbj−wvbi+wgΔt)−vbjbi=(Rbiw)TwΔv−vbjbi=baj−bai=bgj−bgi(7)
我這裏稍微有一個問題就是在代碼中的姿態誤差eq和論文中的公式並不相同,起初筆者還是比較在意這個事情的,但是後來個人認爲只要整個推導過程中按照一個公式來就可以了。
所以根據公式(7)對狀態變量進行求導(按照VINS-Mono中的組織形式):
誤差部分對 i 時刻狀態量的求導
誤差部分對於i 時刻位姿狀態量的求導
∂Tbi∂e=[∂pbi∂e,∂θbi∂e]=⎣⎢⎢⎢⎢⎢⎢⎡∂pbi∂ep∂pbi∂eq∂pbi∂ev∂pbi∂eba∂pbi∂ebg∂θbi∂ep∂θbi∂eq∂θbi∂ev∂θbi∂eba∂θbi∂ebg⎦⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎡−(Rbiw)T0000[(Rbiw)TΔp]×−[[qij]L[qji⊗Jbgqδbgi]R]3×3[(Rbiw)TwΔv]×00⎦⎥⎥⎥⎥⎥⎤(8)
這裏簡單推導一下姿態誤差對姿態的求導:
e(θ+δθ)=2[(qji)−1⊗[(qiw⊗q(δθ))−1⊗qjw]]3×1=2[(qji)−1⊗q(δθ)−1⊗qji]3×1=2[[(qji)−1⊗q(δθ)⊗qji)]−1]3×1=2[[[qij]L[qji]R[121δθ]]−1]3×1=2[[qij]L[qji]R[1−21δθ]]3×1=2[[qij]L[qji]R[10]+[qij]L[qji]R[0−21δθ]]3×1=e(θ)+[[qij]L[qji]R[0−δθ]]3×1
這部分其實看到中間取了一個求逆操作,主要是爲了和VINS-Mono中的公式對上。
所以採用求導的原始定義有:
∂θ∂eq=limδθe(θ+δθ)−e(θ)=−[[qij]L[qji]R]3×3
誤差部分對於 i 時刻運動狀態量的求導
∂Mbi∂e=[∂vbi∂e,∂bai∂e,∂bgi∂e]=⎣⎢⎢⎢⎢⎢⎢⎡∂vbi∂ep∂vbi∂eq∂vbi∂ev∂vbi∂eba∂vbi∂ebg∂bai∂ep∂bai∂eq∂bai∂ev∂bai∂eba∂bai∂ebg∂bgi∂ep∂bgi∂eq∂bgi∂ev∂bgi∂eba∂bgi∂ebg⎦⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡−(Rbiw)TΔt0−(Rbiw)T00−Jbaip−Jbaiq−Jbaiv−I0−Jbgip−[[qij⊗qji]L]3×3Jbgiq−Jbgiv0−I⎦⎥⎥⎥⎥⎤(9)
依舊簡單推導一下姿態誤差對角速度bias的求導過程:
e(bg+δbg)=2[(qji⊗[121Jbgqδbg])−1⊗qji]3×1=2[[121Jbgqδbg]−1(qji)−1⊗qji]3×1=2[[(qji)−1⊗qji)⊗[121Jbgqδbg]]−1]3×1=2[[[qij⊗qji]L[121Jbgqδbg]]−1]3×1=2[[qij⊗qji]L[1−21Jbgqδbg]]3×1=2[[qij⊗qji]L[10]]3×1+2[[qij⊗qji]L[0−21Jbgqδbg]]3×1=e(bg)+[[qij⊗qji]L[0−Jbgqδbg]]3×1
這部分很重要的一定是通過四元數的求逆法則將δbg轉移到公式的最後,最後再通過四元數求逆其實就是把四元數的虛部部分添加負號的方法把求逆符號由公式外轉到宮室內。
同樣使用求導的定義有:
∂bg∂eq=limδbge(bg+δbg)−e(bg)=−[[qij⊗qji]L]3×3Jbgq
誤差部分對 j 時刻狀態量的求導
誤差部分對於 j 時刻位姿狀態量的求導
∂Tbj∂e=[∂pbj∂e,∂θbj∂e]=⎣⎢⎢⎢⎢⎢⎢⎡∂pbj∂ep∂pbj∂eq∂pbj∂ev∂pbj∂eba∂pbj∂ebg∂θbj∂ep∂θbj∂eq∂θbj∂ev∂θbj∂eba∂θbj∂ebg⎦⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎡(Rbiw)T00000[[(qji⊗Jbgqδbgi)−1⊗qji]R]3×3000⎦⎥⎥⎥⎥⎥⎤(10)
簡單推導一下姿態誤差對姿態的求導:
e(θ+δθ)=2[(qji)−1⊗(qiw)−1⊗qjw⊗q(δθ)]3×1=2[(qji)−1⊗qji⊗[121δθ]]3×1=2[[(qji)−1⊗qji]L[121δθ]]3×1=e(θ)+[[(qji)−1⊗qji]L[0δθ]]3×1
誤差部分對於 j 時刻運動狀態量的求導
∂Mbj∂e=[∂vbj∂e,∂baj∂e,∂bgj∂e]=⎣⎢⎢⎢⎢⎢⎢⎡∂vbj∂ep∂vbj∂eq∂vbj∂ev∂vbj∂eba∂vbj∂ebg∂baj∂ep∂baj∂eq∂baj∂ev∂baj∂eba∂baj∂ebg∂bgj∂ep∂bgj∂eq∂bgj∂ev∂bgj∂eba∂bgj∂ebg⎦⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡00(Rbiw)T00000I00000I⎦⎥⎥⎥⎥⎤(11)
小結一下慣性部分的建模問題
- 這部分的誤差模型其實由兩個部分組成,一部分是狀態量構建的幀間變化量(與位姿和速度直接相關),另一部分是IMU預積分得到的幀間變化量,這部分由於是以 i 時刻作爲參考系,因此和位姿速度無直接關係,但是在預積分過程中和角速度計和角速度計的bias息息相關;
- 在預積分過程中,雖然使用了精度較高的中點法,但是整個預積分過程中並沒有涉及到 j 時刻的零偏,或者說認爲 j 時刻的零偏與 i 時刻是一樣的,所以看到誤差部分對 j 時刻狀態的求導是比較簡單的;
小結
建模這部分就先到這裏,下部分關注的重點就是邊緣化和優化問題的先驗部分了。