VINS中陀螺仪零偏的估计

2023-05-16

VINS中关于陀螺仪零偏的初始化估计

对于窗口中得连续两帧 b k b_{k} bk b k + 1 b_{k+1} bk+1 ,已经从视觉SFM中得到了旋转 q b k c 0 q_{b_{k}}^{c_{0}} qbkc0 q b k + 1 c 0 q_{b_{k+1}}^{c_{0}} qbk+1c0 ,从IMU预积分中得到了相邻帧旋转 γ ^ b k + 1 b k \hat{\gamma}^{b_{k}}_{b_{k+1}} γ^bk+1bk 。 根据约束方程,联立所有相邻帧,最小化代价函数(论文式(7)):
min ⁡ δ b w ∑ k ∈ B ∥ q b k + 1 c 0 − 1 ⊗ q b k c 0 ⊗ γ b k + 1 b k ∥ 2 \min _{\delta b_{w}} \sum_{k \in \mathcal{B}}\left\|q_{b_{k+1}}^{c_{0}}{ }^{-1} \otimes q_{b_{k}}^{c_{0}} \otimes \gamma_{b_{k+1}}^{b_{k}}\right\|^{2} δbwminkB qbk+1c01qbkc0γbk+1bk 2
其中对陀螺仪偏置求IMU预积分项线性化,有:
γ b k + 1 b k ≈ γ ^ b k + 1 b k ⊗ [ 1 1 2 J b w γ δ b w ] \gamma_{b_{k+1}}^{b_{k}} \approx \hat{\gamma}_{b_{k+1}}^{b_{k}} \otimes\left[\begin{array}{c} 1 \\ \frac{1}{2} J_{b_{w}}^{\gamma} \delta b_{w} \end{array}\right] γbk+1bkγ^bk+1bk[121Jbwγδbw]
在具体实现的时候,因为上述约束方程为:

q b k + 1 c 0 − 1 ⊗ q b k c 0 ⊗ γ b k + 1 b k = [ 1 0 ] q_{b_{k+1}}^{c_{0}}{ }^{-1} \otimes q_{b_{k}}^{c_{0}} \otimes \gamma_{b_{k+1}}^{b_{k}}=\left[\begin{array}{l} 1 \\ 0 \end{array}\right] qbk+1c01qbkc0γbk+1bk=[10]
有:

γ b k + 1 b k = q b k c 0 − 1 ⊗ q b k + 1 c 0 ⊗ [ 1 0 ] \gamma_{b_{k+1}}^{b_{k}}=q_{b_{k}}^{c_{0}-1} \otimes q_{b_{k+1}}^{c_{0}} \otimes\left[\begin{array}{l} 1 \\ 0 \end{array}\right] γbk+1bk=qbkc01qbk+1c0[10]
代入 δ b w \delta b_{w} δbw 得 :

γ ^ b k + 1 b k ⊗ [ 1 1 2 J b w γ δ b w ] = q b k c 0 − 1 ⊗ q b k + 1 c 0 ⊗ [ 1 0 ] \hat{\gamma}_{b_{k+1}}^{b_{k}} \otimes\left[\begin{array}{c} 1 \\ \frac{1}{2} J_{b_{w}}^{\gamma} \delta b_{w} \end{array}\right]=q_{b_{k}}^{c 0-1} \otimes q_{b_{k+1}}^{c 0} \otimes\left[\begin{array}{l} 1 \\ 0 \end{array}\right] γ^bk+1bk[121Jbwγδbw]=qbkc01qbk+1c0[10]

只考虑虚部,有 :

J b w γ δ b w = 2 ( γ ^ b k + 1 b k − 1 ⊗ q b k c 0 − 1 ⊗ q b k + 1 c 0 ) v e c J_{b_{w}}^{\gamma} \delta b_{w}=2\left(\hat{\gamma}_{b_{k+1}}^{b_{k}}{ }^{-1} \otimes q_{b_{k}}^{c_{0}-1} \otimes q_{b_{k+1}}^{c_{0}}\right)_{v e c} Jbwγδbw=2(γ^bk+1bk1qbkc01qbk+1c0)vec

