文章目录

  • 写在前面
  • 论文解读
    • vins-mono 概述
    • 1. Measurement Preprocessing 过程
    • 2. Estimator Initialization 过程
    • 3. Tightly Computed Monocular VIO
  • 代码解读
    • 各文件夹功能解读
    • 从CMakeLists.txt分析
    • vins_estimator
    • 从多线程角度分析
    • 功能类的问题
  • 附录:
    • 参数/变量 名称
    • class 名称
      • FeatureTracker 特征点追踪类
      • CameraFactory 不同的相机类型和校准模型
      • TicToc 计算时间差的功能类
      • Estimator

写在前面

VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator 的设计思路主要突出两点:

  1. 针对于单目的鲁棒性很强的VIO 系统
  2. 通用性很强的VIO框架

从论文和工程的设计思路无不体现着这两点,从考虑周密的初始化过程,到球面相机模型的引入等等都有体现,至于中间的Keyframe、Sliding Windows 以及4-DoF Pose Graph Optimization都是为了既保证优化的性能,也兼顾系统的实时性所做的一些考量。

论文解读

vins-mono 概述

解读vins-mono

  • 首先 Measurement Preprocessing (Vision Processing Front End + IMU Preintegration Processing)开始 ;

  • 然后通过一个松耦合的方式来做初始化;

  • 再通过一个紧耦合的方式来做 Local Visual-inertial Odometry;

1. Measurement Preprocessing 过程

  • Visual Preprocessing 每一帧图像特征点提取和 KLT稀疏光流追踪
  • IMU Preprocessing 两帧图像之间IMU预积分
  • Keyframe Selection

2. Estimator Initialization 过程

  • 首先是 Monocular Vision-Only SfM in Sliding Window 得到一个初步的平移和旋转
  • Camera - IMU rotation calibration
  • Visual-inertial alignment 对齐

3. Tightly Computed Monocular VIO

Nonlinear graph optimization-based, tightly-coupled, sliding windows, visual-inertial bundle adjustment

代码解读

各文件夹功能解读

code 功能
ar_demo 视觉定位的一个小应用demo
benchmark_publisher 订阅估计的estimated_odometry, 然后与CVS中的groundtruth对比
calibration_images 订阅相机的话题,保存成图片,用于相机校准,支持鱼眼相机,针孔相机
camera_model 各种相机模型的校准,入口函数
config 配置参数文件
feature_tracker 使用光流法追踪特征点
pose_graph 后端优化
vins_estimator 状态估计

从CMakeLists.txt分析

CMake files function
vins_estimator/CmakeLists.txt 生成 vins_estimator Node
feature_tracker/CmakeLists.txt 生成 feature_tracker Node
pose_graph/CmakeLists.txt 生成 pose_graph Node
camera_model/CmakeLists.txt 生成Calibration可执行程序 和camera_model库

vins_estimator

  • 入口函数为 estimator_node.cpp/main()

  • readParameters(n); 读取优化参数,IMU噪声和偏置,IMU-camera内参等

  • estimator.setParameter(); tic ric

  • 订阅 imu_callback feature_callback restart_callback relocalization_callback

  • 发布 Odometry path point-cloud

  • 订阅话题的回调函数只是数据缓存到 buf

  • 真正的处理在线程 std::thread measurement_process{process};中

    getMeasurements 通过时间戳,简单地对齐 IMU 和 feature point
    对于每一个IMU数据: estimator.processIMU(dt, Vector3d(dx, dy, dz), Vector3d(rx, ry, rz));
    对于每一帧CAM数据: estimator.processImage(image, img_msg->header);
    publish Odometry/KeyPoses/CameraPose/PointCloud/TF/Keyframe

vins-estimator 主要程序,
pose_garph
feature_tracker 使用光流法追踪特征点
intrinsic_calib.cc 从其他的库复制过来的

从多线程角度分析

功能类的问题

附录:

参数/变量 名称

