VINS-Mono视觉SLAM总体设计框架解读
文章目录
- 写在前面
- 论文解读
- 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 的设计思路主要突出两点:
- 针对于单目的鲁棒性很强的VIO 系统
- 通用性很强的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总体设计框架解读相关推荐
- 视觉SLAM算法框架解析(1) PTAM
版权声明:本文为博主原创文章,未经博主允许不得转载. 本系列文章旨在总结主流视觉SLAM算法的框架,对比各个算法在子模块的差异,最终提炼出融合各个算法优点的架构. PTAM[1]是视觉SLAM领域里程 ...
- 视觉SLAM:模型介绍、算法框架及应用场景
作者:张长鸿 湖南大学 校稿:董亚微 编辑:郑欣欣@一点人工一点智能 原文地址:视觉SLAM:模型介绍.算法框架及应用场景 目录 01 什么是SLAM 1.1 相机模型 1.2 相机运动 1.3 建图 ...
- 1、视觉slam简介
偶然知道slam这个东西,觉得有趣,找了些资料看,以下为个人总结,主要参照高翔所著的<视觉SLAM十四讲>. 1.什么是slam? SLAM缩写Simultaneous Localizat ...
- 学习记录-视觉SLAM十四讲第2版(二)
文章目录 前言 一.问题是什么? 二.工具是什么? 1.分类 2.三种相机 (1)单目相机 (2)双目相机 (3)深度相机 三.流程是什么? 1.总的流程框架 2.每个步骤说明 3.补充 四.尺度不确 ...
- 视觉SLAM从传统到语义方法的概述
文章:An Overview on Visual SLAM: From Tradition to Semantic 作者:Weifeng Chen,Guangtao Shang,Aihong Ji,C ...
- (周末公众号解读系列)2000字-视觉SLAM综述
参考链接: https://mp.weixin.qq.com/s?__biz=Mzg2NzUxNTU1OA==&mid=2247528395&idx=1&sn=6c9290dd ...
- vins中imu融合_基于非线性优化算法—当视觉SLAM遇到VINS会碰撞出怎样的火花?
今天来给大家分享一个视觉SLAM中比较综合且复杂的系统-VINS.VINS旨在通过融合两个传感器测量数据获得移动机器人的位姿和特征点在空间中的位置,在现代控制理论学科中属于最优估计问题.在移动智能机器 ...
- 全景视觉空间直线检测_视觉SLAM深度解读
近年来,SLAM技术取得了惊人的发展,领先一步的激光SLAM已成熟的应用于各大场景中,视觉SLAM虽在落地应用上不及激光SLAM,但也是目前研究的一大热点,今天我们就来详细聊聊视觉SLAM的那些事儿. ...
- 视觉SLAM深度解读
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自 | 新机器视觉 近年来,SLAM技术取得了惊人的发展,领 ...
最新文章
- linux获取fifo中的数据数量,Linux select()和多个套接字的FIFO排序?
- 理解域信任关系,Active Directory系列之十六
- Oracle 创建及调用存储过程,脚本示例
- [6]Windows内核情景分析 --APC
- 程序员修仙之路--设计一个实用的线程池
- wordpress插件制作视频教程【资料分享】
- 前端学习(2486):$emit
- 新一代高效Git协同模型AGit-Flow详解
- 2021计算机基础知识题库,2021~2021计算机基础知识练习题
- wordpress汉化技巧_保护您的WordPress网站的6个技巧
- 成功的人和不成功的人最大的区别
- [轉]9个优秀的基于 JavaScript 与 CSS 的 Web 图表框架
- [leetcode]5325. 包含所有三种字符的子字符串数目
- 人工神经网络的发展历程,人工神经网络基本结构
- office picture manger图片处理工具下载与安装教程
- 中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡问题”:一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡,母鸡,小鸡各多少只?
- Java Email 发HTML邮件工具 采用 freemarker模板引擎渲染
- 代码覆盖率在性能优化上的一种可行应用
- [乡土民间故事_徐苟三传奇]第廿九回_蠢财主落水知上当
- QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之02EC20模组硬件供电和开关机复位操作