![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
视觉SLAM疑难杂症
文章平均质量分 82
视觉SLAM算法中比较细的点,需要费点脑筋思考的散装。
宛如新生
努力在自动驾驶领域摸爬滚打,怕什么真理无穷,进一寸有一寸的欢喜。
展开
-
欧拉角与旋转矩阵
欧拉角的使用总结。原创 2022-11-19 23:56:51 · 3778 阅读 · 0 评论 -
解超定方程Ax=b,用SVD分解为什么说在||x||=1时,最小奇异值对应的右奇异向量为最优解?
1、什么是超定方程组?对于方程组Ax=b,A为m x n矩阵(m>n),x为n维列向量未知数。如果A列满秩,则方程组没有精确解,此时称方程组为超定方程组。这种方程一般来说无解,但可求其最小二乘解,即所谓的最小二乘问题。了解线性方程组的类型以及求解方法可见:链接1.1、什么是SVD分解?其性质是什么?这一部分可以直接看这个链接,讲的非常明白。我在这把对我们便于理解下一个问题的重要结论摘取出来。SVD分解的定义:SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为方阵。假原创 2021-08-01 17:20:47 · 2855 阅读 · 10 评论 -
7.1 闭环检测之闭环矫正(位姿传播与地图点修正)
目录1 闭环矫正CorrectLoop()1.1 闭环矫正之前的准备1.2 更新当前关键帧与其它关键帧之间的连接关系前面介绍了闭环关键帧是如何确定的,包括闭环候选关键帧的层层选拨、通过词袋匹配估计sim3变换、根据估计的sim3寻找更多的特征点匹配、用g2o进行sim3优化。 得到优化后的sim3变换之后,还有一步:通过sim3将闭环帧的观测点投影到当前帧继续寻找更多匹配,int ORBmatcher::SearchByProjection(KeyFrame* pKF, cv::Mat Scw, cons原创 2022-01-12 12:24:00 · 1875 阅读 · 3 评论 -
6、ORB-SLAM闭环检测之通过g2o优化求解出来的sim3
1 OptimizeSim3()经过前面那么多步骤,终于来到闭环检测的最后一步了,只要sim3优化通过则证明真正检测到了闭环,然后接下来的工作才是闭环矫正。关于g2o优化的知识,如果没有学习的话,推荐看我之前的关于g2o介绍以及编程步骤的博客。首先把整个优化代码贴在下面,然后一步步图解。这里面还包含了g2o顶点和边的编程套路,关于此可以阅读g2o顶点编程和g2o边编程。int Optimizer::OptimizeSim3(KeyFrame *pKF1, KeyFrame *pKF2, vector原创 2022-01-07 18:00:09 · 1137 阅读 · 0 评论 -
5、ORB-SLAM闭环检测之通过求解出来的sim3寻找当前关键帧和闭环候选帧之间的更多匹配
目录1、SearchBySim32、图解每一步实现原理2.11、SearchBySim3函数SearchBySim3()。通过计算的Sim3变换,查找更多的匹配(成功的闭环匹配需要满足足够多的匹配特征点数,之前使用SearchByBoW进行特征点匹配时会有漏匹配),投影搜索pKF1的特征点在pKF2中的匹配,同理,投影搜索pKF2的特征点在pKF1中的匹配,只有互相都成功匹配的才认为是可靠的匹配。和往常一样,先把整个函数挂在下方,然后分别通过图讲解其实现原理。int ORBmatcher::Sear原创 2022-01-04 18:06:26 · 2039 阅读 · 0 评论 -
4、ORB-SLAM闭环检测之通过词袋寻找当前关键帧和闭环候选帧之间的匹配
目录1、 SearchByBoW2、图解每一步实现原理2.1 通过词袋模型寻找匹配2.2 通过旋转直方图来筛除离群点前面,我们已经了解到了sim3的求解流程,具体计算过程中有三步比较重要:1、寻找两关键帧之间的粗匹配来粗略估计sim3;2、由粗略估计出的sim3来寻找两关键帧之间更多的匹配;3、构建图优化模型,固定地图点通过两关键帧的地图点到两帧的重投影误差来优化sim3.1、 SearchByBoW函数SearchByBoW()。通过词袋,对关键帧的特征点进行跟踪,该函数用于闭环检测时两个关键帧间的原创 2021-12-30 22:22:14 · 1989 阅读 · 0 评论 -
3、ORBSLAM闭环检测终局之战之sim3计算流程,确定是否检测到闭环
计算sim变换确定检测到闭环。原创 2021-12-29 14:06:24 · 2815 阅读 · 0 评论 -
2、ORB-SLAM闭环检测之次终局之战——最终的闭环候选帧
目录1、上次选拔简单回顾2、最后一轮选拔指标——连续性检测2.1 这一阶段相关概念2.2 连续性检测原理介绍3、非常感谢您的阅读!上次我们已经通过层层选拔,选出了一部分闭环候选关键帧,也知道了层层选拔的必要性,今天我们一起来看看,最后一轮选拔,闭环候选关键帧终于冲出重围,拨云见日现真颜了!1、上次选拔简单回顾①检查一下闭环关键帧队列里是否为空,一般不为空;②统计与闭环检测帧有连接关系的关键帧(共视关键帧),并计算出闭环检测帧与每个共视关键的bow相似度得分,并得到最低得分minScore;③计算与原创 2021-12-20 11:05:40 · 819 阅读 · 0 评论 -
1、ORBSLAM yyds,闭环检测第一步——闭环候选关键帧的层层选拔(谨慎的态度都是细节)
ORB-SLAM的闭环检测1、回环检测的重要性2、相关关键帧的名称3、回环检测的闭环候选帧层层选拔3.1 Round 13.2 Round 23.3 Round 33.4 Round 43.5 Round 54、回环检测的闭环候选帧为什么要层层选拔呢?5、非常感谢您的阅读,也希望您能提供宝贵意见,欢迎交流!1、回环检测的重要性读过《视觉SLAM十四讲》的很熟悉下面的图,这张图足以说明回环检测的重要性。因为只依靠前端根据传感器的采集数据进行轨迹推演,即使加上后端的各种优化策略,累积误差也是不可避免的,可见原创 2021-12-17 16:36:37 · 1654 阅读 · 7 评论 -
VINS-mono中高效去畸变的方法
目录1 畸变是如何产生的2 vins中去畸变的思想3 代码对照1 畸变是如何产生的我们先来想想3D点是如何投影到图像平面的:世界坐标点经过一个外参矩阵得到相机坐标系下的位置,由于我们经常用到的是归一化平面坐标,所以这里还要各坐标除以ZZZ,之后经过一个相机内参矩阵得到图像坐标系下坐标。那么图像畸变发生在哪个环节呢?为了获得好的成像效果,我们在相机的前方加了透镜。透镜的加入对成像过程中光线的传播会产生新的影响,这个影响就是使图像发生了畸变。仔细想,不难想到由于透镜的影响,世界点投影到相机归一化平面上时已原创 2021-10-20 16:42:40 · 984 阅读 · 4 评论 -
通过能观性分析理解SLAM系统的可观维度。
目录1 可观性分析大体理解2 可观性定义3 可观性矩阵1 可观性分析大体理解什么是可观性分析?能观性分析通过计算可观性矩阵,分析它的零空间的秩,来分析系统哪些状态维度可观/不可观。可观性矩阵对应系统可观测的维度,零空间对应系统不可观的维度。为什么要做能观性分析?举个例子:真实VIO系统不能观的维度是4(位置和yaw角),而实际MSCKF不能观的维度变成了3,绕重力轴的旋转(yaw角)被错误地能观了,从而产生了不一致性(Inconsistency),系统误认为yaw角具有更多的信息从而将yaw对应原创 2021-10-07 15:49:12 · 2471 阅读 · 1 评论 -
认识SLAM问题中的信息矩阵
请看这篇博文:聊聊SLAM问题中的信息矩阵。原创 2021-10-07 15:23:45 · 674 阅读 · 0 评论 -
VINS-mono中的三角化方法(SVD)
目录1 引言2 三角化(14讲方法)3 三角化(SVD方法)4 两套代码示例4 非常感谢您的阅读1 引言最近在跟着高博的《视觉SLAM十四讲》,自己手写一个双目里程计的一个项目,进行到了特征点的三角化部分时,发现其用的和VINS-mono一个方法。他并没有直接调用OpenCV中的现成函数,而是用了SVD分解的方法。所以心想写一个关于SVD分解进行特征点三角化的博客,加深一下印象。2 三角化(14讲方法)三角化又叫三角测量,本质是用相机的运动估计特征点的空间位置,发生在估计得到帧间运动之后(单目)。三原创 2021-08-29 21:11:33 · 3289 阅读 · 14 评论 -
ORBSLAM3的g2o优化之局部BA(LocalBundleAdjustment)
LocalBundleAdjustment():用于LocalMapping线程中剔除关键帧之前的局部地图优化。局部BA的共视图(其中帧都是关键帧)。用数据结构的术语这个图表示的数据结构称为无向加权图,又叫网,权重就是共视地图点的个数。/* pKF:当前关键帧 pbStopFlag:优化停止标志位 vpNonEnoughOptKFs:没有足够观测的那些关键帧(这里显然是入参)*/void Optimizer::LocalBundleAdjustment(KeyFrame *pKF, bo原创 2021-08-25 22:38:37 · 2572 阅读 · 0 评论 -
ORBSLAM3的g2o优化之位姿图优化(PoseOptimization)
目录原创 2021-08-21 12:48:48 · 3005 阅读 · 0 评论 -
ORB-SLAM3g2o之开篇
目录1 什么是图优化?2 图优化的优势在哪里?3 了解g2o框架4 g2o编程步骤5 非常感谢您的阅读!1 什么是图优化?首先,认识一下啥叫图。图是一种数据结构。图的定义就是由顶点的有穷非空集合和顶点之间边的集合组成,像下面这样:当然,我们不在这里谈论算法和数据结构的内容,我们只需要感性的理解到图是由若干顶点和连接这些顶点的边组成的就好了。举个小例子来理解图优化要干个什么事。我们去“蜀留香“吃火锅时(非广告哈)会看到有一个送餐机器人在火锅店里移动,它在某个时刻 ttt 的位姿(posepo原创 2021-08-20 14:09:18 · 823 阅读 · 1 评论 -
VINS-mono之预积分中关于IMU零偏的建模
目录1 预积分中关于IMU零偏的建模2 如何计算预积分量关于零偏的雅可比矩阵1 预积分中关于IMU零偏的建模从之前的学习中知道了IMU的预积分计算公式为:从公式中可以看到,IMU预积分时除了受噪声nnn的影响,还有IMU零偏 bbb 带来的影响。而VINS-mono作为一个紧耦合的SLAM方案,其待估计和优化的状态变量除了 pvqpvqpvq 之外呢,还有加速度计和陀螺仪的零偏 bbb,一共是15∗115*115∗1维的向量。那么,系统每优化迭代一次,零偏也会发生小小的变化调整。相应的当下次迭代原创 2021-08-17 16:52:24 · 961 阅读 · 2 评论 -
如何推导IMU预积分的协方差矩阵?(解决IMU预积分置信度的问题)
目录1 什么是误差卡尔曼滤波?2 为什么要用误差卡尔曼滤波?3 VINS-mono中对误差卡尔曼滤波的应用3.1 连续时间IMU误差状态传递的推导上次在最后讨论了IMU观测置信度的问题,VINS-mono中是通过误差卡尔曼滤波理论来计算和估计的。1 什么是误差卡尔曼滤波?卡尔曼滤波和误差卡尔曼滤波的区别如上图所示。卡尔曼滤波通过对测量值和预测值进行滤波得到一个较准确的真实值。而误差卡尔曼滤波的输入参数为4个,δ\deltaδxxx是我们认为预测值和真实值的误差(这里设为0,因为如果我们能知道这原创 2021-08-13 17:24:32 · 3236 阅读 · 8 评论 -
VINS-mono之IMU预积分(IMU预积分引出)
目录1 滤波问题中的IMU积分2 IMU预积分引出3 离散时间的预积分(中值积分)4 观测的置信度问题(协方差)接上篇。1 滤波问题中的IMU积分我们知道上式中的IMU积分分别表示位移的变化量、速度的变化量和旋转的变化量,在滤波问题中,用已知的上一帧帧的状态加上对IMU测量的积分量可以预测当前帧的状态,这就是滤波器中的预测部份,而更新通常是通过最小化重投影误差来完成。在非线性优化中,会同时优化好几帧的位姿状态,此时再用IMU积分来进行优化就不是很好了。为什么呢?滤波只进行相邻帧的一次预测和更新,原创 2021-08-09 22:01:13 · 2488 阅读 · 4 评论 -
VINS-mono之IMU预积分(IMU连续时间积分和四元数求导)
目录1 IMU运动模型2 PVQ 连续时间积分3 四元数求导VINS-Mono是HKUST的Shen Shaojie团队开源的一套非常优秀的Visual-Inertial融合定位算法。关于算法的介绍以及论文概览可以看此链接。其开源代码可以从此地址下载1 IMU运动模型VINS-mono中的旋转表示是用四元数来表示的,所以整个系统会涉及到四元数求导的内容。首先来看IMU的运动模型:一般,我们只考虑IMU受高斯白噪声和零偏的影响。这里的gw=[0,0,-9.81]T,所以用的加号。注意:这里的原创 2021-08-06 16:10:37 · 2146 阅读 · 8 评论 -
视觉SLAM中,本质矩阵、基础矩阵、单应性矩阵自由度和秩分析。
先贴上一个链接,他总结了视觉SLAM中各个矩阵的自由度、秩及其计算等内容,非常全。1 矩阵的秩和自由度矩阵的秩:经过初等变换之后的非零行(列)的个数,若不存在零行(列),则为满秩矩阵(Rank(A)=n。特别规定零矩阵的秩为零。矩阵的自由度:有几种不同的方法来考虑矩阵的自由度。(1) 考虑一个Am×n矩阵。此矩阵有mn个元素。我们可以改变这个矩阵中的Amn值,使A矩阵唯一,因此它有mn个自由度。(2) 若我们有一个上三角的m×m矩阵,并且知道矩阵中有几个值是0,那么非零项的个数就是矩阵的原创 2021-08-03 16:36:57 · 5101 阅读 · 3 评论