参数名称 类型 来源 功能
IMAGE_TOPIC string yaml config file/image_topic 订阅图像话题名称
IMU_TOPIC string yaml config file/imu_topic 订阅IMU话题名称
MAX_CNT int yaml config file/max_cnt max feature number in feature tracking
MIN_DIST int yaml config file/min_dist min distance between two features
ROW int yaml config file/image_height 像素行数-图像高度
COL int yaml config file/image_width 像素列数-图像宽度
FREQ int yaml config file/freq frequence (Hz) of publish tracking result. At least 10Hz for good estimation. If set 0, the frequence will be same as raw image
F_THRESHOLD double yaml config file/F_threshold ransac threshold (pixel)
SHOW_TRACK int yaml config file/show_track 是否发布 tracking image话题
EQUALIZE int yaml config file/equalize 当图像太亮/暗,是否打开均衡补偿
FISHEYE int yaml config file/fisheye 是否使用鱼眼相机
FISHEYE_MASK string yaml config file/fisheye=1 fisheye_mask.jpg路径
CAM_NAMES std::vector<std::string> parameter.cpp全局变量 像素列数-图像宽度
WINDOW_SIZE int parameter.cpp全局变量 20 滑动窗口的大小
STEREO_TRACK int parameter.cpp全局变量 false 是否使用双目追踪
FOCAL_LENGTH int parameter.cpp全局变量 460 焦距
PUB_THIS_FRAME int parameter.cpp全局变量 false 不发布这帧
NUM_OF_CAM int parameter.h 1 camera的数量
modelType Camera::ModelType yaml config file/model_type kannala_brandt/mei/scaramuzza/pinhole camera的模型
SOLVER_TIME double max_solver_time 确保实时性,最大求解时间 0.04ms
NUM_ITERATIONS int max_num_iterations 确保实时性,最大迭代次数 8,避免冗余计算
MIN_PARALLAX double keyframe_parallax 关键帧选择的视差阈值 10 pixel
VINS_RESULT_PATH int output_path/vins_result_no_loop.csv 不加回环的输出结果
ESTIMATE_EXTRINSIC int estimate_extrinsic IMU和cam相对外参的方式选择,0-有准确可信的参数;1-有一组初始值,后面将基于此再优化,2-完全不知道相对外参,启动之初进行在线校准(注意开始的时候要有旋转) 保存在 output_path/extrinsic_parameter.csv中
RIC[0] cv_R eigen_R Eigen::Matrix3d extrinsicRotation IMU与camera的旋转
TIC[0] cv_T eigen_T Eigen::Vector3d extrinsicRotation IMU与camera的平移
INIT_DEPTH double vins_estimator/parameters.h camera的数量
BIAS_ACC_THRESHOLD double vins_estimator/parameters.h 1 acc偏置的阈值
BIAS_GYR_THRESHOLD double vins_estimator/parameters.h 1 陀螺仪偏置的阈值
TD int config/td IMU与camera的固有时钟差
ESTIMATE_TD int config/estimate_td 置位online estimate time offset between camera and imu
ROLLING_SHUTTER int rolling_shutter: 0 0-全局快门;1-卷帘快门

NUM_OF_CAM | int | parameter.h 1 | camera的数量

class 名称

FeatureTracker 特征点追踪类

  • FeatureTracker trackerData[NUM_OF_CAM];

CameraFactory 不同的相机类型和校准模型

  • static boost::shared_ptr instance(void);

TicToc 计算时间差的功能类

Estimator

参考文档:

