vins-fusion代码解读[一] vio主体

2023-05-16

SLAM新手,欢迎讨论。

港科大vins-fusion代码解读[一]

vins-fusion与vins-mono代码结构有很大相似性。这次先看看vins_estimator节点内的内容。

1.程序入口:

(1)vins_estimator:: rosNodeTest.cpp

main()函数中:

a.读取配置文件参数 readParameter()
b.订阅了四个话题,分别是imu消息,两个相机图像,和feature_tracker所提供的跟踪光流点
c.同时开启了一个新线程sync_process。线程的作用:如果图像buffer里面有数据的话,读入数据并且添加到estimator中。为什么不在相机图像的回调函数就input,我的理解在于对于双目的话,能够检测同步问题,能够将同样时间戳的两帧图片同时放入estimator中。所以对于Imu以及feature直接在回调函数中进行添加。

Estimator estimator;

然而整个程序并不是从main()中开始的,而从Estimator estimator;开启。
类的初始化函数Estimator(),由于Estimator类成员内部有两个比较重要的自定义类成员:
(1)Feature_Tracker featuretracker;(以前vins-mono这部分是作为一个独立的Node存在):
用来对原始图像进行畸变校正,特征点采集,光流跟踪
(2)FeatureManager f_manager;
用来对滑动窗口内所有特征点的管理。
简单设置了一些参数后,系统进入main()。

接着main()与Estimator estimator两者开始发生联系:
main()中estimator.setParameter()开启了滑动窗口估计的一个新线程
由于我们在配置文件中 多线程MULTIPLE_THREAD设置为1,因此当setParameter()时候,就开启了一个Estimator类内的新线程:processMeasurements();

processMeasurements();

处理各种buffer里面的东西,当featureBuf不等于空时,开始进行以下处理(为什么是featureBuf,因为当有图像buffer数据的时候,才会有featuretracker.push(make_pair(t,featureFrame)),即有图像数据后,程序才发给跟踪器叫他产生feature,因此当featureBuf不等于空,所有的buffer,包括imu,图像,都不为空):
processIMU(): 对IMU进行预积分
processIMage():对图像进行处理
pub VIO的各种话题,包括里程计信息,tf变换,相机姿态,点云信息,并且发布关键帧。

processIMage()

1。通过特征点的视差(按照vins-mono的说法,是基于imu旋转补偿后特征点的视差)来判断是否是关键帧,并对应边缘化的flag;
2。判断相机到IMU的外参(R,T)是否有校正,没校正用手眼标定法进行标定,具体体现在CalibrationExRotation里面,注意这里面只有标定旋转矩阵,没有标定平移矩阵,按照沈老师讲座上说的,外参中主要是R对系统比较敏感,如果偏差一两度,系统很容易就蹦。
3。判断是否有进行初始化:
(1)如果初始化已经完成,则就optimization(),用ceres_solver进行滑窗内(11帧)进行非线性优化的求解。按照vinsmono论文中,主要有三项,边缘化残差, imu残差,相机重投影残差。不过其实在代码中,又加入新的残差项,有相机Imu之间同步时间差的残差项。另外在处理图像的这个函数中,同时有一个failureDetection(),满足一定条件下系统认为系统已经挂掉了,例如非线性求解器中的解有大跳动,求解出相机IMU的外参矩阵或IMU偏移等等,系统挂掉就清空状态,重新初始化。
(2)如果没有初始化,则要进行相应的初始化工作。

初始化

初始化分为三种情况:
(1)单目加imu:
相机Imu外参标定好了之后,时间过了0.1秒,就开始进行初始化工作,函数表现在initialStructure()中
(2)双目加imu
双目pnp求解出滑窗内所有相机姿态,三角化特征点空间位置。得到这些之后,再进行陀螺仪漂移的估计。体现在solveGyroscopeBias()中。更新得到新的陀螺仪漂移Bgs,对之前预积分得到的结果进行更新。预积分的好处就在于你得到新的Bgs,不需要又重新再积分一遍,可以通过Bgs对位姿,速度的一阶导数,进行线性近似,得到新的Bgs求解出MU的最终结果。
(3)双目
双目pnp求解出滑窗内所有相机姿态,三角化特征点空间位置。

上面这些都是需要满足一定条件,比如单目加imu中,初始化需要imu至少两轴的激励足够大,并且跟踪到的特征点也需要满足一定的条件。

