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,同步定位与映射,或者同步定位与地图构建。
它的主要流程是:
- 机器人获取图片,提取当前时刻图片的ORB特征,获取1000个关键点,我们称这个点的集合为A。
- 经过一个时刻t=500ms,机器人重新获取图片,提取此图片时刻的ORB特征,获取1000个关键点,我们称这个点集合为B。
- 先求出A,B中的相同点,然后再利用立体匹配stereomapping技术,匹配A B中的相同点,求这些相同点在世界坐标系中发生的位移和姿态角的变化量,进而求到经过这一个t=500ms的时刻,机器人的位移和姿态。我们把A,B中的相同点存储下来,作为地图使用。
- 重复2-3步。
因为第3步中,我们不仅得到了机器人的位置,还得到了地图信息,所以,这个方法就叫同步定位与构图(SLAM)了。
这里面涉及到一些技术细节:
- 如何求出1000个ORB特征关键点? 这个是老知识了,传统的图像特征,ORB-SLAM3也是调用的现有代码,稍后我稍微介绍一下 ORB- SLAM3的代码。
- 如何求出A与B相同的点?使用ORB特征点的匹配技术,如图1 ORBmatcher中的matcher.SearchByBow
- 什么是stereo mapping技术?这个是立体匹配技术,比如双目视觉生成立体图,就是stereo mapping技术。这里主要涉及到世界坐标系到像素坐标系的转换等相关知识。具体代码对应图2
图1 ORBmatcher
图1所含有的代码文件夹:https://gitee.com/anjiang2020_admin/ORB_SLAM3/tree/master/src
此文件夹下的tracking.cc的第2580行
图2 2597行为PnP方法求变换矩阵的参数,从而求出位移姿态
图2 为tracking.cc的第2597行
这个文件夹下的主要代码如下图3:
图3 ORB-SLAM3主要代码
代码PnPsolver.cpp就是解位态方程组用的,位态方程组里的参数就是位移和姿态
代码ORBextractor.cc是求去图像的 ORB特征用的,感兴趣的同学可以去看看。
代码System.cc对应ORB-SLAM3算法整体
代码Tracking.cc主要给出机器人当前位置以及地图信息
其他都是辅助代码。
到此为止,比较粗略地整理了一下。
这里面涉及到的核心细节今天都不再展开了。
我先把核心细节列一下,以后慢慢深挖。
细节:
- ORB特征的提取算法
- 特征点的匹配算法
- 位资方程组的求解算法
- 整体ORB-SLAM3算法对以上核心算法的运用方法:ORB-SLAM3的创新点都在这里
- 工程文件的组织方式,以及一些比较好的C 11的语法使用。这一步不要难倒没有C 面向对象编出基础的同学了,这个补起来没那么容易。
我下一步:
一边下载数据集,一边编译环境,一边读代码写解读。
至于进度的话,就看情况了,
不过一定尽量把ORB-SLAM的思路解读细致。
2021-11-17
其实大体思路有了,剩下就是编译了。按照工程中的README文件所说,
直接./build.sh
报出错误:
这里提示没有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
来编译:
然后再去编译g2o:
仍然是用编译命令:
rm -rf build && mkdir build && cd build && cmake .. && make
编译后报错:
这里将tr1去掉就行了,哪里有tr1 就把它删除就可以编译通过了,
然后继续编译:
发现又是tr1/xxxx.h 找不到,所以还是将tr1/xxx.h改为xxx.h即可。
因为不止一个位置,很多个位置需要将tr1去掉,我们都将其去掉即可。
编译成功:
这里是cmake报的错。
至此,第三方库就编译完成了。
回到ORB-SLAM3的主目录,运行:
./build.sh
发现又报错:
这里是cmake报的错。
./build.sh
发现又报错:
这里是cmake报的错。