目前,自己通过调用opencv的相关接口,想实现一个比较裸的SLAM系统,但是发现opencv在特征提取上的能力着实达不到slam的要求。 可以看到左边的opencv orb算法特征点比较集中扎堆,右边的分布均匀,这样自然,有用的特征点数量也就越多。生扒了ORBSLAM2的实现,果然,没有好的特征,在高效的算法都是徒劳的。这里就顺便整理记录下ORBSLAM2的特征提取实现过程。 流程图
在非线性运动的状态估计中,会有两点影响我们对贝叶斯滤波的使用: 1.我们一般对于运动或测量的噪声都使用的是简单的加性噪声 但是在非线性情况下,往往也会对噪声造成影响,通常是这样的 2.我们通常所处理的那些高斯分布的噪声或状态值的分布会在非线性的环境下,也变成非高斯的,如下图: 这样就不在符合贝叶斯滤波的条件了,自然也就无法使用贝叶斯滤波估计状态了。解决办法就是我们通
之前写过一些关于KF和EKF的使用文章,主要偏向于应用,而且过于工程化。鉴于不断的理解深入学习,对于这块知识也有了更进一步的理解认识,这里通过实际Radar数据,详细记录下对于EKF的认识。 在介绍EKF之前,先要认识它的爸爸,贝叶斯滤波。 贝叶斯滤波 贝叶斯滤波的基础是马尔科夫性:当一个随机过程在给定现在状态以及所有过去状态的情况下,其未来的状态的条件概率分布仅依赖于当前状态;换句话说
单目相机通过对极约束来求解相机运动的位姿。参考了ORBSLAM中单目实现的代码,这里用opencv来实现最简单的位姿估计。 对极约束的概念可以参考我的这篇 ARUANTOU:Visual SLAM -- 理解对极几何和约束 简单的说就是对于单目相机,在不同的位置下我们看到同一个物体P,在两个图像中分别是归一化像素P1(U1,V1)和P2(U2,V2),我们可以通过 来计算出E,E是本质
接上篇,先来看看舒尔补是如何完成从现有信息矩阵中移除一个变量之后保存下这个变量和其余变量原有的信息关系的。 考虑这个联合概率。我们现在打算移除 。 可以看到通过舒尔补,成功的分离了联合概率x和y,这样我们就可以用这种方法优雅的操作窗口中的移除项得到比较准确的协方差矩阵。 我们现在得到了协方差矩阵,只需要适当的变化,就可以获取到信息矩阵。引用深蓝的PPT, 之前的手推公式中,
这几天研究了移动窗口中的边缘化原理,这里做简单的记录。 首先要知道VIO中为什么要使用移动窗口,在物体移动的过程中,周围的环境是不断变化的,这样,导致不断有新的测量和观测数据进入整个的优化过程中,导致随着时间的流逝,计算量越来越大,不利于实时的slam构图,所以会考虑设定一个移动窗口,保证在一定的帧数中进行优化。这样就涉及到加入窗口和移除窗口的操作。那边缘化和舒尔补作用在哪呢?答案就是做移除
IMU最重要的两个测量数据 加速度 和角速度 。IMU在离散时间下获取到这两个值之后,通过积分得到连续时间下,携带IMU载体的位姿以达到定位的目的。 独立IMU 补充下最简单情况下IMU的相关计算概念。 参考深蓝的图,做适当解释。 初中物理的只是,做圆周运动的物体的速度=半径*角速度。 旋转坐标系下的运动 机器人在做定位的时候,如果是使用IMU,那就会存在两个坐标系,一个是
卡尔曼滤波的基本原理可以参考: ARUANTOU:基础卡尔曼滤波 我们都知道卡尔曼滤波在噪声和量测噪声为不相关、零期望的白噪声,且是线性系统,初始时刻的状态估计是无偏的条件下,才能保持无偏的特性。而具有无偏特性的卡尔曼滤波算法是有解的,可以计算出最终的定位位置。也称可观的。 要理解可观性,我们需要先看看带有输入误差的卡尔曼滤波。 现实是存在很多非线性的运动,以及未知的测量和运动误差。这
LocalMap主要用于构建局部地图数据,这里对于构建地图所需要的Mappoint和位姿的优化ORBSLAM的做法给了我很多启发,来看下ORBSLAM是如何更新Mappoint和位姿的。 while(1) { // Tracking will see that Local Mapping is busy SetAcceptKeyFrames(
图优化理论现在是SLAM领域的主流优化方式,原理知识很多,这里不能一一介绍记录。简单的梳理以下什么是G2O。 个人理解,图优化把优化问题考虑成图的模式。带优化的变量称为顶点,对于待优量的限制条件,设定为边的概念,就构成了我们理解上的图。 在这里我们把限制条件理解成损失函数,这个函数是优化的关键,我们要通过不断的迭代获取最小的损失,而这又引出了最小二乘法的概念。 上图就是一个单元图,只
这里分两次分析SLamLAM2dui对于回环检测的实现,第一部分介绍回环帧的选择,第二部分介绍使用选择的回环帧对当前正的优化。 第一部分 介绍回环帧的选择: 回环检测的代码在LoopClosing,通过独立线程run运行 while(1) { // Check if there are keyframes in the queue if
双目立体视觉测量中,立体匹配(对应点的匹配 )是一项关键技术,对极几何在其中起着重要作用。双目立体视觉系统中,有两个摄像机在不同角度拍摄物理空间中的一实体点,在两副图像上分别有两个成像点。立体匹配就是已知其中的一个成像点,在另一副图像上找出该成像点的对应点。这样可以加快匹配的速度。 经典图 从上图看,如果得到三维点P在I1上的投影点如果是P1的话,那这个点在I2上的投影,一定会是在
在进行视觉slam的时候分为前端和后端处理,前端就称为视觉里程计。视觉里程计更具相邻图像的信息估计出错略的相机运动,给后端提供了较好的初始值。在视觉设备中,由单目相机和双目相机,还有双目深度相机。我们从最简单的单目开始讲起。 在机器人运动过程中,单目相机会以很高的频率不断的获取当前的图像,视觉里程计要做的就是在t,t+1用这两个时刻的图像来估计出机器人的运动(移动和旋转)。 先给出具体流程
在OPENGL中,为了将最终的3D的图像显示出来,其实做了很多坐标的转换,可以理解为3D->2D。 最后我们所能看到的图像展示是在所谓的NDC(标准化设备坐标(Normalized Device Coordinate,NDC))。 这个坐标系规定了所有维度都在 (-1.0 , 1.0)之间。为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Mode
以前记录过EKF,对于EKF这种增量方法仅关心当前时刻的状态估计,而对之前的状态则不多考虑。还有另一种方法,叫做批量方法,就是在更大的范围内达到最优化。就是把之前所有的数据都用来评估。显然这种做法不是实时的,所以在视觉slam中, 会用别的一些折中的方法,但是批量的方法更容易介绍背后的原理。 我们假设下面的两个公式为运动和观测模型。 假设噪声项 和 满足零均值高斯分布: 对噪声的假设很重
OPENGL大量使用齐次坐标,背后的原因很简单,就是计算方便高效。我们用例子解释下背后简单的原理和目的。 举个二位坐标的例子: 学过线性代数的都知道,显然: 我们可以用矩阵来表示: 如果我们要对齐进行缩放和旋转操作,同样可以通过矩阵来操作: 缩放变换: 旋转: 更一般的, 我们在处理图形的时候,都是一串猛如虎的操作,也就是说经常性的缩放、旋转、平移一起变换。例如先放大2倍,然后旋转
一直对齐次坐标这个概念的理解不够彻底,只见大部分的书中说道“齐次坐标在仿射变换中非常的方便”,然后就没有了后文,今天在一个叫做“三百年 重生”的博客上看到一篇关于透视投影变换的探讨的文章,其中有对齐次坐标有非常精辟的说明,特别是针对这样一句话进行了有力的证明:“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill
关于定位的原理和算法: ARUANTOU:自适应MCL(KLD采样) ARUANTOU:定位算法 -- MCL蒙特卡洛(粒子)滤波 在Ros实现中,有一个AMCL的package,用的就是自适应滤波算法。这里主要记录下自主定位在ros中的实现方式。 我们知道在粒子滤波定位的时候,需要结合地图数据和机器人的初始位姿通过不断的移动之后们,机器人就可以知道自己所在的位置。 在ros中我们可以通过
在机器人运动过程中,我们一直假设它有一个地图。但是很少有真实世界的应用能够满足这一假设,因为地图通常都是先验的, 或者是人们手工创建的。在一些应用领域,没有过多的资源来建立先验地图。所以,对于机器人而言,能够自行通过移动感知周围环境自建地图的能力是很重要的。 因为一些因素的制约,移动机器人自动建图是一项有挑战的工作: 计算量问题,由于机器人可能的运动环境不定,也许是一个小小的空间,也许是一个足
机器人学中有些问题是二值问题,对于这种二值问题的概率评估问题可以用二值贝叶斯滤波器binary Bayes filter来解决的。比如机器人前方有一个门,机器人想判断这个门是开是关。这个二值状态是固定的,并不会随着测量数据变量的改变而改变。就像门一样,不是开就是关。 如果状态是静态的,那么置信度就只是测量值的函数: ut控制数据对于二值状态没有影响,所以我不忽略。 置信度通常是以对数差异比lo
在自动驾驶中和移动机器人的应用中,感知是至关重要的一环,周边环境障碍物的确定对于之后的路径规划和移动有着中要的影响。在实践中,我们往往用激光雷达(lidar)来满足感知的要求,主要原理是通过雷达接收到反射的光线进行距离的测量(也称为测距仪)。 举个例子,在下图所示矩形地图中,lidar检测了边界和三角形障碍物,并的到了距离障碍物的距离 , 在这个情况下,机器人通过地图数据得知真实的边界距离在
在自动驾驶,轮子机器人的使用中,一般我们都是用平面世界中的运动模型来进行移动计算(预测)。在平面环境中运动的移动机器人, 它的运动学状态,或者说是位姿pose,可以用三个变量来表示 。在平面中我们有两个模型,一个是速度模型一个是里程计模型,里程计模型一般比速度模型更精确,因此大多数商业机器人并不使用速度模型。但是里程计模型具有一定的滞后, 因此不能用于运动规划。蔽障的规划算法不得不预测运动的结
贝叶斯滤波从控制数据(移动机器人),感知数据(传感器)来获取最终结果的置信度bel。 摘自《Probabilistic robotics》 贝叶斯滤波过程如上图。 我们可以分成两步: 通过控制量做出预测 结合观测量进行更新 注意到滤波器需要之前的状态,所以需要初始化开始状态 1.预测 基于进行控制预测时,应该注意到,前一时刻的状态并不确定,也是一个后验分布,应该对每一个可能状态施加
之前介绍过粒子滤波器(传送门),在全局地图环境下,传统粒子滤波器在sample数量过大的情况下,计算效率会非常的低。但是如果在非常大的地图环境下,少量的sample数又会导致定位的发散。这样,在早期阶段可能需要有数十万的样本来完成初期的定位,维持一个如此大的样本集合是有必要的,一旦机器人确定了自己的位置之后只需要一小部分粒子就足以跟踪机器人的位置了。 KLD采样是MCL定位的一种变形,它根
之前的文章介绍过卡尔曼滤波算法进行定位,我们知道kalman算法适合用于线性的高斯分布的状态环境中,我们也介绍了EKF,来解决在非高斯和非线性环境下的机器人定位算法。但是他们在现实应用中存在计算量,内存消耗上不是很高效。这就引出了MCL算法。 粒子滤波很粗浅的说就是一开始在地图空间很均匀的撒一把粒子,然后通过获取机器人的motion来移动粒子,比如机器人向前移动了一米,所有的粒子也就向前移动
在自动驾驶,轮子机器人的使用中,一般我们都是用平面世界中的运动模型来进行移动计算(预测)。在平面环境中运动的移动机器人, 它的运动学状态,或者说是位姿pose,可以用三个变量来表示 。在平面中我们有两个模型,一个是速度模型一个是里程计模型,里程计模型一般比速度模型更精确,因此大多数商业机器人并不使用速度模型。但是里程计模型具有一定的滞后, 因此不能用于运动规划。蔽障的规划算法不得不预测运动的
之前的我们介绍过卡尔曼滤波的一维和多维的基础知识。传送门。 今天我们来看看什么是EKF。在了解EKF具体算法之前,先要知道为什么需要EKF。 1.非线性问题: 我们都知道卡尔曼滤波算法是让预测和更新都建立在线性计算基础上的,比如一个小车我们知道状态是{x,v}。我们预测在下一秒的位置是 然后直接套用一维或多维公式就可以了。但是在现实世界中,往往都是非线性的。比如小车在环岛移动,或者是不
SLAM -- 仿真 定位 构建题图。地图对去机器人的定位是很重要的,我们只有在有地图的情况下才可以进行MCL定位。但是在比较宽广的区域下,去预先的得到地图数据又不make sense,尤其是在自动驾驶领域,不肯能让我们的车永远都在我们设定好的地方活动,我们需要他们能够跑到世界各地。所以,在运动过程中创建地图数据的能力就显得很重要。 Thanks GOD!!! 大牛们为我们带来了slam算法
之前在基础kalman介绍了一维的情况,但是在现实世界中,是很少存在一维情况的,比如一辆自动驾驶汽车停在马路上,它的当前状态是由 这样的思维坐标表示的。x,y,z是三维坐标值, 是方向。更有一种情况是 ,x表示的位置(类似一维坐标中的坐标位置), 代表的是速度。这种情况很适合分析介绍多维卡尔曼的应用情况和分析其优势。下面我们就这个位置速度的2维状态进行介绍。 kalman是建立在线性
原理 卡尔曼滤波器是一种基础预测定位算法。原理非常简单易懂。核心过程可以用一个图说明: 本质上就是这两个状态过程的迭代,来逐步的准确定位。 预测:当前状态环境下,对下一个时间段t的位置估计计算的值。 更新:更具传感器获取到比较准确的位置信息后来更新当前的预测问位置,也就是纠正预测的错误。 你可能要问为什么有传感器的数据了还要进行更新? 因为在现实世界中传感器是存在很多噪声干扰的,
积分
粉丝
勋章
TA还没有专栏噢
第三方账号登入
看不清?点击更换
第三方账号登入
QQ 微博 微信