从零手写VIO
文章平均质量分 97
いしょ
鲜衣怒马看遍
展开
-
[从零写VIO|第七节]——VINS-Mono代码精简版代码详解——run_euroc前端的数据处理(内容|代码)
vins_mono代码总框架如下图:前端的数据处理,包括两个部分,一个是图像的特征提取和匹配,再一个就是对IMU数据进行预积分。对于VINS-Course\CMakeLists.txt:生成两个库文件:camera_model,MyVio;生成两个可执行文件:run_euroc,testCurveFitting;我们重点看一下run_euroc的文件内容;// 跑euroc数据集// 将带有特征点和imu仿真数据喂给系统run_euroc.cpp主函数框架主函数框架定义了三个线程,原创 2020-05-31 13:09:39 · 1823 阅读 · 4 评论 -
[从零写VIO|第七节]——VINS-Mono代码精简版代码详解——thd_BackEnd线程(内容|代码)
前面的两个线程thd_PubImuData、thd_PubImageData主要是获取IMU数据、获取图像数据以及进行特征提取和LK光流的跟踪。thd_BackEnd线程包括IMU预积分Estimator::processIMU和图像数据的进一步操作,其中包括初始化的一系列操作在Estimator::processImage。初始化完成后将进入后端进行滑动窗口的优化,进而得到优化后的状态估计结果。run_euroc.cpp中的最后一个线程:std::thread thd_BackEnd(&Sys原创 2020-06-25 10:35:51 · 1626 阅读 · 6 评论 -
[从零写VIO|第七节]——VINS-Mono代码精简版代码详解——初始化1外参标定(内容|代码)
相关知识点1相关知识点2原创 2020-05-22 23:11:46 · 1413 阅读 · 2 评论 -
[从零写VIO|第七节]——VINS-Mono代码精简版代码详解——初始化2视觉初始化(内容|代码)
接上一篇——外参标定的代码和内容的讲解,计算出旋转外参数qbcq_{bc}qbc(对应代码中的ric)后,开始其他参数的初始化;其代码在estimator.cpp中的Estimator::initialStructure()。原创 2020-05-24 00:01:31 · 1808 阅读 · 2 评论 -
[从零写VIO|第七节]——VINS-Mono代码精简版代码详解——初始化3视觉IMU对齐(内容|代码)
接上一篇——视觉初始化的代码和内容的讲解,我们对所有的图像帧(滑动窗口内与外all)提供初始R、T估计,然后进行pnp优化,同时我们也得到了它们对应的IMU坐标系到lll系的旋转平移。现在进行视觉惯性联合初始化。具体流程图:initialStructure()主要代码:bool Estimator::initialStructure(){ TicToc t_sfm; //1.1 通过滑窗内所有帧的线加速度的标准差判断IMU的运动情况 check imu observibil原创 2020-05-25 00:27:32 · 2181 阅读 · 3 评论 -
[从零写VIO|第七节]——VINS-Mono代码精简版代码详解——初始化4visualInitialAlign()(内容|代码)
接上一篇博客——视觉IMU对齐的内容和代码的解析,我们已经通过VisualIMUAlignment函数得到了初始值:陀螺仪的bias、尺度因子s、有模长限制的重力向量、各个帧的速度,同时借助重力向量实现了相机坐标系与世界坐标系的对齐。总结一下就是:相机-IMU对齐指的是将视觉SFM结构和IMU的预积分结果进行对齐,主要分为1)陀螺仪偏差的标定;2)速度、重力向量和尺度初始化;3)对重力进行修正三部分。在将从视觉SFM中估计出来的位姿信息和IMU预积分的结果对齐之后,我们需要获得世界坐标系中的位姿,也就是原创 2020-05-28 21:38:13 · 1725 阅读 · 0 评论 -
[从零写VIO|第七节]——VINS-Mono代码精简版代码详解——IMU预积分(内容|代码)
理论知识之前在另一篇博客也整理过 ——指路目录1. 为什么要进行IMU积分?2. 连续时间下的IMU运动模型3.为什么要用IMU预积分?IMU的预积分量IMU的预积分误差预积分的离散形式1. 为什么要进行IMU积分?IMU通过加速度计得到线加速度、通过陀螺仪得到角速度。通过对IMU测量值的积分操作,能够获得机器人的位姿信息。IMU的频率比相机的要高,将第 k 帧和第 k+1 帧之间的所有 IMU 进行积分,可得第 k+1 帧的位置、速度和旋转(PVQ),作为视觉估计的初始值,示意图如下:从IMU原创 2020-06-02 17:27:45 · 1478 阅读 · 2 评论 -
[从零写VIO|第七节]——VINS-Mono代码精简版代码详解——边缘化(内容|代码)
目录基本流程1. 判断过新加进来帧是否是关键帧,从而确定边缘化选项2. 如果是`MARGIN_OLD`,就要边缘化掉老帧3.当次新帧不是关键帧时,边缘化次新帧① vector2double():② MargOldFrame()边缘化老帧操作1. 构建problem2. 传入要边缘化掉的最老帧信息,进行边缘化3. 先验信息更新③ MargNewFrame()边缘化次新帧操作1. 构建problem2.传入要边缘化的次新帧信息,进行边缘化3. 先验信息更新基本流程1. 判断过新加进来帧是否是关键帧,从而确定原创 2020-06-23 20:36:51 · 1441 阅读 · 1 评论 -
视觉SLAM十四讲:回环检测-知识点+代码
目录基于外观的几何关系1. 基础知识1.1 准确率和召回率1.2 词袋模型1.3 字典1.4 字典的数据结构1.5 相似度的计算1.6 相似度评分的处理1.7 检测回环后的验证2. 实践与代码解析2.1 创建字典回环检测的关键是,如何有效地检测出相机经过同一个地方。如果能够成功地检测到这件事,就可以为后端的位姿图提供更多有效的数据,使之得到更好的估计,特别是得到一个全局一致的估计。我们可以利用回环检测进行重定位。回环检测的方法:暴力匹配。对任意两幅图像都进行特征匹配,根据正确匹配的数量确定哪两幅图原创 2020-06-21 16:55:54 · 4217 阅读 · 6 评论 -
[从零写VIO|第七节]——VINS初始化(作业)
参考资料原创 2020-05-31 14:30:00 · 1295 阅读 · 0 评论 -
[从零写VIO|第六节]——前端Frontend
本节主要介绍前端:提取匹配特征点和光流跟踪,关键帧和三角化(很多大部分框架都是在前端优化改进的,前端对最终定位精度的影响起着决定性作用)1. 特征点提取和匹配https://www.cnblogs.com/skyfsm/p/7401523.html要关注SLAM的实时性问题,.一般采用速度较快的算子,精度可能不会很高。SIFT等虽然精度高,目前还不能实时。再就是,直接法不依赖角点,但实现效果根据选点数量变化较大.2. 光流跟踪光流法抗光照干扰弱,比较依赖角点。目前常用的是FAST+光流。光原创 2020-05-17 11:18:11 · 312 阅读 · 0 评论 -
三角化求解深度的方法汇总+代码展示
看到一篇写的超级好的博客,转载一下~转载 2020-05-23 22:04:12 · 615 阅读 · 0 评论 -
opencv中的特征提取和匹配算法
运行opencv中的all code:https://www.cnblogs.com/excellentlhw/p/10778904.html内容:https://www.geek-share.com/detail/2670090981.html目标跟踪之光流法:https://blog.csdn.net/u014568921/article/details/46638557特征点三角化:https://www.cnblogs.com/yepeichu/p/10792899.html汇总:https原创 2020-05-17 10:26:46 · 1399 阅读 · 4 评论 -
[从零写VIO|第五节]——后端优化实践:逐行手写求解器(作业)
1.1 信息矩阵H的计算对于每一条边都要进行这样两个for循环,分别是遍历方阵H的行和列,第一个i的for循环是行数,当遍历到行列相等,也就是对角的时候,只用放入一次hessian,而其他情况下都要放入关于对角对称的两个hessian,这是由于这两个位置的hessian是转置的关系。而b则在行遍历的时候一行行填入。MatXX hessian = JtW * jacobian_j; // 所有的信息矩阵叠加起来 // TODO:: home.原创 2020-05-09 00:24:27 · 730 阅读 · 0 评论 -
[从零手写VIO|第五节]——后端优化实践——单目BA求解代码解析
目录solver 全流程回顾Solver三要素Solver求解中的疑问核心问题代码解析1. 产生世界坐标系下的虚拟数据: 相机姿态, 特征点, 以及每帧观测solver 全流程回顾Solver三要素Solver求解中的疑问信息矩阵 H 不满秩,那求解时如何操作?• 使用 LM 算法,加阻尼因子使得系统满秩,可求解,但是求得的结果可能会往零空间变化。• 添加先验约束,增加系统的...原创 2020-05-09 00:20:37 · 2621 阅读 · 5 评论 -
[基础知识点]PCG算法以及代码解析
1. 基本介绍共轭梯度法是介于梯度下降法与牛顿法之间的一个方法,是一个一阶方法,它克服了梯度下降法收敛慢的缺点,又避免了存储和计算牛顿法所需要的二阶导数信息。共轭梯度法的思想是,选择一个优化方向后,本次选择的步长能够将这个方向的误差更新完,在以后的优化更新过程中不再需要朝这个方向更新了。由于每次将一个方向优化到了极小,后面的优化过程将不再影响之前优化方向上的极小值,所以理论上对N维问题求极小只用对N个方向都求出极小就行了。为了不影响之前优化方向上的更新量,需要每次优化方向共轭正交。在 n 维的优化问题原创 2020-05-08 23:19:07 · 5308 阅读 · 0 评论 -
[基础知识点]LM算法——阻尼因子更新策略(Nielsen)——内容与代码解析
1. 内容定量分析,阻尼因子更新策略通过比例因子来确定的:其中:这里采用的μ0\mu_0μ0初始值的策略为:2. 代码此代码节选自BA计算阻尼因子的初始值/// LMvoid Problem::ComputeLambdaInitLM() { ni_ = 2.; currentLambda_ = -1.; currentChi_ = 0.0; // TODO:: robust cost chi2 fo原创 2020-05-08 23:04:56 · 3822 阅读 · 6 评论 -
[从零写VIO|第四节]——基于滑动窗口算法的VIO系统(作业)
1.1 绘制上述系统的信息矩阵根据图示:变量: ξ=[ξ1ξ2ξ3L1L2L3]\xi =\quad\begin{bmatrix}\xi_1 \\ \xi_2 \\ \xi_3 \\ L_1 \\ L_2 \\ L_3 \end{bmatrix}\quadξ=⎣⎢⎢⎢⎢⎢⎢⎡ξ1ξ2ξ3L1L2L3⎦⎥⎥⎥⎥⎥⎥⎤残差:r=[rξ1,L1rξ1,L2rξ2,L1...原创 2020-04-28 22:36:43 · 464 阅读 · 0 评论 -
[从零写VIO|第三节]——基于优化的IMU与视觉信息融合(作业)
目录作业一作业二作业三作业一作业二公式推导f15f_{15}f152. g12g_{12}g12的推导,与f15f_{15}f15的推导极其 类似:作业三公式证明:原创 2020-04-24 21:44:48 · 433 阅读 · 0 评论 -
[基础知识点]IMU以及其预积分的理解
目录1. IMU的简单介绍2. IMU的状态PVQ3. IMU预积分3.1 推导3.2 预积分的离散形式4. IMU的预积分误差5. 预积分量的协方差6. 状态误差线性递推公式推导_基于一阶泰勒展开1. IMU的简单介绍IMU(Inertial measurement unit)中文名叫惯性测量单元。可以测量两个东西,加速度 aaa 是沿三个轴ax,ay,aza_x,a_y,a_zax,...原创 2020-04-24 19:12:55 · 7890 阅读 · 3 评论 -
[从零手写VIO|第二节]从已有轨迹生成imu数据推导
论文在这儿思路1指路——从零手写VIO|第二节——imu.cpp代码解析思路2参考资料摘要本文介绍了一种通用的视惯性同步定位、映射和标定的连续时间框架。我们展示了如何使用Spline参数化,以密切匹配传感器的扭矩最小运动。与传统的离散时间方法相比,连续时间方法特别适用于解决高帧速率传感器和多个非同步设备的问题。通过建立多个非同步器件的相对位姿和内部参数,验证了该方法在多传感器视觉惯性SL...原创 2020-04-19 20:17:54 · 1800 阅读 · 2 评论 -
从零写VIO|第二节——作业:使用Allen方差工具标定IMU
作业一:1 安装im_utils1.1 安装依赖:sudo apt-get install libdw-dev1.2 先编译code_utils,然后再编译imu_utils,不能同时编译mkdir -p imu-calibration/srccd imu-calibration/srcgit clone https://github.com/gaowenliang/code_u...原创 2020-04-19 20:00:08 · 1857 阅读 · 0 评论 -
从零手写VIO|第二节——imu.cpp代码解析
1.用欧拉角表示body坐标系到惯性系的旋转下方公式表示的是用欧拉角表示从惯性系到body系的转换:// euler2Rotation: body frame to interitail frameEigen::Matrix3d euler2Rotation( Eigen::Vector3d eulerAngles){ double roll = eulerAngl...原创 2020-04-14 20:07:52 · 1550 阅读 · 0 评论 -
在Ubuntu18.04上安装ROS Melodic
1. ROS简介ROS,全称Robot Operating System,是一个开源的机器人操作系统(通常运行在Ubantu系统,且有固定的版本对应)。ROS提供了操作系统应有的服务,也提供用于获取、编译、编写和跨计算机运行代码所需的工具和库函数。2. 配置Ubuntu软件仓库打开软件和更新对话框(可在“搜索”中进行搜索),将main,universe,multiuniverse,restr...原创 2020-04-15 12:07:37 · 596 阅读 · 0 评论