VINS-MONO边缘化策略
? ? ? ? VINS中的滑窗優化策略,將滑出窗外的幀與滑窗內的幀的約束使用邊緣化的形式保存為先驗誤差進行后續非線性優化,以保留約束信息。本文對具體的方案進行記錄。
? ? ? ? 緊耦合VIO處理的兩種誤差分別為IMU誤差與圖像誤差,采用LM、GN、Dogleg等方式迭代求解待優化參數增量,以求得最大似然估計,最小化非線性化誤差。
? ? ? ? 迭代優化的核心即求解增量方程:
Hδx=bH\delta x=bHδx=b? ? ? ? 其中H=JTJ,b=JTe,e=(JT)+bH=J^TJ,b=J^Te,e=(J^T)^+bH=JTJ,b=JTe,e=(JT)+b.此處的()+()^+()+為偽逆,eee為殘差,JJJ為殘差對于狀態的Jacobian。
? ? ? ? 由于引入滑窗后,對于滑到窗口之外的幀不再優化其參數,但其與滑窗內的數據仍然存在約束,直接丟掉這些窗外幀會造成約束信息丟失,所以要將其封裝成先驗信息,加入到大的非線性優化問題中作為一部分誤差,這一步即為邊緣化。假設要邊緣化的狀態為x2x_2x2?,要保留的狀態為x1x_1x1?,對于上述增量方程,變為:[H11H12H21H22][δx1δx2]=[b1b2]\left[ \begin{matrix} H_{11} & H_{12} \\ H_{21} & H_{22} \end{matrix} \right] \left[ \begin{matrix} \delta x_1\\ \delta x_2\end{matrix} \right]=\left[ \begin{matrix} b_1\\ b_2\end{matrix} \right] [H11?H21??H12?H22??][δx1?δx2??]=[b1?b2??]? ? ? ? 邊緣化的方法為舒爾補:[I?H12H22?10I][H11H12H21H22][δx1δx2]=[I?H12H22?10I][b1b2][H11?H12H22?1H210H21H22][δx1δx2]=[b1?H12H22?1b2b2]\left[ \begin{matrix} I & -H_{12}H_{22}^{-1} \\ 0 & I \end{matrix} \right]\left[ \begin{matrix} H_{11} & H_{12} \\ H_{21} & H_{22} \end{matrix} \right] \left[ \begin{matrix} \delta x_1\\ \delta x_2\end{matrix} \right]=\left[ \begin{matrix} I & -H_{12}H_{22}^{-1} \\ 0 & I \end{matrix} \right]\left[ \begin{matrix} b_1\\ b_2\end{matrix} \right] \\ \left[ \begin{matrix} H_{11}-H_{12}H_{22}^{-1}H_{21} & 0 \\ H_{21} & H_{22} \end{matrix} \right]\left[ \begin{matrix} \delta x_1\\ \delta x_2\end{matrix} \right]=\left[ \begin{matrix} b_{1}-H_{12}H_{22}^{-1}b_{2}\\ b_2\end{matrix} \right][I0??H12?H22?1?I?][H11?H21??H12?H22??][δx1?δx2??]=[I0??H12?H22?1?I?][b1?b2??][H11??H12?H22?1?H21?H21??0H22??][δx1?δx2??]=[b1??H12?H22?1?b2?b2??]? ? ? ? 這樣只需要求解第一個方程,即(H11?H12H22?1H21)δx1=b1?H12H22?1b2,(H_{11}-H_{12}H_{22}^{-1}H_{21})\delta x_1= b_{1}-H_{12}H_{22}^{-1}b_{2},(H11??H12?H22?1?H21?)δx1?=b1??H12?H22?1?b2?,? ? ? ? 這樣既沒有損失約束信息,又不需要求解δx2\delta x_2δx2?,把H11?H12H22?1H21H_{11}-H_{12}H_{22}^{-1}H_{21}H11??H12?H22?1?H21?記為H0?H_0^*H0??,b1?H12H22?1b2b_{1}-H_{12}H_{22}^{-1}b_{2}b1??H12?H22?1?b2?記為b0?b_0^*b0??。
? ? ? ? 上式為邊緣化后待求解的增量方程,我們要根據這個增量方程恢復出邊緣化封裝的先驗誤差的具體形式epe_pep?
? ? ? ? 隨著迭代的過程,狀態量被不斷更新。但在邊緣化時,被邊緣化的狀態值固定,舒爾補時使用的雅克比即為當時泰勒展開使用該固定的值(x線性化點)求得的雅克比,都需要固定。在VINS中,線性化點處的參數值x0被保存為keep_block_data。此即為EFJ,更多解釋詳看滑窗優化、邊緣化、舒爾補、FEJ及fill-in問題。但在上述方程中,由于b=JTeb=J^Teb=JTe,其中的eee隨著狀態的更新而變化,因此bbb也需隨之變化。
? ? ? ? 狀態的更新(此處δx\delta xδx表示當前參數值相對x0x_0x0?的變化):x′=Exp(δx)?x0x'=Exp(\delta x)\otimes x_0x′=Exp(δx)?x0?? ? ? ? 此時b的更新可以表示為b=b0+?b?x∣x0δx=b0+JT?e?x∣x0δx=b0+JTJδx=b0+Hδxb=b_0+\frac{\partial b}{\partial x}|_{x_0}\delta x\\=b_0+J^T\frac{\partial e}{\partial x}|_{x_0}\delta x\\=b_0+J^TJ\delta x=b_0+H\delta xb=b0?+?x?b?∣x0??δx=b0?+JT?x?e?∣x0??δx=b0?+JTJδx=b0?+Hδx? ? ? ? 有[b1b2]=[b1,0b2,0]+[H11H12H21H22][δx1δx2]b1=b1,0+H11δx1+H12δx2b2=b2,0+H21δx1+H22δx2\left[ \begin{matrix} b_1\\b_2\end{matrix} \right]=\left[ \begin{matrix} b_{1,0}\\b_{2,0}\end{matrix} \right]+\left[ \begin{matrix} H_{11} & H_{12} \\ H_{21} & H_{22} \end{matrix} \right] \left[ \begin{matrix} \delta x_1\\ \delta x_2\end{matrix} \right] \\ b_1=b_{1,0}+H_{11} \delta x_1+ H_{12} \delta x_2\\ b_2=b_{2,0}+H_{21} \delta x_1+ H_{22} \delta x_2[b1?b2??]=[b1,0?b2,0??]+[H11?H21??H12?H22??][δx1?δx2??]b1?=b1,0?+H11?δx1?+H12?δx2?b2?=b2,0?+H21?δx1?+H22?δx2?? ? ? ? 聯立b?=b1?H12H22?1b2b^*=b_{1}-H_{12}H_{22}^{-1}b_{2}b?=b1??H12?H22?1?b2?? ? ? ? 有b?=b1?H12H22?1b2=(b1,0+H11δx1+H12δx2)?H12H22?1(b2,0+H21δx1+H22δx2)=b1,0?H12H22?1b2,0+(H11?H12H22?1H21)δx1=b0?+H0?δx1b^*=b_{1}-H_{12}H_{22}^{-1}b_{2}\\=(b_{1,0}+H_{11} \delta x_1+ H_{12} \delta x_2)-H_{12}H_{22}^{-1}(b_{2,0}+H_{21} \delta x_1+ H_{22} \delta x_2)\\ =b_{1,0}-H_{12}H_{22}^{-1}b_{2,0}+(H_{11}-H_{12}H_{22}^{-1}H_{21})\delta x_1\\ =b_0^*+H_0^*\delta x_1b?=b1??H12?H22?1?b2?=(b1,0?+H11?δx1?+H12?δx2?)?H12?H22?1?(b2,0?+H21?δx1?+H22?δx2?)=b1,0??H12?H22?1?b2,0?+(H11??H12?H22?1?H21?)δx1?=b0??+H0??δx1?? ? ? ? 由上述推導,原增量方程變為H0?δx=JlTJlδx=b?=b0?+H0?dx=b0?+JlTJldx=JlT(JlT)+b0?+JlTJldx=JlT((JlT)+b0?+Jldx)H_0^*\delta x=J_l^TJ_l\delta x=b^*=b_0^*+H_0^*dx\\ =b_0^*+J_l^TJ_ldx=J_l^T(J_l^T)^+b_0^*+J_l^TJ_ldx=J_l^T((J_l^T)^+b_0^*+J_ldx)H0??δx=JlT?Jl?δx=b?=b0??+H0??dx=b0??+JlT?Jl?dx=JlT?(JlT?)+b0??+JlT?Jl?dx=JlT?((JlT?)+b0??+Jl?dx)? ? ? ? 其中JlJ_lJl?為H0?H_0^*H0??分解出的等價雅克比,δx\delta xδx為每次參數更新增量,dxdxdx為當前參數值與線性化點x0x_0x0?的差值。
? ? ? ? 因此,邊緣化后等價的先驗誤差ep=(JlT)+b?=(JlT)+b0?+Jldxe_p=(J_l^T)^+b^*\\=(J_l^T)^+b_0^*+J_ldxep?=(JlT?)+b?=(JlT?)+b0??+Jl?dx至此,邊緣化的步驟可以總結為:
同時定義costfunction需要的jacobians,把JlJ_lJl?由localsize轉為globalsize)
ceres自動更新b?b^*b?:b?=JlTepb^*=J_l^Te_pb?=JlT?ep?:
附錄:
? ? ? ? 使用H分解J的方式如下:
H=USUT=JTJH=USU^T=J^TJH=USUT=JTJ? ? ? ? 對H進行奇異值分解,由于H為半正定實矩陣,S也即為特征值矩陣,這樣J=S12UT(JT)+=S?12UTJ=S^\frac12U^T\\(J^T)^+=S^{-\frac12}U^T J=S21?UT(JT)+=S?21?UT
總結
以上是生活随笔為你收集整理的VINS-MONO边缘化策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++实现车轮轨迹
- 下一篇: 无水印视频免费素材 抖音短视频特效玩法