採用逆深度參數表達的BA問題導數推導
由於大部分的slam算法均採用逆深度參數表達地圖點的結構,但是網上對該方法的介紹比較少因此本文將詳細說明其推導過程。逆深度參數表達具有優化變量少、能表達非常遠的點以及分佈接近高斯分佈等優勢,這也是大家選擇逆深度參數的原因。
圖結構表達
從上圖可以看出一個約束項Ep12連接三個節點分別是當前幀、參考幀和逆深度參數表達的地圖點。這是因爲在逆深度參數的表達下需要當前幀、參考幀位姿及地圖點才能共同確定誤差函數,這將在下文中看到。
優化節點
優化節點分爲兩類,關鍵幀的相機位姿和地圖點座標。其中關鍵幀的相機位姿維護SE(3)表達的狀態,而地圖點則是逆深度參數。
相機位姿
狀態量採用四元數+平移向量的方式表達,即[q|t],對於微小的角度更新方法如下:
tk+1=tk+δtqk+1=qk⊕δq
其中⊕代表的是四元數更新,一般採用四階Runge-Kunta法更新四元數。
∂δξ∂pf=(TP)⊙=[I0T−pf∧0T]
其中pf爲當前座標系下的XYZ表達地圖點,導數的具體求解過程參考附錄。
逆深度參數地圖點
逆深度參數採用MSCKF表示:
pf=⎣⎡xfyfzf⎦⎤=ρ1⎣⎡αβ1⎦⎤
λ=⎣⎡αβρ⎦⎤=⎣⎡xf/zfyf/zf1/zf⎦⎤
∂λ∂pf=⎣⎢⎡ρ1000ρ10−ρ2α−ρ2β−ρ21⎦⎥⎤
其中pf爲參考座標系下地圖點的三維座標,xf,yf,zf分別爲對應數值,λ爲逆深度參數表達的座標而二者的導數關係也一併給出。推導公式參考附錄。
邊約束項
誤差計算的思路在於把參考幀下的地圖點轉換到當前幀座標系下,在投影到當前幀像素平面上與對應的特徵點座標求差值。因此誤差函數爲:
e=[umvm]−[uv]
[umvm]=H(Twc−1TwfG(λ))
其中[umvm]是重投影的點,H函數根據相機模型將相機座標系下的點投影到像素座標系中,而G函數則將逆深度參數轉換爲參考幀下的3d座標,對於Twc,Twf則分別是世界系下當前相機幀的位姿和參考幀的相機位姿。
更進一步,將誤差函數展開成爲更加具體的形式。
[umvm]=[fzcxc+cxfzcyc+cy]
pc=⎣⎡xcyczc⎦⎤=Rwc−1pw−Rwc−1twc
pw=Rwfpf+twf
pf=ρ1⎣⎡αβ1⎦⎤
將誤差函數通過一步步轉換成爲逆深度參數座標,在求導時便可輕易的採用鏈式法則進行計算。
對地圖點的導數
∂λ∂e=∂pc∂e∂pf∂pc∂λ∂pf
由於∂λ∂pf已知,因此只需要求解∂pc∂e,∂pf∂pc
∂pc∂e=−[∂xc∂u∂xc∂v∂yc∂u∂yc∂v∂zc∂u∂zc∂v]=−[zcf00zcf−zc2fxc−zc2fyc]
∂pf∂pc=Rcf
對當前幀的導數
∂δξc∂e=∂pc∂e∂δξc∂pc
其中,∂pc∂e在對點求導時已求得,而∂δξc∂pc只要帶入可得
∂δξc∂pc=[I0T−pc∧0T]
在計算時通常會直接刪除下面爲零的部分,以便和前面矩陣維度一致。
對參考幀的導數
∂δξf∂e=∂pf∂e∂δξf∂pf
同樣,∂pf∂e在對點求導時已經求得了
∂δξf∂pc=[I0T−pf∧0T]
附錄
向量的求導
∂[xy]∂[ab]=[∂x∂a∂x∂b∂y∂a∂y∂b]
對微小的擾動δξ求導