VINS-Mono+Fusion源码解析系列(十五):视觉惯性对齐

本文详细解析了VINS-Mono+Fusion中的VisualIMUAlignment过程,包括陀螺仪零偏solveGyroscopeBias的理论推导、流程及代码实现。此外,介绍了LinearAlignment的线性方程构造,通过预积分量求解速度、加速度修正和平移尺度。整个过程涉及到自动驾驶中计算机视觉和惯性传感器融合的关键技术。

1. VisualIMUAlignment

(1)大致思路

  • 通过solveGyroscopeBias求出陀螺仪零偏
  • 通过LinearAlignment求出每帧的速度,加速度修正以及平移尺度s

(2)代码实现

/**
 * @brief 
 * 
 * @param[in] all_image_frame 每帧的位姿和对应的预积分量
 * @param[out] Bgs 陀螺仪零偏
 * @param[out] g 重力向量
 * @param[out] x 其他状态量
 * @return true 
 * @return false 
 */

bool VisualIMUAlignment(map<double, ImageFrame> &all_image_frame, 
                        Vector3d* Bgs, Vector3d &g, VectorXd &x)
{
   
   
    solveGyroscopeBias(all_image_frame, Bgs);  // 求零偏

    if(LinearAlignment(all_image_frame, g, x))  // 求每帧的速度,加速度修正以及尺度s
        return true;
    else 
        return false;
}

1.1 陀螺仪零偏solveGyroscopeBias

(1)理论推导 —— 根据旋转预积分量构造方程来求解陀螺仪零偏

​ 假设c0c_0c0帧为前面所说的枢纽帧,记它到第kkk个IMU数据之间的旋转为qc0bkq_{c_0}^{b_k}qc0bk,平移为pˉc0bk\bar{p}_{c_0}^{b_k}pˉc0bk。另外,记相机与IMU之间的旋转外参为qcbq_c^bqcb,平移外参为pcbp_c^bpcb

c0c_0c0帧到ckc_kck帧的变换关系如下:
Tc0ck=Tc0bk⋅Tbc[Rc0ckspc0ck01]=[Rc0bkspc0bk01][Rbcpbc01]⇒Rc0ck=Rc0bkRbc      spˉc0bk=spˉc0ck−Rc0bkpbc T_{c_0}^{c_k} = T_{c_0}^{b_k} \cdot T_b^c \\ \left[\begin{array}{cc} R_{c_0}^{c_k} & sp_{c_0}^{c_k} \\ 0 & 1 \end{array} \right] = \left[\begin{array}{cc} R_{c_0}^{b_k} & sp_{c_0}^{b_k} \\ 0 & 1 \end{array} \right] \left[\begin{array}{cc} R_b^c & p_b^c \\ 0 & 1 \end{array} \right] \\ \Rightarrow \\ R_{c_0}^{c_k} = R_{c_0}^{b_k}R_b^c\ \ \ \ \ \ s\bar{p}_{c_0}^{b_k} = s\bar{p}_{c_0}^{c_k} - R_{c_0}^{b_k}p_b^c Tc0ck=Tc0bkTbc[Rc0ck0spc0ck1]=[Rc0bk0spc0bk1][Rbc0pbc1]Rc0ck=Rc0bkRbc      spˉc0bk=spˉc0ckRc0bkpbc
​ 于是,枢纽帧到第kkk个IMU数据之间的旋转和平移可通过下式表达:
qc0bk=qc0ck⊗(qbc)−1spˉc0bk=spˉc0ck−Rc0bkpbc q_{c_0}^{b_k} = q_{c_0}^{c_k} \otimes (q_b^c)^{-1} \\ s\bar{p}_{c_0}^{b_k} = s\bar{p}_{c_0}^{c_k} - R_{c_0}^{b_k}p_b^c qc0bk=qc0ck(qbc)1spˉc0bk=spˉc0ckRc0bkpbc
:这里的命名是从右到左,从下到上,与SLAM14讲中的命名方式一样。

