这篇笔记会记录论文里的关于初始化的方法,以及自己的一些心得,欢迎交流(´▽‘)ノ。
视觉惯性融合导航系统(VINS)因为相机和IMU的互补特性而被关注,但性能提升的前提是能够获取好的初始值。好的初始值能提高定位准确性,帮助系统收敛;而坏的初始值甚至会降低系统的性能。目前来说,VINS系统增加的初始化内容包括:尺度s、重力向量 g w g_{w} gw,速度v,陀螺仪偏置 b g b_{g} bg、加速度计偏置 b a b_{a} ba、相机和IMU之间的外参 T C B = [ R C B ∣ c p B ] T_{CB}=[R_{CB}|_{c}^{}\textrm{p}_{B}] TCB=[RCB∣cpB](一般默认已知)。
方法来源:Raul Mur-Artal在2017年发表的论文Visual-Inertial Monocular SLAM With Map Reuse。Raul在论文里把初始化问题分成4步来解决:(1)陀螺仪偏置估计;(2)绝对尺度和重力粗估计;(3)加速度计偏置估计,细化尺度和重力;(4)速度估计。其中会使用预积分理论,有需要可以参考我整理的笔记视觉惯性融合学习笔记一 预积分理论。
在初始阶段VI_ORB会先运行纯ORBSLAM一段时间,通过优化参数初始值使残差(目标函数)最小。
纯ORBSLAM有3个并行线程,tracking线程对关键帧之间的每个相机帧提取特征,匹配局部地图点,优化关键帧之间所有相机帧的重投影误差,并不断估计当前相机帧的位姿,直到局部地图点更新;local mapping线程负责管理地图点和关键帧,当检测到新的关键帧时,会开启局部BA,优化前N个关键帧位姿和这些帧看到的所有的地图点;loop closing线程通过place recognition模块将当前关键帧与过去的关键帧匹配,并优化位姿图。
这里引用ORBSLAM论文里的图,图片显示的是ORBSLAM的系统结构。
当ORBSLAM检测到N个关键帧时,先进行陀螺仪偏置估计。方法是以连续两个关键帧的ORBSLAM姿态估计值和IMU预积分的残差作为目标函数进行优化。
对于连续两帧关键帧i和i+1,关键帧i的ORBSLAM估计姿态记为 R W C i R_{WC}^{i} RWCi,关键帧i+1的估计姿态记为 R W C i + 1 R_{WC}^{i+1} RWCi+1,相机坐标系到体坐标系间的旋转矩阵为 R C B R_{CB} RCB。假设在初始化阶段,陀螺仪偏置存在小扰动,但是可以忽略,仍旧认为其为常数,两个关键帧之间的IMU预积分姿态测量值为(这里忽略了陀螺仪的测量噪声):
Δ R ~ i i + 1 = E x p [ ( ω ~ i − b g ) Δ t ] \Delta \widetilde R_{ii+1}=Exp[(\widetilde{\omega} _{i}-b^{g})\Delta t] ΔR ii+1=Exp[(ω i−bg)Δt]
其中 ω ~ i \widetilde{\omega} _{i} ω i表示关键帧i的陀螺仪测量值; b g b^{g} bg表示关键帧i的陀螺仪偏置,是待优化的量。
可以建立目标函数:
a r g m i n b g ∑ i = 1 N − 1 ∣ ∣ l o g [ ( Δ R ~ i i + 1 E x p ( J Δ R g b g ) ) T ] R B W i + 1 R W B i ∣ ∣ 2 \underset{b^{g}}{argmin} \sum_{i=1}^{N-1}||log[(\Delta \widetilde R_{ii+1}Exp(J_{\Delta R}^{g}b^{g}))^{T}]R_{BW}^{i+1}R_{WB}^{i}||^{2} bgargmini=1∑N−1∣∣log[(ΔR ii+1Exp(JΔRgbg))T]RBWi+1RWBi∣∣2
其中 J Δ R g = ∂ Δ R ~ i i + 1 ∂ b g J_{\Delta R}^{g}=\frac{\partial \Delta \widetilde R_{ii+1}}{\partial b^{g}} JΔRg=∂bg∂ΔR ii+1,因为假设了扰动,所以这个Jacobian的计算是有意义的; R W B i + 1 = R W C i + 1 R C B R_{WB}^{i+1}=R_{WC}^{i+1}R_{CB} RWBi+1=RWCi+1RCB表示世界坐标系到关键帧i+1对应的体坐标系的旋转矩阵; R W B i = R W C i R C B R_{WB}^{i}=R_{WC}^{i}R_{CB} RWBi=RWCiRCB表示关键帧i对应的IMU姿态。
令初始陀螺仪偏置为0,直接用Gauss-Newton法进行优化可以估计陀螺仪偏置初始值。
在估计陀螺仪偏置之后,关键帧i对应的IMU姿态测量值变成 R W B i R_{WB}^{i} RWBi已知。这时可以通过其他两个IMU预积分测量值估计绝对尺度和重力。
和陀螺仪偏置估计的方式不同,由于陀螺仪偏置已知,这里先忽略加速度计偏置和噪声的影响,因此可以计算出IMU位置和速度预积分测量值。利用已经计算的IMU预积分测量值,可以求得关键帧i+1的IMU位置测量值和速度测量值:
p i + 1 = p i + v i Δ t i i + 1 + 1 2 g W Δ t i i + 1 2 + R W B i Δ p i i + 1 p_{i+1}=p_{i}+v_{i}\Delta t_{ii+1}+\frac{1}{2}g^{W}\Delta t_{ii+1}^{2}+R_{WB}^{i}\Delta p_{ii+1} pi+1=pi+viΔtii+1+21gWΔtii+12+RWBiΔpii+1 v i + 1 = v i + g W Δ t i i + 1 + R W B i Δ v i i + 1 v_{i+1}=v_{i}+g^{W}\Delta t_{ii+1}+R_{WB}^{i}\Delta v_{ii+1} vi+1=vi+gWΔtii+1+RWBiΔvii+1
其中 p i p_{i} pi和 p i + 1 p_{i+1} pi+1分别表示关键帧i和i+1对应的IMU在世界坐标系的位置; v i + 1 v_{i+1} vi+1和 v i v_{i} vi分别表示关键帧i+1和i对应的IMU的速度; Δ t i i + 1 \Delta t_{ii+1} Δtii+1为两帧之间的时间差; g W g^{W} gW表示重力加速度向量; R W B i R_{WB}^{i} RWBi表示关键帧i对应的IMU姿态; Δ p i i + 1 \Delta p_{ii+1} Δpii+1表示IMU预积分位置测量值; Δ v i i + 1 \Delta v_{ii+1} Δvii+1表示IMU预积分速度测量值。
将上式的IMU在世界坐标系的位置 p i p_{i} pi和 p i + 1 p_{i+1} pi+1转换为相机在世界坐标系的位置 W p c i _{W}^{}\textrm{p}_{c}^{i} Wpci和 W p c i + 1 _{W}^{}\textrm{p}_{c}^{i+1} Wpci+1后得到:
s W p c i + 1 = s W p c i + v i Δ t i i + 1 + 1 2 g W Δ t i i + 1 2 + R W B i Δ p i i + 1 + ( R W C i − R W C i + 1 ) c p B s_{W}^{}\textrm{p}_{c}^{i+1}=s_{W}^{}\textrm{p}_{c}^{i}+v_{i}\Delta t_{ii+1}+\frac{1}{2}g^{W}\Delta t_{ii+1}^{2}+R_{WB}^{i}\Delta p_{ii+1}+(R_{WC}^{i}-R_{WC}^{i+1})_{c}^{}\textrm{p}_{B} sWpci+1=sWpci+viΔtii+1+21gWΔtii+12+RWBiΔpii+1+(RWCi−RWCi+1)cpB
为了利用避免出现IMU速度测量值,考虑连续3帧关键帧,分别将 W p c i + 1 _{W}^{}\textrm{p}_{c}^{i+1} Wpci+1乘以 Δ t i + 1 i + 2 \Delta t_{i+1i+2} Δti+1i+2, W p c i + 1 _{W}^{}\textrm{p}_{c}^{i+1} Wpci+1乘以 Δ t i i + 1 \Delta t_{ii+1} Δtii+1后计算差值,可以得到方程,用矩阵表示为:
[ λ ( i ) β ( i ) ] [ s g W ] = γ ( i ) [\lambda (i)\; \beta (i)]\begin{bmatrix} s\\g^{W} \end{bmatrix}=\gamma (i) [λ(i)β(i)][sgW]=γ(i)
用1,2,3简单表示i,i+1,i+2,得到
λ ( i ) = ( W p c 2 − W p c 1 ) Δ t 23 − ( W p c 3 − W p c 2 ) Δ t 12 \lambda (i)=(_{W}^{}\textrm{p}_{c}^{2}-_{W}^{}\textrm{p}_{c}^{1})\Delta t_{23}-(_{W}^{}\textrm{p}_{c}^{3}-_{W}^{}\textrm{p}_{c}^{2})\Delta t_{12} λ(i)=(Wpc2−Wpc1)Δt23−(Wpc3−Wpc2)Δt12 β ( i ) = 1 2 I 3 × 3 ( Δ t 12 2 Δ t 23 + Δ t 23 2 Δ t 12 ) \beta (i)=\frac{1}{2}I_{3\times 3}(\Delta t_{12}^{2}\Delta t_{23}+\Delta t_{23}^{2}\Delta t_{12}) β(i)=21I3×3(Δt122Δt23+Δt232Δt12) γ ( i ) = ( R W C 2 − R W C 1 ) c p B Δ t 23 − ( R W C 3 − R W C 2 ) c p B Δ t 12 + \gamma (i)=(R_{WC}^{2}-R_{WC}^{1})_{c}^{}\textrm{p}_{B}\Delta t_{23}-(R_{WC}^{3}-R_{WC}^{2})_{c}^{}\textrm{p}_{B}\Delta t_{12}+ γ(i)=(RWC2−RWC1)cpBΔt23−(RWC3−RWC2)cpBΔt12+ R W B 2 Δ p 23 Δ t 12 − R W B 1 Δ p 12 Δ t 23 + R W B 1 Δ v 12 Δ t 12 Δ t 23 R_{WB}^{2}\Delta p_{23}\Delta t_{12}-R_{WB}^{1}\Delta p_{12}\Delta t_{23}+R_{WB}^{1}\Delta v_{12}\Delta t_{12}\Delta t_{23} RWB2Δp23Δt12−RWB1Δp12Δt23+RWB1Δv12Δt12Δt23
但是我作差的结果和论文结果有差异,我计算的结果是
[ λ ( i ) β ( i ) ] [ s g W ] = − γ ( i ) [\lambda (i)\; \beta (i)]\begin{bmatrix} s\\g^{W} \end{bmatrix}=-\gamma (i) [λ(i)β(i)][sgW]=−γ(i)
因为我还没有实现过论文里的方法,目前仍然存疑。
之后利用奇异值分解(SVD)可以得到尺度和重力向量的初步估计值。
先避免计算加速度计偏置,是因为加速度计偏置远小于重力,很难与重力区分,这里利用重力大小G和惯性坐标系I下的重力方向 g ^ I = [ 0 , 0 , − 1 ] \hat {g}_{I}=[0,0,-1] g^I=[0,0,−1]帮助估计。设2.3估计的重力初始值为 g W ∗ g_{W}^{*} gW∗,则对应的重力方向为 g ^ W = g W ∗ / ∣ ∣ g W ∗ ∣ ∣ \hat {g}_{W}=g_{W}^{*}/||g_{W}^{*}|| g^W=gW∗/∣∣gW∗∣∣。
计算从惯性系I到世界坐标系的旋转矩阵为:
R W I = E x p ( v ^ θ ) R_{WI}=Exp(\hat {v}\theta ) RWI=Exp(v^θ) v ^ = g ^ I × g ^ W ∣ ∣ g ^ I × g ^ W ∣ ∣ I \hat {v}=\frac{\hat {g}_{I}\times \hat {g}_{W}}{||\hat {g}_{I}\times \hat {g}_{W}||}I v^=∣∣g^I×g^W∣∣g^I×g^WI θ = a t a n 2 ( ∣ ∣ g ^ I × g ^ W ∣ ∣ , g ^ I ⋅ g ^ W ) \theta =atan2(||\hat {g}_{I}\times \hat {g}_{W}||,\hat {g}_{I}\cdot \hat {g}_{W}) θ=atan2(∣∣g^I×g^W∣∣,g^I⋅g^W)
其中 v ^ \hat {v} v^为从I系到W系的旋转轴; θ \theta θ为从I系到W系的旋转角; R W I R_{WI} RWI为为从I系到W系的旋转矩阵。
设给 R W I R_{WI} RWI施加一个小扰动 E x p ( δ θ ) Exp(\delta \theta) Exp(δθ),因为绕z轴上的扰动不会对重力产生影响,因此 δ θ = [ δ θ x y T , 0 ] \delta \theta=[\delta \theta_{xy}^{T},0] δθ=[δθxyT,0], δ θ x y = [ δ θ x , δ θ y ] \delta \theta_{xy}=[\delta \theta_{x},\delta \theta_{y}] δθxy=[δθx,δθy]。这样估计W系下的重力向量可以转化为估计I系到W系的旋转矩阵:
g W = R W I g ^ I G − R W I ⌊ g I ⌋ × G δ θ g_{W}=R_{WI} \hat {g}_{I}G-R_{WI}\left \lfloor g_{I} \right \rfloor_{ \times} G\delta \theta gW=RWIg^IG−RWI⌊gI⌋×Gδθ
将重力向量 g W g_{W} gW代入关键帧i+1的IMU位置测量值:
s W p c i + 1 = s W p c i + v i Δ t i i + 1 + 1 2 R W I g ^ I G Δ t i i + 1 2 − 1 2 R W I ⌊ g I ⌋ × G δ θ Δ t i i + 1 2 + s_{W}^{}\textrm{p}_{c}^{i+1}=s_{W}^{}\textrm{p}_{c}^{i}+v_{i}\Delta t_{ii+1}+\frac{1}{2}R_{WI} \hat {g}_{I}G\Delta t_{ii+1}^{2}-\frac{1}{2}R_{WI}\left \lfloor g_{I} \right \rfloor_{ \times} G\delta \theta\Delta t_{ii+1}^{2}+ sWpci+1=sWpci+viΔtii+1+21RWIg^IGΔtii+12−21RWI⌊gI⌋×GδθΔtii+12+ R W B i Δ p i i + 1 + ( R W C i − R W C i + 1 ) c p B R_{WB}^{i}\Delta p_{ii+1}+(R_{WC}^{i}-R_{WC}^{i+1})_{c}^{}\textrm{p}_{B} RWBiΔpii+1+(RWCi−RWCi+1)cpB
对连续3帧关键帧,考虑加速度计偏置变化时的预积分修正,可以得到方程:
[ λ ( i ) ϕ ( i ) ζ ( i ) ] [ s δ θ x y b a ] = ψ ( i ) [\lambda (i)\; \phi (i)\; \zeta (i)]\begin{bmatrix} s\\ \delta \theta_{xy} \\b_{a} \end{bmatrix}=\psi (i) [λ(i)ϕ(i)ζ(i)]⎣⎡sδθxyba⎦⎤=ψ(i)
用1,2,3简单表示i,i+1,i+2:
ϕ ( i ) = [ 1 2 R W I ⌊ g I ⌋ × G ( Δ t 12 2 Δ t 23 + Δ t 23 2 Δ t 12 ) ] ( : , 1 : 2 ) \phi (i)=[\frac{1}{2}R_{WI}\left \lfloor g_{I} \right \rfloor_{ \times} G(\Delta t_{12}^{2}\Delta t_{23}+\Delta t_{23}^{2}\Delta t_{12})]_{(:,1:2)} ϕ(i)=[21RWI⌊gI⌋×G(Δt122Δt23+Δt232Δt12)](:,1:2) ζ ( i ) = R W B 2 J Δ p 23 a Δ t 12 − R W B 1 J Δ p 12 a Δ t 23 + R W B 1 J Δ v 23 a Δ t 12 Δ t 23 \zeta (i)=R_{WB}^{2}J_{\Delta p_{23}}^{a}\Delta t_{12}-R_{WB}^{1}J_{\Delta p_{12}}^{a}\Delta t_{23}+R_{WB}^{1}J_{\Delta v_{23}}^{a}\Delta t_{12}\Delta t_{23} ζ(i)=RWB2JΔp23aΔt12−RWB1JΔp12aΔt23+RWB1JΔv23aΔt12Δt23
ψ ( i ) = ( R W C 2 − R W C 1 ) c p B Δ t 23 − ( R W C 3 − R W C 2 ) c p B Δ t 12 + \psi (i)=(R_{WC}^{2}-R_{WC}^{1})_{c}^{}\textrm{p}_{B}\Delta t_{23}-(R_{WC}^{3}-R_{WC}^{2})_{c}^{}\textrm{p}_{B}\Delta t_{12}+ ψ(i)=(RWC2−RWC1)cpBΔt23−(RWC3−RWC2)cpBΔt12+ R W B 2 Δ p 23 Δ t 12 − R W B 1 Δ p 12 Δ t 23 + R W B 1 Δ v 12 Δ t 12 Δ t 23 + R_{WB}^{2}\Delta p_{23}\Delta t_{12}-R_{WB}^{1}\Delta p_{12}\Delta t_{23}+R_{WB}^{1}\Delta v_{12}\Delta t_{12}\Delta t_{23}+ RWB2Δp23Δt12−RWB1Δp12Δt23+RWB1Δv12Δt12Δt23+ 1 2 R W I g ^ I G ( Δ t 12 2 Δ t 23 + Δ t 23 2 Δ t 12 ) \frac{1}{2}R_{WI} \hat {g}_{I}G(\Delta t_{12}^{2}\Delta t_{23}+\Delta t_{23}^{2}\Delta t_{12}) 21RWIg^IG(Δt122Δt23+Δt232Δt12)
这里我推导的结果和论文也有一些出入,除了上面修改的 ψ ( i ) \psi (i) ψ(i)的最后一项外,我计算的方程为:
[ λ ( i ) − ϕ ( i ) ζ ( i ) ] [ s δ θ x y b a ] = − ψ ( i ) [\lambda (i)\; -\phi (i)\; \zeta (i)]\begin{bmatrix} s\\ \delta \theta_{xy} \\b_{a} \end{bmatrix}=-\psi (i) [λ(i)−ϕ(i)ζ(i)]⎣⎡sδθxyba⎦⎤=−ψ(i)
还没有实现过论文里的方法,这里目前也仍然存疑。
同样利用SVD可以求解方程。
在已经求出陀螺仪偏置、尺度、重力、加速度计偏置的情况下,速度初值是可以直接计算的:
v i + 1 = v i + g W Δ t i i + 1 + R W B i ( Δ v i i + 1 + J Δ v i i + 1 g b g + J Δ v i i + 1 a b a ) v_{i+1}=v_{i}+g^{W}\Delta t_{ii+1}+R_{WB}^{i}(\Delta v_{ii+1}+J_{\Delta v_{ii+1}}^{g}b_{g}+J_{\Delta v_{ii+1}}^{a}b_{a}) vi+1=vi+gWΔtii+1+RWBi(Δvii+1+JΔvii+1gbg+JΔvii+1aba)
这里计算的速度是最靠近当前帧的关键帧对应的IMU速度。
到这里VI_ORB的初始化过程就结束了,虽然从公式上看好像很清楚,但是感觉实现起来不会简单;上面的内容有一些是自己的推测,也有一些与论文有出入,大家有想法的话,欢迎交流≧∀≦)o)。