文章目录
1.前言
本博客主要介绍VINS-Mono初始化时相机与IMU对齐,主要包括相机到IMU的外参估计、陀螺仪偏置、相机位移和估计空间点的尺度、重力加速度、每帧速度,主要参考了深蓝学院的VIO课程及博客VINS-Mono理论学习——视觉惯性联合初始化与外参标定和崔华坤的《VINS 论文推导及代码解析》。
总体而言,视觉IMU对齐流程主要包括以下几部分:
- 若旋转外参数 q c b q^{b}_{c} qcb未知,则先估计旋转外参数
- 利用旋转约束估计陀螺仪偏置: q b k c 0 = q c k c 0 ⊗ ( q c b ) − 1 q^{c_{0}}_{b_{k}} = q_{c_{k}}^{c_{0}}\otimes (q^{b}_{c})^{-1} qbkc0=qckc0⊗(qcb)−1
- 利用平移约束估计重力方向,速度,以及尺度初始值 s p ˉ b k c 0 = s p ˉ c k c 0 − R b k c 0 p c b s\bar p^{c_{0}}_{b_{k}} = s \bar p^{c_{0}}_{c_{k}} - R^{c_{0}}_{b_{k}}p^{b}_{c} spˉbkc0=spˉckc0−Rbkc0pcb
- 对重力向量 g c 0 g^{c_{0}} gc0进行进一步的优化
- 求解世界坐标系 w w w和初始相机坐标系 c 0 c_{0} c0之间的旋转矩阵 q c 0 w q^{w}_{c_{0}} qc0w,并将轨迹对齐到世界坐标系中
2. 外参标定 (利用旋转约束估计外参数旋转 q c b ) q^{b}_{c}) qcb)
相邻俩时刻 k k k, k + 1 k+1 k+1之间, k k k时刻的IMU到 k + 1 k+1 k+1时刻的相机外参旋转矩阵有: R c k + 1 b k = R b k + 1 b k ⋅ R c b = R c b ∗ R c k + 1 c k R^{b_{k}}_{c_{k+1}}=R^{b_{k}}_{b_{k+1}} \cdot R^{b}_{c} = R^{b}_{c} * R^{c_{k}}_{c_{k+1}} Rck+1bk=Rbk+1bk⋅Rcb=Rcb∗Rck+1ck 转换为四元素有: q b k + 1 b k ⊗ q c b = q c b ⊗ q c k + 1 c k q^{b_{k}}_{b_{k+1}} \otimes q^{b}_{c} = q^{b}_{c} \otimes q^{c_{k}}_{c_{k+1}} qbk+1bk⊗qcb=qcb⊗qck+1ck 上式可写为: ( L ( q b k + 1 b k ) − R ( q c k + 1 c k ) ) q c b = Q k + 1 k ⋅ q c b = 0 (\mathcal{L}(q^{b_{k}}_{b_{k+1}})-\mathcal{R}(q^{c_{k}}_{c_{k+1}}))q^{b}_{c} = Q^{k}_{k+1} \cdot q^{b}_{c} = 0 (L(qbk+1bk)−R(qck+1ck))qcb=Qk+1k⋅qcb=0
将多个时刻的上式方程累计起来,并加上鲁棒核权重,可构建超定方程: [ w 1 0 ⋅ Q 1 0 w 2 1 ⋅ Q 2 1 ⋯ w N N − 1 ⋅ Q N N − 1 ] q c b = Q N ⋅ q c b = 0 (1) \begin{bmatrix}w^{0}_{1} \cdot Q^{0}_{1} \\ w^{1}_{2} \cdot Q_{2}^{1} \\ \cdots \\ w^{N-1}_{N} \cdot Q_{N}^{N-1}\end{bmatrix} q^{b}_{c} = Q_{N}\cdot q^{b}_{c} = 0 \tag{1} ⎣⎢⎢⎡w10⋅Q10w21⋅Q21⋯wNN−1⋅QNN−1⎦⎥⎥⎤qcb=QN⋅qcb=0(1) 其中:
w k + 1 k = { 1 , r k + 1 k < t h r e s h o l d t h r e s h o l d r k + 1 k , o t h e r w i s e w_{k+1}^{k} = \left\{\begin{matrix} 1, \ \ r^{k}_{k+1}<threshold \\ \frac{threshold}{r^{k}_{k+1}}, \ \ otherwise \end{matrix}\right. wk+1k={
1, rk+1k<thresholdrk+1kthreshold, otherwise 由旋转和轴角之间的关系 t r ( R ) = 1 + 2 cos θ tr(R)=1+2\cos\theta tr(R)=1+2cosθ,能得到角度误差 r r r的计算为: r k + 1 k = a c o s ( ( t r ( ( R b k + 1 b k R ^ c b ) − 1 R ^ c b R c k + 1 c k ) − 1 ) / 2 ) = a c o s ( ( t r ( R ^ c b − 1 R b k + 1 b k − 1 R c b ^ R c k + 1 c k ) − 1 ) / 2 ) r^{k}_{k+1}=acos((tr((R^{b_{k}}_{b_{k+1}}\hat{R}^{b}_{c})^{-1}\hat{R}^{b}_{c}R^{c_{k}}_{c_{k+1}})-1)/2) \\ = acos((tr(\hat{R}^{b \ -1}_{c}R^{b_{k}\ -1}_{b_{k+1}}\hat{R^{b}_{c}}R^{c_{k}}_{c_{k+1}})-1)/2) 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()
对于 t r ( R ) = 1 + 2 cos θ tr(R)=1+2\cos \theta tr(R)=1+2cosθ的推导如下:
旋转矩阵和轴角的关系为: R = cos θ I + ( 1 − cos θ ) a a T − sin θ [ a ] × R=\cos\theta I +(1-\cos \theta) aa^{T} - \sin \theta [a]_{\times} R=cosθI+(1−cosθ)aaT−sinθ[a]× 其中 a = [ a 1 , a 2 , a 3 ] T a=[a_{1}, a_{2}, a_{3}]^{T} a=[a1,a2,a3]T为单位旋转轴, θ \theta θ为绕着旋转轴转动的角度, [ a ] × = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] [a]_{\times}=\begin{bmatrix} 0 & -a_{3} & a_{2} \\ a_{3} & 0 & -a_{1} \\ -a_{2} & a_{1} &0\end{bmatrix} [a]×=⎣⎡0a3−a2−a30a1a2−a10⎦⎤
同时,由于 a a a为单位旋转轴,有 t r ( a a T ) = 1 tr(aa^{T})=1 tr(aaT)=1,故:
t r ( R ) = cos θ t r ( I ) + ( 1 − cos θ ) t r ( a a T ) + sin θ t r ( [ a ] × ) = 3 cos θ + ( 1 − cos θ ) = 1 + 2 cos θ tr(R)=\cos \theta \ tr(I)+(1-\cos \theta) tr(aa^{T}) + \sin\theta \ tr([a]_{\times}) \\ = 3\cos\theta + (1-\cos \theta) = 1+2\cos \theta tr(R)=cosθ tr(I)+(1−cosθ)tr(aaT)+sinθ tr([a]×)=3cosθ+(1−cosθ)=1+2cosθ 同时也有 R a = a Ra=a Ra=a,即旋转轴上在旋转后并不发生变化,旋转轴 a a a为旋转矩阵 R R R的特征值为1对应的特征向量。
关于旋转矩阵和轴角的关系可参考:https://en.wikipedia.org/wiki/Rotation_matrix
3. 视觉IMU联合初始化

假如我们已经有一个初始的IMU到相机的外参 T c b = [ R c b ∣ p c b ] T^{b}_{c}=[R^{b}_{c}| p^{b}_{c}] Tcb=[Rcb∣pcb],同时又有不同时刻帧的位姿 T c k c 0 = [ R c k c 0 ∣ p c k c 0 ] T^{c_{0}}_{c_{k}}=[R^{c_{0}}_{c_{k}}|p^{c_{0}}_{c_{k}}] Tckc0=[Rckc0∣pckc0] (基于第一帧坐标系下),那么我们可以知道姿态从相机坐标系到IMU坐标系的关系 T b k c 0 = [ R b k c 0 ∣ p b k c 0 ] T^{c_{0}}_{bk}=[R^{c_{0}}_{b_{k}}|p^{c_{0}}_{b_{k}}] Tbkc0=[Rbkc0∣pbkc0]与前俩者的关系: T c k c 0 = T b k c 0 T c b T^{c_{0}}_{c_{k}} = T^{c_{0}}_{b_{k}}T^{b}_{c} Tckc0=Tbkc0Tcb 则有: [ R c k c 0 s p ˉ c k c 0 0 1 ] = [ R b k c 0 s p ˉ b k c 0 0 1 ] [ R c b p c b 0 1 ] \begin{bmatrix}R^{c_{0}}_{c_{k}} & s\bar{p}^{c_{0}}_{c_{k}} \\ 0 & 1\end{bmatrix} = \begin{bmatrix}R^{c_{0}}_{b_{k}} & s\bar{p}^{c_{0}}_{b_{k}} \\ 0 & 1\end{bmatrix} \begin{bmatrix}R^{b}_{c} & {p}^{b}_{c} \\ 0 & 1\end{bmatrix} [Rckc00spˉckc01]=[Rbkc00spˉbkc01][Rcb0pcb1] 将式子展开有【论文公式(14)】: R c k c 0 = R b k c 0 R c b → R b k c 0 = R c k c 0 ( R c b ) − 1 R^{c_{0}}_{c_{k}}=R^{c_{0}}_{b_{k}}R^{b}_{c} \rightarrow R^{c_{0}}_{b_{k}}=R^{c_{0}}_{c_{k}}(R^{b}_{c})^{-1} Rckc0=Rbkc0Rcb→Rbkc0=Rckc0(Rcb)