从零学习VINS-Mono/Fusion源代码(三):IMU预积分公式推导

2023-05-16

本节学习IMU预积分,推导离散时间下的IMU预积分公式,并解读相应代码。

VINS-Mono/Fusion代码学习系列:
从零学习VINS-Mono/Fusion源代码(一):主函数
从零学习VINS-Mono/Fusion源代码(二):前端图像跟踪
从零学习VINS-Mono/Fusion源代码(三):IMU预积分公式推导
从零学习VINS-Mono/Fusion源代码(四):误差卡尔曼滤波
从零学习VINS-Mono/Fusion源代码(五):VIO初始化
从零学习VINS-Mono/Fusion源代码(六):后端优化


从零学习VINS-Mono/Fusion源代码(三):IMU预积分公式推导

  • 1 旋转的表示方法
  • 2 连续时间积分
  • 3 IMU预积分
    • 3.1 连续时间积分
    • 3.2 离散时间中值积分
    • 3.3 中值积分代码实现

1 旋转的表示方法

  • 旋转矩阵 R
    3x3的旋转矩阵R用9个量来描述3自由度,引入了额外约束(正交矩阵RR^T=I),求导十分困难
  • 旋转向量 n ⃗ θ \vec{n}\theta n θ
    表示形式紧凑,但是具有周期性,超过2pi就无法区分了
  • 欧拉角
    欧拉角默认旋转顺序为Z-Y-X,分别对应航向(yaw),俯仰(pitch),横滚(roll);优势是直观,但存在万向节死锁问题
  • 四元数
    紧凑,没有奇异,但是过参数化(用四个数表示3自由度,要求是单位四元数)
    在这里插入图片描述

2 连续时间积分

VINS-Mono论文中给出的世界坐标系W下,k到k+1时刻的连续时间积分:
在这里插入图片描述
注意:此公式定义中虚部在前,实部在后

在这里插入图片描述

四元数求导:
在这里插入图片描述


3 IMU预积分

3.1 连续时间积分

将位置速度姿态从世界坐标系w转到bk坐标系下,两边同乘转移矩阵,得到IMU预积分项.
IMU预积分项只与IMU输出有关,与位姿无关,当位姿得到优化后,也不需要重新对IMU做积分.
在这里插入图片描述在这里插入图片描述

3.2 离散时间中值积分

相邻两个图像帧时刻[bk, bk+1]之间有多个imu数据,计算i到i+1时刻的imu预积分量.
然后,依次更新姿态、速度、位置.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3 中值积分代码实现

IMU预积分的部分都是在/vins_estimator/src/factor/integration_base.h这个头文件中实现的,找到midPointIntergration()
输入参数:

void midPointIntegration(double _dt,   //时间戳
                         const Eigen::Vector3d &_acc_0, const Eigen::Vector3d &_gyr_0,  //k时刻加计和陀螺输出
                         const Eigen::Vector3d &_acc_1, const Eigen::Vector3d &_gyr_1,
                         const Eigen::Vector3d &delta_p, const Eigen::Quaterniond &delta_q, const Eigen::Vector3d &delta_v,
                         const Eigen::Vector3d &linearized_ba, const Eigen::Vector3d &linearized_bg,
                            Eigen::Vector3d &result_delta_p, Eigen::Quaterniond &result_delta_q, Eigen::Vector3d &result_delta_v,
                            Eigen::Vector3d &result_linearized_ba, Eigen::Vector3d &result_linearized_bg, bool update_jacobian)
参数属性
_dt时间戳
acc_0, gyr_0k时刻加速度计和陀螺仪
acc_1, gyr_1k+1时刻加速度计和陀螺仪
delta_p, delta_q, delta_v,k时刻位置、速度、姿态
linearized_ba, linearized_bgk时刻加速度计和陀螺仪
result_delta_p, result_delta_q, result_delta_vk+1时刻位置、速度、姿态
result_linearized_ba, result_linearized_bgk+1时刻加速度计和陀螺仪
update_jacobian=1求解雅克比矩阵

这里的k都是针对于imu采样值,不是相机帧

 //预积分更新
Vector3d un_acc_0 = delta_q * (_acc_0 - linearized_ba);
Vector3d un_gyr = 0.5 * (_gyr_0 + _gyr_1) - linearized_bg;
result_delta_q = delta_q * Quaterniond(1, un_gyr(0) * _dt / 2, un_gyr(1) * _dt / 2, un_gyr(2) * _dt / 2);
Vector3d un_acc_1 = result_delta_q * (_acc_1 - linearized_ba);
Vector3d un_acc = 0.5 * (un_acc_0 + un_acc_1);
result_delta_p = delta_p + delta_v * _dt + 0.5 * un_acc * _dt * _dt;
result_delta_v = delta_v + un_acc * _dt;
result_linearized_ba = linearized_ba;
result_linearized_bg = linearized_bg;             
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从零学习VINS-Mono/Fusion源代码(三):IMU预积分公式推导 的相关文章

