
SLAM
文科升
无人驾驶行业程序员。
展开
-
VINS-Mono代码阅读笔记(九):vins_estimator中的相机-IMU对齐
本篇笔记紧接上一篇VINS-Mono代码阅读笔记(八):vins_estimator中的相机-IMU初始化。阅读分析视觉惯导对齐部分的代码。相机-IMU对齐指的是将视觉SFM结构和IMU的预积分结果进行对齐,主要分为1)陀螺仪偏差的标定;2)速度、重力向量和尺度初始化;3)对重力进行修正三部分。效果如论文中提供的下图所示。1.陀螺仪偏差的标定1)论文中理论描述推导从滑动窗口中根据视...原创 2019-12-10 21:21:18 · 4310 阅读 · 13 评论 -
VINS-Mono代码阅读笔记(八):vins_estimator中的相机-IMU初始化
本篇代码阅读笔记接着上一篇VINS-Mono代码阅读笔记(七):vins_estimator中相机与IMU的外参标定,来学习一下VINS-Mono中初始化部分的代码。在VINS论文的第V. ESTIMATOR INITIALIZATION部分将初始化分为两部分来描述:A.在滑动窗口中仅视觉的SFM;B.视觉和惯导的对齐。初始化部分是从processImage函数中开始的,所以先从process...原创 2019-11-28 11:15:50 · 4213 阅读 · 9 评论 -
VINS-Mono代码阅读笔记(七):vins_estimator中相机与IMU的外参标定
VINS SLAM系统运行过程中,其实就是根据一帧一帧的图像之间匹配的特征点,通过对极几何进行相机位姿的计算,IMU的加入能够将尺度极大的“精确化”,这样就使得相机的运动有了测量尺度。那么,系统中有了两类sensor,单目相机和IMU之间的旋转关系也就是外参标定怎么来计算呢?本篇笔记主要分析这个问题。1.相机与IMU外参标定是什么VINS系统中使用了相机来获取图像信息,使用IMU来“...原创 2019-11-25 17:04:34 · 4852 阅读 · 10 评论 -
static assertion failed: Error: GTSAM was built against a different version of Eigen问题修改
1.问题描述:最近在下载编译BLAM代码的时候,运行命令./update后出现了下面问题:/usr/local/include/gtsam/base/Vector.h:72:1: error: static assertion failed: Error: GTSAM was built against a different version of Eigenstatic_assert(2.原因:原因是GTSAM自带的eigen和我系统安装的eigen之间有冲突。GTSAM编译的时候默认使用了自.原创 2020-07-01 10:57:28 · 7986 阅读 · 5 评论 -
旋转矩阵和四元数的几个基本知识点
1.旋转矩阵的四元数表示我们知道,旋转矩阵也可以用四元数来描述。一个四元数由一个实部和三个虚部组成,通常可写为如下形式: 或者 其中,前边的为实部,为虚部。由于实部为标量,虚部为矢量,所以可写为:...原创 2020-04-20 17:41:37 · 2744 阅读 · 2 评论 -
单应矩阵学习笔记
单应矩阵是视觉SLAM当中一个很重要的概念,它用于描述处于共同平面上的一些特征点在两张图像之间的变换关系。举个现实例子,我们去商店买东西,结账的时候柜台前的微信/支付宝收款二维码就相当于处于同一个平面上的特征点组成的平面,而张三打开手机端摄像机拍到的图片和李四手机拍摄到的二维码的图片之间的转换关系就可以用单应矩阵来描述。而且,两个人站在不同的角度用手机扫一扫二维码后,在手机端出现的二维码竟然是方方...原创 2020-04-07 15:35:01 · 816 阅读 · 0 评论 -
ORB-SLAM2系统中的优化函数
SLAM系统中,一般在特征点投影完成一次的时候就要进行一次优化,优化是为了将匹配的误差最小化,进而剔除一些outlier点。ORB-SLAM系统当中的优化分为下面5个,从优化的范围层次逐步扩大。1.位姿优化函数PoseOptimization一些说明:PoseOptimization优化的是单帧图像的位姿。相机在运动的时候每个图像帧可以对应三维世界中多个地图点,那么此时我们可以知道三维世界...原创 2020-03-26 12:17:58 · 2648 阅读 · 4 评论 -
ORB-SLAM2中LoopClosing线程主要流程梳理
LoopClosing线程主要工作是两个:一个是对当前新到来的关键帧进行闭环检测,看看之前的关键帧中哪个和当前关键帧形成闭环;另一个是纠正闭环,就是在检测到闭环的时候要将当前关键帧和闭环关键帧的位姿拉到一起,形象点说就是进行融合(既然都存在闭环了,那肯定得合并啊)。一、闭环检测DetectLoop1.从关键帧列表中获取列表头的关键帧,也就是获取最新插入到LoopClosing线程的关键帧,...原创 2020-03-25 00:12:39 · 1119 阅读 · 0 评论 -
ORB-SLAM2中LocalMapping线程主要流程梳理
一、LocalMapping线程简述在ORB-SLAM2当中,LocalMapping作为一个线程在系统启动后就一直在运行,只是在Tracking线程“生产出”新的关键帧并插入到LocalMapping线程中的mlNewKeyFrames列表后,LocalMapping线程检测到该列表中有关键帧后开始处理这些新插入的关键帧(CheckNewKeyFrames函数用来检测mlNewKeyFram...原创 2020-03-20 17:49:29 · 1262 阅读 · 1 评论 -
ORB-SLAM2中Tracking线程主要流程梳理
一、初始化部分:1.首次进入初始化 对于当前帧中关键点数>100的帧,用该帧来构造初始化帧和上一个帧; 并记录当前帧中关键点的坐标值,用于下一帧进来的时候进行特征点匹配; 使用当前帧构造初始化器;2.第二次进入初始化 如果当前传入的帧的关键点数<=100的帧,删除初始化器,直接返回; 对当前传入的帧和初始化帧之间进行特征点匹配,调用matcher.Searc...原创 2020-03-13 23:49:45 · 1504 阅读 · 3 评论 -
记录几个SLAM疑问
记录几个本人的SLAM疑问,有大神恰好路过的麻烦给指教一下。谢谢!1.目前大多开源的优秀SLAM系统都包含有闭环检测,那么在实际使用当中如果SLAM系统运行在无人车上的话,从A地到B地之间路线没有闭环的情况下,闭环检测是不是就失效了?这时候通过闭环检测来较小漂移和误差的“想法”是不是就失效了?实践当中是怎么来实现的呢?2.视觉和IMU融合的方案,主要是借助IMU测量的加速度对其积分计算出速...原创 2020-03-06 09:30:53 · 580 阅读 · 8 评论 -
VINS-Mono代码阅读笔记(十四):posegraph的存储和加载
本篇笔记紧接着VINS-Mono代码阅读笔记(十三):posegraph中四自由度位姿优化,来分析位姿图的存储和加载。完整(也是理想的)的SLAM的使用应该是这样的:搭载有SLAM程序的移动设备在一个陌生环境中运行一圈来对该环境进行建图;建图完成后存储该地图;当设备再次运行在该环境中的时候加载已经创建的地图帮助定位。VINS-Mono系统当中存储的是posegraph,先来看看论文中对po...原创 2020-01-20 14:49:55 · 3487 阅读 · 5 评论 -
VINS-Mono代码阅读笔记(十三):posegraph中四自由度位姿优化
本篇笔记紧接着VINS-Mono代码阅读笔记(十二):将关键帧加入位姿图当中,来学习pose_graph当中的紧耦合优化部分。在重定位完成之后,进行位姿图优化是为了将已经产生的所有位姿统一到一个全局一致的配置当中。如论文中展示的下图所示,参考帧处于世界坐标系下,当相机运动的时候会相对于参考帧发生变化。而由于重力向量始终不会发生变化,所以从重力方向得到的水平面也不会发生变化,进而该水平面对应的两...原创 2020-01-19 17:47:40 · 4892 阅读 · 0 评论 -
VINS-Mono和ORB-SLAM2代码阅读笔记汇总
VINS-Mono代码是港科大沈老师组开放出来的非常优秀的开源SLAM项目,融合了视觉和IMU,是SLAM学习研究中一个很好的项目。这里列出本人学习该项目代码过程中的笔记,后续有新的理解会不断更新。代码学习过程中也借鉴参考了许多网上的其他资料来帮助自己理解,非常感谢有这么多人分享自己的学习经验。VINS-Mono代码阅读笔记(一):从Euroc数据集的运行开始 VINS-Mono代码...原创 2020-01-12 10:04:13 · 6171 阅读 · 6 评论 -
VINS-Mono代码阅读笔记(十二):将关键帧加入位姿图当中
本篇笔记紧接着上一篇VINS-Mono代码阅读笔记(十一):进入pose_graph节点代码分析,继续阅读在process线程中将关键帧加入到位姿图当中的代码。1.创建关键帧在KeyFrame类中可以看到有两个KeyFrame构造函数,这里调用的是第一个构造函数。该函数代码解释如下:/** * double _time_stamp, 关键帧的时间戳 * int _index...原创 2020-01-08 15:22:30 · 4709 阅读 · 3 评论 -
VINS-Mono代码阅读笔记(十一):进入pose_graph节点代码分析
本篇笔记紧接着上一篇VINS-Mono代码阅读笔记(十):vins_estimator中的非线性优化,来接着学习VINS-Mono系统中重定位和全局优化部部分的代码。这部分代码在pose_graph节点中,首先看一下在第一篇笔记中贴出来的下面这张系统运行时的Node graph图。从这张图中可以看到pose_graph在系统节点中所处的位置以及它要订阅和发布的topic有哪些,rviz就是...原创 2020-01-05 18:04:13 · 4174 阅读 · 1 评论 -
VINS-Mono代码阅读笔记(十):vins_estimator中的非线性优化
本篇笔记紧接着VINS-Mono代码阅读笔记(九):vins_estimator中的相机-IMU对齐,初始化完成之后就获得了要优化的变量的初始值,后边就是做后端优化处理了。这部分对应论文中第VI部分,紧耦合的单目VIO,这部分也是该系统的核心部分。1.前言在我们对经典的视觉SLAM框架和现有的知识一无所知的情况下,我们看到搭载有相机的移动设备(无人车或者无人机等)从A地点运动到B地点,我们...原创 2019-12-23 15:47:30 · 4385 阅读 · 8 评论 -
VINS-Mono代码阅读笔记(六):vins_estimator中图像处理1
引言VINS-Mono代码阅读笔记(四):vins_estimator中process线程代码分析 中讲process函数的时候,说到了一段设置重定位帧的代码,但是没有做分析,本篇笔记先把这部分代码进行梳理,接着分析图像处理这个重头戏的代码逻辑。1.设置重定位帧// set relocalization frame 设置重定位帧 sensor_msgs::Po...原创 2019-10-21 11:08:26 · 3253 阅读 · 12 评论 -
VINS-Mono代码阅读笔记(五):vins_estimator中IMU预积分处理
1.前言本篇紧接着上一篇笔记 VINS-Mono代码阅读笔记(四):vins_estimator中process线程代码分析 来分析IMU数据的相关处理代码流程。先上一张图从代码结构上看一下IMU处理在process函数中的位置。如上图所示,process函数中有三个for循环:1)第一个for循环也就是最外层的for循环是在遍历measurements,这样可以获取每个mea...原创 2019-10-10 10:43:10 · 3611 阅读 · 21 评论 -
ORB-SLAM2代码阅读笔记(二):System.cc相关函数
目录1.System在ORB-SLAM2系统中的作用2.System类构造函数3.System::TrackMonocular函数4.System::Shutdown函数5.System::SaveKeyFrameTrajectoryTUM函数6.本部分在总体流程中的位置1.System在ORB-SLAM2系统中的作用在ORB-SLAM2代码阅读笔记(一):从mon...原创 2019-05-15 10:31:14 · 3669 阅读 · 0 评论 -
ORB-SLAM2代码阅读笔记(三):Tracking线程1——进入Tracking线程
Table of Contents1.Tracking线程主要工作2.Tracking构造函数代码解析3.Tracking线程中调用的第一个函数Tracking::GrabImageMonocular4.Frame.cc中的单目Frame构造函数代码解析5.本篇笔记的结构图总结在上一篇 ORB-SLAM2代码阅读笔记(二):System.cc相关函数 的基础上,接下来分析T...原创 2019-05-16 09:14:29 · 2754 阅读 · 1 评论 -
ORB-SLAM2代码阅读笔记(四):Tracking线程2——ORB特征提取
Table of Contents1.特征的提取代码入口2.计算图像金字塔的函数ComputePyramid分析3.计算图像的关键点4.计算图像的描述子5.去畸变函数解析6.计算图像边界7.将图像提取的特征“较均匀”的分布在网格中8.小结这段时间学习ORB-SLAM2系统代码,对自己不太懂的地方主要借鉴了吴博的视频和PPT讲解以及其他一些人的介绍,自己再写笔记梳...原创 2019-05-22 21:02:39 · 3400 阅读 · 2 评论 -
ORB-SLAM2代码阅读笔记(五):Tracking线程3——Track函数中单目相机初始化
Table of Contents1.特征点匹配相关理论简介2.ORB-SLAM2中特征匹配代码分析(1)Tracking线程中的状态机(2)单目相机初始化函数MonocularInitialization代码分析(3)ORBmatcher::SearchForInitialization函数代码分析(4)mpInitializer->Initialize函数代码分析...原创 2019-05-27 17:40:01 · 4038 阅读 · 3 评论 -
ORB-SLAM2代码阅读笔记(六):Tracking线程4——Track函数中相机位姿估计
Table of Contents1.Track函数结构2.相机位姿估计1)Track函数代码分析2)跟踪并定位情况下的位姿估计(1)CheckReplacedInLastFrame函数(2)TrackReferenceKeyFrame函数(3)TrackWithMotionModel函数3)跟踪情况下的位姿估计4)局部地图跟踪函数TrackLocalMap分析...原创 2019-06-05 11:59:35 · 6405 阅读 · 6 评论 -
ORB-SLAM2代码阅读笔记(八):LoopClosing线程
Table of Contents1.LoopClosing线程工作内容2.LoopClosing线程代码流程分析1)闭环检测2)计算sim33)闭环校正3.小结在上一篇笔记ORB-SLAM2代码阅读笔记(七):LocalMapping线程 中,可以看到LocalMapping线程中会将关键帧插入到LoopClosing线程的列表中,对应代码语句如下://关键帧...原创 2019-06-12 17:09:01 · 2105 阅读 · 5 评论 -
ORB-SLAM2代码阅读笔记(九):进行窗口显示的Viewer线程
Table of Contents1.View线程都做了些什么2.View线程代码1)View线程创建2)Run函数代码3)在地图中画出当前相机位姿4)绘制地图中当前相机之前的关键帧5)绘制地图中的MapPoint6)窗口中显示标注有特征点的图像帧3.小结ORB-SLAM2的可视化主要是使用Pangolin这个可视化库来实现的,其中也有用到opencv的接口...原创 2019-06-12 23:03:53 · 6947 阅读 · 6 评论 -
ORB-SLAM2代码阅读笔记(七):LocalMapping线程
Table of Contents1.LocalMapping线程代码框架2.LocalMapping线程代码梳理1)将关键帧插入地图中(对应KeyFrame Insertioin)2)剔除地图中不符合要求的MapPoint(对应Recent MapPoints Culling)3)创建MapPoint(对应New Points Creation)4)局部BA优化(对应Lo...原创 2019-06-09 22:32:56 · 3070 阅读 · 1 评论 -
ORB-SLAM2代码阅读笔记(十):sim3求解
Table of Contents1.sim3的简单概述2.sim3算法介绍1)3对匹配的3D点建立坐标系2)旋转矩阵计算3)平移向量计算4)尺度计算3.代码解析1)sim3求解器构造函数Sim3Solver2)sim3迭代求解Sim3Solver::iterate本篇笔记对 ORB-SLAM2代码阅读笔记(八):LoopClosing线程 中提到的s...原创 2019-06-22 12:09:16 · 14474 阅读 · 8 评论 -
SLAM中常用的非线性优化算法学习笔记
Table of Contents1.优化的由来和梯度下降法2.最速下降法和牛顿法3.(Guass-Newton)高斯-牛顿法4.(Levenburg-Marquadt)列文伯格-马夸尔特方法5.小结本文为高博《视觉SLAM十四讲》第六讲的学习笔记。1.优化的由来和梯度下降法了解过机器学习相关算法的话,都知道优化这个词语。优化指的是通过改变某个函数中的自变量,来得到...原创 2019-06-24 22:22:01 · 3190 阅读 · 0 评论 -
SLAM中的优化、李群李代数和BA
Table of Contents1.SLAM中优化目标函数的表示2.李群李代数的引入3.BA本文为高博《视觉SLAM十四讲》李群李代数部分的学习笔记。1.SLAM中优化目标函数的表示SLAM的核心问题就是通过观测数据来得到其对应的位姿,通用的方法就是构建为一个优化问题,然后求解最优的旋转矩阵和平移向量,使得误差最小化。构建优化问题来求解相机位姿是问题求解的总体思路,但...原创 2019-06-28 07:27:11 · 2917 阅读 · 3 评论 -
VINS-Mono代码阅读笔记(一):从Euroc数据集的运行开始
1.写在前面的话最近开始学习VINS-Mono系统源码,也看到了网上有许多别人的的阅读笔记和代码介绍资料。对我自己而言,阅读前人的笔记能够很快帮助自己加深对系统以及代码的整体理解。但是,自己也要写阅读笔记,这样在写的过程中能加深自己的认识和对系统的理解。VINS-Mono的代码路径:https://github.com/HKUST-Aerial-Robotics/VINS-MonoVI...原创 2019-09-17 20:33:05 · 8690 阅读 · 8 评论 -
VINS-Mono代码阅读笔记(二):feature_tracker代码阅读
1.入口main函数feature_tracker结点的入口函数为feature_tracker_node.cpp文件中的main函数。main函数代码如下:/** * feature_tracker_node的入口函数*/int main(int argc, char **argv){ ros::init(argc, argv, "feature_tracker");...原创 2019-09-19 17:12:48 · 4178 阅读 · 1 评论 -
VINS-Mono代码阅读笔记(三):vins_estimator中main函数分析
在VINS-Mono代码阅读笔记(一):从Euroc数据集的运行开始 中我们已经初步知道了vins_estimator中订阅和发布的topic,那么,在研究vins_estimator模块的代码时,一个很有用的思路就是关注接收到的每一个topic是怎么进行处理的,发送的topic的message信息有哪些。把这些搞清楚了,这个模块的主要工作也就搞清楚了。1.vins_estimator的mai...原创 2019-10-07 17:04:01 · 4139 阅读 · 8 评论 -
VINS-Mono代码阅读笔记(四):vins_estimator中process线程代码分析
process线程作为estimator中的主要线程,对接收到的imu消息和image消息进行处理,进而通过这些信息估计出相机位姿。1.process函数介绍阅读IMU相关代码前,要能够明白IMU都能测量哪些数据。IMU就是惯性传感器的缩写,主要用于测量加速度和旋转运动的传感器。基础的IMU包括加速度计和角速度计,一般由三轴的加速度传感器和三个轴的陀螺仪组成,可以测量IMU在三个轴方向上的...原创 2019-10-08 11:45:04 · 3175 阅读 · 12 评论 -
ORB-SLAM2代码阅读笔记(一):从mono_kitti单目运行开始
目录1.写在前边的话2.mono_kitti单目数据集运行效果3.系统框架简要了解4.最开始的代码5.mono_kitti代码总结1.写在前边的话 最近开始学习SLAM,除了学习SLAM相关理论知识外,自己还开始学习ORB-SLAM2开源系统代码,毕竟ORB-SLAM2是比较完整的SLAM系统,里边包括了前端VO,后端优化和闭环检测这三大主要模块。所...原创 2019-05-13 23:17:38 · 10252 阅读 · 7 评论