initialStructure()

1.第一步就是要检测IMU的可观性,即IMU的激励如果不够的话,会造成尺度的不客观。
2.接着使用sfm,pnp来求解出滑窗内所有帧的姿态,此时姿态是在尺度s下面的,即没有尺度信息。(单目没有办法得到尺度信息)
3.接着visualInitialAlign(),用来做视觉与IMU之间的融合,直观上讲,把纯视觉得到的结果拉拉扯扯一下,扯到IMU的尺度上来,并且又进行求解陀螺仪的bias,solveGyroscopeBias().同时LinearIMUAlign()求解得到尺度s,同时又进行RefineGravity(),对重力加速度的方向的大小进行求解。最后将第一帧相机的位姿调整到与重力加速度对齐的方向上来,即第一帧相机的z轴与重力加速度平行。这个就是代码中注释的//change state,下面做的东西

optimization()

google中ceres的问题,待估计的参数包括滑窗内所有帧的位姿,速度,加速度的漂移,陀螺仪的漂移(前面三项体现在para_speedBias里面,只一个9自由度的向量),以及特征点的深度(这一项是让整个非线性优化维度变得很高的主要原因,但是矩阵稀疏,有方便的求解方法)。如果相机到IMU的外参在配置文件没有足够的勇气设置成0,这两项R,T也会作为参数进行估计,另外如果使用比较low的自制VIsensor没有做到相机IMU同步,这两个传感器的时间差td也会作为一个参数来进行非线性优化(配置文件estimator_td如果你没有勇气设置成0的话,这一项也会进行估计)。单目的残差项与VINS-mono一致,但是双目残差项多了两项。还未看懂,谢谢惠顾!

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

vins-fusion代码解读[一] vio主体 的相关文章

  • 2 用D435i运行VINS-fusion

    文章目录 1 VINS fusion的安装1 1 环境和依赖的安装1 2 编译VINS Fusion1 3 编译错误解决方法 2 VINS Fusion跑数据集3 用相机运行VINS Fusion 环境 xff1a Ubuntu20 04
  • realsense435i运行vins-mono,标定部分

    相机标定 1 安装kalibr xff1b 参考 xff1a https blog csdn net wangbaodong070411209 article details 112248834 https blog csdn net we
  • VINS技术路线与代码详解

    VINS技术路线 写在前面 xff1a 本文整和自己的思路 xff0c 希望对学习VINS或者VIO的同学有所帮助 xff0c 如果你觉得文章写的对你的理解有一点帮助 xff0c 可以推荐给周围的小伙伴们 xff0c 当然 xff0c 如果
  • 记录编译Vins-mono中遇到的问题

    ceres版本导致的问题 xff1a 开始用的ceres 2 0的版本 xff0c 在catkin make的时候会报关于ceres interger 的错误 xff0c 见下图 然后换成ceres 1 4的版本 xff0c 顺利解决这个问
  • VINS-Mono代码阅读笔记:feature_tracker代码阅读(转载)

    转载 xff1a https blog csdn net moyu123456789 article details 100988989 1 入口main函数 feature tracker结点的入口函数为feature tracker n
  • ubuntu18.04 安装ros与运行vins-mono

    Ubuntu18 04 安装环境及运行Vins mono xff08 2022年 xff09 AI技术聚合 安装 sudo apt get install ros melodic desktop full 正在解包 ros melodic
  • ubuntu20.04跑PL-VINS

    PL VINS源码 xff1a https github com cnqiangfu PL VINS 编译时报错 catkin make Ceres报错 报错信息 CMake Error at usr local lib cmake Cer
  • 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
  • VIO与全局快门及轮速计的一些应用小技巧

    封面就用一个可爱的小车车 之前各种针对VIO xff0c VSLAM和VINS的工程注意事项都讲过了 今天的内容主要是针对VSLAM xff0c VIO的实用性 比如Td xff0c 同步对时 xff0c 内参 xff0c 外参这一串 最近
  • IMU误差模型简介及VINS使用说明

    1 IMU误差来源 2 IMU噪声模型 Noise and Bias kalibr中的imu noise model 参考 xff1a https github com ethz asl kalibr wiki IMU Noise Mode
  • 在TUMVI数据集上测试VINS-Fusion算法

    VINS Fusion算法是一个非常优秀的视觉惯性里程计 但原版VINS Fusion并没有提供与TUM数据集相应的配置文件 因此需要自己进行写yaml文件 修改配置文件 tum mono yaml span class token dir
  • 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论文翻译】VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator

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

    Intel RealSense D435i 一 准备工作二 修改参数rs camera launchrealsense color config yaml 参考文献 一 准备工作 1 Intel Realsense D435i Ubuntu
  • px4ctrl代码解读-px4ctrl_node

    头文件 include lt ros ros h gt include 34 PX4CtrlFSM h 34 include lt signal h gt 1 初始化节点 ros init argc argv 34 px4ctrl 34 r
  • VINS问题整理

    VINS的初始化过程 xff1f 首先进行纯视觉SfM xff1a 把滑窗填满 xff0c 然后选择枢纽帧 xff08 和最后一帧有足够的视野重叠保证计算的位姿精度 xff0c 并且和最后一帧有足够的视差保证三角化地图点的精度 xff09
  • SiamRPN VOT2018竞赛提交代码解读

    SiamRPN VOT CODE 上一篇文章解析了SiamRPN DaSiamRPN 的论文 但是光说不练是不行的 好在其团队还是给出了竞赛用的代码 虽然没有训练部分 但有的总比没有的强 这里就简要解析一下代码 欢迎交流 1 主要文件引用关
  • VMware Fusion 挂载物理机硬盘(整盘)

    以下操作前提 系统为 Mac OS OSX 安装了 VMware Fusion 实现原理 类似ESXI中的RDM映射 将物理硬盘映射到一个VM虚拟磁盘 可供VM选择的虚拟磁盘文件 首先查询本机硬盘情况 diskutil list 采用SCS
  • 强化学习代码实战入门

    这是一个易理解的 demo 300行左右 可以作为RL的入门代码 辅助基础公式的理解 这个是我自己的学习笔记 三连留下邮箱 可以直接发送完整的代码标注文件 如有错误 麻烦指出 我已经蛮久没写博了 上一篇RL博客也快一年半了 很久没做这一块了
  • 如何解决:自定义 MSBuild 任务需要在 AppBase 外部进行组装

    我有一个自定义任务 想要在构建 C 项目时执行 此任务位于 MyTask dll 中 它引用另一个程序集 MyCommon DLL 问题是 MyCommon dll 相对于 MyTask dll 位于 Common MyCommon dll

