1. 前言
之前看過崔華坤的《VINS論文推導及代碼解析》還有深藍學院的VIO課程,對VINS的後端非線性優化有了較爲清晰的認識,但是一直沒有時間整理寫成筆記,最近看到Manni的博客VINS-Mono理論學習——後端非線性優化 概括得很不錯,針對這三份資料還有自己的一些理解重新整理下,感謝優秀的大佬們提供的參考資料。
2. 非線性最小二乘
儘管非線性最小二乘是很常見的問題,可參考《SLAM14講》第六章節,《多視圖幾何》附錄6,喬治梅森大學Timothy Sauer的《數值分析》(忘記第幾章了,書也沒帶回家,哭.jpg),在我之前的博客非線性最小二乘也對Guass-Newton和LM進行了介紹,這裏簡單回顧一下,由於VINS-Mono中在視覺重投影誤差添加了魯棒核函數,因此也整理下對 殘差(也可以說是誤差,一個意思,以下內容不分殘差和誤差) 添加魯棒核函數對需要優化的狀態量增量方程的影響。
2.1 Guass-Newton 和 Levenberg-Marquardt
對於最常見的最小二乘問題有:xminF(x)=xmin21∥f(x)∥22 將殘差寫成組合向量的形式:f(x)=⎣⎡f1(x)⋯fm(x)⎦⎤, 則F(x)=21∥f(x)∥22=21fT(x)f(x)=21i=1∑m(fi(x))2 同理,如果記Ji(x)=∂x∂fi(x), 則有:∂x∂f(x)=Jm×n=⎣⎡J1(x)⋯Jm(x)⎦⎤ , Ji(x)1×n=[∂x1∂fi(x) ∂x2∂fi(x) ⋯ ∂xn∂fi(x)]
對殘差函數f(x)進行一階泰勒展開:f(x+Δx)=f(x)+JΔx, 其中J是殘差函數f的雅可比矩陣,代入損失函數(以下推導用f代替f(x)):F(x+Δx)≈L(Δx)=21(f+JΔx)T(f+JΔx)=21fTf+ΔxTJTf+21ΔxTJTJΔx=F(x)+ΔxTJTf+21ΔxTJTJΔx(1) 這樣損失函數就近似成了一個二次函數,如果雅可比矩陣是滿秩的(並不一定滿秩),則JTJ正定,損失函數有最小值,且易得 F′(x)=(JTf)T, F′′(x)=JTJ
Gauss-Newton Method:
令公式(1)的一階導數等於0,得到(JTJ)Δxgn=−JTf 由於H=JTJ可能出現H矩陣奇異或者病態,此時高斯牛頓法增量的穩定性較差,導致算法不收斂。同時對於步長問題,若求出來的Δxgn太長,則可能出現局部近似不夠準確,無法保證迭代收斂。
Levenberg-Marquardt Method (LM):
在高斯牛頓法的基礎上引入阻尼因子:(JTJ+μI)Δxlm=−JTf, s.t. μ≥0 其中μ稱爲阻尼因子。
阻尼因子的作用: μ>0保證(JTJ+μI)正定,迭代朝着下降方向進行。
阻尼因子的初始化: μ0=τ max{(JTJ)ij}, 按需設定 τ∈[10−8,1]。
阻尼因子μ的更新策略:
- 如果Δx→F(x)↑,則 μ↑→Δx↓,增大阻尼減小步長,拒絕本次迭代。
- 如果Δx→F(x)↓,則 μ↓→Δx↑,減小阻尼增加步長,減少迭代次數。
Δx和阻尼因子μ的關係:
阻尼因子的更新由比例因子來確定:
ρ=L(0)−L(Δxlm)F(x)−F(x+Δxlm)=近似下降實際下降 其中 L(0)−L(Δxlm)=−ΔxlmTJTf−21ΔxlmTJTJΔx=−21ΔxlmT(2JTf+(JTJ+μI−μI)Δxlm)=−21ΔxlmT(JTf−μIΔxlm)=21ΔxlmT(μΔxlm−JTf) 首先比例因子分母始終大於0,因爲是沿負梯度方向進行的Δxlm的調整,故L(0)>L(Δxlm),如果:
- ρ<0,則F(x)↑,應該μ↑→Δx↓,增大阻尼減小步長。
- 如果ρ>0且比較大,減小μ,讓LM接近Gauss-Newton使得系統更快收斂。
- 反之,如果是比較小的正數,則增大阻尼μ,縮小迭代步長。
2.2 魯棒核函數下狀態量增量方程的構建
由上得 F(x)=21∥f(x)∥22=21fT(x)f(x)=21i=1∑m(fi(x))2 魯棒核函數直接作用於殘差fi(x)上,則有
xmin21i∑ρ(∥fi(x)∥22)=xmin21i∑ρ(fi(x)2) 將誤差的平方項記作si=∥fi(x)∥22,對魯棒核誤差函數進行二階泰勒展開有:
ρ(s+Δs)≈ρ(s)+ρ′(s)Δs+21ρ′′(s)Δ2s(2)
對於Δs的計算,我們有:
Δs=∥fi(x+Δx)∥22−∥fi(x)∥22≈∥fi(x)+JiΔx∥22−∥fi(x)∥22=(fi(x)+JiΔx)2−fi2(x)=2fiT(x)JiΔx+(Δx)TJiTJiΔx(3.1)
若誤差項爲Σ範數(表徵爲誤差項的協方差矩陣,協方差爲對稱矩陣,故協方差的逆(稱爲信息矩陣)亦爲對稱矩陣)而非二範數,我們有:
Δs=∥fi(x+Δx)∥Σi2−∥fi(x)∥Σi2≈∥fi(x)+JiΔx∥Σi2−∥fi(x)∥Σi2=(fi(x)+JiΔx)TΣi−1(fi(x)+JiΔx)−fiT(x)Σi−1fi(x)=(Σi−Tfi(x))TJiΔx+(JiΔx)TΣi−1fi(x)+ΔxTJiTΣi−1JiΔx=2fiT(x)Σi−1JiΔx+ΔxTJiTΣi−1JiΔx(3.2)
將公式(3)代入公式(2),令fi(x)=fi ,ρ=ρ(s),可得
21ρ(s+Δs)≈21(ρ(s)+ρ′(s)Δs+21ρ′′(s)Δ2s)=21(ρ+ρ′[2fiTJiΔx+(Δx)TJiTJiΔx]+21ρ′′[2fiTJiΔx+(Δx)TJiTJiΔx]2)≈ρ+ρ′fiTJiΔx+21ρ′(Δx)TJiTJiTΔx+ρ′′(Δx)TJiTfifiTJiΔx=ρ+ρ′fiTJiΔx+21(Δx)TJiT(ρ′I+2ρ′′fifiT)JiΔx(4.1)
若誤差項爲Σ範數:
21ρ(s+Δs)≈21(ρ(s)+ρ′(s)Δs+21ρ′′(s)Δ2s)=21(ρ+ρ′[2fiTΣi−1JiΔx+(Δx)TJiTΣi−1JiΔx]+21ρ′′[2fiTΣi−1JiΔx+(Δx)TJiTΣi−1JiΔx]2)≈ρ+ρ′fiTΣi−1JiΔx+21ρ′(Δx)TJiTΣi−1JiΔx+ρ′′(Δx)TJiTΣi−1fifiTΣi−1JiΔx=ρ+ρ′fiTΣi−1JiΔx+21(Δx)TJiT(ρ′Σi−1+2ρ′′Σi−1fifiTΣi−1)JiΔx(4.2)
由於Δx是一個極小量,故其三階及以上的項數值很小,近似忽略Δx三階及其以上的項。
對公式(4)中的Δx進行求導後,令其等於0,得到: i∑JiT(ρ′I+2ρ′′fifiT)JiΔx=−i∑ρ′JiTfi 化簡得:i∑JiTWJiΔx=−i∑ρ′JiTfi 其中 W=ρ′I+2ρ′′fifiT
若誤差項爲Σ範數:
i∑JiT(ρ′Σi−1+2ρ′′Σi−1fifiTΣi−1)JiΔx=−i∑ρ′JiTΣi−1fi 化簡得:i∑JiTWJiΔx=−i∑ρ′JiTΣi−1fi 其中 W=ρ′Σi−1+2ρ′′Σi−1fifiTΣi−1
3. 局部Bundle Adjustment代價函數的構建
對於需要優化的狀態向量,包括滑動窗口內的所有IMU狀態xk(位姿P、速度V、旋轉Q、加速度偏置ba,陀螺儀偏置bw)、相機到IMU的外參 xcb、所有3D點的逆深度 λm:【論文公式(21)】X=[x0,x1,⋯,xn,xcb,λ0,λ1,⋯,λm] xk=[pbkw,vbkw,qbkw,ba,bg],k∈[0,n] xcb=[pcb,qcb] 其中xk代表相機獲取圖片時對應時刻k的IMU狀態,n爲滑動窗口內的關鍵幀的數量,m爲滑動窗口內3D視覺特徵(空間點)的數量,λm爲第m個3D視覺特徵的逆深度(第一次被觀察時計算得到的值)。
目標函數爲 【論文公式(22)(23)】:Xmin{∥rp−HpX∥2+k∈B∑∥∥∥rB(z^bk+1bk,X)∥∥∥Pbk+1bk2+(l,j)∈C∑ρ(∥∥rC(z^lcj,X)∥∥Plcj2)}(5) ρ(s)={1,s≥12s−1,s<1 其中這三項分別爲邊緣化的先驗信息 (由滑動窗口產生的關鍵幀邊緣化)、IMU的測量誤差、視覺的重投影誤差,三種殘差都是用馬氏距離表示。Pbk+1bk代表IMU殘差的協方差,Plcj代表視覺重投影誤差的協方差,通過協方差的逆 (即信息矩陣) 對各個變量計算殘差時進行加權。ρ(s)爲Huber核函數。
4. IMU測量殘差 (增量誤差) 及其對狀態量雅克比矩陣、協方差遞推方程的推導
4.1 IMU測量殘差 (增量誤差)
在IMU預積分中我們已經得到了:
Rwbkpbk+1w=Rwbk(pbkw+vbkwΔtk−21gwΔtk2)+αbk+1bk Rwbkvbk+1w=Rwbk(vbkw−gwΔtk)+βbk+1bk qwbk⊗qbk+1w=γbk+1bk
因此倆幀之間的PVQ和bias的變化量(增量)誤差爲:【論文公式[24]】
rB15×1(z^bk+1bk,X)=⎣⎢⎢⎢⎢⎢⎡δαbk+1bkδβbk+1bkδθbk+1bkδbaδbw⎦⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎡Rwbk(pbk+1w−pbkw−vkwΔtk+21gwΔtk2)−αbk+1bkRwbk(vbk+1w−vbkw+gwΔtk)−βbk+1bk2[(γbk+1bk)−1⊗(qbkw)−1⊗qbk+1w]xyzbabk+1−babkbwbk+1−bwbk⎦⎥⎥⎥⎥⎥⎤(6)
其中[⋅]xyz代表取四元素虛部部分來表示狀態誤差,[αbk+1bk,βbk+1bk,γbk+1bk]T爲IMU的預積分量,具體推導可見上一篇博客VINS-Mono之IMU預積分,預積分對應的誤差、協方差及雅克比矩陣遞推方程的推導,同時,加速度計和陀螺儀的偏置同樣包含在殘差中以在線校正。
4.2 IMU優化變量
優化變量主要包含第k時刻、第k+1時刻(其中k和k+1爲前後捕獲倆幀圖像對應的時間)的PVQ和加速度計的偏置ba、陀螺儀的偏置bw:
[pbkw,qbk],[vbkw,bak,bwk],[pbk+1w,qbk+1w],[vbk+1w,bak+1,bwk+1]
4.3 IMU增量殘差對狀態量的雅克比矩陣
這部分在imu_factor.h中的class IMUFactor:public ceres::SizedCostFunction<15,7,9,7,9>
的函數virtual bool Evaluate()
中實現,其中parameters[0~3]
分別對應了以上4組優化變量的參數塊,4組參數的長度依次是7,9,7,9。
代碼IMUFactor::Evaluate()
中redidual
還乘以一個信息矩陣sqrt_info
,這是由於在IMU測量誤差和視覺的重投影誤差通過協方差的逆進行了加權,因此實際優化的是min(d)=min(rkTP−1rk), 這裏rk代表k時刻時候的殘差,P代表協方差。而Ceres只接受諸如min(rkTrk)的優化,因此在代碼裏,需要將信息矩陣P−1做LLT分解,即LLT=P−1 ,代碼中矩陣L對應sqrt_info
,這樣就可以將優化進行轉換:min(d)=min(rkTP−1rk)=min((LTrk)T(LTrk))=min(rk′Trk)
計算雅克比時,殘差對應的求偏差對象爲上面的優化變量,但是計算時採用擾動方式計算,即擾動爲[δpbkw,δθbkw],[vbkw,δbak,δbwk],[δpbk+1w,δθbk+1w],[δvk+1w,δak+1,δbwk+1]
這裏給出先給出雅克比J的結果(對應上面的parameters[3]
)
J[0]15×7=[∂pbkw∂rB,∂qbkw∂rB]=⎣⎢⎢⎢⎢⎡−Rwbk0000[Rwbk(pbk+1w−pbkw−vbkwΔtk+21gwΔtk2)]×[Rwbk(vbk+1w−vbkw+gwΔtk)]×−L3×3[(qk+1w)−1⊗qbkw]R3×3[γbk+1bk]00⎦⎥⎥⎥⎥⎤(7) J[1]15×9=[∂vbkw∂rB,∂bak∂rB,∂bwk∂rB]=⎣⎢⎢⎢⎢⎡−RwbkΔtk−Rwbk000−Jbaα−Jbaβ0−I0−Jbwα−Jbwβ−L3×3[(qbk+1w)−1⊗qbkw⊗γbk+1bk]Jbwγ0−I⎦⎥⎥⎥⎥⎤(8)
J[2]15×7=[∂pbk+1w∂rB,∂qbk+1w∂rB]=⎣⎢⎢⎢⎢⎡Rwbk000000L3×3[(γbk+1bk)−1⊗(qbkw)−1⊗qbk+1w]00⎦⎥⎥⎥⎥⎤(9)
J[3]15×9=[∂vbk+1w∂rB,∂bak+1∂rB,∂bwk+1∂rB]=⎣⎢⎢⎢⎢⎡0Rwbk000000I00000I⎦⎥⎥⎥⎥⎤(10)
對於上式,PVQ的求導可以直接採用對誤差增量進行計算,而對ba,bg的求導,因爲k時刻的bias相關的預計分計算是通過迭代一步一步遞推的,直接求導太複雜,這裏直接對預積分量在k時刻的bias附近用一階泰勒展開來近似,而不是真的取迭代計算:
αbk+1bk≈α^bk+1bk+Jbaαδba+Jbwαδbw βbk+1bk≈β^bk+1bk+Jbaβδba+Jbwβδbw γbk+1bk≈γ^bk+1bk⊗[121Jbwγδbw]
其中Jbaα=∂δba∂αbk+1bk,Jbwα=∂δbw∂αbk+1bk,Jbaβ=∂δba∂βbk+1bk,Jbwβ=∂δbw∂βbk+1bk,Jbwγ=∂δbw∂γbk+1bk表示預積分量對k時刻的偏置的求導。關於偏置的雅克比矩陣可以根據IMU預積分討論(VINS-Mono之IMU預積分,預積分對應的誤差、協方差及雅克比矩陣遞推方程的推導)的協方差遞推公式,一步步遞推獲得。遞推公式爲:Jk+1=FJk, J0=I
以下是對公式(7)(8)(9)(10)的推導:
由於δαbk+1bk(預積分Pose誤差)和δβbk+1bk(預積分Velocity誤差)形式很接近,因此其對各個狀態量求導的雅克比形式也很相似。
首先明確下反對稱符號的性質:有R[δθ]×=−[δθ]×R [δθ]×(Rp)=−[Rp]×δθ (Rexp([δθ]×))−1=exp(−[δθ]×)R−1 (exp([δθ]×)R)−1=R−1exp(−[δθ]×)
1) 預積分Pose誤差 δαbk+1bk 對k 時刻狀態量雅克比進行推導 (k+1時刻的雅克比同理):
- 對k時刻Pose pbkw的導數:∂pbkw∂δαbk+1bk=−Rwbk
- 對k時刻Velocity vbkw的導數:∂vbkw∂δαbk+1bk=−RwbkΔtk
- 對k時刻旋轉 qbkw的導數:
∂qbkw∂δαbk+1bk=∂δθbkw∂δαbk+1bk=∂δθbkw∂qwbk⊗[121δθbkw](pbk+1w−pbkw−vkwΔtk+21gwΔtk2)=∂δθbkw∂Rwbkexp([δθbkw]×)(pbk+1w−pbkw−vkwΔtk+21gwΔtk2)≈∂δθbkw∂Rwbk(I+[δθbkw]×)(pbk+1w−pbkw−vkwΔtk+21gwΔtk2)=∂δθbkw∂−[δθbkw]×Rwbk(pbk+1w−pbkw−vkwΔtk+21gwΔtk2)=∂δθbkw∂[Rwbk(pbk+1w−pbkw−vkwΔtk+21gwΔtk2)]×δθbkw=[Rwbk(pbk+1w−pbkw−vkwΔtk+21gwΔtk2)]×
- 對k時刻偏置ba和bw的導數:∂ba∂δαbk+1bk=∂αbk+1bk∂δαbk+1bk∂ba∂αbk+1bk=−Jbaα∂bw∂δαbk+1bk=∂αbk+1bk∂δαbk+1bk∂bw∂αbk+1bk=−Jbwα
2) 預積分Velocity誤差 δβbk+1bk 對k 時刻狀態量雅克比的推導同Pose誤差δαbk+1bk對狀態量雅克比的推導。
3) 預積分旋轉角度誤差 δθbk+1bk 對k 時刻和k+1時刻狀態量雅克比進行推導:
- 對k時刻旋轉 qbkw的導數: ∂qbkw∂δθbk+1bk=∂δθbk∂δθbk+1bk=∂δθbk∂2[(γbk+1bk)−1⊗(qbkw)−1⊗qbk+1w]xyz∂δθbk∂2[(γbk+1bk)−1⊗(qbkw⊗[121δθbk])−1⊗qbk+1w]xyz=∂δθbk∂−2[((γbk+1bk)−1⊗(qbkw⊗[121δθbk])−1⊗qbk+1w)−1]xyz=∂δθbk∂−2[(qbk+1w)−1⊗(qbkw⊗[121δθbk])⊗γbk+1bk]xyz=−2[0 I]3×4∂δθbk∂L((qbk+1w)−1⊗qbkw)R(γbk+1bk)[121δθbk]=−2[0 I]3×4∂L((qbk+1w)−1⊗qbkw)R(γbk+1bk)21⎣⎢⎢⎢⎢⎢⎢⎡∂δθbkx∂2∂δθbky∂δθbkx∂δθbkx∂δθbky∂δθbkx∂δθbkz∂δθbkx∂2∂δθbky∂δθbkx∂δθbky∂δθbky∂δθbky∂δθbkz∂δθbkz∂2∂δθbkz∂δθbkx∂δθbkz∂δθbky∂δθbkz∂δθbkz⎦⎥⎥⎥⎥⎥⎥⎤=−2[0 I]3×4∂L((qbk+1w)−1⊗qbkw)R(γbk+1bk)21⎣⎢⎢⎡010000100001⎦⎥⎥⎤=−2[0 I]3×4L((qbk+1w)−1⊗qbkw)R(γbk+1bk)[021I]4×3(*) ∂qbkw∂δθbk+1bk=−L3×3((qbk+1w)−1⊗qbkw)R3×3(γbk+1bk)
- 對k時刻陀螺儀偏置bwk的導數: ∂qbkw∂δθbk+1bk=∂δbwk∂δθbk+1bk=∂δbwk∂2[(γbk+1bk⊗[121Jbwγδbwk])−1⊗(qbkw)−1⊗qbk+1w]xyz=∂δbwk∂−2[((γbk+1bk⊗[121Jbwγδbwk])−1⊗qbkw)−1⊗qbk+1w)−1]xyz=∂δbwk∂−2[(qbk+1w)−1⊗qbkw⊗(γbk+1bk⊗[121Jbwγδbwk])]xyz=−2[0 I]3×4L([(qbk+1w)−1⊗qbkw⊗γbk+1bk)[021Jbwγ]4×3(*) ∂qbkw∂δθbk+1bk=−L3×3([(qbk+1w)−1⊗qbkw⊗γbk+1bk)Jbwγ
- 對k+1時刻陀螺儀旋轉qbk+1w的導數:∂qbk+1w∂δθbk+1bk=∂δθbk∂δθbk+1bk=∂δθbk∂2[(γbk+1bk)−1⊗(qbkw)−1⊗qbk+1w⊗[121δθbk+1]]xyz=∂δθbk∂2[L((γbk+1bk)−1⊗(qbkw)−1⊗qbk+1w)⊗[121δθbk+1]]xyz=2[0 I]3×4L((γbk+1bk)−1⊗(qbkw)−1⊗qbk+1w)[021I]4×3(*) ∂qbk+1w∂δθbk+1bk=L3×3((γbk+1bk)−1⊗(qbkw)−1⊗qbk+1w)
4) 加速度計和陀螺儀偏置誤差δba, δbw對k 時刻和k+1時刻的偏置babk, babk+1, bwbk, bwbk+1雅克比分別爲: babk∂ba=−I, babk+1∂ba=I, bwbk∂bw=−I, bwbk+1∂bw=I
至此IMU預積分誤差對各個狀態量的雅克比矩陣已經推導完畢,推導過程中規中矩,需要對哪個變量進行求導,則對其添加擾動。但是公式標有(*)都用到了四元素公式的一些推導,需要熟悉這些運算,具體可看《Quaternion-kinematics-for-the-error-state-Kalman-filter》這本書。
值得注意的是,當Pose 誤差δαbk+1bk和Velocity 誤差 δβbk+1bk對偏置進行求導時,需要用到預積分量αbk+1bk, βbk+1k 與偏置ba, bw的遞推關係,而角度誤差δγbk+1k對偏置求導時,只用了預積分量γbk+1bk與bw的遞推關係。
4.4 協方差遞推方程
協方差即爲IMU預積分中迭代得到的IMU增量誤差的協方差。
對IMU增量誤差遞推方程:
δzk+115×1=F15×15δzk15×1+V15×18n18×1 協方差的迭代公式爲(協方差的初始值P0=0):
Pk+1=FPkFT+VQVT 其中噪聲項的對角協方差矩陣Q爲:Q18×18=(σa2,σw2,σa2,σw2,σba2,σbw2) 。
雅克比矩陣的迭代公式爲(雅克比矩陣的初始值爲J0=I): Jk+1=FJk 這裏計算出來的Jk+1只是爲了給後面提供對 bias 的雅克比矩陣。
5. 視覺測量殘差(重投影誤差)及其對狀態量雅克比、協方差的推導
5.1 視覺測量殘差(重投影誤差)
視覺殘差是重投影誤差,對於第l個路標點P,將P從第一次觀看到它的第i個相機座標系,轉換到當前的第j個座標系下的歸一化平面,其座標(u, v)的誤差。以下公式根據l,i,j來定義。
重投影誤差:一個特徵點在歸一化相機座標系下的估計值與觀測值的差:rc=[zx−uzy−v] 其中,待估計狀態量爲特徵點的三維空間座標(x,y,z)T,觀測值(u,v)T 爲特徵在相機歸一化平面的座標。
逆深度參數化:採用逆深度λ來表示特徵點在歸一化相機座標系的座標:⎣⎡xyz⎦⎤=λ1⎣⎡uv1⎦⎤ 以逆深度作爲參數進行優化的原因:一是一些觀測到的特徵點深度值可能會非常大,難以進行優化;二是可以減少實際優化的參數變量;三是逆深度更加服從高斯分佈。
對於第l個路標點P,其在第i幀中被第一次觀測到,其歸一化相機座標系的座標⎣⎡ucivci1⎦⎤
轉換到第j幀的座標爲:⎣⎡ucjvcj1⎦⎤=π(Tbc−1Twbj−1TwbiTbc⎣⎢⎢⎡λ1uciλ1vciλ11⎦⎥⎥⎤) 上式即爲重投影方程,這裏優化的狀態量是IMU body 座標系的位姿Twbj,Twbi,因此相較於視覺SLAM的重投影,還需要加上倆項從相機到IMU body座標系的外參。
將重投影方程拆成三維座標形式: Plcj=⎣⎡xcjycjzcj⎦⎤=Rbc{Rwbj[Rbiw(Rcbλ1[ucivci]+pcb)+pbiw]+pwbj}+pbc
對於變換矩陣有Rwbj=(Rbjw)T,pwbj=−(Rbjw)Tpbjw,Rbc=(Rcb)T,pbc=−(Rcb)Tpcb,故有:
Plcj=⎣⎡xcjycjzcj⎦⎤=Rbc⎩⎨⎧Rwbj[Rbiw(Rcbλ1⎣⎡ucivci1⎦⎤+pcb)+pbiw]−(Rbjw)Tpbjw⎭⎬⎫−(Rcb)Tpcb=RbcRwbjRbiwRcbλ1⎣⎡ucivci1⎦⎤+Rbc(Rwbj(Rbiwpcb+pbiw−pbjw)−pcb)
而觀測值即P在第j幀被觀測到的歸一化相機座標系下的座標爲⎣⎡ucjvcj1⎦⎤,因而得到視覺殘差爲:rc=⎣⎡zcjxcj−ucjzcjycj−vcj⎦⎤
以上是對針孔模型的視覺殘差,而在VINS論文中其實顯示的是對一般相機模型的視覺殘差,即使用了廣角相機的球面模型。
最後定義的視覺殘差爲:【論文公式(25)】rC(zl^cj,X)=[b1b2](∥∥Plcj∥∥Plcj−Plˉcj) 其中,Pˉlcj爲第l個路標點在第j個相機歸一化相機座標系中的觀察到的座標爲:Pˉlcj=πc−1([u^lcjvlcj^]) 另外,Plcj是估計第l個路標點在第j個相機歸一化相機座標系中的可能座標,推導如下:Plcj=Rbc{Rwbj[Rbiw(Rcbλ1Pˉlci+pcb)+pbiw−pbjw]−pcb} 因爲視覺殘差的自由度爲2, 因此將視覺殘差投影到正切平面上,b1,b2爲正切平面上的任意倆個正交基。
在代碼中,針孔模型和廣角相機的球面模型都有被用到:
#ifdef UNIT_SPHERE_ERROR
residual = tangent_base * (pts_camera_j.normalized() - pts_j.normalized());
#else
double dep_j = pts_camera_j.z();
residual = (pts_camera_j / dep_j).head<2>() - pts_j.head<2>();
#endif
5.2 視覺優化變量
第l個路標點在i和j時刻構建的殘差,優化變量包括倆個時刻的狀態量、外參、以及路標點的逆深度(路標點第一次被觀察到的時候確定的值):[pbiw,qbiw], [pbjw,qbjw], [pcb,qcb], λl
5.3 視覺重投影誤差對狀態量的雅克比矩陣
這裏採用針孔相機的(歸一化相機平面)視覺殘差來進行推導,而相機球面模型的視覺殘差推導過程也相似。rc=⎣⎡zcjxcj−ucjzcjycj−vcj⎦⎤ 這裏先定義:fci=λl1Pˉlci=λ1⎣⎡ucivci1⎦⎤ fcj即原來的Plcj: fcj=RbcRwbjRbiwRcbfci+Rbc(Rwbj(Rbiwpcb+pbiw−pbjw)−pcb) 即 fcj=Rbc{Rwbj[Rbiw(Rcbfci+pcb)+pbiw−pbjw]−pcb}
根據鏈式法則,對殘差對每個雅克比的計算可以分成:
1)視覺殘差對重投影3D點fcj求導:∂fcj∂rc=⎣⎡zcj100zcj1−zcj2xcj−zcj2ycj⎦⎤
2) fcj 對各個優化變量的求導:J[0]3×7=[∂pbiw∂fcj,∂qbiw∂fcj]=[RbcRwbj,−RbcRwbjRbiw[Rcbλl1Pˉlci+pcb]×](11) J[1]3×7=[∂pbjw∂fcj,∂qbjw∂fcj]=[−RbcRwbj,Rbc{Rwbj[Rbiw(λl1RcbPˉlci+pcb)+pbiw−pbjw]}×](12) J[2]3×7=[∂pcb∂fcj,∂qcb∂fcj]=[Rbc(RwbjRbiw−I3×3)−RbcRwbjRbiwRcb[λl1Pˉlci]×+[RbcRwbjRbiwRcbλl1Pˉlci]×+{Rbc[Rwbj(Rbiwpcb+pbiw−pbjw)−pcb]}×](13) J[3]3×1=λl∂fcj=−RbcRwbjRbiwRcbλl2Pˉlci(14)
這一部分的具體代碼實現在projection_factor.cpp
的bool ProjectionFactor::Evaluate()
函數中。
以下是對公式(11)(12)(13)(14)的推導:
由上面公式得:fcj=Rbc{Rwbj[Rbiw(Rcbfci+pcb)+pbiw−pbjw]−pcb}
- 對i時刻位移pbiw的求導:∂pbiw∂fcj=RbcRwbj
- 對i時刻旋轉qbiw的求導:∂qbiw∂fcj=∂δθbi∂fcj=∂δθbiRbc{Rwbj[Rbiwexp([δθbi]×)(Rcbfci+pcb)+pbiw−pbjw]−pcb}=∂δθbiRbcRwbjRbiwexp([δθbi]×)(Rcbfci+pcb)=−∂δθbiRbcRwbjRbiw[Rcbfci+pcb]×δθbi=−RbcRwbjRbiw[Rcbfci+pcb]×
- 對j時刻位姿pbjw的求導:∂pbiw∂fcj=−RbcRwbj
- 對j時刻旋轉qbjw的求導:∂qbjw∂fcj=∂δθbi∂fcj=∂δθbi∂Rbc{(Rbjwexp([δθbi]×))−1[Rbiw(Rcbfci+pcb)+pbiw−pbjw]−pcb}=∂δθbi∂Rbcexp(−[δθbi]×)Rwbj[Rbiw(Rcbfci+pcb)+pbiw−pbjw]=∂δθbi∂Rbc{Rwbj[Rbiw(Rcbfci+pcb)+pbiw−pbjw]}×δθbi=Rbc{Rwbj[Rbiw(Rcbfci+pcb)+pbiw−pbjw]}×
- 對外參的旋轉qcb的求導:fcj=Rbc{Rwbj[Rbiw(Rcbfci+pcb)+pbiw−pbjw]−pcb}=RbcRwbjRbiwRcbfci+Rbc(Rwbj(Rbiwpcb+pbiw−pbjw)−pcb)=fcj1+fcj2 分成倆項分別求導,其中o2(δθcb)代表關於δθcb的二階項:∂qcb∂fcj1=∂δθcb∂fcj1=∂δθcb∂(Rcbexp([δθcb]×))−1RwbjRbiwRcbexp([δθcb]×)fci=∂δθcb∂exp(−[δθcb]×)RbcRwbjRbiwRcbexp([δθcb]×)fci≈∂δθcb∂(I−[δθcb]×)RbcRwbjRbiwRcb(I+[δθcb]×)fci=∂δθcb∂(−[δθcb]×)RbcRwbjRbiwRcbfci+RbcRwbjRbiwRcb([δθcb]×)fci+o2(δθcb)=∂δθcb∂[RbcRwbjRbiwRcbfci]×δθcb−RbcRwbjRbiwRcb[fci]×δθcb+o2(δθcb)=[RbcRwbjRbiwRcbfci]×−RbcRwbjRbiwRcb[fci]× ∂qcb∂fcj2=∂δθcb∂fcj2=∂δθcb∂(Rcbexp([δθcb]×))−1(Rwbj(Rbiwpcb+pbiw−pbjw)−pcb)=∂δθcb∂exp(−[δθcb]×)Rbc(Rwbj(Rbiwpcb+pbiw−pbjw)−pcb)≈∂δθcb∂(−[δθcb]×)Rbc(Rwbj(Rbiwpcb+pbiw−pbjw)−pcb)=∂δθcb∂[Rbc(Rwbj(Rbiwpcb+pbiw−pbjw)−pcb)]×δθcb=[Rbc(Rwbj(Rbiwpcb+pbiw−pbjw)−pcb)]× 故 ∂qcb∂fcj=∂qcb∂fcj1+∂qcb∂fcj2=[RbcRwbjRbiwRcbfci]×−RbcRwbjRbiwRcb[fci]×+[Rbc(Rwbj(Rbiwpcb+pbiw−pbjw)−pcb)]×
- 對逆深度λ的求導: ∂λ∂fcj=∂fci∂fcj∂λ∂fci=−RbcRwbjRbiwRcbλ21⎣⎡ucivci1⎦⎤=−RbcRwbjRbiwRcbλ21Pˉci
至此相機重投影誤差對各個狀態量的雅克比矩陣已經推導完畢,推導過程中規中矩,需要對哪個變量進行求導,則對其添加擾動。
4、協方差
視覺約束的協方差與標定相機內參時的重投影誤差有關。VINS在代碼中sqrt_info
取1.5個像素,對應到歸一化相機平面還需除以焦距f,最後得到的信息矩陣:(這裏真正的信息矩陣其實是sqrt_info的平方)
sqrt(Ωvis)=sqrt(Σvis−1)=(1.5/f I2×2)−1=f/1.5 I2×2
void Estimator::setParameter()
{
for (int i = 0; i < NUM_OF_CAM; i++)
{
tic[i] = TIC[i];
ric[i] = RIC[i];
}
f_manager.setRic(ric);
ProjectionFactor::sqrt_info = FOCAL_LENGTH / 1.5 * Matrix2d::Identity();
ProjectionTdFactor::sqrt_info = FOCAL_LENGTH / 1.5 * Matrix2d::Identity();
td = TD;
}
總結:
- 相機構建的殘差的特徵點逆深度在第i幀中初始化得到,在第j幀被觀察到,因此 i和j不一定是相鄰倆幀,而IMU的增量誤差一般爲相鄰時刻k和k+1的誤差。
- 對於IMU預積分增量誤差或者視覺重投影誤差對優化量的偏導,如果對位姿(四元數)求導,則用擾動模型進行推導,如果是其他狀態量,就直接對狀態量求偏導。
- IMU約束的協方差是從上一時刻通過遞推方程傳遞到當前時刻的,而視覺的協方差是獨立的,由當前時刻確定的常量。