陀螺仪零偏的求解方程
min⁡δbw∑k∈B∣∣(qc0bk+1)−1⊗qc0bk⊗γbkbk+1∣∣2 \min_{\delta b_w}\sum_{k \in \mathcal{B}}||(q_{c_0}^{b_{k+1}})^{-1} \otimes q_{c_0}^{b_k} \otimes \gamma_{b_k}^{b_{k+1}}||^2 δbwminkB∣∣(qc0bk+1)1qc0bkγbkbk+12
​ 对上述方程的解释:前面已经求出枢纽帧c0c_0c0到第kkk帧IMU之间的旋转qc0bkq_{c_0}^{b_k}qc0bk,因此也可求出枢纽帧c0c_0c0到第k+1k+1k+1帧IMU之间的旋转qc0bk+1q_{c_0}^{b_{k+1}}qc0bk+1,第kkk帧IMU与第k+1k+1k+1帧IMU预积分量γbkbk+1\gamma_{b_k}^{b_{k+1}}γbkbk+1也可求出。

​ 所以,理论上(qc0bk+1)−1⊗qc0bk⊗γbkbk+1=qbk+1bk⊗qbkbk+1=I(q_{c_0}^{b_{k+1}})^{-1} \otimes q_{c_0}^{b_k} \otimes \gamma_{b_k}^{b_{k+1}} = q_{b_{k+1}}^{b_k} \otimes q_{b_k}^{b_{k+1}} = I(qc0bk+1)1qc0bkγbkbk+1=qbk+1bkqbkbk+1=I。但由于陀螺仪零偏δbw\delta b_wδbw的存在,使得预积分量γbkbk+1\gamma_{b_k}^{b_{k+1}}γbkbk+1存在误差,为了避免重新进行预积分,需要在原有预积分量γ^bkbk+1\hat{\gamma}_{b_k}^{b_{k+1}}γ^bkbk+1的基础上进行如下补偿:
γbkbk+1≈γ^bkbk+1⊗[112Jbwγδbw] \gamma_{b_k}^{b_{k+1}} \approx \hat{\gamma}_{b_k}^{b_{k+1}} \otimes \left[\begin{array}{cc} 1 \\ \frac{1}{2}J_{b_w}^{\gamma}\delta b_w \end{array} \right] γbkbk+1γ^bkbk+1[121Jbwγδbw]
​ 于是,在考虑陀螺仪零偏的情况下,上述求解方程应该得到一个单位四元数,即:
(qc0bk+1)−1⊗qc0bk⊗γ^bkbk+1⊗[112Jbwγδbw]=[1000]⇒[112Jbwγδbw]=[(qc0bk+1)−1⊗qc0bk⊗γ^bkbk+1]−1=(γ^bkbk+1)−1⊗(qc0bk)−1⊗qc0bk+1⇒12Jbwγδbw=[(γ^bkbk+1)−1⊗(qc0bk)−1⊗qc0bk+1]vec⇒Jbwγδbw=2[(γ^bkbk+1)−1⊗(qc0bk)−1⊗qc0bk+1]vec (q_{c_0}^{b_{k+1}})^{-1} \otimes q_{c_0}^{b_k} \otimes \hat{\gamma}_{b_k}^{b_{k+1}} \otimes \left[\begin{array}{cc} 1 \\ \frac{1}{2}J_{b_w}^{\gamma}\delta b_w \end{array} \right] = \left[\begin{array}{cc} 1 \\ 0 \\ 0 \\ 0 \end{array} \right] \\ \Rightarrow \\ \left[\begin{array}{cc} 1 \\ \frac{1}{2}J_{b_w}^{\gamma}\delta b_w \end{array} \right] = [(q_{c_0}^{b_{k+1}})^{-1} \otimes q_{c_0}^{b_k} \otimes \hat{\gamma}_{b_k}^{b_{k+1}} ]^{-1} = (\hat{\gamma}_{b_k}^{b_{k+1}})^{-1} \otimes (q_{c_0}^{b_k})^{-1} \otimes q_{c_0}^{b_{k+1}} \\ \Rightarrow \\ \frac{1}{2}J_{b_w}^{\gamma}\delta b_w = [(\hat{\gamma}_{b_k}^{b_{k+1}})^{-1} \otimes (q_{c_0}^{b_k})^{-1} \otimes q_{c_0}^{b_{k+1}}]_{vec} \\ \Rightarrow \\ J_{b_w}^{\gamma}\delta b_w = 2[(\hat{\gamma}_{b_k}^{b_{k+1}})^{-1} \otimes (q_{c_0}^{b_k})^{-1} \otimes q_{c_0}^{b_{k+1}}]_{vec} (qc0bk+1)1qc0bkγ^bkbk+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值