1.前言
本博客主要介紹VINS-Mono初始化時相機與IMU對齊,主要包括相機到IMU的外參估計、陀螺儀偏置、相機位移和估計空間點的尺度、重力加速度、每幀速度,主要參考了深藍學院的VIO課程及博客VINS-Mono理論學習——視覺慣性聯合初始化與外參標定和崔華坤的《VINS 論文推導及代碼解析》。
總體而言,視覺IMU對齊流程主要包括以下幾部分:
- 若旋轉外參數qcb未知,則先估計旋轉外參數
- 利用旋轉約束估計陀螺儀偏置:qbkc0=qckc0⊗(qcb)−1
- 利用平移約束估計重力方向,速度,以及尺度初始值spˉbkc0=spˉckc0−Rbkc0pcb
- 對重力向量gc0進行進一步的優化
- 求解世界座標系w和初始相機座標系c0之間的旋轉矩陣qc0w,並將軌跡對齊到世界座標系中
2. 外參標定 (利用旋轉約束估計外參數旋轉qcb)
相鄰倆時刻k,k+1之間,k時刻的IMU到k+1時刻的相機外參旋轉矩陣有:Rck+1bk=Rbk+1bk⋅Rcb=Rcb∗Rck+1ck 轉換爲四元素有: qbk+1bk⊗qcb=qcb⊗qck+1ck 上式可寫爲:(L(qbk+1bk)−R(qck+1ck))qcb=Qk+1k⋅qcb=0
將多個時刻的上式方程累計起來,並加上魯棒核權重,可構建超定方程:⎣⎢⎢⎡w10⋅Q10w21⋅Q21⋯wNN−1⋅QNN−1⎦⎥⎥⎤qcb=QN⋅qcb=0(1) 其中:
wk+1k={1, rk+1k<thresholdrk+1kthreshold, otherwise 由旋轉和軸角之間的關係tr(R)=1+2cosθ,能得到角度誤差r的計算爲:rk+1k=acos((tr((Rbk+1bkR^cb)−1R^cbRck+1ck)−1)/2)=acos((tr(R^cb −1Rbk+1bk −1Rcb^Rck+1ck)−1)/2)
公式(1)的求解同樣採用SVD分解,即最下奇異值對應的奇異向量即爲IMU座標系到相機座標系的旋轉(四元素表示),具體代碼見initial_ex_rotation.cpp
函數 CalibrationExRotation()
對於tr(R)=1+2cosθ的推導如下:
旋轉矩陣和軸角的關係爲:R=cosθI+(1−cosθ)aaT−sinθ[a]× 其中a=[a1,a2,a3]T爲單位旋轉軸,θ爲繞着旋轉軸轉動的角度,[a]×=⎣⎡0a3−a2−a30a1a2−a10⎦⎤
同時,由於a爲單位旋轉軸,有tr(aaT)=1,故:
tr(R)=cosθ tr(I)+(1−cosθ)tr(aaT)+sinθ tr([a]×)=3cosθ+(1−cosθ)=1+2cosθ 同時也有Ra=a,即旋轉軸上在旋轉後並不發生變化,旋轉軸a爲旋轉矩陣R的特徵值爲1對應的特徵向量。
關於旋轉矩陣和軸角的關係可參考:https://en.wikipedia.org/wiki/Rotation_matrix
3. 視覺IMU聯合初始化
假如我們已經有一個初始的IMU到相機的外參(Rcb,pcb),同時又有不同時刻幀的位姿(Rckc0,pcb) (基於第一幀座標系下),那麼我們可以知道姿態從相機座標系到IMU座標系的關係:Tckc0=Tbkc0Tcb 則有:[Rckc00spˉckc01]=[Rbkc00spˉbkc01][Rcb0pcb1] 將式子展開有【論文公式(14)】:Rckc0=Rbkc0Rcb→Rbkc0=Rckc0(Rcb)−1 spˉckc0=Rbkc0pcb+spˉbkc0→spˉbkc0=spˉckc0−Rbkc0pcb(2)
視覺IMU聯合初始化中的視覺SFM位姿與IMU位姿的對齊主要在vins_estimator/src/initial/initial_aligment.cpp
中的VisualIMUAlignment()
函數中。
3.1 陀螺儀偏置的估計 (利用旋轉約束估計bw)
對於窗口的連續倆幀bk和bk+1,已經從SFM中得到了旋轉qbkc0和qbk+1c0,從IMU預積分中得到了相鄰幀的旋轉γ^bk+1bk。根絕約束方程,聯立所有相鄰幀,可以得到最小化代價函數【論文公式(15)】:
δbwmink∈B∑∥∥∥qbk+1c0 −1⊗qbkc0⊗γbk+1bk∥∥∥2(3) 其中B爲滑動窗口內的所有圖像幀,另外對預積分進行一階泰勒展開近似,即對其線性化:γbk+1bk≈γ^bk+1bk⊗[121Jbwγδbw](4) 由於在理想情況下,即當qbkc0 −1⊗qbk+1c0=γbk+1bk,這倆個旋轉的差異(qbkc0 −1⊗qbk+1c0)−1γbk+1bk的旋轉角度爲0,根據四元素的表示,可得虛部爲0,實部爲1:qbk+1c0 −1⊗qbkc0⊗γbk+1bk=[10] 則有:γbk+1bk=qbkc0 −1⊗qbk+1c0⊗[10](5) 將公式(4)代入公式(5),得:γ^bk+1bk⊗[121Jbwγδbw]=qbkc0 −1⊗qbk+1c0⊗[10] 當只考慮虛部(虛部爲三維向量)的時候,我們有:Jbwγδbw=2⌊γ^bk+1bk −1⊗qbkc0 −1⊗qbk+1c0⌋xyz 將左邊轉爲對稱矩陣,這樣就可以直接用LDLT對係數矩陣進行分解了:Jbwγ TJbwγδbw=2Jbwγ T⌊γ^bk+1bk −1⊗qbkc0 −1⊗qbk+1c0⌋xyz→Ax=b 求出陀螺儀的偏置bias後,需要對IMU預積分進行重新計算。
代碼見vins_estimator/initial/initial_aligment.cpp
中的solveGyroscopeBias
。
3.2 速度、重力和尺度初始化 (利用預積分約束估計vbkbk、gc0、s)
對於當前部分需要了估計的變量有:【論文式(16)】XI3(n+1)+3+1=[vb0b0,vb1b1,⋯,vbnbn,gc0,s] 其中,vbkbk表示k時刻(捕獲到圖像的時刻)IMU body座標系的速度在IMU body座標系的表示,gc0爲重力向量在第0幀相機座標系下的表示,s表示尺度因子,將視覺軌跡拉伸到米制單位。
在IMU預積分中我們已經推導過基於世界座標系w(東北天座標系)的預積分量約束:Rwbkpbk+1w=Rwbk(pbkw+vbkwΔtk−21gwΔtk2)+αbk+1bk Rwbkvbk+1w=Rwbk(vbkw−gwΔtk)+βbk+1bk 將世界座標系w 換成相機初始時刻座標系c0有: αbk+1bk=Rc0bk(s(pˉbk+1c0−pˉbkc0)+21gc0Δtk2−Rbkc0vbkbkΔtk) βbk+1bk=Rc0bk(Rbk+1c0vbk+1bk+1−Rbkc0vbkbk+gc0Δtk)
將論文式(14) (即本文公式(2)) 代入αbk+1bk有:δαbk+1bk=αbk+1bk−Rc0bk(spˉbk+1c0−spˉbkc0+21gc0Δtk2−Rbkc0vbkbkΔtk)=αbk+1bk−Rc0bk(spˉck+1c0−Rbk+1c0pcb−(spˉckc0−Rbkc0pcb)+21gc0Δtk2−Rbkc0vbkbkΔtk)=αbk+1bk−sRc0bk(pˉck+1c0−pˉckc0)+Rc0bkRbk+1c0pcb−pcb+vbkbkΔtk−21Rc0bkgc0Δtk2)=03×1 這裏vbkbk、gc0和s均爲待優化變量,將其轉成Ax=b的形式:
Rc0bk(pˉck+1c0−pˉckc0)s−vbkbkΔtk+21Rc0bkgc0Δtk2=αbk+1bk+Rc0bkRbk+1c0pcb−pcb(6) 對於βbk+1bk, 則有 δβbk+1bk=βbk+1bk−Rc0bk(Rbk+1c0vbk+1bk+1−Rbkc0vbkbk+gc0Δtk)=03×1 這裏的優化變量vbkbk、vbk+1bk+1、gc0,將其轉成Ax=b的形式:
Rc0bkRbk+1c0vbk+1bk+1−Rc0bkRbkc0vbkbk+Rc0bkgc0Δtk=βbk+1bk(7) 將公式(6)(7)寫出矩陣的形式:論文式【(18)(19)】
Hbk+1bkXI+nbk+1bk=[−IΔtk−I0Rc0bkRbk+1c021Rc0bkΔtk2Rc0bkΔtkRc0bk(pˉck+1c0−pˉckc0)0]6×10⎣⎢⎢⎢⎡vbkbkvbk+1bk+1gc0s⎦⎥⎥⎥⎤10×1+nbk+1bk=[αbk+1bk+Rc0bkRbk+1c0pcb−pcbβbk+1bk]6×1=z^bk+1bk(8)其中Rbkc0、Rbk+1c0、pˉbkc0、pˉckc0可從視覺的SFM獲得,Δtk爲相鄰倆幀圖像之間的時間間隔。
公式(8)轉換成線性最小二乘問題對狀態量進行求解:XImink∈B∑∣∣z^bk+1bk−Hbk+1bkXIk∣∣2 從矩陣角度來看,也看看做解方程 Hbk+1bkXIk=z^bk+1bk→Ax=b。
具體代碼見 vins_estimator/initial/initial_aligment.cpp
中的LinearAlignment()
.
3.3 優化重力向量gc0
爲什麼需要優化重力向量?
利用公式(8)求解的重力向量並沒有模長的限制,即∣∣gc0∣∣=9.81,因此重力向量gc0實際上只有倆個自由度。
採用球面座標,在切面空間上用兩個變量重新參數化重力,將其表示爲:gc0^=∣∣g∣∣⋅gˉ^c0+w1b1+w2b2=∣∣g∣∣⋅gˉ^c0+bw 其中gˉ^c0爲上一部分公式(8)得到的重力向量初始值的單位向量,w2×1=[w1,w2]爲待優化變量,b3×2=[b1,b2]中的b1,b2在∣∣g∣∣⋅gˉ^c0的正切平面上且正交,定義如下:b1={(gˉ^c0×[1,0,0]), gˉ^c0=[1,0,0]T(gˉ^c0×[1,0,0]), otherwise , b2=gˉ^c0×b1 因此優化變量將從gc0(三個自由度)變爲wc0(倆個自由度):
Hbk+1bkXI+nbk+1bk=[−IΔtk−I0Rc0bkRbk+1c021Rc0bkΔtk2bRc0bkΔtkbRc0bk(pˉck+1c0−pˉckc0)0]6×9⎣⎢⎢⎡vbkbkvbk+1bk+1ws⎦⎥⎥⎤9×1+nbk+1bk=[αbk+1bk+Rc0bkRbk+1c0pcb−pcb−21Rc0bkΔtk∣∣g∣∣⋅gˉ^c0βbk+1bk−Rc0bkΔtk∣∣g∣∣⋅gˉ^c0]6×1=z^bk+1bk(8)
採用最小二乘對待優化變量XI進行重新優化。
具體代碼見 vins_estimator/initial/initial_aligment.cpp
中的RefineGrivity()
.
3.4 對齊導航世界座標系
由於我們的求解都是在第一幀相機座標系c0的,因此需要計算Rc0w將所有c0座標系下的變量轉到世界座標系下,令
Rc0w=exp([θa]) 令g^c0爲重力細化後得到的c0座標系的重力向量,gw=[0,0,9.81]T爲世界座標系下的重力向量,故單位旋轉軸a爲: a=∣∣g^c0×g^w∣∣g^c0×g^w 旋轉角度θ爲:θ=atang^c0⋅g^wg^c0×g^w=atan∣∣g^c0∣∣⋅∣∣g^w∣∣cosθ∣∣g^c0∣∣⋅∣∣g^w∣∣sinθ
問題1: 加速度的偏置bat爲什麼沒有估計?
由於線性加速度的模型爲:a^t=at+bat+Rwtgw+na,由於有重力的作用,加速度偏置ba小Rwtgw幾個數量級,很難在初始化的時候估計重力向量的同時估計出加速度偏置,故沒必要初始化加速度偏置的初始值bat
問題2:平移外參數pcb爲何沒有初始化?
由於平移相比於旋轉而言,對於系統來說是線性的,因爲平移與其他變量量幾乎爲加法運算。同時,IMU與相機可能距離很近,因此在初始化過程沒有必要初始化pcb,而是留到非線性優化的時候。