0.引言
搬運工+自己閱讀代碼理解。
pipeline如圖:
本節則是閱讀總結IMU(100hz)-->IMU Pre-integration
部分。processIMU()函數、integration_base.h-->IntegrationBase類
。
1.IMU測量模型
忽略地球旋轉,IMU 測量方程爲:
a t = a t ( r e a l ) + b a t + R w t g w + n a w t = w t ( r e a l ) + b w t + n w (1)
\begin{array}{c}{a_{t}=a_{t(r e a l)}+b_{a_{t}}+R_{w}^{t} g^{w}+n_{a}} \\ {w_{t}=w_{t(r e a l)}+b_{w_{t}}+n_{w}}\end{array} \tag{1}
a t = a t ( r e a l ) + b a t + R w t g w + n a w t = w t ( r e a l ) + b w t + n w ( 1 ) 上標 g g g 表示gyro,a a a 表示acc,w w w 表示在世界座標系world,b b b 表示imu機體座標系body.imu的真實值爲 ω, a 測量值爲ω \omega ω 、a a a ;測量值爲ω ~ , a ~ \tilde{\omega}, \tilde{\mathbf{a}} ω ~ , a ~ 。
IMU 的測量信息是在body座標系(即 IMU 座標)中獲取
,假設噪聲n a n_{a} n a 和n w n_{w} n w 服從高斯分佈:
n a ∼ N ( 0 , σ a 2 ) n w ∼ N ( 0 , σ w 2 ) (2)
\begin{aligned} n_{a} & \sim N\left(0, \sigma_{a}^{2}\right) \\ n_{w} & \sim N\left(0, \sigma_{w}^{2}\right) \end{aligned} \tag{2}
n a n w ∼ N ( 0 , σ a 2 ) ∼ N ( 0 , σ w 2 ) ( 2 )
加速度偏置b a t b_{a_{t}} b a t 和陀螺儀偏置b w t b_{w_{t}} b w t 被建模爲隨機遊走:
b ˙ a i = n b a
\dot{b}_{a_{i}}=n_{b_{a}}
b ˙ a i = n b a b ˙ w i = n b w (3)
\dot{b}_{w_{i}}=n_{b_{w}}\tag{3}
b ˙ w i = n b w ( 3 ) 其中n b a n_{b_{a}} n b a 和n b w n_{b_{w}} n b w 服從高斯分佈:
n b a ∼ N ( 0 , σ b a 2 ) n b w ∼ N ( 0 , σ b w 2 ) (4) \begin{aligned} n_{b_{a}} & \sim N\left(0, \sigma_{b_{a}}^{2}\right) \\ n_{b_{w}} & \sim N\left(0, \sigma_{b_{w}}^{2}\right) \end{aligned}\tag{4} n b a n b w ∼ N ( 0 , σ b a 2 ) ∼ N ( 0 , σ b w 2 ) ( 4 )
既是其導數服從高斯分佈!
2.當前時刻 PVQ 的連續形式
對於連續兩個關鍵幀 b k b_{k} b k 和b k + 1 b_{k+1} b k + 1 ,它們對應的時刻分別爲 t k , t k + 1 t_{k}, t_{k+1} t k , t k + 1 。可以根據 [ t k , t k + 1 ] \left[t_{k}, t_{k+1}\right] [ t k , t k + 1 ] 時間間隔內 IMU 的測量值,對系統的位置、速度和旋轉等狀態進行傳播(注意這裏的四元數採用了實部在後,虛部在前的形式):
p b k + 1 w = p b k w + v b k w Δ t k + ∬ t ∈ [ t k , t k + 1 ] ( R t w ( a t − b a i − n a ) − g w ) d t 2 (5) p_{b_{k+1}}^{w}=p_{b_{k}}^{w}+v_{b_{k}}^{w} \Delta t_{k}+\iint_{t \in\left[t_{k}, t_{k+1}\right]}\left(R_{t}^{w}\left(a_{t}-b_{a_{i}}-n_{a}\right)-g^{w}\right) d t^{2}\tag{5} p b k + 1 w = p b k w + v b k w Δ t k + ∬ t ∈ [ t k , t k + 1 ] ( R t w ( a t − b a i − n a ) − g w ) d t 2 ( 5 ) v b k + 1 w = v b k w + ∫ t ∈ [ t k , t k + 1 ] ( R t w ( a t − b a i − n a ) − g w ) d t (6)
v_{b_{k+1}}^{w}=v_{b_{k}}^{w}+\int_{t \in\left[t_{k}, t_{k+1}\right]}\left(R_{t}^{w}\left(a_{t}-b_{a_{i}}-n_{a}\right)-g^{w}\right) d t
\tag{6} v b k + 1 w = v b k w + ∫ t ∈ [ t k , t k + 1 ] ( R t w ( a t − b a i − n a ) − g w ) d t ( 6 ) q b k + 1 w = q b k w ⊗ ∫ t ∈ [ t k , t k + 1 ] 1 2 q t b k ⊗ ( w t − b w i − n w ) d t
q_{b_{k+1}}^{w}=q_{b_{k}}^{w} \otimes \int_{t \in\left[t_{k}, t_{k+1}\right]} \frac{1}{2} q_{t}^{b_{k}} \otimes\left(w_{t}-b_{w_{i}}-n_{w}\right) d t
q b k + 1 w = q b k w ⊗ ∫ t ∈ [ t k , t k + 1 ] 2 1 q t b k ⊗ ( w t − b w i − n w ) d t = q b k w ⊗ ∫ t ∈ [ t k , t k + 1 ] 1 2 Ω ( w t − b w t − n w ) q t b k d t (7)
=q_{b_{k}}^{w} \otimes \int_{t \in\left[t_{k}, t_{k+1}\right]} \frac{1}{2} \Omega\left(w_{t}-b_{w_{t}}-n_{w}\right) q_{t}^{b_{k}} d t
\tag{7} = q b k w ⊗ ∫ t ∈ [ t k , t k + 1 ] 2 1 Ω ( w t − b w t − n w ) q t b k d t ( 7 ) 其中:Ω ( w ) = [ − [ w ] × w − w T 0 ] , [ w ] × = [ 0 − w z w y w z 0 − w x − w y w x 0 ] (8)
\Omega(w)=\left[\begin{array}{cc}{-[w]_{ \times}} & {w} \\ {-w^{T}} & {0}\end{array}\right],[w]_{ \times}=\left[\begin{array}{ccc}{0} & {-w_{z}} & {w_{y}} \\ {w_{z}} & {0} & {-w_{x}} \\ {-w_{y}} & {w_{x}} & {0}\end{array}\right]
\tag{8} Ω ( w ) = [ − [ w ] × − w T w 0 ] , [ w ] × = ⎣ ⎡ 0 w z − w y − w z 0 w x w y − w x 0 ⎦ ⎤ ( 8 ) Δ t k \Delta t_{k} Δ t k 是[ t k , t k + 1 ] \left[t_{k}, t_{k+1}\right] [ t k , t k + 1 ] 之間的時間間隔,R t w R_{t}^{w} R t w 爲 t t t 時刻從body座標系到世界座標系的旋轉矩陣,q t b k q_{t}^{b_{k}} q t b k 爲用四元數表示的 t t t 時刻從body座標系到世界座標系的旋轉。a t , w t a_t,w_t a t , w t 爲 IMU 測量的加速度和角速度,是在 Body 自身座標系,world 座標系是IMU 所在的慣導系。
3.當前時刻 PVQ 的中值法離散形式
前面給出的是連續時刻的相機當前 PVQ 的迭代公式,基於中值法的公式 , 即從第 i 個 IMU 時刻 到第 i+1 個 IMU 時刻的積分過程 ,這與Estimator::processIMU()函數
中的 Ps[j]、Rs[j]
和 Vs[j]
是一致的(代碼中的 j
時刻即爲此處的i+1
),IMU 積分出來的第 j
時刻的物理量可以作爲第 j
幀圖像的初始值。
p b i + 1 w = p b i w + v b i w δ t + 1 2 a ‾ i δ t 2 (9)
p_{b_{i+1}}^{w}=p_{b_{i}}^{w}+v_{b_{i}}^{w} \delta t+\frac{1}{2} \overline{{a}}_{i} \delta t^{2}
\tag{9} p b i + 1 w = p b i w + v b i w δ t + 2 1 a i δ t 2 ( 9 ) v b i + 1 w = v b i w + a ‾ i δ t (10)
v_{b_{i+1}}^{w}=v_{b_{i}}^{w}+\overline{{a}}_{i} \delta t\tag{10}
v b i + 1 w = v b i w + a i δ t ( 1 0 ) q b i + 1 w = q b i w ⊗ [ 1 2 ω ‾ i δ t ] (11)
q_{b_{i+1}}^{w}=q_{b_{i}}^{w} \otimes\left[\frac{1}{2} \overline{{\omega}}_{i} \delta t\right]\tag{11}
q b i + 1 w = q b i w ⊗ [ 2 1 ω i δ t ] ( 1 1 ) 其中:a ‾ i = 1 2 [ q i ( a i − b a i ) − g w + q i + 1 ( a i + 1 − b a i ) − g w ] (12)
\overline{{a}}_{i}=\frac{1}{2}\left[q_{i}\left({a}_{i}-b_{a_{i}}\right)-g^{w}+q_{i+1}\left({a}_{i+1}-b_{a_{i}}\right)-g^{w}\right]\tag{12}
a i = 2 1 [ q i ( a i − b a i ) − g w + q i + 1 ( a i + 1 − b a i ) − g w ] ( 1 2 ) ω ‾ i = 1 2 ( ω i + ω i + 1 ) − b ω i (13)
\overline{{\omega}}_{i}=\frac{1}{2}\left({\omega}_{i}+{\omega}_{i+1}\right)-b_{\omega_{i}}\tag{13}
ω i = 2 1 ( ω i + ω i + 1 ) − b ω i ( 1 3 )
與代碼中Estimator::processIMU()
:一一對應
~ ~ ~
int j = frame_count;
Vector3d un_acc_0 = Rs[j] * (acc_0 - Bas[j]) - g;
Vector3d un_gyr = 0.5 * (gyr_0 + angular_velocity) - Bgs[j];
Rs[j] *= Utility::deltaQ(un_gyr * dt).toRotationMatrix();
Vector3d un_acc_1 = Rs[j] * (linear_acceleration - Bas[j]) - g;
Vector3d un_acc = 0.5 * (un_acc_0 + un_acc_1);
Ps[j] += dt * Vs[j] + 0.5 * dt * dt * un_acc;
Vs[j] += dt * un_acc;
若採用歐拉積分,其中:
a = q w b k ( a b k − ( b k a ) − g w (14)
\mathbf{a}=\mathbf{q}_{w b_{k}}\left(\mathbf{a}^{b_{k}}-\left(\mathbf{b}_{k}^{a}\right)-\mathbf{g}^{w}\right.\tag{14}
a = q w b k ( a b k − ( b k a ) − g w ( 1 4 ) ω = ω b k − b k g (15)
\omega=\omega^{b_{k}}-\mathbf{b}_{k}^{g} \tag{15}
ω = ω b k − b k g ( 1 5 ) 這兩個等式表達式表達與上面不統一,不影響理解。
4.兩幀之間 PVQ 增量的連續形式
IMU的數據頻率一般遠高於視覺,在視覺兩幀k,k+1之間通常會有>10組IMU數據。IMU的數據通過積分,可以獲取當前位姿(p位置,q四元數表達的姿態)、瞬時速度等參數。
在VIO中,如果參考世界座標系對IMU進行積分,積分項中包含相對於世界座標系的瞬時旋轉矩陣,這樣有幾個問題:
相對世界座標系的旋轉矩陣有drift,如果一直以其爲基準進行積分,必然造成積分誤差累積;
在進行優化位姿調整時(通常是調整視覺KeyFrame的pose),相對於世界座標系的pose會變化,因而優化後的瞬時旋轉矩陣和積分時不同,那麼積分自然也就存在問題;
一般這個旋轉矩陣不知道。。。
因此,一般的預積分的參考座標系爲k幀的IMU參考系,這樣可以解決以上問題:
相對k幀的IMU進行積分,不會有累積誤差;
即使後面調整了位姿,相對位置不變,因此預積分不存在問題;
這個旋轉矩陣爲單位矩陣E,後面每出現一個IMU數據,都可以用任何一種數值積分的方法計算;同時可以將重力加速度提取到積分號外面不參加積分,相當於在重力參考系中積分,計算量也會減少。
注意這裏是求的增量,即是在窗口優化過程中的產生的變化Δ \Delta Δ .優化狀態向量包括滑動窗口內的所有相機狀態(位置P、旋轉Q、速度V、加速度偏置ba、陀螺儀偏置bw)、相機到IMU的外參、所有3D點的逆深度:
X = [ x 0 , x 1 , ⋯ x n , x c b , λ 0 , λ 1 , ⋯ λ m ]
\mathcal{X}=\left[\mathbf{x}_{0}, \mathbf{x}_{1}, \cdots \mathbf{x}_{n}, \mathbf{x}_{c}^{b}, \lambda_{0}, \lambda_{1}, \cdots \lambda_{m}\right]
X = [ x 0 , x 1 , ⋯ x n , x c b , λ 0 , λ 1 , ⋯ λ m ] x k = [ p b k w , v b k w , q b k w , b a , b g ] , k ∈ [ 0 , n ]
\mathbf{x}_{k}=\left[\mathbf{p}_{b_{k}}^{w}, \mathbf{v}_{b_{k}}^{w}, \mathbf{q}_{b_{k}}^{w}, \mathbf{b}_{a}, \mathbf{b}_{g}\right], k \in[0, n]
x k = [ p b k w , v b k w , q b k w , b a , b g ] , k ∈ [ 0 , n ] x c b = [ p c b , q c b ]
\mathbf{x}_{c}^{b}=\left[\mathbf{p}_{c}^{b}, \mathbf{q}_{c}^{b}\right]
x c b = [ p c b , q c b ]
故q b k w \mathbf{q}_{b_{k}}^{w} q b k w 隨着優化是在改變的,導致公式(5)(6)(7)的積分隨着優化需重複計算,耗時耗力,故將積分項轉換到body座標系計算,減少重複。
. 通過公式(5)(6)(7)可知,IMU 的預積分需要依賴與第 k 幀的 v 和 R,當我們在後端進行非線性優化時,需要迭代更新第 k 幀的 v 和 R,這將導致我們需要根據每次迭代後值重新進行積分,這將非常耗時。因此,我們考慮將優化變量從第 k 幀到第 k+1 幀的 IMU 預積分項b中分離開來,通過對公式(1)左右兩側各乘R w b k R_{w}^{b_{k}} R w b k ,可化簡爲:
從積分式可以看出,系統位置、速度和旋轉等狀態的傳播需要關鍵幀b k b_{k} b k 時刻的位置p b k w p_{b_{k}}^{w} p b k w 、速度ν b k w \nu_{b_{k}}^{w} ν b k w 和旋轉q b k w q_{b_{k}}^{w} q b k w ,當這些起始狀態發生改變時,就需要按照上訴積分式重新進行狀態傳播。在基於優化的算法中,每個關鍵幀時刻的狀態需要頻繁調整,所以就需要頻繁地重新積分,這樣會浪費大量的計算資源。IMU 預積分就是爲了避免這種計算資源上的浪費。考慮將優化變量從第 k 幀到第 k+1 幀的 IMU 預積分項中分離開來,通過對公式(5)(6)(7)左右兩側各乘R w b k R_{w}^{b_{k}} R w b k ,可化簡爲公式(16)(17)(18)(19)(20)(21).
IMU 預積分的思路簡單來說,就是將參考座標系從世界座標系 w w w 調整爲第 k k k 個關鍵幀時刻的body座標系 b k b_k b k :
R w b k p b k + 1 w = R w b k ( p b k w + v b k w Δ t k − 1 2 g w Δ t k 2 ) + α b k + 1 b k (16)
R_{w}^{b_{k}} p_{b_{k+1}}^{w}=R_{w}^{b_{k}}\left(p_{b_{k}}^{w}+v_{b_{k}}^{w} \Delta t_{k}-\frac{1}{2} g^{w} \Delta t_{k}^{2}\right)+\alpha_{b_{k+1}}^{b_{k}}
\tag{16} R w b k p b k + 1 w = R w b k ( p b k w + v b k w Δ t k − 2 1 g w Δ t k 2 ) + α b k + 1 b k ( 1 6 ) R w b k v b k + 1 w = R w b k ( v b k w − g w Δ t k ) + β b k + 1 b k (17)
R_{w}^{b_{k}} v_{b_{k+1}}^{w}=R_{w}^{b_{k}}\left(v_{b_{k}}^{w}-g^{w} \Delta t_{k}\right)+\beta_{b_{k+1}}^{b_{k}}
\tag{17} R w b k v b k + 1 w = R w b k ( v b k w − g w Δ t k ) + β b k + 1 b k ( 1 7 ) q w b k ⊗ q b k + 1 w = γ b k + 1 b k (18)
q_{w}^{b_{k}} \otimes q_{b_{k+1}}^{w}=\gamma_{b_{k+1}}^{b_{k}}
\tag{18} q w b k ⊗ q b k + 1 w = γ b k + 1 b k ( 1 8 ) 其中:
α b k + 1 b k = ∬ t ∈ [ t k , t k + 1 ] ( R t b k ( a t − b a i − n a ) ) d t 2 (19)
\alpha_{b_{k+1}}^{b_{k}}=\iint_{t \in\left[t_{k}, t_{k+1}\right]}\left(R_{t}^{b_{k}}\left(a_{t}-b_{a_{i}}-n_{a}\right)\right) d t^{2}
\tag{19} α b k + 1 b k = ∬ t ∈ [ t k , t k + 1 ] ( R t b k ( a t − b a i − n a ) ) d t 2 ( 1 9 ) β b k + 1 b k = ∫ t ∈ [ t k , t k + 1 ] ( R t b k ( a t − b a t − n a ) ) d t (20)
\beta_{b_{k+1}}^{b_{k}}=\int_{t \in\left[t_{k}, t_{k+1}\right]}\left(R_{t}^{b_{k}}\left(a_{t}-b_{a_{t}}-n_{a}\right)\right) d t
\tag{20} β b k + 1 b k = ∫ t ∈ [ t k , t k + 1 ] ( R t b k ( a t − b a t − n a ) ) d t ( 2 0 ) γ b k + 1 b k = ∫ t ∈ [ t k , t k + 1 ] 1 2 Ω ( w t − b w i − n w ) γ t b k d t (21)
\gamma_{b_{k+1}}^{b_{k}}=\int_{t \in\left[t_{k}, t_{k+1}\right]} \frac{1}{2} \Omega\left(w_{t}-b_{w_{i}}-n_{w}\right) \gamma_{t}^{b_{k}} d t
\tag{21} γ b k + 1 b k = ∫ t ∈ [ t k , t k + 1 ] 2 1 Ω ( w t − b w i − n w ) γ t b k d t ( 2 1 ) 新的積分項(12.13.14)中參考座標系變成了b k b_{k} b k ,可以理解爲這時的積分結果爲b k + 1 b_{k+1} b k + 1 對於b k b_{k} b k 的相對運動量,即使在優化過程中對關鍵幀的位置、速度和旋轉等狀態進行調整,也不對新的積分項產生任何影響,從而避免了重複積分。(從world系轉換爲body系)
這裏需要重新討論下公式(19)~(21)的預積分公式,以α b k + 1 b k {\alpha}_{b_{k+1}}^{b_{k}} α b k + 1 b k 爲例,發現它是與 IMU 的bias 相關的,而 bias 也是我們需要優化的變量,這將導致的問題是,當每次迭代時,我們得到一個新的 bias,又得根據公式中重新對第 k 幀和第 k+1 幀之間的 IMU 預積分,非常耗時。這裏假設預積分的變化量與 bias 是線性關係,可以寫成:
α b k + 1 b k ≈ α ^ b k + 1 b k + J b a α δ b a + J b ω α δ b ω
\alpha_{b_{k+1}}^{b_{k}} \approx \hat{\alpha}_{b_{k+1}}^{b_{k}}+J_{b_{a}}^{\alpha} \delta b_{a}+J_{b_{\omega}}^{\alpha} \delta b_{\omega}
α b k + 1 b k ≈ α ^ b k + 1 b k + J b a α δ b a + J b ω α δ b ω β b k + 1 b k ≈ β ^ b k + 1 b k + J b a β δ b a + J b ω β δ b ω (22)
\beta_{b_{k+1}}^{b_{k}} \approx \hat{\beta}_{b_{k+1}}^{b_{k}}+J_{b_{a}}^{\beta} \delta b_{a}+J_{b_{\omega}}^{\beta} \delta b_{\omega}\tag{22}
β b k + 1 b k ≈ β ^ b k + 1 b k + J b a β δ b a + J b ω β δ b ω ( 2 2 ) γ b k + 1 b k ≈ γ ^ b k + 1 b k ⊗ [ 1 1 2 J b ω γ δ b ω ]
\gamma_{b_{k+1}}^{b_{k}} \approx \hat{\gamma}_{b_{k+1}}^{b_{k}} \otimes\left[\begin{array}{c}{1} \\ {\frac{1}{2} J_{b_{\omega}}^{\gamma} \delta b_{\omega}}\end{array}\right]
γ b k + 1 b k ≈ γ ^ b k + 1 b k ⊗ [ 1 2 1 J b ω γ δ b ω ] 其中的Jacobi矩陣後面講。
5.兩幀之間 PVQ 增量的離散形式
歐拉法:
下面給出離散時刻的 IMU 預積分公式,首先按照論文中採用的歐拉法,給出第 i 個 IMU時刻與第 i+1 個 IMU 時刻的變量關係爲:
α ^ i + 1 b k = α ^ i b k + β ^ i b k δ t + 1 2 R ( γ ^ i b k ) ( a ^ i − b a i ) δ t 2
\hat{\alpha}_{i+1}^{b_{k}}=\hat{\alpha}_{i}^{b_{k}}+\hat{\beta}_{i}^{b_{k}} \delta t+\frac{1}{2} R\left(\hat{\gamma}_{i}^{b_{k}}\right)\left(\hat{a}_{i}-b_{a_{i}}\right) \delta t^{2}
α ^ i + 1 b k = α ^ i b k + β ^ i b k δ t + 2 1 R ( γ ^ i b k ) ( a ^ i − b a i ) δ t 2 β ^ i + 1 b k = β ^ i b k + R ( γ ^ i b k ) ( a ^ i − b a i ) δ t (23)
\hat{\beta}_{i+1}^{b_{k}}=\hat{\beta}_{i}^{b_{k}}+R\left(\hat{\gamma}_{i}^{b_{k}}\right)\left(\hat{a}_{i}-b_{a_{i}}\right) \delta t
\tag{23} β ^ i + 1 b k = β ^ i b k + R ( γ ^ i b k ) ( a ^ i − b a i ) δ t ( 2 3 ) γ ^ i + 1 b k = γ ^ i b k ⊗ γ ^ i + 1 i = γ ^ i b k ⊗ [ 1 1 2 ( ω ^ i − b ω i ) δ t ]
\hat{\gamma}_{i+1}^{b_{k}}=\hat{\gamma}_{i}^{b_{k}} \otimes \hat{\gamma}_{i+1}^{i}=\hat{\gamma}_{i}^{b_{k}} \otimes\left[\begin{array}{c}{1} \\ {\frac{1}{2}\left(\widehat{\omega}_{i}-b_{\omega_{i}}\right) \delta t}\end{array}\right]
γ ^ i + 1 b k = γ ^ i b k ⊗ γ ^ i + 1 i = γ ^ i b k ⊗ [ 1 2 1 ( ω i − b ω i ) δ t ]
中值法:
代碼中採用的基於中值法的 IMU 預積分公式,這與 Estimator::processIMU()
函數中的 IntegrationBase::push_back()
上是一致的。特別注意這裏跟公式(9)~(13)是不一樣的,這裏積分出來的是前後兩幀之間的 IMU 增量信息,而公式(9)~(13)給出的當前幀時刻的物理量信息。這裏相當於在求解優化過程中產生的增量,計算的是增量值。
α ^ i + 1 b k = α ^ i b k + β ^ i b k δ t + 1 2 a ^ ‾ i ′ δ t 2
\widehat{\alpha}_{i+1}^{b_{k}}=\widehat{\alpha}_{i}^{b_{k}}+\hat{\beta}_{i}^{b_{k}} \delta t+\frac{1}{2} \overline{\widehat{a}}_{i}^{\prime} \delta t^{2}
α i + 1 b k = α i b k + β ^ i b k δ t + 2 1 a i ′ δ t 2 β ^ i + 1 b k = β ^ i b k + a ^ ‾ i ′ δ t (24)
\hat{\beta}_{i+1}^{b_{k}}=\hat{\beta}_{i}^{b_{k}}+\overline{\widehat{a}}_{i}^{\prime} \delta t
\tag{24} β ^ i + 1 b k = β ^ i b k + a i ′ δ t ( 2 4 ) γ ^ i + 1 b k = γ ^ i b k ⊗ γ ^ i + 1 i = γ ^ i b k ⊗ [ 1 1 2 ω ‾ i ′ δ t ]
\hat{\gamma}_{i+1}^{b_{k}}=\hat{\gamma}_{i}^{b_{k}} \otimes \hat{\gamma}_{i+1}^{i}=\hat{\gamma}_{i}^{b_{k}} \otimes\left[\begin{array}{c}{1} \\ {\frac{1}{2} \overline{\omega}_{i}^{\prime} \delta t}\end{array}\right]
γ ^ i + 1 b k = γ ^ i b k ⊗ γ ^ i + 1 i = γ ^ i b k ⊗ [ 1 2 1 ω i ′ δ t ] 其中:a ^ ‾ i ′ = 1 2 [ q i ( a ^ i − b a i ) + q i + 1 ( a ^ i + 1 − b a i ) ]
\overline{\hat{a}}_{i}^{\prime}=\frac{1}{2}\left[q_{i}\left(\hat{a}_{i}-b_{a_{i}}\right)+q_{i+1}\left(\hat{a}_{i+1}-b_{a_{i}}\right)\right]
a ^ i ′ = 2 1 [ q i ( a ^ i − b a i ) + q i + 1 ( a ^ i + 1 − b a i ) ] ω ^ ‾ i ′ = 1 2 ( ω ^ i + ω ^ i + 1 ) − b ω i (25)
\overline{\widehat{\omega}}_{i}^{\prime}=\frac{1}{2}\left(\widehat{\omega}_{i}+\widehat{\omega}_{i+1}\right)-b_{\omega_{i}}\tag{25}
ω i ′ = 2 1 ( ω i + ω i + 1 ) − b ω i ( 2 5 )
對應代碼integration_base.h--> midPointIntegration()
:
Vector3d un_acc_0 = delta_q * (_acc_0 - linearized_ba);
Vector3d un_gyr = 0.5 * (_gyr_0 + _gyr_1) - linearized_bg;
result_delta_q = delta_q * Quaterniond(1, un_gyr(0) * _dt / 2, un_gyr(1) * _dt / 2, un_gyr(2) * _dt / 2);
Vector3d un_acc_1 = result_delta_q * (_acc_1 - linearized_ba);
Vector3d un_acc = 0.5 * (un_acc_0 + un_acc_1);
result_delta_p = delta_p + delta_v * _dt + 0.5 * un_acc * _dt * _dt;
result_delta_v = delta_v + un_acc * _dt;
result_linearized_ba = linearized_ba;
result_linearized_bg = linearized_bg;
6.連續形式下 PVQ 增量的誤差、協方差及 Jacobian
. 目前已經完成了IMU預積分測量值的梳理,而要將IMU預積分運用到非線性優化中,需要建立線性高斯誤差狀態遞推方程,由線性高斯系統的協方差,推導方程協方差矩陣,並求解對應的雅可比矩陣。
IMU 在每一個時刻積分出來的值都有誤差,下面對誤差進行分析。預積分誤差:
一段時間內 IMU 構建的預積分量作爲測量值,對兩時刻之間的狀態量進行約束,
[ r p r q r v r b a r b g ] 15 × 1 = \left[\begin{array}{l}{\mathbf{r}_{p}} \\ {\mathbf{r}_{q}} \\ {\mathbf{r}_{v}} \\ {\mathbf{r}_{b a}} \\ {\mathbf{r}_{b g}}\end{array}\right]_{15 \times 1}= ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ r p r q r v r b a r b g ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ 1 5 × 1 = [ q b i w ( p w b j − p w b i − v i w Δ t + 1 2 g w Δ t 2 ) − α b i b j 2 [ q b j b i ⊗ ( q b i w ⊗ q w b j ) ] x y z q b i w ( v j w − v i w + g w Δ t ) − β b i b j b j a − b i a b j g − b i g ] \left[\begin{array}{c}{\mathbf{q}_{b_{i} w}\left(\mathbf{p}_{w b_{j}}-\mathbf{p}_{w b_{i}}-\mathbf{v}_{i}^{w} \Delta t+\frac{1}{2} \mathbf{g}^{w} \Delta t^{2}\right)-\boldsymbol{\alpha}_{b_{i} b_{j}}} \\ {2\left[\mathbf{q}_{b_{j}} b_{i} \otimes\left(\mathbf{q}_{b_{i} w} \otimes \mathbf{q}_{w b_{j}}\right)\right]_{x y z}} \\ {\mathbf{q}_{b_{i} w}\left(\mathbf{v}_{j}^{w}-\mathbf{v}_{i}^{w}+\mathbf{g}^{w} \Delta t\right)-\boldsymbol{\beta}_{b_{i} b_{j}}} \\ {\mathbf{b}_{j}^{a}-\mathbf{b}_{i}^{a}} \\ {\mathbf{b}_{j}^{g}-\mathbf{b}_{i}^{g}}\end{array}\right] ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ q b i w ( p w b j − p w b i − v i w Δ t + 2 1 g w Δ t 2 ) − α b i b j 2 [ q b j b i ⊗ ( q b i w ⊗ q w b j ) ] x y z q b i w ( v j w − v i w + g w Δ t ) − β b i b j b j a − b i a b j g − b i g ⎦ ⎥ ⎥ ⎥ ⎥ ⎤
上面誤差中位移,速度,偏置都是直接相減得到。第二項是關於四元數的旋轉誤差,其中[ ⋅ ] x y z [\cdot]_{x y z} [ ⋅ ] x y z 表示只取四元數的虛部( x , y , z ) (x, y, z) ( x , y , z ) 組成的三維向量。
問題的提出:一個 IMU 數據作爲測量值的噪聲方差我們能夠標定。現在,一段時間內多個 IMU 數據積分形成的預積分量的方差呢?由高斯分佈的線性組合性質:
y = A x , x ∈ N ( 0 , Σ x ) \mathbf{y}=\mathbf{A} \mathbf{x}, \mathbf{x} \in \mathcal{N}\left(0, \boldsymbol{\Sigma}_{x}\right) y = A x , x ∈ N ( 0 , Σ x ) 則有:
Σ y = A Σ x A ⊤ \boldsymbol{\Sigma}_{y}=A \boldsymbol{\Sigma}_{x} A^{\top} Σ y = A Σ x A ⊤
所以,要推導預積分量的協方差,我們需要知道 imu 噪聲和預積分量之間的線性遞推關係。類似於狀態轉移,回顧一下之前的卡爾曼濾波 .
假設已知了相鄰時刻誤差的線性傳遞方程:
η i k = F k − 1 η i k − 1 + G k − 1 n k − 1
\boldsymbol{\eta}_{i k}=\mathbf{F}_{k-1} \boldsymbol{\eta}_{i k-1}+\mathbf{G}_{k-1} \mathbf{n}_{k-1}
η i k = F k − 1 η i k − 1 + G k − 1 n k − 1 比如:狀態量誤差爲η i k = [ δ θ i k , δ v i k , δ p i k ] \boldsymbol{\eta}_{i k}=\left[\delta \boldsymbol{\theta}_{i k}, \delta \mathbf{v}_{i k}, \delta \mathbf{p}_{i k}\right] η i k = [ δ θ i k , δ v i k , δ p i k ] 測量噪聲爲n k = [ n k g , n k a ] \mathbf{n}_{k}=\left[\mathbf{n}_{k}^{g}, \mathbf{n}_{k}^{a}\right] n k = [ n k g , n k a ] .誤差的傳遞由兩部分組成
:當前時刻的誤差傳遞給下一時刻,當前時刻測量噪聲傳遞給下一時刻。
協方差矩陣可以通過遞推計算得到:
Σ i k = F k − 1 Σ i k − 1 F k − 1 ⊤ + G k − 1 Σ n G k − 1 ⊤
\boldsymbol{\Sigma}_{i k}=\mathbf{F}_{k-1} \boldsymbol{\Sigma}_{i k-1} \mathbf{F}_{k-1}^{\top}+\mathbf{G}_{k-1} \mathbf{\Sigma}_{\mathbf{n}} \mathbf{G}_{k-1}^{\top}
Σ i k = F k − 1 Σ i k − 1 F k − 1 ⊤ + G k − 1 Σ n G k − 1 ⊤ 其中,Σ n \boldsymbol{\Sigma}_{\mathbf{n}} Σ n 是測量噪聲的協方差矩陣,方差從 i 時刻開始進行遞推,Σ i i = 0 \boldsymbol{\Sigma}_{i i}=\mathbf{0} Σ i i = 0 。
6.1.基於誤差隨時間變化的遞推方程
此處藉助卡爾曼濾波過程理解。
通常對於狀態量之間的遞推關係是非線性的方程如x k = f ( x k − 1 , u k − 1 ) \mathbf{x}_{k}=f\left(\mathbf{x}_{k-1}, \mathbf{u}_{k-1}\right) x k = f ( x k − 1 , u k − 1 ) ,其中狀態量爲 x,u 爲系統的輸入量。可以用兩種方法來推導狀態誤差傳遞的線性遞推關係:
一種是基於一階泰勒展開的誤差遞推方程。
一種是基於誤差隨時間變化的遞推方程。
非線性系統x k = f ( x k − 1 , u k − 1 ) \mathbf{x}_{k}=f\left(\mathbf{x}_{k-1}, \mathbf{u}_{k-1}\right) x k = f ( x k − 1 , u k − 1 ) 的狀態誤差的線性遞推關係如下:
δ x k = F δ x k − 1 + G n k − 1 (26)
\delta \mathbf{x}_{k}=\mathbf{F} \delta \mathbf{x}_{k-1}+\mathbf{G} \mathbf{n}_{k-1}
\tag{26} δ x k = F δ x k − 1 + G n k − 1 ( 2 6 ) 基於泰勒展開的誤差傳遞應用於 EKF 的協方差預測。論文中採用基於誤差隨時間變化的遞推方程。如果我們能夠推導狀態誤差隨時間變化的導數關係,比如:
δ x ˙ = A δ x + B n
\dot{\delta \mathbf{x}}=\mathbf{A} \delta \mathbf{x}+\mathbf{B} \mathbf{n}
δ x ˙ = A δ x + B n 則誤差狀態的傳遞方程爲:
δ x k = δ x k − 1 + δ ˙ x k − 1 Δ t → δ x k = ( I + A Δ t ) δ x k − 1 + B Δ t n k − 1
\begin{aligned} \delta \mathbf{x}_{k} &=\delta \mathbf{x}_{k-1}+\dot{\delta} \mathbf{x}_{k-1} \Delta t \\ \rightarrow \delta \mathbf{x}_{k} &=(\mathbf{I}+\mathbf{A} \Delta t) \delta \mathbf{x}_{k-1}+\mathbf{B} \Delta t \mathbf{n}_{k-1} \end{aligned}
δ x k → δ x k = δ x k − 1 + δ ˙ x k − 1 Δ t = ( I + A Δ t ) δ x k − 1 + B Δ t n k − 1 可以看出有等式(26)中:
F = I + A Δ t , G = B Δ t
\mathbf{F}=\mathbf{I}+\mathbf{A} \Delta t, \mathbf{G}=\mathbf{B} \Delta t
F = I + A Δ t , G = B Δ t
回顧一下預積分的誤差遞推公式,將測量噪聲也考慮進模型:
q b i b k + 1 = q b i b k ⊗ [ 1 1 2 ω δ t ]
\mathbf{q}_{b_{i} b_{k+1}}=\mathbf{q}_{b_{i} b_{k}} \otimes\left[\begin{array}{c}{1} \\ {\frac{1}{2} \omega \delta t}\end{array}\right]
q b i b k + 1 = q b i b k ⊗ [ 1 2 1 ω δ t ] α b i b k + 1 = α b i b k + β b i b k δ t + 1 2 a δ t 2
\boldsymbol{\alpha}_{b_{i} b_{k+1}}=\boldsymbol{\alpha}_{b_{i} b_{k}}+\beta_{b_{i} b_{k}} \delta t+\frac{1}{2} \mathbf{a} \delta t^{2}
α b i b k + 1 = α b i b k + β b i b k δ t + 2 1 a δ t 2 β b i b k + 1 = β b i b k + a δ t
\beta_{b_{i} b_{k+1}}=\beta_{b_{i} b_{k}}+\mathbf{a} \delta t
β b i b k + 1 = β b i b k + a δ t b k + 1 a = b k a + n b k a δ t b k + 1 g = b k g + n b k g δ t
\begin{aligned} \mathbf{b}_{k+1}^{a} &=\mathbf{b}_{k}^{a}+\mathbf{n}_{\mathbf{b}_{k}^{a}} \delta t \\ \mathbf{b}_{k+1}^{g} &=\mathbf{b}_{k}^{g}+\mathbf{n}_{\mathbf{b}_{k}^{g}} \delta t \end{aligned}
b k + 1 a b k + 1 g = b k a + n b k a δ t = b k g + n b k g δ t 其中:
ω = 1 2 ( ( ω b k + n k g − b k g ) + ( ω b k + 1 + n k + 1 g − b k g ) )
\boldsymbol{\omega}=\frac{1}{2}\left(\left(\boldsymbol{\omega}^{b_{k}}+\mathbf{n}_{k}^{g}-\mathbf{b}_{k}^{g}\right)+\left(\boldsymbol{\omega}^{b_{k+1}}+\mathbf{n}_{k+1}^{g}-\mathbf{b}_{k}^{g}\right)\right)
ω = 2 1 ( ( ω b k + n k g − b k g ) + ( ω b k + 1 + n k + 1 g − b k g ) ) a = 1 2 ( q b i b k ( a b k + n k a − b k a ) + q b i b k + 1 ( a b k + 1 + n k + 1 a − b k a ) )
\mathbf{a}=\frac{1}{2}\left(\mathbf{q}_{b_{i} b_{k}}\left(\mathbf{a}^{b_{k}}+\mathbf{n}_{k}^{a}-\mathbf{b}_{k}^{a}\right)+\mathbf{q}_{b_{i} b_{k+1}}\left(\mathbf{a}^{b_{k+1}}+\mathbf{n}_{k+1}^{a}-\mathbf{b}_{k}^{a}\right)\right)
a = 2 1 ( q b i b k ( a b k + n k a − b k a ) + q b i b k + 1 ( a b k + 1 + n k + 1 a − b k a ) ) 確定誤差傳遞的狀態量,噪聲量,然後開始構建傳遞方程。
推導出如下的形式,直接給出推導結果:
[ δ α b k + 1 b k + 1 ′ δ θ b k + 1 b k + 1 ′ δ β b k + 1 b k + 1 ′ δ b k + 1 a δ b k + 1 g ] = F [ δ α b k b k ′ δ θ b k b k ′ δ β b k b k ′ δ b k a δ b k g ] + G [ n k a n k g n k a n k + 1 a n b k g n b k g ] (27)
\left[\begin{array}{c}{\delta \boldsymbol{\alpha}_{b_{k+1} b_{k+1}^{\prime}}} \\ {\delta \boldsymbol{\theta}_{b_{k+1} b_{k+1}^{\prime}}} \\ {\delta \boldsymbol{\beta}_{b_{k+1} b_{k+1}^{\prime}}} \\ {\delta \mathbf{b}_{k+1}^{a}} \\ {\delta \mathbf{b}_{k+1}^{g}}\end{array}\right]=\mathbf{F}\left[\begin{array}{c}{\delta \boldsymbol{\alpha}_{b_{k} b_{k}^{\prime}}} \\ {\delta \boldsymbol{\theta}_{b_{k} b_{k}^{\prime}}} \\ {\delta \boldsymbol{\beta}_{b_{k} b_{k}^{\prime}}} \\ {\delta \mathbf{b}_{k}^{a}} \\ {\delta \mathbf{b}_{k}^{g}}\end{array}\right]+\mathbf{G}\left[\begin{array}{c}{\mathbf{n}_{k}^{a}} \\ {\mathbf{n}_{k}^{g}} \\ {\mathbf{n}_{k}^{a}} \\ {\mathbf{n}_{k+1}^{a}} \\ {\mathbf{n}_{\mathbf{b}_{k}^{g}}} \\ {\mathbf{n}_{\mathbf{b}_{k}^{g}}}\end{array}\right]
\tag{27} ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ δ α b k + 1 b k + 1 ′ δ θ b k + 1 b k + 1 ′ δ β b k + 1 b k + 1 ′ δ b k + 1 a δ b k + 1 g ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ = F ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ δ α b k b k ′ δ θ b k b k ′ δ β b k b k ′ δ b k a δ b k g ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ + G ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ n k a n k g n k a n k + 1 a n b k g n b k g ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ ( 2 7 )
F , G \mathbf{F}, \mathbf{G} F , G 爲兩個時刻間的協方差傳遞矩陣:
F = \mathbf{F}= F = [ I f 12 I δ t − 1 4 ( q b i b k + q b i b k + 1 ) δ t 2 f 15 0 I − [ ω ] × 0 0 − I δ t 0 f 32 I − 1 2 ( q b i b k + q b i b k + 1 ) δ t f 35 0 0 0 I 0 0 0 0 0 I ] \left[\begin{array}{cccccc}{\mathbf{I}} & {\mathbf{f}_{12}} & {\mathbf{I} \delta t} & {-\frac{1}{4}\left(\mathbf{q}_{b_{i} b_{k}}+\mathbf{q}_{b_{i} b_{k+1}}\right) \delta t^{2}} & {\mathbf{f}_{15}} \\ {\mathbf{0}} & {\mathbf{I}-[\boldsymbol{\omega}]_{ \times}} & {\mathbf{0}} & {\mathbf{0}} & {-\mathbf{I} \delta t} \\ {\mathbf{0}} & {\mathbf{f}_{32}} & {\mathbf{I}} & {-\frac{1}{2}\left(\mathbf{q}_{b_{i} b_{k}}+\mathbf{q}_{b_{i} b_{k+1}}\right) \delta t} & {\mathbf{f}_{35}} \\ {\mathbf{0}} & {\mathbf{0}} & {\mathbf{0}} & {\mathbf{I}} & {\mathbf{0}} \\ {\mathbf{0}} & {\mathbf{0}} & {\mathbf{0}} & {\mathbf{0}} & {\mathbf{I}}\end{array}\right] ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ I 0 0 0 0 f 1 2 I − [ ω ] × f 3 2 0 0 I δ t 0 I 0 0 − 4 1 ( q b i b k + q b i b k + 1 ) δ t 2 0 − 2 1 ( q b i b k + q b i b k + 1 ) δ t I 0 f 1 5 − I δ t f 3 5 0 I ⎦ ⎥ ⎥ ⎥ ⎥ ⎤
G = \mathbf{G}= G = [ 1 4 q b i b k δ t 2 g 12 1 4 q b i b k + 1 δ t 2 g 14 0 0 0 1 2 I δ t 0 1 2 I δ t 0 0 1 2 q b i b k δ t g 32 1 2 q b i b k + 1 δ t g 34 0 0 0 0 0 0 I δ t 0 0 0 0 0 0 I δ t ] \left[\begin{array}{cccccc}{\frac{1}{4} \mathbf{q}_{b_{i} b_{k}} \delta t^{2}} & {\mathbf{g}_{12}} & {\frac{1}{4} \mathbf{q}_{b_{i} b_{k+1}} \delta t^{2}} & {\mathbf{g}_{14}} & {\mathbf{0}} & {\mathbf{0}} \\ {\mathbf{0}} & {\frac{1}{2} \mathbf{I} \delta t} & {\mathbf{0}} & {\frac{1}{2} \mathbf{I} \delta t} & {\mathbf{0}} & {\mathbf{0}} \\ {\frac{1}{2} \mathbf{q}_{b_{i} b_{k}} \delta t} & {\mathbf{g}_{32}} & {\frac{1}{2} \mathbf{q}_{b_{i} b_{k+1}} \delta t} & {\mathbf{g}_{34}} & {\mathbf{0}} & {\mathbf{0}} \\ {\mathbf{0}} & {\mathbf{0}} & {\mathbf{0}} & {\mathbf{0}} & {\mathbf{I} \delta t} & {\mathbf{0}} \\ {\mathbf{0}} & {\mathbf{0}} & {\mathbf{0}} & {\mathbf{0}} & {\mathbf{0}} & {\mathbf{I} \delta t}\end{array}\right] ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ 4 1 q b i b k δ t 2 0 2 1 q b i b k δ t 0 0 g 1 2 2 1 I δ t g 3 2 0 0 4 1 q b i b k + 1 δ t 2 0 2 1 q b i b k + 1 δ t 0 0 g 1 4 2 1 I δ t g 3 4 0 0 0 0 0 I δ t 0 0 0 0 0 I δ t ⎦ ⎥ ⎥ ⎥ ⎥ ⎤
其中:
f 12 = ∂ α b i b k + 1 ∂ δ θ b k b k ′ = − 1 4 ( R b i b k [ a b k − b k a ] × δ t 2 + R b i b k + 1 [ ( a b k + 1 − b k a ) ] × ( I − [ ω ] × δ t ) δ t 2 ) \mathbf{f}_{12}=\frac{\partial \boldsymbol{\alpha}_{b_{i} b_{k+1}}}{\partial \delta \boldsymbol{\theta}_{b_{k} b_{k}^{\prime}}}=-\frac{1}{4}\left(\mathbf{R}_{b_{i} b_{k}}\left[\mathbf{a}^{b_{k}}-\mathbf{b}_{k}^{a}\right]_{ \times} \delta t^{2}+\mathbf{R}_{b_{i} b_{k+1}}\left[\left(\mathbf{a}^{b_{k+1}}-\mathbf{b}_{k}^{a}\right)\right] \times\left(\mathbf{I}-[\boldsymbol{\omega}]_{ \times} \delta t\right) \delta t^{2}\right) f 1 2 = ∂ δ θ b k b k ′ ∂ α b i b k + 1 = − 4 1 ( R b i b k [ a b k − b k a ] × δ t 2 + R b i b k + 1 [ ( a b k + 1 − b k a ) ] × ( I − [ ω ] × δ t ) δ t 2 )
f 12 = ∂ α b i b k + 1 ∂ δ θ b k b k ′ = − 1 4 ( R b i b k [ a b k − b k a ] × δ t 2 + R b i b k + 1 [ ( a b k + 1 − b k a ) ] × ( I − [ ω ] × δ t ) δ t 2 ) \mathbf{f}_{12}=\frac{\partial \boldsymbol{\alpha}_{b_{i} b_{k+1}}}{\partial \delta \boldsymbol{\theta}_{b_{k} b_{k}^{\prime}}}=-\frac{1}{4}\left(\mathbf{R}_{b_{i} b_{k}}\left[\mathbf{a}^{b_{k}}-\mathbf{b}_{k}^{a}\right]_{ \times} \delta t^{2}+\mathbf{R}_{b_{i} b_{k+1}}\left[\left(\mathbf{a}^{b_{k+1}}-\mathbf{b}_{k}^{a}\right)\right] \times\left(\mathbf{I}-[\omega]_{ \times} \delta t\right) \delta t^{2}\right) f 1 2 = ∂ δ θ b k b k ′ ∂ α b i b k + 1 = − 4 1 ( R b i b k [ a b k − b k a ] × δ t 2 + R b i b k + 1 [ ( a b k + 1 − b k a ) ] × ( I − [ ω ] × δ t ) δ t 2 )
f 15 = ∂ α b i b k + 1 ∂ δ b k g = − 1 4 ( R b i b k + 1 [ ( a b k + 1 − b k a ) ] × δ t 2 ) ( − δ t ) \mathbf{f}_{15}=\frac{\partial \boldsymbol{\alpha}_{b_{i} b_{k+1}}}{\partial \delta \mathbf{b}_{k}^{g}}=-\frac{1}{4}\left(\mathbf{R}_{b_{i} b_{k+1}}\left[\left(\mathbf{a}^{b_{k+1}}-\mathbf{b}_{k}^{a}\right)\right]_{ \times} \delta t^{2}\right)(-\delta t) f 1 5 = ∂ δ b k g ∂ α b i b k + 1 = − 4 1 ( R b i b k + 1 [ ( a b k + 1 − b k a ) ] × δ t 2 ) ( − δ t )
f 35 = ∂ β b i b k + 1 ∂ δ b k g = − 1 2 ( R b i b k + 1 [ ( a b k + 1 − b k a ) ] × δ t ) ( − δ t ) \mathbf{f}_{35}=\frac{\partial \boldsymbol{\beta}_{b_{i} b_{k+1}}}{\partial \delta \mathbf{b}_{k}^{g}}=-\frac{1}{2}\left(\mathbf{R}_{b_{i} b_{k+1}}\left[\left(\mathbf{a}^{b_{k+1}}-\mathbf{b}_{k}^{a}\right)\right]_{ \times} \delta t\right)(-\delta t) f 3 5 = ∂ δ b k g ∂ β b i b k + 1 = − 2 1 ( R b i b k + 1 [ ( a b k + 1 − b k a ) ] × δ t ) ( − δ t )
g 12 = ∂ α b i b k + 1 ∂ n k g = g 14 = ∂ α b i b k + 1 ∂ n k + 1 g = 1 4 ( R b i b k + 1 [ ( a b k + 1 − b k a ) ] × δ t 2 ) ( 1 2 δ t ) \mathbf{g}_{12}=\frac{\partial \boldsymbol{\alpha}_{b_{i} b_{k+1}}}{\partial \mathbf{n}_{k}^{g}}=\mathbf{g}_{14}=\frac{\partial \boldsymbol{\alpha}_{b_{i} b_{k+1}}}{\partial \mathbf{n}_{k+1}^{g}}=\frac{1}{4}\left(\mathbf{R}_{b_{i} b_{k+1}}\left[\left(\mathbf{a}^{b_{k+1}}-\mathbf{b}_{k}^{a}\right)\right] \times \delta t^{2}\right)\left(\frac{1}{2} \delta t\right) g 1 2 = ∂ n k g ∂ α b i b k + 1 = g 1 4 = ∂ n k + 1 g ∂ α b i b k + 1 = 4 1 ( R b i b k + 1 [ ( a b k + 1 − b k a ) ] × δ t 2 ) ( 2 1 δ t )
g 32 = ∂ β b i b k + 1 ∂ n k g = g 34 = ∂ β b i b k + 1 ∂ n k + 1 g = − 1 2 ( R b i b k + 1 [ ( a b k + 1 − b k a ) ] × δ t 2 ) ( 1 2 δ t ) \mathbf{g}_{32}=\frac{\partial \boldsymbol{\beta}_{b_{i} b_{k+1}}}{\partial \mathbf{n}_{k}^{g}}=\mathbf{g}_{34}=\frac{\partial \boldsymbol{\beta}_{b_{i} b_{k+1}}}{\partial \mathbf{n}_{k+1}^{g}}=-\frac{1}{2}\left(\mathbf{R}_{b_{i} b_{k+1}}\left[\left(\mathbf{a}^{b_{k+1}}-\mathbf{b}_{k}^{a}\right)\right] \times \delta t^{2}\right)\left(\frac{1}{2} \delta t\right) g 3 2 = ∂ n k g ∂ β b i b k + 1 = g 3 4 = ∂ n k + 1 g ∂ β b i b k + 1 = − 2 1 ( R b i b k + 1 [ ( a b k + 1 − b k a ) ] × δ t 2 ) ( 2 1 δ t )
代碼中F , G \mathbf{F}, \mathbf{G} F , G 爲F , V \mathbf{F}, \mathbf{V} F , V 。
這裏對公式(26)(27)的 IMU 誤差運動方程(狀態方程)再說明,將上式和 EKF 對比可知,上式恰好給出瞭如 EKF 一般對非線性系統線性化的過程,這裏的意義是表示下一個時刻的 IMU 測量誤差與上一個時刻的成線性關係,這樣我們根據當前時刻的值,可以預測出下一個時刻的均值和協方差,而公式(26)給出的是均值預測,協方差預測公式如下(對比卡爾曼濾波的第二個公式):
P t + δ t b k = ( I + F t δ t ) P t b k ( I + F t δ t ) T + ( G t δ t ) Q ( G t δ t ) T
P_{t+\delta t}^{b_{k}}=\left(\mathrm{I}+F_{t} \delta t\right) P_{t}^{b_{k}}\left(\mathrm{I}+F_{t} \delta t\right)^{T}+\left(G_{t} \delta t\right) Q\left(G_{t} \delta t\right)^{T}
P t + δ t b k = ( I + F t δ t ) P t b k ( I + F t δ t ) T + ( G t δ t ) Q ( G t δ t ) T 其中:F = I + F t δ t , V = G t δ t
F=\mathrm{I}+F_{t} \delta t, \quad V=G_{t} \delta t
F = I + F t δ t , V = G t δ t 上式給出了協方差的迭代公式,初始值P b k b k = 0 P_{b_{k}}^{b_{k}}=0 P b k b k = 0 。其中,Q Q Q 爲表示噪聲項的對角協方差矩陣:Q 12 × 12 = [ σ a 2 0 0 0 0 σ w 2 0 0 0 0 σ b a 2 0 0 0 0 σ b w 2 ]
Q^{12 \times 12}=\left[\begin{array}{cccc}{\sigma_{a}^{2}} & {0} & {0} & {0} \\ {0} & {\sigma_{w}^{2}} & {0} & {0} \\ {0} & {0} & {\sigma_{b_{a}}^{2}} & {0} \\ {0} & {0} & {0} & {\sigma_{b_{w}}^{2}}\end{array}\right]
Q 1 2 × 1 2 = ⎣ ⎢ ⎢ ⎡ σ a 2 0 0 0 0 σ w 2 0 0 0 0 σ b a 2 0 0 0 0 σ b w 2 ⎦ ⎥ ⎥ ⎤ 誤差項的 Jacobian 的迭代公式:J t + δ t = ( I + F t δ t ) J t
J_{t+\delta t}=\left(\mathrm{I}+F_{t} \delta t\right) J_{t}
J t + δ t = ( I + F t δ t ) J t 其中 Jacobian 的初始值爲J b k = I J_{b_{k}}=I J b k = I
7.離散形式的 PVQ 增量誤差分析
首先直接給出 PVQ 增量誤差在離散形式下的矩陣形式,爲了與代碼一致,我們修改下變量順序,這和代碼中 midPointIntegration()函數是一致的。(但不知爲何計算的 V 中與前四個噪聲項相關的差個負號?)
[ δ α k + 1 δ θ k + 1 δ β k + 1 δ b k + 1 δ b w k + 1 ] = [ I f 01 δ t f 03 f 04 0 f 11 0 0 − δ t 0 f 21 I f 23 f 24 0 0 0 I 0 0 0 0 0 I ] [ δ α k δ θ k δ β k δ b a k δ b w k ] \left[\begin{array}{c}{\delta \alpha_{k+1}} \\ {\delta \theta_{k+1}} \\ {\delta \beta_{k+1}} \\ {\delta b_{k+1}} \\ {\delta b_{w_{k+1}}}\end{array}\right]=\left[\begin{array}{ccccc}{I} & {f_{01}} & {\delta t} & {f_{03}} & {f_{04}} \\ {0} & {f_{11}} & {0} & {0} & {-\delta t} \\ {0} & {f_{21}} & {I} & {f_{23}} & {f_{24}} \\ {0} & {0} & {0} & {I} & {0} \\ {0} & {0} & {0} & {0} & {I}\end{array}\right]\left[\begin{array}{c}{\delta \alpha_{k}} \\ {\delta \theta_{k}} \\ {\delta \beta_{k}} \\ {\delta b_{a_{k}}} \\ {\delta b_{w_{k}}}\end{array}\right] ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ δ α k + 1 δ θ k + 1 δ β k + 1 δ b k + 1 δ b w k + 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ I 0 0 0 0 f 0 1 f 1 1 f 2 1 0 0 δ t 0 I 0 0 f 0 3 0 f 2 3 I 0 f 0 4 − δ t f 2 4 0 I ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ δ α k δ θ k δ β k δ b a k δ b w k ⎦ ⎥ ⎥ ⎥ ⎥ ⎤
+ [ v 00 v 01 v 02 v 03 0 0 − δ t 2 0 − δ t 2 0 − R k δ t 2 v 21 − R k + 1 δ t 2 v 23 0 0 0 0 0 δ t 0 0 0 0 0 0 δ t ] [ n a k n w k n a k + 1 n b a n b w ] (28) +\left[\begin{array}{ccccc}{v_{00}} & {v_{01}} & {v_{02}} & {v_{03}} & {0} \\ {0} & {\frac{-\delta t}{2}} & {0} & {\frac{-\delta t}{2}} & {0} \\ {-\frac{R_{k} \delta t}{2}} & {v_{21}} & {-\frac{R_{k+1} \delta t}{2}} & {v_{23}} & {0} \\ {0} & {0} & {0} & {0} & {\delta t} & {0}
\\ {0}& {0} & {0} & {0} & {0} & {\delta t}\end{array}\right]\left[\begin{array}{c}{n_{a_{k}}} \\ {n_{w_{k}}} \\ {n_{a_{k+1}}} \\ {n_{b_{a}}} \\ {n_{b_{w}}}\end{array}\right]\tag{28} + ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ v 0 0 0 − 2 R k δ t 0 0 v 0 1 2 − δ t v 2 1 0 0 v 0 2 0 − 2 R k + 1 δ t 0 0 v 0 3 2 − δ t v 2 3 0 0 0 0 0 δ t 0 0 δ t ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ ⎣ ⎢ ⎢ ⎢ ⎢ ⎡ n a k n w k n a k + 1 n b a n b w ⎦ ⎥ ⎥ ⎥ ⎥ ⎤ ( 2 8 )
其中:
f 01 = δ t 2 f 21 = − 1 4 R k ( a ^ k − b a k ) ∧ δ t 2 − 1 4 R k + 1 ( a ^ k + 1 − b a k ) ∧ [ I − ( ω ^ k + ω ^ k + 1 2 − b ω k ) ∧ δ t ] δ t 2 f_{01}=\frac{\delta t}{2} f_{21}=-\frac{1}{4} R_{k}\left(\hat{a}_{k}-b_{a_{k}}\right)^{\wedge} \delta t^{2}-\frac{1}{4} R_{k+1}\left(\hat{a}_{k+1}-b_{a_{k}}\right)^{\wedge}\left[I-\left(\frac{\widehat{\omega}_{k}+\widehat{\omega}_{k+1}}{2}-b_{\omega_{k}}\right)^{\wedge} \delta t\right] \delta t^{2} f 0 1 = 2 δ t f 2 1 = − 4 1 R k ( a ^ k − b a k ) ∧ δ t 2 − 4 1 R k + 1 ( a ^ k + 1 − b a k ) ∧ [ I − ( 2 ω k + ω k + 1 − b ω k ) ∧ δ t ] δ t 2
f 03 = − 1 4 ( R k + R k + 1 ) δ t 2 f_{03}=-\frac{1}{4}\left(R_{k}+R_{k+1}\right) \delta t^{2} f 0 3 = − 4 1 ( R k + R k + 1 ) δ t 2
f 04 = δ t 2 f 24 = 1 4 R k + 1 ( a ^ k + 1 − b a k ) ∧ δ t 3 f_{04}=\frac{\delta t}{2} f_{24}=\frac{1}{4} R_{k+1}\left(\hat{a}_{k+1}-b_{a_{k}}\right)^{\wedge} \delta t^{3} f 0 4 = 2 δ t f 2 4 = 4 1 R k + 1 ( a ^ k + 1 − b a k ) ∧ δ t 3
f 11 = I − ( ω ^ k + ω ^ k + 1 2 − b ω k ) ∧ δ t f_{11}=I-\left(\frac{\widehat{\omega}_{k}+\widehat{\omega}_{k+1}}{2}-b_{\omega_{k}}\right)^{\wedge} \delta t f 1 1 = I − ( 2 ω k + ω k + 1 − b ω k ) ∧ δ t
f 21 = − 1 2 R k ( a ^ k − b a k ) ∧ δ t − 1 2 R k + 1 ( a ^ k + 1 − b a k ) ∧ [ I − ( ω ^ k + ω ^ k + 1 2 − b ω k ) ∧ δ t ] δ t f_{21}=-\frac{1}{2} R_{k}\left(\hat{a}_{k}-b_{a_{k}}\right)^{\wedge} \delta t-\frac{1}{2} R_{k+1}\left(\hat{a}_{k+1}-b_{a_{k}}\right)^{\wedge}\left[I-\left(\frac{\widehat{\omega}_{k}+\widehat{\omega}_{k+1}}{2}-b_{\omega_{k}}\right)^{\wedge} \delta t\right] \delta t f 2 1 = − 2 1 R k ( a ^ k − b a k ) ∧ δ t − 2 1 R k + 1 ( a ^ k + 1 − b a k ) ∧ [ I − ( 2 ω k + ω k + 1 − b ω k ) ∧ δ t ] δ t
f 23 = − 1 2 ( R k + R k + 1 ) δ t f_{23}=-\frac{1}{2}\left(R_{k}+R_{k+1}\right) \delta t f 2 3 = − 2 1 ( R k + R k + 1 ) δ t
f 24 = 1 2 R k + 1 ( a ^ k + 1 − b a k ) ∧ δ t 2 f_{24}=\frac{1}{2} R_{k+1}\left(\hat{a}_{k+1}-b_{a_{k}}\right)^{\wedge} \delta t^{2} f 2 4 = 2 1 R k + 1 ( a ^ k + 1 − b a k ) ∧ δ t 2
v 00 = − 1 4 R k δ t 2 v_{00}=-\frac{1}{4} R_{k} \delta t^{2} v 0 0 = − 4 1 R k δ t 2
v 01 = v 03 = δ t 2 v 21 = 1 4 R k + 1 ( a ^ k + 1 − b a k ) ∧ δ t 2 δ t 2 v_{01}=v_{03}=\frac{\delta t}{2} v_{21}=\frac{1}{4} R_{k+1}\left(\hat{a}_{k+1}-b_{a_{k}}\right)^{\wedge} \delta t^{2} \frac{\delta t}{2} v 0 1 = v 0 3 = 2 δ t v 2 1 = 4 1 R k + 1 ( a ^ k + 1 − b a k ) ∧ δ t 2 2 δ t
v 02 = − 1 4 R k + 1 δ t 2 v_{02}=-\frac{1}{4} R_{k+1} \delta t^{2} v 0 2 = − 4 1 R k + 1 δ t 2
v 21 = v 23 = 1 4 R k + 1 ( a ^ k + 1 − b a k ) ∧ δ t 2 v_{21}=v_{23}=\frac{1}{4} R_{k+1}\left(\hat{a}_{k+1}-b_{a_{k}}\right)^{\wedge} \delta t^{2} v 2 1 = v 2 3 = 4 1 R k + 1 ( a ^ k + 1 − b a k ) ∧ δ t 2
8.離散形式的 PVQ 增量誤差的 Jacobian 和協方差
將公式(28)簡寫爲:
δ z k + 1 15 × 1 = F 15 × 15 δ z k 15 × 1 + V 15 × 18 Q 18 × 1 \delta z_{k+1}^{15 \times 1}=F^{15 \times 15} \delta z_{k}^{15 \times 1}+V^{15 \times 18} Q^{18 \times 1} δ z k + 1 1 5 × 1 = F 1 5 × 1 5 δ z k 1 5 × 1 + V 1 5 × 1 8 Q 1 8 × 1
則 J a c o b i a n Jacobian J a c o b i a n 的迭代公式爲:
J k + 1 15 × 15 = F J k (29)
J_{k+1}^{15 \times 15}=F J_{k}
\tag{29} J k + 1 1 5 × 1 5 = F J k ( 2 9 )
其中,J a c o b i a n Jacobian J a c o b i a n 的初始值爲J k = I J_k = I J k = I 。這裏計算出來的J k + 1 J_{k+1} J k + 1 只是爲了給後面提供對 bias 的
J a c o b i a n Jacobian J a c o b i a n 。
協方差的迭代公式爲:
P k + 1 15 × 15 = F P k F T + V Q V T (30)
P_{k+1}^{15 \times 15}=F P_{k} F^{T}+V Q V^{T}
\tag{30} P k + 1 1 5 × 1 5 = F P k F T + V Q V T ( 3 0 )
其中,初始值P k = 0 P_{k}=0 P k = 0 。Q Q Q 爲表示噪聲項的對角協方差矩陣:
Q 18 × 18 = [ σ a 2 0 0 0 0 0 0 σ w 2 0 0 0 0 0 0 σ a 2 0 0 0 0 0 0 σ w 2 0 0 0 0 0 0 σ b a 2 0 0 0 0 0 0 σ b w 2 ]
Q^{18 \times 18}=\left[\begin{array}{cccccc}{\sigma_{a}^{2}} & {0} & {0} & {0} & {0} & {0} \\ {0} & {\sigma_{w}^{2}} & {0} & {0} & {0} & {0} \\ {0} & {0} & {\sigma_{a}^{2}} & {0} & {0} & {0} \\ {0} & {0} & {0} & {\sigma_{w}^{2}} & {0} & {0} \\ {0} & {0} & {0} & {0} & {\sigma_{b_{a}}^{2}} & {0} \\ {0} & {0} & {0} & {0} & {0} & {\sigma_{b_{w}}^{2}}\end{array}\right]
Q 1 8 × 1 8 = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ σ a 2 0 0 0 0 0 0 σ w 2 0 0 0 0 0 0 σ a 2 0 0 0 0 0 0 σ w 2 0 0 0 0 0 0 σ b a 2 0 0 0 0 0 0 σ b w 2 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
代碼integration_base.h-->midPointIntegration():
void midPointIntegration(double _dt,
const Eigen::Vector3d &_acc_0, const Eigen::Vector3d &_gyr_0,
const Eigen::Vector3d &_acc_1, const Eigen::Vector3d &_gyr_1,
const Eigen::Vector3d &delta_p, const Eigen::Quaterniond &delta_q, const Eigen::Vector3d &delta_v,
const Eigen::Vector3d &linearized_ba, const Eigen::Vector3d &linearized_bg,
Eigen::Vector3d &result_delta_p, Eigen::Quaterniond &result_delta_q, Eigen::Vector3d &result_delta_v,
Eigen::Vector3d &result_linearized_ba, Eigen::Vector3d &result_linearized_bg, bool update_jacobian)
{
//ROS_INFO("midpoint integration");
Vector3d un_acc_0 = delta_q * (_acc_0 - linearized_ba);
Vector3d un_gyr = 0.5 * (_gyr_0 + _gyr_1) - linearized_bg;
result_delta_q = delta_q * Quaterniond(1, un_gyr(0) * _dt / 2, un_gyr(1) * _dt / 2, un_gyr(2) * _dt / 2);
Vector3d un_acc_1 = result_delta_q * (_acc_1 - linearized_ba);
Vector3d un_acc = 0.5 * (un_acc_0 + un_acc_1);
result_delta_p = delta_p + delta_v * _dt + 0.5 * un_acc * _dt * _dt;
result_delta_v = delta_v + un_acc * _dt;
result_linearized_ba = linearized_ba;
result_linearized_bg = linearized_bg;
if(update_jacobian)
{
Vector3d w_x = 0.5 * (_gyr_0 + _gyr_1) - linearized_bg;
Vector3d a_0_x = _acc_0 - linearized_ba;
Vector3d a_1_x = _acc_1 - linearized_ba;
Matrix3d R_w_x, R_a_0_x, R_a_1_x;
R_w_x<<0, -w_x(2), w_x(1),
w_x(2), 0, -w_x(0),
-w_x(1), w_x(0), 0;
R_a_0_x<<0, -a_0_x(2), a_0_x(1),
a_0_x(2), 0, -a_0_x(0),
-a_0_x(1), a_0_x(0), 0;
R_a_1_x<<0, -a_1_x(2), a_1_x(1),
a_1_x(2), 0, -a_1_x(0),
-a_1_x(1), a_1_x(0), 0;
//構造F、V矩陣
MatrixXd F = MatrixXd::Zero(15, 15);
F.block<3, 3>(0, 0) = Matrix3d::Identity();
F.block<3, 3>(0, 3) = -0.25 * delta_q.toRotationMatrix() * R_a_0_x * _dt * _dt +
-0.25 * result_delta_q.toRotationMatrix() * R_a_1_x * (Matrix3d::Identity() - R_w_x * _dt) * _dt * _dt;
F.block<3, 3>(0, 6) = MatrixXd::Identity(3,3) * _dt;
F.block<3, 3>(0, 9) = -0.25 * (delta_q.toRotationMatrix() + result_delta_q.toRotationMatrix()) * _dt * _dt;
F.block<3, 3>(0, 12) = -0.25 * result_delta_q.toRotationMatrix() * R_a_1_x * _dt * _dt * -_dt;
F.block<3, 3>(3, 3) = Matrix3d::Identity() - R_w_x * _dt;
F.block<3, 3>(3, 12) = -1.0 * MatrixXd::Identity(3,3) * _dt;
F.block<3, 3>(6, 3) = -0.5 * delta_q.toRotationMatrix() * R_a_0_x * _dt +
-0.5 * result_delta_q.toRotationMatrix() * R_a_1_x * (Matrix3d::Identity() - R_w_x * _dt) * _dt;
F.block<3, 3>(6, 6) = Matrix3d::Identity();
F.block<3, 3>(6, 9) = -0.5 * (delta_q.toRotationMatrix() + result_delta_q.toRotationMatrix()) * _dt;
F.block<3, 3>(6, 12) = -0.5 * result_delta_q.toRotationMatrix() * R_a_1_x * _dt * -_dt;
F.block<3, 3>(9, 9) = Matrix3d::Identity();
F.block<3, 3>(12, 12) = Matrix3d::Identity();
//cout<<"A"<<endl<<A<<endl;
MatrixXd V = MatrixXd::Zero(15,18);
V.block<3, 3>(0, 0) = 0.25 * delta_q.toRotationMatrix() * _dt * _dt;
V.block<3, 3>(0, 3) = 0.25 * -result_delta_q.toRotationMatrix() * R_a_1_x * _dt * _dt * 0.5 * _dt;
V.block<3, 3>(0, 6) = 0.25 * result_delta_q.toRotationMatrix() * _dt * _dt;
V.block<3, 3>(0, 9) = V.block<3, 3>(0, 3);
V.block<3, 3>(3, 3) = 0.5 * MatrixXd::Identity(3,3) * _dt;
V.block<3, 3>(3, 9) = 0.5 * MatrixXd::Identity(3,3) * _dt;
V.block<3, 3>(6, 0) = 0.5 * delta_q.toRotationMatrix() * _dt;
V.block<3, 3>(6, 3) = 0.5 * -result_delta_q.toRotationMatrix() * R_a_1_x * _dt * 0.5 * _dt;
V.block<3, 3>(6, 6) = 0.5 * result_delta_q.toRotationMatrix() * _dt;
V.block<3, 3>(6, 9) = V.block<3, 3>(6, 3);
V.block<3, 3>(9, 12) = MatrixXd::Identity(3,3) * _dt;
V.block<3, 3>(12, 15) = MatrixXd::Identity(3,3) * _dt;
//step_jacobian = F;
//step_V = V;
jacobian = F * jacobian; \\公式(29)
covariance = F * covariance * F.transpose() + V * noise * V.transpose();\\公式(30)
}
}
總述:基於滑動窗口的 VIO Bundle Adjustment,總的loss funcution如下所示:
min X ρ ( ∥ r p − J p X ∥ Σ p 2 ) ⏟ prior + ∑ i ∈ B ρ ( ∥ r b ( z b i b i + 1 , X ) ∥ Σ b i b i + 1 2 ) ⏟ IMU error \min _{\mathcal{X}} \underbrace{\rho\left(\left\|\mathbf{r}_{p}-\mathbf{J}_{p} \mathcal{X}\right\|_{\Sigma_{p}}^{2}\right)}_{\text { prior }}+\underbrace{\sum_{i \in B} \rho\left(\left\|\mathbf{r}_{b}\left(\mathbf{z}_{b_{i} b_{i+1}}, \mathcal{X}\right)\right\|_{\Sigma_{b_{i} b_{i+1}}}^{2}\right)}_{\text { IMU error }} min X prior ρ ( ∥ r p − J p X ∥ Σ p 2 ) + IMU error i ∈ B ∑ ρ ( ∥ r b ( z b i b i + 1 , X ) ∥ Σ b i b i + 1 2 ) + ∑ ( i , j ) ∈ F ρ ( ∥ r f ( z f j c i , X ) ∥ Σ f j c i 2 ) ⏟ image error +\underbrace{\sum_{(i, j) \in F} \rho\left(\left\|\mathbf{r}_{f}\left(\mathbf{z}_{\mathbf{f}_{j}}^{c_{i}}, \mathcal{X}\right)\right\|_{\Sigma_{\mathbf{f}_{j}}^{c_{i}}}^{2}\right)}_{\text { image error }} + image error ( i , j ) ∈ F ∑ ρ ( ∥ ∥ ∥ r f ( z f j c i , X ) ∥ ∥ ∥ Σ f j c i 2 )
故,6、7、8小節實際是在求的IMU error項將會用到的量,爲後端優化做準備!