![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
视觉、激光SLAM
文章平均质量分 71
将对经典视觉SLAM:ORB、SVO等,激光SLAM:LOAM、LEGO-LOAM,多传感器融合:VINS等进行源码解析
try_again_later
在读硕士,高精度建图定位方向。
知乎专栏:《视觉、激光SLAM源码详细解析》
展开
-
SLAM秋招知识点总结——自动驾驶算法、3D视觉岗位(附有解答)
前言本文为楼主在学习SLAM过程中相关知识点总结,包含多视图几何、常见SLAM系统源码解析、相关数学知识、图像处理问题、机器视觉知识点、《十四讲》精品总结、基本库安装等系列。这些知识点帮助我在2020年秋招面试自动驾驶岗位过程中有了系统认知。2020年新冠疫情影响滞留在家,把之前学习的知识点做了系统总结,所有问题都有解答,并附有链接,希望可以帮助到之后寻找相关岗位的同学。目录一、多视图...原创 2020-04-07 12:18:14 · 3871 阅读 · 2 评论 -
一文详解单目VINS论文与代码解读目录
Vins-mono是香港科技大学开源的一个VIO算法,用紧耦合的方法,通过单目+IMU恢复出尺度,效果非常棒。VINS的功能模块可包括五个部分:数据预处理、初始化、后端非线性优化、闭环检测及闭环优化。代码中主要开启了四个线程,分别是:前端图像跟踪、后端非线性优化(其中初始化和IMU预积分在这个线程中)、闭环检测、闭环优化。1、VINS-mono 论文解读(IMU预积分+Marg...原创 2020-03-14 09:32:16 · 5571 阅读 · 0 评论 -
LOAM源码解析4——transformMaintenance
这一部分主要为了:融合后的Lidar轨迹(里程计位姿+地图优化的位姿)main函数订阅的两个消息节点:1、laserOdometry节点发布的/laser_odom_to_init消息(Lidar里程计估计位姿到初始坐标系的变换)2、laserMapping节点发布的/aft_mapped_to_init消息(laserMapping节点优化后的位姿到初始坐标系的变换)发布的节点:发布...原创 2020-04-20 12:47:38 · 727 阅读 · 0 评论 -
LOAM源码解析3——laserMapping
SLAM系统前面大多是先估计相邻两帧之间相对位姿估计,接下来开始建图,然后根据建图结果对现有姿态进行优化,最后把当前这特征点填充进地图,且估计当前帧相对于世界坐标系下的位姿。在扫描周期末尾激光雷达里程计输出畸变矫正过的点云Pk+1^\widehat{P_{k+1}}Pk+1,同时还有整个周期内每个点的姿态Tk+1LT_{k+1}^{L}Tk+1L。雷达建图过程是为了把Pk+1^\wideh...原创 2020-04-20 12:11:31 · 1768 阅读 · 2 评论 -
LOAM源码解析2——laserOdometry
这是LOAM第二部分Lidar laserOdometry雷达里程计。在第一章提取完特征点后,需要对特征点云进行关联匹配,之后估计姿态。主要分为两部分:特征点关联使用scan-to-scan方式t和t+1时刻相邻两帧的点云数据进行配准,分为边缘点匹配和平面点匹配两部分。计算点到直线的距离和点到平面的距离。姿态解算根据匹配的特征点云使用LM算法估计接收端位姿。这部分代码完全是放在mai...原创 2020-04-18 22:22:38 · 1499 阅读 · 0 评论 -
LOAM源码解析——scanRegistration
入手激光雷达SLAM,从最经典的LOAM源码开始,之后会对秦通在此基础上改进的A-LOAM源码进行观看,应该就会很简单了,第三步是把LEGO-LOAM的源码进行解读。之前对LOAM的论文进行了详细解读。LOAM的源码主要分为scanRegistration提取特征点、laserOdometry 10HZ估计位姿、laserMapping 1HZ构建三维地图、transforMaintenance...原创 2020-04-12 20:04:47 · 1483 阅读 · 3 评论 -
LeGO-LOAM:轻量级地面优化的建图
LEGO-LOAM 是基于LOAM优化的系统,相比之下,有以下优点:1)LeGO-LOAM是轻量级的,因为可以在嵌入式系统上实现实时姿态估计和建图。2)去除失真数据,在地面分离之后,执行点云分割以丢弃可能表示不可靠特征的点。3)LeGO-LOAM引入地面优化,因为我们引入了两步优化姿势估计。从地面提取的平面特征用于在第一步中获得[tz,θroll,θpitch][t_{z},\theta_{...原创 2020-04-07 22:37:19 · 6007 阅读 · 0 评论 -
LOAM:实时的雷达里程计和建图
之前对视觉SLAM主要的开源框架,ORB-SLAM2、SVO等进行了介绍,然后疫情期间对VINS-Mono进行了详细的源码解析,接下来考虑到工作原因需要用到激光雷达、GNSS、IMU等多传感器融合,所以接下来会对最经典的激光SLAM框架LOAM和LeGo-LOAM两个开源系统进行总结。之前对激光SLAM的印象就是激光雷达采集到点云数据,然后用ICP对准就可获得接收端位姿估计。第一篇经典的激光S...原创 2020-04-07 12:19:03 · 4887 阅读 · 1 评论 -
VINS-Mono 代码详细解读——回环检测与重定位、四自由度位姿图优化
本文主要介绍VINS的闭环检测重定位与位姿图优化部分,作为系列文章的最后一节。回环检测的关键就是如何有效检测出相机曾经经过同一个地方,这样可以避免较大的累积误差,使得当前帧和之前的某一帧迅速建立约束,形成新的较小的累积误差。由于回环检测提供了当前数据与所有历史数据的关联,在跟踪算法丢失后,还可以利用重定位。论文中主要分为两部分:回环检测与重定位、4-DOF的位姿图优化。第一部分主要是...原创 2020-03-22 23:02:19 · 3770 阅读 · 3 评论 -
VINS-Mono 代码详细解读——基于滑动窗口的紧耦合后端非线性优化 optimization()+滑动窗slideWindow()
上一篇文章是基于滑动窗的紧耦合后端非线性优化的理论部分,主要分为以下部分:VIO残差函数构建 视觉约束:视觉重投影误差residual、残差对状态量的Jacobian、协方差 IMU约束:residual、Jacobian、Covariance 基于舒尔补的边缘化本文将对Estimator::optimization()函数的代码进行详细讲解。目录一、VIO残差函数构建...原创 2020-03-21 12:14:28 · 4928 阅读 · 3 评论 -
最小二乘、梯度下降法、牛顿与高斯-牛顿与LM关系总结
LZ听师兄讲,SLAM的优化方法是基础知识,尤其最小二乘法是所有优化的基础。接下来将对以下知识进行总结。最小二乘法 非线性:最速下降法、牛顿法、高斯牛顿法(GN)、列文伯格-马夸尔特(LM)联系 线性:QR分解、乔姆斯基分解法求解(Cholesky)、奇异值分解(SVD)一、最小二乘法引出最小二乘问题通常可以表述为,通过搜集到的一些数据(获取得到的样本),对某一个模型进行拟合,并...原创 2019-03-04 16:30:13 · 4765 阅读 · 1 评论 -
VINS-Mono 理论详细解读——紧耦合后端非线性优化 IMU+视觉的残差residual、Jacobian、协方差、基于舒尔补的边缘化
本讲是VINS最核心部分了,前面经历了 1)视觉跟踪feature_tracker、IMU预积分integrationBase类;2)初始化中SFM纯视觉估计滑动窗中所有帧的位姿和3D路标点深度、SFM与IMU预积分松耦合对齐求解初始化参数。本节将进行第3部分,基于滑动窗的紧耦合后端非线性优化:将视觉约束、IMU约束、闭环约束放到一个大的目标函数中进行非线性优化,求解出滑动窗口中所有帧的PVQ、bias等。原创 2020-03-17 23:27:45 · 4596 阅读 · 2 评论 -
VINS-Mono 代码详细解读——基础储备:在线Cam到IMU的外参标定 InitialEXRotation类
本讲还是为了estimator类中最主要的函数processImage()做知识储备。前面两讲知识储备主要讲了IMU预积分相关的integrationBase类以及图像特征点管理器feature_manager.cpp,本节将对processImage()的相机到IMU的外参矩阵的代码讲解。processImage()中:第一步为检测当前输入的image是否为关键帧,f_mana...原创 2020-03-17 12:39:02 · 2521 阅读 · 3 评论 -
VINS-Mono 代码详细解读——feature_manager.cpp
LZ发现estimator.cpp中关键函数为processImage(),里面包含了IMU预积分、图像处理特征点跟踪等一系列流程,上一节中对processIMU()以及预积分的integrationBase类进行解读,本节继续做基础储备,对与estimator.cpp中的feature_manager.cpp进行详细介绍,主要是对特征点管理。特征点管理器主要就是FeatureManager类原创 2020-03-16 10:44:26 · 3417 阅读 · 3 评论 -
VINS-Mono 代码详细解读——IMU预积分的残差、Jacobian和协方差 processIMU()+intergrationBase类+imu_factor.h
IMU离散中值预积分1.1、IMU模型测量值:加速度计a^、陀螺仪w^, 加上了bias游走和随机白噪声。真实值:加速度计a、陀螺仪w。实际情况下,可以获得测量值a^和w^,需要反推真实值。一般忽略随机游走高斯噪声nw=w^-bg; a=qwb(a^-ba)-gw;1.2、连续时间IMU运动模型,积分 PVQ(两帧之间)将第k帧和第k+1帧所有的IMU进行积...原创 2020-03-15 22:25:17 · 7913 阅读 · 5 评论 -
VINS-Mono 代码详细解读——Estimator_node.cpp
getMeasurements()函数对imu和图像数据对齐组合,直到把缓存中图像数据或者IMU数据读取完,才能跳出函数,返回数据。std::vector<std::pair<std::vector<sensor_msgs::ImuConstPtr>, sensor_msgs::PointCloudConstPtr>>getMeasuremen...原创 2020-03-15 16:01:01 · 2852 阅读 · 0 评论 -
VINS-Mono 代码详细解读——视觉跟踪 feature_trackers
原理视觉:1)提取Harris角点,KLT金字塔光流跟踪相邻帧;2)2 维特征点先矫正为不失真的,然后在通过外点剔除后投影到一个单位球面上;3)去除异常点:先进行F矩阵测试,通过RANSAC去除异常点;4)关键帧选取:1、当前帧相对最近的关键帧的特征平均视差大于一个阈值就为关键帧(因为视差可以根据平移和旋转共同得到,而纯旋转则导致不能三角化成功,所以这一步需要IMU预积分进...原创 2020-03-13 18:45:01 · 4946 阅读 · 2 评论 -
VINS-Mono 代码详细解读——初始化2:视觉惯性松耦合初始化 visualIntialAlign()
本节主要介绍Estimator模块的视觉惯性联合初始化模块,visualIntialAlign()函数内第一步VisualIMUAlignment()函数其中,步骤1的在线Cam到IMU的外参标定qbc 参考之前的博客。1、陀螺仪零偏bg标定2、优化 速度v、重力g和尺度初始化s。我们得到了陀螺仪偏置bias的初始校准,需要将陀螺仪偏置bg代入到IMU预积分重新计算预积分3、重力矢量修正原创 2020-03-10 21:20:01 · 3292 阅读 · 18 评论 -
VINS-Mono 代码详细解读——初始化1:视觉SFM详解 processImage()+initialStructure()
1.检查两帧的视差判断是否为关键帧f_manager.addFeatureCheckParallax()在VINS-Mono 代码详细解读——feature_manager.cpp中已经解释2.IMU预积分IntegrationBase 在VINS-Mono 代码详细解读——IMU离散中值预积分 中解释3.在线标定外参CalibrationExRotation 在VINS-Mono 代码详细解读——基础储备:在线Cam到IMU的外参标定 InitialEXRotation类 中已经解释原创 2020-03-05 22:36:43 · 4806 阅读 · 0 评论 -
VINS未读懂代码
run_euroc.cpp主函数中pSystem.reset(new System(sConfig_path));// shared_ptr引用计数减一,这里的用法是?????原创 2020-03-02 19:55:22 · 576 阅读 · 0 评论 -
《视觉SLAM十四讲精品总结》6.1:VO—— 2D-2D对极约束求位姿R、t
本节内容已在笔记本进行推导分为2D-2D、3D-2D、3D-3D。三位场景中的同一个三维点在不同视角下的像点存在着一种约束关系:对极约束,基础矩阵E是这种约束关系的代数表示,并且这种约束关系独立与场景的结构,只依赖与相机的内参K和外参R t(相对位姿)。1、可以通过通过匹配的像点对计算出两幅图像的基础矩阵E,2、然后分解基础矩阵得到相机的相对位姿R t。本节内容对极约束通过...原创 2018-08-13 23:13:36 · 6996 阅读 · 1 评论 -
通过solvePnP求解相机位置 (代码可运行)
solvePnP原型为:bool cv::solvePnP ( InputArray objectPoints,InputArray imagePoints,InputArray cameraMatrix,InputArray distCoeffs,OutputArray rvec,OutputArray tvec,bool useExtrinsicGuess = ...原创 2019-04-08 15:23:47 · 7544 阅读 · 9 评论 -
文件读取Config类
前言:写一个负责参数读取的类Config,能够只更改default.yaml内容即可,无需在程序内部更改。获取相机参数:myslam::Config::setParameterFile("default.yaml");double fx=myslam::Config::get<double> ("Camera.fx");直接调用类中成员函数,需要static静态成员...原创 2019-03-22 17:01:27 · 658 阅读 · 0 评论 -
SVO(稀疏直接视觉里程计)论文解析
SVO是种半直接法:结合特征点法和直接法,先跟踪特征点,然后利用直接法根据关键点周围的4*4小块进行块匹配,估计相机位姿。优点:计算量小,速度快缺点:不是SLAM,舍弃了后端优化和回环检测。基本流程分为两个线程:Motion Estimated 和 Mapping Motion Estimated 分为三部分:1)Frame-to-frame 的粗略位姿估计 2)光流跟踪 Fea...原创 2019-01-21 17:11:54 · 2503 阅读 · 0 评论 -
画SLAM的轨迹方式
先说机器人位姿,正常情况下,变换矩阵T包含:旋转矩阵【3*3】与平移矩阵【3*1】但是,旋转矩阵9维只表示了3个自由度,具有冗余性,于是一种更紧凑的描述方式:旋转向量出现了。1.旋转向量3*1:该向量方向与旋转轴一致,向量长度等于旋转角。通过罗德里格斯公式将旋转向量3*1转化为旋转矩阵3*3缺点:有奇异性。2.四元数4*1:复平面上,乘上复数i相当于逆时针把一个复向量旋转90度。一...原创 2019-01-10 17:25:04 · 4520 阅读 · 0 评论 -
Segmentation fault (core dumped)
在linux下变成有时会出现这样的情况,编译时没有error,但是执行时会出现Segmentation fault (core dumped)core dumped就是核心转储,进程异常终止,进程用户空间的数据就会被写到磁盘。但是linux下一般不会产生core文件需要用到gdb调试工具:1、首先使用ulimit -a查看你的core file size是否为0.如果不是的话就请跳到步...原创 2019-03-29 11:19:04 · 9577 阅读 · 0 评论 -
用imu_utils标定IMU
用imu_utils标定IMU,之后用于kalibr中相机和IMU的联合标定转载 2019-06-21 20:24:03 · 5735 阅读 · 0 评论 -
使用 Mathpix Snipping 和 MathType 快速输入公式
使用 Mathpix Snipping 和 MathType 快速输入公式转载 2019-06-30 16:33:49 · 3566 阅读 · 0 评论 -
SLAM目录
SVOVO:简单的视觉里程计代码注释SVO(稀疏直接视觉里程计)论文解析ORB-SLAMROS下运行ORB-SLAM实例教程ORB-SLAM2源码解读(1):系统入口System(2.1):Tracking(2.2):单目初始化、匀速运动模型跟踪、跟踪参考关键帧、跟踪局部地图(3):LocalMapping(4):LocalClosingVINS《视觉S...原创 2019-07-18 20:26:27 · 769 阅读 · 0 评论 -
VINS-Mono 论文解读(IMU预积分残差+Marg边缘化)
VINS是一个鲁棒的基于紧耦合的滑动窗非线性优化的单目视觉惯性里程计。VIO引出原因:1)单纯视觉:缺点: 尺度不确定性、单目纯旋转无法估计、快速运动易丢失、受图像遮挡运动物体干扰。 优点:不产生漂移、直接测量旋转与平移。2)单纯IMU:缺点:零偏导致漂移、低精度IMU积分位姿发散 优点:...原创 2019-07-24 10:14:58 · 8027 阅读 · 1 评论 -
SLAM、自动驾驶算法、3D视觉岗位秋招知识点(附有解答)
多视图几何求解相似、仿射、射影变换区别基本矩阵F、本质矩阵E、单应矩阵H处理关键帧、李群李代数、特征点法与直接法手推BARANSAC在图像匹配上应用PnP(3D-2D)、ICP(3D-3D)直接法与光流法常见SLAMSLAM目录SVO中深度滤波器原理VINS-mono论文解读数学知识凸集、凸函数、凸优化特征向量、特征值分解SVD矩阵分析:...原创 2019-09-12 09:38:10 · 1099 阅读 · 1 评论 -
ROS下运行ORB-SLAM实例教程
实验环境ubuntu 14.04+ros indigoStep1: 配置环境变量$ mkdir -p ~/catkin_ws/src$ cd ~/catkin_ws/src在’src’目录中可能没有任何软件包,只有一个CMakeLists.txt,返回到catkin_ws中依然可以编译它:$ cd ~/catkin_ws/$ catkin_makegedit ~/.bashr...原创 2018-12-09 14:35:05 · 4387 阅读 · 0 评论 -
ORB-SLAM2源码解读(2.2):单目初始化、匀速运动模型跟踪、跟踪参考关键帧、跟踪局部地图
这里是Tracking部分的第二部分,详细讲述各分支的代码及其实现原理。单目初始化MonocularInitialization()目标:从初始的两帧单目图像中,对SLAM系统进行初始化(得到初始两帧的匹配,相机初始位姿,初始MapPoints),以便之后进行跟踪。方式:并行得计算基础矩阵E和单应矩阵H,恢复出最开始两帧相机位姿;三角化得到MapPoints的深度,获得点云地图...原创 2018-11-15 11:10:23 · 4406 阅读 · 3 评论 -
《视觉SLAM十四讲精品总结》10.3: 添加g2o优化位姿T
0.3版本的VO就是在0.2的基础上增加了g2o优化: 1、在visual_odometry.cpp中的poseEstimationPNP()函数中,用PNP求出T_c_r_estimated_后,增加了g2o优化,对位姿进行优化。 2、同时增加的还有g2o相关的头文件和源文件:g2o_types.h和g2o_types.cppvisual_odometry.cpp //使用B...原创 2018-08-30 15:12:15 · 1398 阅读 · 0 评论 -
《视觉SLAM十四讲精品总结》10 测试
#include "myslam/config.h"#include "myslam/visual_odometry.h"int main ( int argc, char** argv ){ //链接参数文件 myslam::Config::setParameterFile ( argv[1] ); //构造VO,类型就是定义指向自身类型的指针 myslam::Vi...原创 2018-08-29 22:45:41 · 707 阅读 · 0 评论 -
《视觉SLAM十四讲精品总结》9:直接法和光流法
内容:二者关系光流法直接法一、二者关系引出原因:关键点和描述子计算非常耗时,可以保留特征点,使用光流法跟踪特征点运动。关系:光流法描述像素在图像中运动,直接法利用相机运动模型计算特征点在下一时刻图像中位置。使用条件:直接法利用图像的像素灰度信息计算相机运动,需要场景中存在明暗变化。二、LK光流法光流法常用来跟踪角点的运动。之后用跟踪的特征点,用ICP、PnP或对...原创 2018-08-25 17:23:20 · 5080 阅读 · 4 评论 -
《视觉SLAM十四讲精品总结》10.2: 基本的VO,特征提取和匹配
根据输入的图像,计算相机运动T和特征点位置3D坐标。两两帧之间,只关心运动,不关心结构,把估计位姿串起来得到运动轨迹。visual_odometry.h#ifndef VISUALODOMETRY_H#define VISUALODOMETRY_H#include "myslam/common_include.h"#include "myslam/map.h"#in...原创 2018-08-28 22:20:44 · 1208 阅读 · 0 评论 -
《视觉SLAM十四讲精品总结》10.1:设计前端0.1
一、框架看一下文件夹组织:1、bin用来存放可执行的二进制文件。0.1版本主要是搭建SLAM库框架2、include/myslam存放SLAM模块的头文件,主要是.h文件,声明即可。3、src存放源代码文件,主要是.cpp文件。4、test文件是测试SLAM库的文件,也是.cpp文件。5、lib存放编译好的库文件 .a .so6、config存放配置文件,也就是需要经常修改...原创 2018-08-28 10:30:51 · 1705 阅读 · 1 评论 -
《视觉SLAM十四讲精品总结》8:VO—— 3D-3D:ICP+SVD+BA
一、ICPICP(Iterative Closest Point)迭代最近点,指代匹配好的两组点云间运动估计问题。ICP算法是对于X中的每一个点用当前的R和 t在Y中找最近的点(比如用欧式距离),然后这两个点就成了一对了,每个点都有了对应的映射点,用每一对的坐标列一个方程,就得到一系列的方程。重复迭代运行上述过程,直到均方差误差小于某个阀值。 二、RANSAC (RANdo...原创 2018-08-22 11:39:20 · 2756 阅读 · 1 评论 -
《视觉SLAM十四讲精品总结》7:VO—— 3D-2D:PnP+BA
引出:2D-2D的对极几何需要8个以上点对,且存在初始化、纯旋转和尺度问题。特征点3D位置可以由三角化或RGB-D相机深度图确定。因此,双目或RGB-D相机直接使用PnP估计相机运动。单目视觉里程计,首先初始化,然后才能PnP。PnP为( Perspective-n-Point)的简称,即给出n个3D空间点及其投影位置时,如何求解相机的位姿R t。PnP优点:不需要对极约束,3...原创 2018-08-18 23:03:00 · 7284 阅读 · 6 评论