VINS-Mono之外参标定和视觉IMU联合初始化

1.前言

本博客主要介绍VINS-Mono初始化时相机与IMU对齐,主要包括相机到IMU的外参估计、陀螺仪偏置、相机位移和估计空间点的尺度、重力加速度、每帧速度,主要参考了深蓝学院的VIO课程及博客VINS-Mono理论学习——视觉惯性联合初始化与外参标定和崔华坤的《VINS 论文推导及代码解析》。
总体而言,视觉IMU对齐流程主要包括以下几部分:

  1. 若旋转外参数 q c b q^{b}_{c} qcb未知,则先估计旋转外参数
  2. 利用旋转约束估计陀螺仪偏置: 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
  3. 利用平移约束估计重力方向,速度,以及尺度初始值 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ˉckc0Rbkc0pcb
  4. 对重力向量 g c 0 g^{c_{0}} gc0进行进一步的优化
  5. 求解世界坐标系 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+1bkRcb=RcbRck+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+1bkqcb=qcbqck+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+1kqcb=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} w10Q10w21Q21wNN1QNN1qcb=QNqcb=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+(1cosθ)aaTsinθ[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]×=0a3a2a30a1a2a10
同时,由于 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)+(1cosθ)tr(aaT)+sinθ tr([a]×)=3cosθ+(1cosθ)=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=[Rcbpcb],同时又有不同时刻帧的位姿 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=[Rckc0pckc0] (基于第一帧坐标系下),那么我们可以知道姿态从相机坐标系到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=[Rbkc0pbkc0]与前俩者的关系: 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=Rbkc0RcbRbkc0=Rckc0(Rcb)

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值