[学习笔记]RTAB-Map学习笔记

最近开始实习,做三维稠密建图相关的工作,同组的哥们来的比我早两周,已经在尝试用RTAB-Map稠密建图了,仿真环境下的双目数据集,1280*720的分辨率。具体我做什么还没有定,先跑一遍然后开始看代码好了。

1.安装

安装链接,最好先装好ROS,然后OpenCV,G2O,GTSAM,这几个库最好都用源码装,其中G2O的版本最好用17年那个版本,在clone的时候这样写:

$ git clone --branch 20170730_git https://github.com/RainerKuemmerle/g2o.git

题外话,如果你git clone的时候速度比较慢,把下面两行加到/etc/hosts文件里

192.30.253.112 github.com
151.101.44.249 github.global.ssl.fastly.net

然后执行

$ sudo /etc/init.d/networking restart

在编译这几个库还有RTAB-Map源码的时候,注意一下CMake ..之后输出的结果,如果提示缺失哪个库,记得安装,尤其是检查G2O的include还有bin有没有被发现,编译安装之后执行rtabmap就可以运行程序了。还有在安装好之后执行rtabmap运行程序的时候有时候会提醒

rtabmap: error while loading shared libraries: librtabmap_gui.so.0.19: cannot open shared object file: No such file or directory

执行一下

$ sudo ldconfig

就OK了。不得不佩服IntroLab的人,界面写的很好,代码逻辑也很强。

2.数据测试

输入数据是双目的测试集,3746张图像,TIFF格式。主要流程按照官方的流程,公司电脑跑起来一卡一卡的,不知道是设置不对还是配置的问题,晚上回去用我的电脑跑一跑试试,结果看起来还行。

3.代码阅读

貌似RTAB-Map有点冷门,网上详细的代码解读比较少,一时间竟不知道从哪开始入手,还好有个博客略写了几个cpp的介绍,才大概知道从何处入手。

rtabmap/corelib/src/util3d_features.cpp

这个cpp主要实现把特征点投影到三维空间中,有单目、双目、深度以及视差这几种形式的输入。

函数generateKeypoints3DStereo利用左右两张图的对应keypoints的视差计算对应的三维点,然后结合当前帧所处的位姿,计算keypoints对应在世界坐标系下的位置。一个类似的函数generateKeypoints3DDisparity是已知双目的disparity然后直接计算关键点三维坐标。

函数generateKeypoints3DDepth把RGB-D图像里的keypoints投影到三维空间中,直接利用深度信息、相机内参及当前帧的位姿,计算keypoints对应在世界坐标系下的位置。

函数generateWords3DMono利用前后帧的words生成对应三维点。首先利用自己写的findPairs函数进行对应words点对的搜索,如果点对的数量大于8的话,那么可以用八点法计算基本矩阵F,那个叫status的vector没看懂什么作用,反正按顺序检查所有的点对,然后排除了status为0的时候的words。然后用F对前后两帧的words进行修正,再由E计算两帧之间的运动,不过具有尺度不确定性,因为函数的输入参数有相机的运动,因此并没有用计算出来的矩阵P。然后就是三角化计算,用的是OpenCV的triangulatePoints函数,归一化之后得到words在相机坐标系下的坐标,然后把深度值大于0的words存下来。最后计算尺度,太长没看太懂,改天继续看。

还有一个函数aggregate是把words的ID和keypoints整合到一个multimap里。

 

你可能感兴趣的:([学习笔记]RTAB-Map学习笔记)