VINS-Mono视觉SLAM总体设计框架解读相关推荐

  1. 视觉SLAM算法框架解析(1) PTAM

    版权声明:本文为博主原创文章,未经博主允许不得转载. 本系列文章旨在总结主流视觉SLAM算法的框架,对比各个算法在子模块的差异,最终提炼出融合各个算法优点的架构. PTAM[1]是视觉SLAM领域里程 ...

  2. 视觉SLAM:模型介绍、算法框架及应用场景

    作者:张长鸿 湖南大学 校稿:董亚微 编辑:郑欣欣@一点人工一点智能 原文地址:视觉SLAM:模型介绍.算法框架及应用场景 目录 01 什么是SLAM 1.1 相机模型 1.2 相机运动 1.3 建图 ...

  3. 1、视觉slam简介

    偶然知道slam这个东西,觉得有趣,找了些资料看,以下为个人总结,主要参照高翔所著的<视觉SLAM十四讲>. 1.什么是slam? SLAM缩写Simultaneous Localizat ...

  4. 学习记录-视觉SLAM十四讲第2版(二)

    文章目录 前言 一.问题是什么? 二.工具是什么? 1.分类 2.三种相机 (1)单目相机 (2)双目相机 (3)深度相机 三.流程是什么? 1.总的流程框架 2.每个步骤说明 3.补充 四.尺度不确 ...

  5. 视觉SLAM从传统到语义方法的概述

    文章:An Overview on Visual SLAM: From Tradition to Semantic 作者:Weifeng Chen,Guangtao Shang,Aihong Ji,C ...

  6. (周末公众号解读系列)2000字-视觉SLAM综述

    参考链接: https://mp.weixin.qq.com/s?__biz=Mzg2NzUxNTU1OA==&mid=2247528395&idx=1&sn=6c9290dd ...

  7. vins中imu融合_基于非线性优化算法—当视觉SLAM遇到VINS会碰撞出怎样的火花?

    今天来给大家分享一个视觉SLAM中比较综合且复杂的系统-VINS.VINS旨在通过融合两个传感器测量数据获得移动机器人的位姿和特征点在空间中的位置,在现代控制理论学科中属于最优估计问题.在移动智能机器 ...

  8. 全景视觉空间直线检测_视觉SLAM深度解读

    近年来,SLAM技术取得了惊人的发展,领先一步的激光SLAM已成熟的应用于各大场景中,视觉SLAM虽在落地应用上不及激光SLAM,但也是目前研究的一大热点,今天我们就来详细聊聊视觉SLAM的那些事儿. ...

  9. 视觉SLAM深度解读

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自 | 新机器视觉 近年来,SLAM技术取得了惊人的发展,领 ...

最新文章

  1. linux获取fifo中的数据数量,Linux select()和多个套接字的FIFO排序?
  2. 理解域信任关系,Active Directory系列之十六
  3. Oracle 创建及调用存储过程,脚本示例
  4. [6]Windows内核情景分析 --APC
  5. 程序员修仙之路--设计一个实用的线程池
  6. wordpress插件制作视频教程【资料分享】
  7. 前端学习(2486):$emit
  8. 新一代高效Git协同模型AGit-Flow详解
  9. 2021计算机基础知识题库,2021~2021计算机基础知识练习题
  10. wordpress汉化技巧_保护您的WordPress网站的6个技巧
  11. 成功的人和不成功的人最大的区别
  12. [轉]9个优秀的基于 JavaScript 与 CSS 的 Web 图表框架
  13. [leetcode]5325. 包含所有三种字符的子字符串数目
  14. 人工神经网络的发展历程,人工神经网络基本结构
  15. office picture manger图片处理工具下载与安装教程
  16. 中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡问题”:一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡,母鸡,小鸡各多少只?
  17. Java Email 发HTML邮件工具 采用 freemarker模板引擎渲染
  18. 代码覆盖率在性能优化上的一种可行应用
  19. [乡土民间故事_徐苟三传奇]第廿九回_蠢财主落水知上当
  20. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之02EC20模组硬件供电和开关机复位操作

热门文章

  1. c语言stl用法,C STL快速入门!学习使我快乐
  2. Tailwind CSS
  3. 手机html5活体检测,手把手教你做实时活体检测系统
  4. 与其坐而论道,不如起而行之
  5. 亚马逊风控规则,亚马逊测评如何避免风控
  6. Python爬虫51job职位
  7. Jmeter接口测试+压力测试
  8. Win10深度学习环境配置(CUDA+cuDNN+TensorFlow-gpu+Keras)
  9. python url转码_Python如何实现转换URL详解
  10. 商业银行业务培训总结