两侧乘以 J b w γ T \mathbf{J_{b_{w}}^{\gamma}}^{T} JbwγT ,用LDLT分解求得 δ b w \delta b_{w} δbw
在代码中, q i , j \mathrm{q}_\mathrm{i,j} qi,j q b k + 1 b k = q b k c 0 − 1 ⊗ q b k + 1 c 0 q_{b_{k+1}}^{b_{k}}=q_{b_{k}}^{c_{0}-1} \otimes q_{b_{k+1}}^{c_{0}} qbk+1bk=qbkc01qbk+1c0
t m p − A \mathrm{tmp}_{-} \mathrm{A} tmpA J b w γ J_{b_{w}}^{\gamma} Jbwγ

t m p − B \mathrm{tmp}_{-} \mathrm{B} tmpB
2 ( r ^ b k + 1 b k − 1 ⊗ q b k + 1 b k ) v e c = 2 ( r ^ b k + 1 b k − 1 ⊗ q b k c 0 − 1 ⊗ q b k + 1 c 0 ) v e c 2\left(\hat{r}_{b_{k+1}}^{b_{k}}{ }^{-1} \otimes q_{b_{k+1}}^{b_{k}}\right)_{v e c}=2\left(\hat{r}_{b_{k+1}}^{b_{k}}{ }^{-1} \otimes q_{b_{k}}^{c_{0}-1} \otimes q_{b_{k+1}}^{c_{0}}\right)_{v e c} 2(r^bk+1bk1qbk+1bk)vec=2(r^bk+1bk1qbkc01qbk+1c0)vec
根据上面的代价函数构造 A x = B \mathrm{Ax}=\mathrm{B} Ax=B
J b w γ T J b w γ δ b w = 2 J b w γ T ( r ^ b k + 1 b k − 1 ⊗ q b k c 0 − 1 ⊗ q b k + 1 c 0 ) vec  J_{b_{w}}^{\gamma T} J_{b_{w}}^{\gamma} \delta b_{w}=2 J_{b_{w}}^{\gamma T}\left(\hat{r}_{b_{k+1}}^{b_{k}}{ }^{-1} \otimes q_{b_{k}}^{c_{0}-1} \otimes q_{b_{k+1}}^{c_{0}}\right)_{\text {vec }} JbwγTJbwγδbw=2JbwγT(r^bk+1bk1qbkc01qbk+1c0)vec 
然后采用LDLT分解求得 δ b w \delta b_{w} δbw

  • VINS中的代码
/**
 * @brief   陀螺仪偏置校正
 * @optional    根据视觉SFM的结果来校正陀螺仪Bias -> Paper V-B-1
 *              主要是将相邻帧之间SFM求解出来的旋转矩阵与IMU预积分的旋转量对齐
 *              注意得到了新的Bias后对应的预积分需要repropagate
 * @param[in]   all_image_frame所有图像帧构成的map,图像帧保存了位姿、预积分量和关于角点的信息
 * @param[out]  Bgs 陀螺仪偏置
 * @return      void
*/
void solveGyroscopeBias(map<double, ImageFrame> &all_image_frame, Vector3d* Bgs)
{
    Matrix3d A;
    Vector3d b;
    Vector3d delta_bg;
    A.setZero();
    b.setZero();
    map<double, ImageFrame>::iterator frame_i;
    map<double, ImageFrame>::iterator frame_j;
    for (frame_i = all_image_frame.begin(); next(frame_i) != all_image_frame.end(); frame_i++)
    {
        frame_j = next(frame_i);
        MatrixXd tmp_A(3, 3);
        tmp_A.setZero();
        VectorXd tmp_b(3);
        tmp_b.setZero();
 
        //R_ij = (R^c0_bk)^-1 * (R^c0_bk+1) 转换为四元数 q_ij = (q^c0_bk)^-1 * (q^c0_bk+1)
        Eigen::Quaterniond q_ij(frame_i->second.R.transpose() * frame_j->second.R);
        //tmp_A = J_j_bw
        tmp_A = frame_j->second.pre_integration->jacobian.template block<3, 3>(O_R, O_BG);
        //tmp_b = 2 * (r^bk_bk+1)^-1 * (q^c0_bk)^-1 * (q^c0_bk+1)
        //      = 2 * (r^bk_bk+1)^-1 * q_ij
        tmp_b = 2 * (frame_j->second.pre_integration->delta_q.inverse() * q_ij).vec();
        //tmp_A * delta_bg = tmp_b
        A += tmp_A.transpose() * tmp_A;
        b += tmp_A.transpose() * tmp_b;
 
    }
    // LDLT方法
    delta_bg = A.ldlt().solve(b);
    ROS_WARN_STREAM("gyroscope bias initial calibration " << delta_bg.transpose());
 
    for (int i = 0; i <= WINDOW_SIZE; i++)
        Bgs[i] += delta_bg;
    // 得到了新的Bias后对应的预积分需要repropagate
    for (frame_i = all_image_frame.begin(); next(frame_i) != all_image_frame.end( ); frame_i++)
    {
        frame_j = next(frame_i);
        frame_j->second.pre_integration->repropagate(Vector3d::Zero(), Bgs[0]);
    }
}

