zoukankan      html  css  js  c++  java
  • ORB-SLAM学习笔记

    一、ORB-SLAM的主要贡献

    二、ORB-SLAM的系统架构

    三、ORB-SLAM流程


    ORB-SLAM 它是由三大块、三个流程同时运行的。第一块是跟踪,第二块是建图,第三块是闭环检测。

    Part 0 自动地图初始化

    参考自 https://blog.csdn.net/u010128736/article/details/53218140

    Part Ⅰ 跟踪

    这一部分主要工作是从图像中提取 ORB 特征,根据上一帧进行姿态估计,或者进行通过全局重定位初始化位姿,然后跟踪已经重建的局部地图,优化位姿,再根据一些规则确定新关键帧。

    参考自https://blog.csdn.net/u010128736/article/details/53339311

    1 Extract ORB

    1.1 ORB特征

    • 改进的FAST,加入了方向(灰度质心法)和尺度不变性(利用图像金字塔对每一层图像提取FAST角点,这样可以使得相同的物体在不同分辨率(尺度)大小的场景中都能提取到关键点,因此特征点具有尺度不变性)
    • BRIEF描述子变得可旋转性

    1.2 提取改进点

    ORB-SLAM中,对图像进行划分网格,利用四叉树结构保存提取到的特征点,从而使得图像的特征点分布比较均匀。
    https://zhuanlan.zhihu.com/p/61738607

    2 Map Initialization

    分为双目、RGBD,以及单目两种不同的初始化过程。单目的初始化需要注意的较多。这样的处理使得ORB-SLAM的初始化处理具有鲁棒性。

    2.1 单目相机初始化

    因为单目相机不能获取深度信息,所以单目SLAM得通过初始化确定尺度并且得到一个初始地图。

    • 在ORB-SLAM中,初始化提取的特征点设定为一般图像帧的两倍。但是如果提取的特征点不够(<100)或者匹配对不够(<100),都要找新的两帧重新进行初始化。
    • 一旦找到了满足要求的前后两帧图像,就利用RANSAC迭代同时计算基础矩阵F(八点法)和单应矩阵H(DLT),并通过计算重投影误差得到两个模型的分数SF和SH。
    • 如果分数比例SH/(SH+SF)>0.45(代码中设为0.4),就用单应矩阵恢复相机位姿,否则就认为相机符合对极约束模型,从基础矩阵恢复相机位姿。
    • 在对恢复出的位姿进行选择时,会对三角测量的点检查其坐标是否有限、深度是否为正、视差是否够大、重投影误差是否够小。
    • 如果选定的H矩阵或者F矩阵最后没能找到一个足够可靠的位姿,或者两帧之间没有足够的视差,抑或在此位姿下好的3D点不够多,那么就判断这两帧的初始化失败。
    • 如果初始化成功,便将初始帧(前一帧)设为坐标原点(R为单位阵,t为0向量),这样前一帧到后一帧的旋转矩阵和平移向量就是后一帧的位姿了。

    参考自https://zhuanlan.zhihu.com/p/89715373

    2.2 RANSAC算法

    2.2.1 RANSAC算法作用

    ransac算法进行过滤在特征匹配中所遇到的误匹配。RANSAC是“RANdom SAmple Consensus(随机抽样一致)”的缩写。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果;为了提高概率必须提高迭代次数。

    2.2.2 RANSAC算法基本假设

    (1)数据由“局内点”组成,例如:数据的分布可以用一些模型参数来解释;
    (2)“局外点”是不能适应该模型的数据;
    (3)除此之外的数据属于噪声。

    2.2.3 RANSAC算法步骤

    • RANSAC算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一些可信的参数。

    • RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:
      1.首先我们先随机假设一小组局内点为初始值。然后用此局内点拟合一个模型,此模型适应于假设的局内点,所有的未知参数都能从假设的局内点计算得出。
      2.用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点,将局内点扩充。
      3.如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。
      4.然后,用所有假设的局内点去重新估计模型,因为此模型仅仅是在初始的假设的局内点估计的,后续有扩充后,需要更新。
      5.最后,通过估计局内点与模型的错误率来评估模型。

    • 整个这个过程为迭代一次,此过程被重复执行固定的次数,每次产生的模型有两个结局:
      1、要么因为局内点太少,还不如上一次的模型,而被舍弃,
      2、要么因为比现有的模型更好而被选用。

    2.2.4 RANSAC算法优缺点

    优点:

    • 能鲁棒的估计模型参数
    • 能从包含大量局外点的数据集中估计出高精度的参数。
      缺点:
    • 计算参数的迭代次数没有上限;如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果。
    • 它要求设置跟问题相关的阀值。
    • 只能从特定的数据集中估计出一个模型,如果存在两个(或多个)模型,RANSAC不能找到别的模型。

    参考自 https://blog.csdn.net/robinhjwy/article/details/79174914

    Part Ⅱ 建图

    这一部分主要完成局部地图构建。包括对关键帧的插入,验证最近生成的地图点并进行筛选,然后生成新的地图点,使用局部捆集调整(Local BA),最后再对插入的关键帧进行筛选,去除多余的关键帧。

    参考自https://blog.csdn.net/u010128736/article/details/53395936

    Part Ⅲ 闭环检测

    这一部分主要分为两个过程,分别是闭环探测和闭环校正。闭环检测先使用 WOB 进行探测,然后通过 Sim3 算法计算相似变换。闭环校正,主要是闭环融合和 Essential Graph 的图优化。

    参考自https://blog.csdn.net/u010128736/article/details/53409199

  • 相关阅读:
    python爬虫实例——爬取歌单
    第一次接触稍大一点的项目有感——规范
    Ajax学习——ajax提交目的是返回刷新页面某个位置的内容
    C++ STL(标准模板库)的学习了解
    各高级编程语言分类分析
    ubuntu安装后中出现如下启动报错的错误
    解决GitHub下载慢的问题
    caffe的CPU编译需要更改的地方
    拐点处选择聚类K值
    python处理大规模数据时,出现memory
  • 原文地址:https://www.cnblogs.com/Justing778/p/13476686.html
Copyright © 2011-2022 走看看