快捷搜索:  汽车  科技

slam 极简入门(ORB-SLAM3基本思路分析-适合入门作参考)

slam 极简入门(ORB-SLAM3基本思路分析-适合入门作参考)图1 ORBmatcher这里面涉及到一些技术细节:SLAM全称Simultaneous Localization and Mapping,同步定位与映射,或者同步定位与地图构建。它的主要流程是:因为第3步中,我们不仅得到了机器人的位置,还得到了地图信息,所以,这个方法就叫同步定位与构图(SLAM)了。

先看一下效果:

若视频打不开,也可以在这里看:https://www.ixigua.com/6855889114248629508

ORB是一种提取图片上关键点的方法,我们就不多说了,理解sift特征,就容易理解ORB特征。

SLAM全称Simultaneous Localization and Mapping,同步定位与映射,或者同步定位与地图构建。

它的主要流程是:

  1. 机器人获取图片,提取当前时刻图片的ORB特征,获取1000个关键点,我们称这个点的集合为A。
  2. 经过一个时刻t=500ms,机器人重新获取图片,提取此图片时刻的ORB特征,获取1000个关键点,我们称这个点集合为B。
  3. 先求出A,B中的相同点,然后再利用立体匹配stereomapping技术,匹配A B中的相同点,求这些相同点在世界坐标系中发生的位移和姿态角的变化量,进而求到经过这一个t=500ms的时刻,机器人的位移和姿态。我们把A,B中的相同点存储下来,作为地图使用。
  4. 重复2-3步。

因为第3步中,我们不仅得到了机器人的位置,还得到了地图信息,所以,这个方法就叫同步定位与构图(SLAM)了。

这里面涉及到一些技术细节:

  1. 如何求出1000个ORB特征关键点? 这个是老知识了,传统的图像特征,ORB-SLAM3也是调用的现有代码,稍后我稍微介绍一下 ORB- SLAM3的代码。
  2. 如何求出A与B相同的点?使用ORB特征点的匹配技术,如图1 ORBmatcher中的matcher.SearchByBow
  3. 什么是stereo mapping技术?这个是立体匹配技术,比如双目视觉生成立体图,就是stereo mapping技术。这里主要涉及到世界坐标系到像素坐标系的转换等相关知识。具体代码对应图2

slam 极简入门(ORB-SLAM3基本思路分析-适合入门作参考)(1)

图1 ORBmatcher

图1所含有的代码文件夹:https://gitee.com/anjiang2020_admin/ORB_SLAM3/tree/master/src

此文件夹下的tracking.cc的第2580行

slam 极简入门(ORB-SLAM3基本思路分析-适合入门作参考)(2)

图2 2597行为PnP方法求变换矩阵的参数,从而求出位移姿态

图2 为tracking.cc的第2597行

这个文件夹下的主要代码如下图3:

slam 极简入门(ORB-SLAM3基本思路分析-适合入门作参考)(3)

图3 ORB-SLAM3主要代码

代码PnPsolver.cpp就是解位态方程组用的,位态方程组里的参数就是位移和姿态

代码ORBextractor.cc是求去图像的 ORB特征用的,感兴趣的同学可以去看看。

代码System.cc对应ORB-SLAM3算法整体

代码Tracking.cc主要给出机器人当前位置以及地图信息

其他都是辅助代码。

到此为止,比较粗略地整理了一下。

这里面涉及到的核心细节今天都不再展开了。

我先把核心细节列一下,以后慢慢深挖。

细节:

  1. ORB特征的提取算法
  2. 特征点的匹配算法
  3. 位资方程组的求解算法
  4. 整体ORB-SLAM3算法对以上核心算法的运用方法:ORB-SLAM3的创新点都在这里
  5. 工程文件的组织方式,以及一些比较好的C 11的语法使用。这一步不要难倒没有C 面向对象编出基础的同学了,这个补起来没那么容易。

我下一步:

一边下载数据集,一边编译环境,一边读代码写解读。

至于进度的话,就看情况了,

不过一定尽量把ORB-SLAM的思路解读细致。

2021-11-17

其实大体思路有了,剩下就是编译了。按照工程中的README文件所说,

直接./build.sh

报出错误:

slam 极简入门(ORB-SLAM3基本思路分析-适合入门作参考)(4)

这里提示没有stdint-gcc.h这个文件 我用的macbook编译的,使用的不是gcc 而是clang 而clang里面只有stding.h 没有stdint-gcc.h

由于gcc和clang有时候可以互通,所以我就冒险将FORB.cpp中的#include <stdint-gcc.h>改为#include <stdint.h> 然后重新使用命令:

rm -rf build && mkdir build && cd build && cmake .. && make

来编译:

slam 极简入门(ORB-SLAM3基本思路分析-适合入门作参考)(5)

slam 极简入门(ORB-SLAM3基本思路分析-适合入门作参考)(6)

然后再去编译g2o:

仍然是用编译命令:

rm -rf build && mkdir build && cd build && cmake .. && make

编译后报错:

slam 极简入门(ORB-SLAM3基本思路分析-适合入门作参考)(7)

这里将tr1去掉就行了,哪里有tr1 就把它删除就可以编译通过了,

然后继续编译:

发现又是tr1/xxxx.h 找不到,所以还是将tr1/xxx.h改为xxx.h即可。

因为不止一个位置,很多个位置需要将tr1去掉,我们都将其去掉即可。

编译成功:

slam 极简入门(ORB-SLAM3基本思路分析-适合入门作参考)(8)

这里是cmake报的错。

至此,第三方库就编译完成了。

回到ORB-SLAM3的主目录,运行:

./build.sh

发现又报错:

slam 极简入门(ORB-SLAM3基本思路分析-适合入门作参考)(9)

这里是cmake报的错。

./build.sh

发现又报错:

slam 极简入门(ORB-SLAM3基本思路分析-适合入门作参考)(10)

这里是cmake报的错。

猜您喜欢: