运行环境:Ubuntu 20.04 虚拟机,采用 ROS1 Noetic 版本,使用小鱼一键安装工具完成部署。
一、主要参考
除了官方原始的RTAB工程 (务必注意切换到noetic分支):
introlab/rtabmap: RTAB-Map library and standalone application
以及打补丁的方法:
还重点参考了:
【RTAB-Map+VINS-Fusion+euroc】(Ubuntu 20.04)三维稠密重建-实践笔记 - 技术栈
对于第二个博客,建议大家按照他说的走一遍,走不下去了也没事,至少环境基本配置好了,尤其是:
sudo apt-get install ros-noetic-rtabmap ros-noetic-rtabmap-ros
sudo apt-get remove ros-noetic-rtabmap ros-noetic-rtabmap-ros
大致的思路是没问题的,主要是RTA****B-MAP已经更新了一些内容,导致文中的内容已经不适用。
我是在前面没有成功的基础上基础操作的,因此如果直接按我的这个往下走可能依赖出问题,两个走下来其实你也会对RTAB-map的安装有更深的理解,自己部署试试别的也不成问题了。
VINS+opencv4的安装,参考(自己想办法解锁,我只摘录了VINS-FUSIONG)
Ubuntu20.04下运行VINS系列:VINS-Mono、VINS-Fusion和GVINS
二、主要过程
1、新建ros空间并初始化
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
2、配置VINS-fusion依赖
主要是安装 Ceres 2.1.0 , Eigen3.4.0 和opencv 4.*。
前两个请自查安装方法。
后者与VINS的一些功能如GPU加速需要指定版本,如果只是为了编译测试一下,可以用最简单的办法,安装个python(目前我用的python 3.8.*),然后用pip安装opencv指定版本,卸载也方便,如
pip install opencv-python==4.5.*(我没有指定版本,直接装的最新版4.13也可以编译通过)
3、安装VINS-fusion
(1)下载源码并打补丁
cd ~/catkin_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git
cd VINS-Fusion
git fetch origin pull/136/head:noetic_fix
git checkout noetic_fix
wget https://gist.githubusercontent.com/matlabbe/795ab37067367dca58bbadd8201d986c/raw/193453344b0e35d3b0156a763699d7976474d928/vins-fusion_pull136.patch
git apply vins-fusion_pull136.patch
(2)将所有文件夹下的CMakeLists.txt文件全部修改为C++14编译
#set(CMAKE_CXX_FLAGS "-std=c++11")
set(CMAKE_CXX_FLAGS "-std=c++14")
(3)并在各个CMakeLists.txt里面find_package的时候明确指定OpenCV的版本:
#find_package(OpenCV REQUIRED)
find_package(OpenCV 4 REQUIRED)
(4)在camera_model包中的头文件Chessboard.h中添加
#include <opencv2/imgproc/types_c.h>
#include <opencv2/calib3d/calib3d_c.h>
(5)在头文件CameraCalibration.h、pose_graph.h、feature_tracker.h、BRIEF.h中添加
#include <opencv2/imgproc/types_c.h>
#include <opencv2/imgproc/imgproc_c.h>
(6)在KITTIGPSTest.cpp和KITTIOdomTest.cpp中将报错的CV_LOAD_IMAGE_GRAYSCALE修改为cv::IMREAD_GRAYSCALE(我目前这个版本似乎已经改过了)
(7) 编译运行
cd ~/catkin_ws
catkin_make
出现了warning可以不用理会。
提示:如果你不小心其他时候安装了conan环境,这一步很可能报跟conan有关的错误,需要去~/.bashrc文件中把conan相关的环境注释掉在编译。
4、安装rtab-map
务必注意,要 noetic对应的分支,默认的main不是。
自己找个目录,比如我直接根目录
cd
git clone -b 0.21.10-noetic https://github.com/introlab/rtabmap.git rtabmap_vins
cd rtabmap_vins/build
cmake -DCMAKE_INSTALL_PREFIX=~/catkin_ws/devel -DWITH_VINS=ON ..
make -j8
make install
其中, -DCMAKE_INSTALL_PREFIX=~/catkin_ws/devel 就是你编译VINS那个地方,只有给对了,才会出现:

没有这个YES,编译通过也没有意义。可能会有一些warning,前面参考的安装链接里面遇到的问题我没有遇到。
会发现直接安装到VINS所在的ros工程目录里面了,注意版本是0.21,才是noetic。

5、安装rtabmap-ros
这次安装到VINS的工程目录,放一起,注意,目前是ros2是主分支,需要给定noetic分支。
cd ~/catkin_ws/src
git clone -b noetic-devel https://github.com/introlab/rtabmap_ros.git rtabmap_ros
cd ~/catkin_ws
source ./devel/setup.bash
有可能遇到catkin_ws/devel目录没有写入权限的问题(如果你前面安装rtmap的时候sudo make install了),直接777就好,
sudo chmod -R 777 ~/catkin_ws/devel(你的VINS工程目录)
三、运行euroc数据测试
euroc数据集参看我前面的博文有一个百度云共享。
1、 测试rtabmap
终端1:
cd ~/catkin_ws
source ./devel/setup.bash
roslaunch rtabmap_examples euroc_datasets.launch MH_seq:=true
终端2:
cd到你的数据bag目录
rosbag play --clock MH_01_easy.bag
2、测试rtabmap+vins
使用euroc_stereo_config.yaml和euroc_stereo_imu_config.yaml进行VO和VIO测试。
分别打开两个终端执行命令:
终端1:
cd ~/catkin_ws
source ./devel/setup.bash
roslaunch rtabmap_examples euroc_datasets.launch args:="Odom/Strategy 9 OdomVINS/ConfigPath ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml" MH_seq:=true raw_images_for_odom:=true
终端2:
cd到你的数据bag目录
rosbag play --clock MH_01_easy.bag
VO的结果

三、遗留问题
问题:运行VIO同样遇到了参考文中的Odom: quality=0, std dev=0.010000m|0.010000rad,好吧,那么只好按照参考文中的(我怀疑原文作者其实也没有解决,因为他这个branch好像不是解决这个问题的,原文作者也一样没有给出VIO的状态):
cd ~/catkin_ws/src/rtabmap_ros
git checkout 3eb0b47a55bd56ea6282e5fff157880dcdca753a
cd ~/catkin_ws
catkin_make
经核对,跳转到链接:
https://github.com/introlab/rtabmap_ros/commit/3eb0b47a55bd56ea6282e5fff157880dcdca753a
可知对应rtmap-ros的0.21.10-noetic和0.21.09-noetic分支,我遇到这个问题的时候分支没选对,修正之后似乎还是不行,VIO完全跑飞了,VO还可以,跟参考文章差不多,但是Odom: quality=0还是存在,没找到是什么原因。
再次对简单的数据集:V1_01_easy.bag进行VIO测试如下,似乎还行,没有跑飞。

下一步对ROS2版本+VINS再行测试是否还会跑飞。
这样看下来,可能是这个数据集已经超过了这样结合的算法的能力,也可能VINS安安静静的自己跑+GPU加速才是最好的答案。