随机推荐

  • 非科班如何自学深度学习转行

    前言 xff1a 博主已经学废了 xff0c 代码代码不行 xff0c 理论理论不行 xff0c 所以想把走过的路给大家讲讲经验 xff0c 仅供参考 研一前 xff1a 编程基础 xff1a Python为主 xff0c 一般的深度学习代
  • Pointpillars三维点云实时检测

    目录 一 项目方案 二 项目准备工作 1 安装并配置好Openpcdet的环境 2 安装好ROS melodic 三 项目工作空间创建及代码配置 四 具体代码修改与讲解 launch pointpillars launch的修改 launc
  • 神经网络模型的过拟合和欠拟合问题

    一 过拟合和欠拟合问题 过拟合定义 xff1a 模型在训练集上表现良好 xff0c 但在测试集上表现不好 过拟合原因 xff1a 1 原始特征过多 xff0c 存在一些噪声特征 xff0c 而模型过于复杂 xff0c 学习能力过强 xff0
  • 如何读取或转换PCD点云文件

    目录 一 Python方式 1 Open3D 2 直接用python读取并保存成bin格式 3 pypcd 二 C 43 43 方式 一 Python方式 1 Open3D 读取pcd文件 因为我的点云是ZED相机获得的 xff0c 所以是
  • Ubuntu不同版本的python如何进行切换

    ubuntu系统自带的有python2 7和python3 6 xff0c 也可以下其他的 运行下面的程序 xff0c 为python赋予优先使用等级 sudo update alternatives install usr bin pyt
  • 如何计算旋转框的IOU

    一 先将两个框转换为角点形式 一般我们得到的是中心点 xff0c 宽高 xff0c 和旋转角度 通过矢量旋转公式得到角点形式 二 判断四个角点是否在对方的框里 xff0c 并保存在里面的角点 A的角点向B的相邻的两条边投影 任意的B的两条边
  • centerpoint论文和代码解读

    目录 一 序论 二 论文结构 三 代码 论文地址 xff1a https arxiv org pdf 2006 11275 pdf 代码地址 xff1a tianweiy CenterPoint github com 一 序论 centor
  • 关于严蔚敏教授的数据结构一书中return ok ,OK为1不为0的问题

    在主函数即Main 函数中的return 需要返回0 xff0c 表示成功完成本函数 但是在严教授的书中所写的多数函数 xff0c 是status函数类型 xff0c 也就是说并不是主函数 xff0c 是子函数 xff0c 原则上子函数的r
  • MTN模型LOSS均衡相关论文解读

    目录 一 综述 二 依据任务不确定性加权多任务损失 三 依据不同任务的梯度大小来动态修正其loss权重GradNorm 四 根据LOSS变化动态均衡任务权重Dynamic Weight Average xff08 DWA xff09 五 R
  • 安装ceres库的避坑指南(附官方文档)

    目录 写在前面 1 Failed to connect to ceres solver google com port 443 解决办法 xff1a 更换源 2 OpenSSL SSL read Connection was reset e
  • 一文搞清apt与apt-get的异同

    本文翻译自Difference Between apt and apt get Explained It 39 s FOSS 译者注 xff1a 本人尽量以通俗易懂的方式展现原文的内容 xff0c 限于经验和水平 xff0c 错误之处欢迎指
  • SLAM≠机器人自主定位导航

    SLAM技术作为机器人自主移动的关键技术 xff0c 让很多人都误解为 xff1a SLAM 61 机器人自主定位导航 其实 xff0c SLAM 机器人自主定位导航 xff0c 不解决行动问题 SLAM如其名一样 xff0c 主要解决的是
  • slam是什么意思?一文带你读懂SLAM

    SLAM是Simultaneous localization and mapping缩写 xff0c 意为 同步定位与建图 xff0c 主要用于解决机器人在未知环境运动时的定位与地图构建问题 xff0c 为了让大家更多的了解SLAM xff
  • 自带SLAM和定位,不需要里程计的全新建图传感器—— SLAMTEC Mapper来了

    这些年 xff0c 我们引领并见证了激光传感器行业的快速发展 xff0c 是时候 xff0c 我们来搞点新的名堂了 xff01 下面 xff0c 有请今天的主角SLAMTEC Mapper 正式登场 xff01 Slamtec Mapper
  • ROS机器人编程学习(六)——ROS工具

    第6章 ROS工具 本章介绍了ROS的实用工具 RViz 和 rqt RViz是ROS的三维可视化工具 xff0c 便于三维视图的构建和显示 rqt是GUI开发工具 xff0c 便于图像查看 xff0c 重点介绍了rqt plot rqt
  • ZED2双目相机+IMU标定

    本文主要使用了kalibr工具标定ZED2双目相机 43 IMU xff0c 并运行VINS Fusion 阐述了标定板的选择方法 xff0c 以及标定中的注意事项 ZED2双目相机 43 IMU联合标定 1 安装标定工具2 选择标定板3
  • ZED2相机运行VINS-Fusion和ORB-SLAM3

    ZED2相机运行VINS Fusion和ORB SLAM3 1 关于zed2标定2 运行VINS Fusion3 运行ORB SLAM3 1 关于zed2标定 我最开始被zed2的标定问题折磨了好久 xff0c 用kalibr工具标定出来的
  • 用自己的设备跑各种VI-SLAM算法(1)——VINS/PL-VINS/ROVIO/MSCKF

    用自己的设备跑各种VI SLAM算法 xff08 1 xff09 1 VINS Fusion2 PL VINS3 ROVIO4 MSCKF 本人用的设备是一个海康单目相机和一个MTI惯导 xff0c 已经预先用kalibr工具标定了内外参
  • 【语言-汇编】自然常数(e)的计算

    原理介绍 它就是当 时函数 值的极限 即 xff1a 同时它也等于 计算结果 编译平台 xff1a Microsoft Visual Studio 2010 项目 xff1a Win32项目 空项目 CPU xff1a Intel R Co
  • 从零学习VINS-Mono/Fusion源代码(三):IMU预积分公式推导

    本节学习IMU预积分 xff0c 推导离散时间下的IMU预积分公式 xff0c 并解读相应代码 VINS Mono Fusion代码学习系列 xff1a 从零学习VINS Mono Fusion源代码 xff08 一 xff09 xff1a