之所以 A +=tmp_A.transpose() * tmp_A,其实就是 A T A x = A T b A^T Ax=A^Tb ATAx=ATb。在求解 A x = b Ax=b Ax=b 的最小二乘解时,两边同乘以A矩阵的转置得到的 A T A A^TA ATA 一定是可逆的。

  • TIPS

    这里为什么是可以连加的呢,直接构造该正定方程呢,简单来说就是VINS中认为滑窗中陀螺仪的Bags都是一样的。所以把所有的方程写在一起就构成了同一个变量的连加形式。

Reference

  • https://zhuanlan.zhihu.com/p/465689538

  • https://zhuanlan.zhihu.com/p/158621734

  • https://blog.csdn.net/m0_37874102/article/details/114834500

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VINS中陀螺仪零偏的估计 的相关文章

  • VINS-Mono运行与评测

    VINS Mono运行与评测 1 修改VINS mono轨迹保存代码1 1 修改 visualization cpp1 2 修改 pose graph cpp1 3 修改VINS mono运行参数 2 EVO 显示轨迹2 1 分析单条轨迹2
  • VINS-Fusion代码按执行顺序阅读(二)

    main 函数的最后一句 xff0c std thread sync thread sync process 可以看出 xff0c 只有time0在time1前后0 03s内的两幅图片 xff0c 才会被发布estimator inputI
  • vins-mono源码解读

    VINS MONO论文 43 代码学习 论文解读1 https blog csdn net hu hao article details 120257735 论文解读2 https blog csdn net weixin 44754915
  • SLAM之小觅相机跑开源方案(ORB_SLAM2,VINS MONO,VINS FUSION,RTAB-Map)

    传感器 xff1a 小觅相机标准版 开源SLAM方案 xff1a ORB SLAM2 xff0c VINS MONO xff0c VINS FUSION xff0c RTAB Map 测试地点 xff1a 室内大厅 xff08 光线不均 x
  • 【SLAM】VINS-MONO解析——对vins-mono的一点小改动

    vins mono刷了三遍 xff0c 手写vio刷了两遍 xff0c SLAM十四讲刷了两三遍 xff0c 从一开始完全看不懂是啥 xff0c 不知道什么是SLAM xff0c 什么是VIO xff0c 什么是VINS xff0c 什么是
  • realsense435i运行vins-mono,标定部分

    相机标定 1 安装kalibr xff1b 参考 xff1a https blog csdn net wangbaodong070411209 article details 112248834 https blog csdn net we
  • vins 解读_代码解读 | VINS_Mono中的鱼眼相机模型

    本文作者是计算机视觉life公众号成员蔡量力 xff0c 由于格式问题部分内容显示可能有问题 xff0c 更好的阅读体验 xff0c 请查看原文链接 xff1a 代码解读 VINS Mono中的鱼眼相机模型 VINS Mono中的鱼眼相机模
  • VINS on RealSense D435i

    关于Realsense D435i运行VINS系列 前言 在SLAM中 xff0c 主要是以激光SLAM和视觉SLAM为主 xff0c 激光雷达直接可以获取三维点云坐标信息 xff0c 所以激光SLAM会比视觉SLAM稳定许多 xff0c
  • vins位姿图优化

    我们 的滑动窗口和边缘化方案限制了计算的复杂性 xff0c 但也给系统带来了累积漂移 更确切地说 xff0c 漂移发生在全局三维位置 x y z 和围绕重力方向的旋转 yaw 为了消除漂移 xff0c 提出了一种与单目VIO无缝集成的紧耦合
  • ubuntu18.04 安装ros与运行vins-mono

    Ubuntu18 04 安装环境及运行Vins mono xff08 2022年 xff09 AI技术聚合 安装 sudo apt get install ros melodic desktop full 正在解包 ros melodic
  • VINS-Fusion跑kitti stereo及stereo+GPS数据

    Stereo source vfusion devel setup bash roslaunch vins vins rviz launch source vfusion devel setup bash rosrun loop fusio
  • VINS-Mono

    文章目录 初始化框架缺点ORB SLAM的Local Map VINS的滑窗 逐次逼近式去畸变给后端提供的特征点信息光流追踪对极约束F去除外点 rejectWithF 特征点均匀化预积分系统初始化初始化时不校正bias a误差卡尔曼滤波误差
  • 在ubuntu20.04上配置VINS_Fusion(亲测有效,一应俱全)

    最近在做科研训练的时候配置了HKUST Aerial Robotics实验室的VINS Fusion代码项目 xff0c 经历了一些编译报错的问题 xff0c 在网上查找的时候博客内容良莠不齐 xff0c 且实质针对性意见不多 xff0c
  • TX2上布置vins_fusion_gpu指南

    1 参考链接 如果初次安装 xff0c 新的TX2环境 xff0c 请参考文档 https github com arjunskumar vins fusion gpu tx2 nano 2 问题记录 1 xff0c 自己的环境情况 我的环
  • VINS-mono 解析 新特征

    在17 12 29 xff0c VINS更新了代码加入了新的特征 xff0c 包括map merge 地图合并 pose graph reuse 位姿图重利用 online temporal calibration function 在线时
  • vins中的坐标系变换及g2r函数

    slam中经常会需要表示一个刚体的位姿 例如imu的位姿 xff0c 相机的位姿 首先我们需要在一个刚体上架上一个坐标系 这个坐标系为本体坐标系 怎么架一个坐标系 xff1f imu本身就有规定其本身的x y z轴的方向 相机一般认为 xf
  • VINS-Mono论文笔记(中)

    VINS Mono论文笔记 中 前言1 初始化过程1 1 视觉重构1 2 视觉惯性联合 2 紧耦合的单目VIO系统2 1 公式2 2 imu残差2 3 视觉残差2 4 边缘化残差2 5 针对相机实时帧率的纯运动视觉惯性状态估计器2 6 im
  • VINS-Mono视觉初始化代码详解

    摘要 视觉初始化的过程是至关重要的 xff0c 如果在刚开始不能给出很好的位姿态估计 xff0c 那么也就不能对IMU的参数进行精确的标定 这里就体现了多传感器融合的思想 xff0c 当一个传感器的数据具有不确定性的时候 xff0c 我们需
  • 【VINS论文翻译】VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator

    回到目录 写在前面 港科大的VINS Mono作为目前state of the art的开源VIO项目 xff0c 是研究视觉与IMU紧耦合的必读算法 xff0c 网上的论文解读与代码实现也非常丰富 xff08 感谢 xff01 xff09
  • vins运行1

    vins fusion 运行笔记 安装code utils 1 fatal error elfutils libdw h 没有那个文件或目录 没有安装 sudo apt get install libdw dev 2 fatal error

随机推荐