初始化

ORB SLAM3的初始化主要是创建ORB词袋、关键帧数据库、多地图等对象,其步骤如下:

  1. 检测配置文件能否打开
  2. 加载ORB词袋(ORBVocabulary)
  3. 创建关键帧数据库(KeyFrameDatabase)
  4. 创建多地图(Atlas)
  5. 创建跟踪线程(Tracking)
  6. 创建局部建图线程(LocalMapping)
  7. 创建闭环线程(LoopClosing)
  8. 设置线程间的指针

A.跟踪线程

  1. 从配置文件中读取相机参数,创建相机模型(Pinhole/KannalaBrandt8)

    • Pinhole/KannalaBrandt8: 继承自GeometricCamera,输入:相机参数(fx,fy,cx,cy/fx,fy,cx,cy,k1,k2,k3,k4
    • 添加相机模型到多地图系统中(mpAtlas->AddCamera(mpCamera))
OpenCV 中的 `FileStorage` 类能够读写`.xml`和`.yaml`文件,以 `FileNode` 为单位存储数据,其有以下操作:
* 写入:`FileStorage::WRITE`
* 追加:`FileStorage::APPEND`
* 读取:`FileStorage::WRITE`
  1. 从配置文件中读取ORB参数,创建ORB特征提取器(ORBextractor)
  • nFeatures: 特征点的数量
  • Scale factor:特征金字塔的尺度因子
  • nLevels: 特征金子塔的层数
  • iniThFAST: 初始Fast阈值
  • minThFAST: 最小Fast阈值
mpORBextractorLeft = new ORBextractor(nFeatures,fScaleFactor,nLevels,fIniThFAST,fMinThFAST);
//相对于普通情况,单目初始化时提取的特征点数量更多
mpIniORBextractor = new ORBextractor(5*nFeatures,fScaleFactor,nLevels,fIniThFAST,fMinThFAST);
  1. 从配置文件中读取IMU参数,创建IMU标定(IMU::Calib)、IMU预积分(IMU::Preintegrated)

    • Tbc:相机到IMU的变换矩阵
    • freq:IMU的频率
      • 单位:hzhzhz
      • 符号:1Δt\frac{1}{\Delta t}Δt1​
    • Ng:陀螺仪白噪声
      • 单位:rad s1Hz\frac{\text { rad }}{s} \frac{1}{\sqrt{H_{z}}}s rad ​Hz​​1​
      • 符号:σg\sigma_{g}σg​
    • Na:加速计白噪声
      • 单位:ms21Hz\frac{m}{s^{2}} \frac{1}{\sqrt{H z}}s2m​Hz​1​
      • 符号:σa\sigma_{a}σa​
    • Ngw:陀螺仪随机游走噪声
      • 单位:rad s21Hz\frac{\text { rad }}{s^{2}} \frac{1}{\sqrt{H z}}s2 rad ​Hz​1​
      • 符号:σbg\sigma_{bg}σbg​
    • Naw:加速计随机游走噪声
      • 单位:ms31Hz\frac{m}{s^{3}} \frac{1}{\sqrt{H z}}s3m​Hz​1​
      • 符号:σba\sigma_{ba}σba​

高斯白噪声的方差从连续时间离散时间需要乘以一个1freq\frac{1}{\sqrt{freq}}freq​1​
Na=NadfreqNg=Ngdfreq\begin{array}{c} N_{a} = N_{a}^{d}\sqrt{freq} \\ N_{g} = N_{g}^{d}\sqrt{freq} \end{array} Na​=Nad​freq​Ng​=Ngd​freq​​
随机游走方差从连续时间离散时间乘以一个 freq\sqrt{freq}freq​
Naw=Nawd1freqNgw=Ngwd1freq\begin{array}{c} N_{aw} = N_{aw}^{d}\frac{1}{\sqrt{freq}} \\ N_{gw} = N_{gw}^{d}\frac{1}{\sqrt{freq}} \end{array} Naw​=Nawd​freq​1​Ngw​=Ngwd​freq​1​​
高斯白噪声协方差:
[Ng2000000Ng2000000Ng2000000Na2000000Na2000000Na2]\begin{bmatrix} N_{g}^{2} & 0 & 0 & 0 & 0 & 0\\ 0 & N_{g}^{2} & 0 & 0 & 0 & 0\\ 0 & 0 &N_{g}^{2} & 0 & 0 & 0\\ 0 & 0& 0 &N_{a}^{2} & 0& 0\\ 0& 0& 0& 0&N_{a}^{2} & 0\\ 0& 0& 0& 0& 0&N_{a}^{2} \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎡​Ng2​00000​0Ng2​0000​00Ng2​000​000Na2​00​0000Na2​0​00000Na2​​⎦⎥⎥⎥⎥⎥⎥⎤​
随机游走协方差:
[Ngw2000000Ngw2000000Ngw2000000Naw2000000Naw2000000Naw2]\begin{bmatrix} N_{gw}^{2} & 0 & 0 & 0 & 0 & 0\\ 0 & N_{gw}^{2} & 0 & 0 & 0 & 0\\ 0 & 0 &N_{gw}^{2} & 0 & 0 & 0\\ 0 & 0& 0 &N_{aw}^{2} & 0& 0\\ 0& 0& 0& 0&N_{aw}^{2} & 0\\ 0& 0& 0& 0& 0&N_{aw}^{2} \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎡​Ngw2​00000​0Ngw2​0000​00Ngw2​000​000Naw2​00​0000Naw2​0​00000Naw2​​⎦⎥⎥⎥⎥⎥⎥⎤​

ORB特征提取器

  1. 设置图像金字塔的尺度因子逆尺度因子方差
mvScaleFactor.resize(nlevels);
mvInvScaleFactor.resize(nlevels);mvLevelSigma2.resize(nlevels);
mvInvLevelSigma2.resize(nlevels);

mvScalefactori=mvScalefactori−1⋅scalefactormvInvScalefactori=1mvScalefactorimvLevelSigma2i=mvScalefactori2mvInvLevelSigma2i=1mvLevelSigma2i\begin{array}{l} mvScalefactor_{i} = mvScalefactor_{i-1} \cdot scalefactor \\ mvInvScalefactor_{i} = \frac{1}{mvScalefactor_{i}} \\ mvLevelSigma2_{i} = mvScalefactor_{i}^{2} \\ mvInvLevelSigma2_{i} = \frac{1}{mvLevelSigma2_{i}} \end{array} mvScalefactori​=mvScalefactori−1​⋅scalefactormvInvScalefactori​=mvScalefactori​1​mvLevelSigma2i​=mvScalefactori2​mvInvLevelSigma2i​=mvLevelSigma2i​1​​

  1. 预分配每层金字塔的特征点数量
  • 分配的方式:

    • 先分配前n−1n-1n−1层,再将剩余的特征点N−sum(0,n−1)N-sum(0,n-1)N−sum(0,n−1)分配给第n层。
  • 每层金字塔期望的特征点数量

假设需要提取的特征点数量为NNN,金字塔共有mmm层,第0层图像的宽为WWW,高为HHH ,对应的面积H⋅W=CH\cdot W =CH⋅W=C,图像金字塔缩放因子为s(0<s<1)s(0<s<1)s(0<s<1),在 ORB-SLAM中 ,m=8,s=1/1.2m=8,s=1/ 1.2m=8,s=1/1.2。
那么,整个金字塔总面积为:
S=H⋅W⋅(s2)0+H⋅W⋅(s2)1+⋯+H⋅W⋅(s2)(m−1)=HW1−(s2)m1−s2=C1−(s2)m1−s2\begin{aligned} S &=H \cdot W \cdot\left(s^{2}\right)^{0}+H \cdot W \cdot\left(s^{2}\right)^{1}+\cdots+H \cdot W \cdot\left(s^{2}\right)^{(m-1)} \\ &=H W \frac{1-\left(s^{2}\right)^{m}}{1-s^{2}}=C \frac{1-\left(s^{2}\right)^{m}}{1-s^{2}} \end{aligned} S​=H⋅W⋅(s2)0+H⋅W⋅(s2)1+⋯+H⋅W⋅(s2)(m−1)=HW1−s21−(s2)m​=C1−s21−(s2)m​​
单位面积应该分配的特征点数目为:
Navg=NS=NC1−(s2)m1−s2=N(1−s2)C(1−(s2)m)N_{a v g}=\frac{N}{S}=\frac{N}{C \frac{1-\left(s^{2}\right)^{m}}{1-s^{2}}}=\frac{N\left(1-s^{2}\right)}{C\left(1-\left(s^{2}\right)^{m}\right)} Navg​=SN​=C1−s21−(s2)m​N​=C(1−(s2)m)N(1−s2)​
第0层应该分配的特征点数量为:
N0=N(1−s2)1−(s2)mN_{0}=\frac{N\left(1-s^{2}\right)}{1-\left(s^{2}\right)^{m}} N0​=1−(s2)mN(1−s2)​
第 i 层应该分配的特征点数量为:
Ni=N(1−s2)C(1−(s2)m)C(s2)i=N(1−s2)1−(s2)m(s2)iN_{i}=\frac{N\left(1-s^{2}\right)}{C\left(1-\left(s^{2}\right)^{m}\right)} C\left(s^{2}\right)^{i}=\frac{N\left(1-s^{2}\right)}{1-\left(s^{2}\right)^{m}}\left(s^{2}\right)^{i} Ni​=C(1−(s2)m)N(1−s2)​C(s2)i=1−(s2)mN(1−s2)​(s2)i
在ORB-SLAM3 的代码里,不是按照面积均摊的,而是按照面积的开方来均摊特征点的,也就是将上述公式中的s2s^2s2换成sss 即可。

  1. 初始化pattern
    pattern为32⋅8⋅4=102432\cdot8\cdot4 = 102432⋅8⋅4=1024,其中pattern是ORB预设好的。
    参考文献:《BRIEF: Binary Robust Independent Elementary Features 》

  1. 预先计算灰度质心法每行对应的终点

    1. 先算弧A->B(v∈(0,vmax)v\in(0,vmax )v∈(0,vmax))段
    2. 再算弧C->B(v∈(r,vmin)v\in(r,vmin )v∈(r,vmin))段


注意:这里算出来vmaxvmin是相等的,可以看打印出来的点中有一个红圈套篮圈

欢迎点赞、收藏、转发,本人微信公众号:火柴的初心

Part-1 ORB SLAM3初始化-1相关推荐

  1. ORB SLAM3加载Vocabulary更快ORBvoc.bin

    最近ORB SLAM3刚开源,跑了跑,发现源代码加载词袋还是ORBvoc.txt,加载时间比较慢,这里教你修改成ORBvoc.bin加载,1秒内完成加载. 1. 将ORBvoc.bin拷贝到Vocab ...

  2. ORB SLAM3——IMU优化部分精读-VertexPose(ImuCamPose)的更新量到底是什么?

    ORB SLAM3--IMU优化部分精读-VertexPose(ImuCamPose)的更新量到底是什么? 先说答案 void ImuCamPose::Update(const double *pu) ...

  3. ORB SLAM3论文大致翻译,手动整理

    ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM I. INTRODU ...

  4. orb slam3之BA部分源码解读

    提前透露一下,用的是g2o库 Optimizer::GlobalBundleAdjustemnt(mpAtlas->GetCurrentMap(),20); 迭代次数是20 然后进入Bundle ...

  5. ORB SLAM学习--跑自己数据集图片序列或摄像头或视频(转)

    转自:用ORB SLAM2跑自己的数据集 使用图片序列或摄像头或视频 实践篇_不二青衣的博客-CSDN博客_orbslam2运行自己的数据集 学习 做实验参考使用,侵权则删 用ORB SLAM2跑自己 ...

  6. orb slam [RGBD-1] process has died解决

    运行orb slam3时出现如下报错 [RGBD-1] process has died [pid 36546, exit code -4, cmd /orb_slam3/RGBD /ORB_SLAM ...

  7. VSLAM 相关知识点总结

    VSLAM 相关知识点 这篇文章是对VSLAM涉及的知识点进行系统性的总结和更新,一些内容来源至VSLAM经典教材,博客,和开源项目(引用材料如下表) SLAM十四讲高博 古月老师的技术博客 崔神的g ...

  8. 八种常用激光雷达和视觉SLAM算法的评估与比较

    文章:Evaluation and comparison of eight popular Lidar and Visual SLAM algorithms 作者:Bharath Garigipati ...

  9. DynaSLAM超详细安装配置运行ubantu20.0.4+opencv2.4.11+tensorflow1.4.0

    DynaSLAM超详细安装配置运行ubantu20.0.4+opencv2.4.11+tensorflow1.4.0 注:我现在ubantu的环境是基于可以运行ORB SLAM 2和ORB SLAM3 ...

最新文章

  1. Windows PE变形练手2-开发一套自己的PE嵌入模板
  2. c#中的protected和internal
  3. 记一次安装docker的坑
  4. Python回调函数的实现
  5. 新建jsp报错“The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path”...
  6. 传递实体类对象_Java I/O 流之对象流中的序列化和反序列化
  7. 数电笔记:触发器的基础知识
  8. 记录-QuartuesⅡ-Qsys自定义数码管IP过程以及遇到的源文件路径问题
  9. java微信扫一扫_java调用微信扫一扫
  10. python tkinter treeview制作_python-3.x – Tkinter Treeview标题样式
  11. 换个角度看前几天的女孩父亲杀男孩事件 另附一些对当前教育的感想
  12. 硬盘分区,格式化分区,删除分区
  13. Matlab之保存/写矩阵数据到文本(fprintf, save, dlmwrite)
  14. MessageBox英文显示OK/Cancel(适用于中英文界面)
  15. python与会计学_Python 中用于表示逻辑与的关键字分别是 ____
  16. 中大新华计算机科学与技术,专业评估|信息科学学院电子信息科学与技术、计算机科学与技术、软件工程、数字媒体技术专业评估考察会议举行...
  17. <口算练习机 方案开发原理图>口算练习机/口算宝/儿童数学宝/儿童计算器 LCD液晶显示驱动IC-VK1621B,提供技术支持
  18. 四种常见的ps怎么模糊背景的方法
  19. Java周记(第二周)
  20. 项目随记:8250-Oneplus

热门文章

  1. 奇酷学院-简单配置 MySQL 编码格式
  2. R语言作图:坐标轴设置
  3. 推荐算法的Python实现——MF(矩阵分解)
  4. 北科大matlab,教学反思怎么写北科大Matlab_数学实验报告1~6次(全)亲情作文开头
  5. 携程、美团“抢食”精致周边游
  6. WCF Rest用法
  7. android dropbear 密码,[Android]dropbear on android
  8. 数据分析双十一某宝男装参与活动情况
  9. 【儿童文学论文】王立春诗集《骑扁马的扁人》的主题分析(节选)
  10. 什么地图软件好用?有什么简单好用的绘制地图的软件