随机推荐

  • Latex小白学习方法和实践

    1 了解简单语法 xff0c 读懂latex解决的问题 xff0c 和其核心方法论 知道latex其实不是万金油 xff0c 只是在熟悉的情况下 xff0c 让你更完美的排版 xff0c 省去可视化下不精确的问题 xff0c 其不会很快的完
  • PADS版本历史

    从加载文件的速度 xff0c 生成的文件大小 xff0c 画图的速度 xff0c 渲染的速度等多方面来说 xff0c 个人认为 PDAS 算是非常不错的一款软件 xff0c 值得学习和使用 大概把其光辉历史罗列一下 xff0c 作为一个回忆
  • 简述Z-Stack的基本工作原理与流程(OSAL操作系统)

    首先上图 xff0c 跟着图中的函数顺序来感受Z Stack的工作流程 xff1a Z Stack协议栈总的来说做了两件事 xff0c 系统的初始化和启动OSAL操作系统 系统初始化 xff1a 从main函数看 xff0c 首先是调用了o
  • 使用MaixPy IDE开发K210

    使用MaixPy IDE快速开发K210 距离我第一次使用MaixPy将近40天了 xff0c 大概花了26天 xff0c 完成了我的毕业设计并且进行了优化 后面我会花时间去和大家分享我的毕设 xff0c 也希望能得到各位码友的意见和建议
  • K210实现人脸识别(附代码解读)

    基于K210的人脸识别门禁 xff08 一 xff09 进入官网 xff08 首次登陆需要注册 xff09 获取人脸识别源码 https wiki sipeed com soft maixpy zh course ai image face
  • K210人脸识别+人脸信息存储

    在我的上一篇博客中已经介绍了如何使用K210实现基本的人脸识别功能 https blog csdn net HuangChen666 article details 113995079 spm 61 1001 2014 3001 5501
  • 旅行商问题--蚁群优化算法求解(matlab实现)

    今天给大家分享一下matlab实现蚁群优化算法 xff0c 解决旅行商问题 在上一篇博客中对蚁群优化算法做了较为详细的介绍 xff0c 有需要的小伙伴可以看一下 https blog csdn net HuangChen666 articl
  • 粒子群优化算法及MATLAB实现

    上一篇博客是关于蚁群优化算法的 xff0c 有兴趣的可以看下 https blog csdn net HuangChen666 article details 115913181 1 粒子群优化算法概述 2 粒子群优化算法求解 2 1 连续
  • A星(A*、A Star)路径规划算法详解(附MATLAB代码)

    首先看看运行效果 xff0c 分别有三种模式 xff0c 代码运行前需要通过鼠标点击设置起点和终点 第一种模式直接输出最短路径 第二种模式输出最短路径的生成过程 第三种模式输出最短路径的生成过程和详细探索的过程 代码获取 gitee链接 x
  • Ubuntu20.04+MAVROS+PX4+Gazebo保姆级安装教程

    Ubuntu20 04 43 MAVROS 43 PX4 43 Gazebo 安装PX4步骤安装MAVROS安装QGCPX4仿真 安装PX4步骤 从github上clone源码 span class token function git s
  • PX4+Offboard模式+代码控制无人机起飞(Gazebo)

    参考PX4自动驾驶用户指南 https docs px4 io main zh ros mavros offboard cpp html 我的另一篇博客写了 键盘控制PX4无人机飞行 PX4无人机 键盘控制飞行代码 可以先借鉴本篇博客 xf
  • 基于ESP32的小型四轴无人机

    粗糙版试飞成功 xff01 陀螺仪部分直接飞线飞了一个模块 xff0c 懒得焊了 不是很水平 xff0c 稳定性不是很好 因为滤波算法中加入的元素太少了 xff0c 目前也就MPU6050的输出数据加入了计算 xff0c 所以很多自稳定性飞
  • PX4无人机 - 键盘控制飞行代码

    PX4无人机 键盘控制飞行代码 仿真效果 实机效果 由于图片限制5M以内 xff0c 只能上传一小段了 xff0c 整段视频请点击链接 Pixhawk 6c 无人机 键盘控制无人机 Offboard模式 核心 xff1a 发布 mavros
  • 【FreeRTOS学习 - 消息队列学习】

    跟着韦东山老师FreeRTOS教学资料的学习记录 FreeRTOS全部项目代码链接 xff08 更新中 xff09 https gitee com chenshao777 free rtos study 本文章一共分为一下几个部分 1 创建
  • 【Linux多线程编程-自学记录】08.Linux多线程互斥量

    Linux多线程编程学习代码 xff08 代码已上传gitee xff0c 还请各位兄弟点个Star哦 xff01 xff09 https gitee com chenshao777 linux thread git 笔记 xff1a 1
  • 【Linux多线程编程-自学记录】09.Linux多线程之读写锁

    Linux多线程编程学习代码 xff08 代码已上传gitee xff0c 还请各位兄弟点个Star哦 xff01 xff09 https gitee com chenshao777 linux thread git 笔记 xff1a 1
  • 【Linux多线程编程-自学记录】10.条件变量

    Linux多线程编程学习代码 xff08 代码已上传gitee xff0c 还请各位兄弟点个Star哦 xff01 xff09 https gitee com chenshao777 linux thread git 笔记 xff1a 1
  • 树莓派4B安装Ros 2 Foxy踩坑记录

    1 通过树莓派官方提供的写卡工具raspberry pi imager选择Ubuntu 20 04 5 xff08 64 bit xff09 xff0c 因为我打算用一个8G的存储卡安装ros 2 xff0c Ubuntu 22 04的比较
  • 港科大vins-fusion初探

    SLAM新手 xff0c 欢迎讨论 关于vins fusion的博客 xff1a 1 初探 xff1a https blog csdn net huanghaihui 123 article details 86518880 2 vio主体
  • vins-fusion代码解读[一] vio主体

    SLAM新手 xff0c 欢迎讨论 港科大vins fusion代码解读 一 vins fusion与vins mono代码结构有很大相似性 这次先看看vins estimator节点内的内容 1 程序入口 xff1a 1 vins est