Realsense D435i实时跑ORB-SLAM3

Feb 25,2021   2491 words   9 min

Tags: SLAM

0.背景

在之前的这篇博客中,我们介绍了ORB-SLAM3的ROS节点的编译,并在此基础上跑了EuRoC的数据进行测试。这篇博客要做的其实也很简单,就是连接Realsense D435i,实时跑ORB-SLAM3,做到real-time & real-run。其实有了前面的基础,这个目标是非常容易实现的,主要涉及一些Topic的配置。

1.ROS节点编译

ROS节点编译其实在上面提到的那篇博客里已经介绍了。如果要说还有什么需要注意的就是Topic的节点名称,比如以双目的节点为例,原版代码中订阅的是/camera/left/image_raw/camera/right/image_raw这两个Topic。但是我们的D435i发布的两个红外相机影像并不叫这个名字,而是/camera/infra1/image_rect_raw/camera/infra2/image_rect_raw。所以我们要么就利用ROS中转一下,换个名字,做法可以参考这里,或者就在代码里把Topic名称改成我们自己的。这里我们使用后一种方法。

以D435i为例,ORB-SLAM3订阅的原版Topic和D435i发布的Topic对应关系如下。

  • Mono:/camera/image_raw -> /camera/color/image_raw(RGB相机)
  • Mono-Inertial:/imu、/camera/image_raw -> /camera/imu、/camera/color/image_raw
  • RGBD:/camera/rgb/image_raw、/camera/depth_registered/image_raw -> /camera/color/image_raw、/camera/aligned_depth_to_color/image_raw
  • Stereo:/camera/left/image_raw、/camera/right/image_raw -> /camera/infra1/image_rect_raw、/camera/infra2/image_rect_raw
  • Stereo-Inertial:/camera/left/image_raw、/camera/right/image_raw、/imu -> /camera/infra1/image_rect_raw、/camera/infra2/image_rect_raw、/camera/imu

修改完成后就可以在终端输入如下内容编译了。

mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make

当然编译的时候可能会遇到各种各样奇怪的错误,需要耐心找原因。如果真的解决不了,那也不要太难为自己,有可能是环境的问题,换台电脑可能就轻轻松松编译过了。一个比较常见的错误如下图所示。 提示说在什么路径下找不到包什么的,这个错误非常简单。把当前目录添加到ROS_PACKAGE_PATH环境变量中就好了。在终端中输入gedit ~/.bashrc,然后添加如下的内容,最后source ~/.bashrc一下就可以了。 我这里编译好的可执行文件如下图所示。

2.D435i的配置

在运行之前,我们还需要对D435i进行一些配置和标定。D435i的配置其实在这篇博客里也已经介绍的差不多了,主要就是涉及到launch文件里一些参数的设置。比如IMU信息的融合、深度图对齐、红外散点的开关等问题,不是很难的东西。

另一个需要注意的是就是标定,ORB-SLAM3运行时需要一些相机的内参等参数文件的,这些也需要提前准备或者标定好。仿照着示例里面其它的参数文件,将对应部分替换成我们自己的内容就可以使用了。感兴趣的话可以参考这篇博客这篇博客。当然,如果你只是为了跑起来,不在乎精度,用ORB-SLAM提供的那些配置文件也可以跑起来。

3.实际测试

在ROS节点和D435i都配置好以后,就可以实际测试了。首先将D435i连接到电脑上,然后roslaunch realsense2_camera rs_camera.launch启动D435i的ROS节点。

然后,再依次运行不同配置的ORB-SLAM节点即可,虽然不通节点配置不同,但启动参数基本都是相同的,都是:Exec_file path_to_vocabulary path_to_settings的形式。

(1) 单目
./Mono_D435i ../../../Vocabulary/ORBvoc.txt ../../Monocular/TUM1.yaml

效果如下。

(2) 单目+IMU
./Mono_Inertial_D435i ../../../Vocabulary/ORBvoc.txt ../../Monocular-Inertial/EuRoC.yaml

效果如下。

(3) 双目
./Stereo_D435i ../../../Vocabulary/ORBvoc.txt ../../Stereo/EuRoC.yaml false

效果如下。 双目相比于其它配置有个是否校正的选项,由于我们使用的参数不是D435i的,所以就不拿他的参数校正我们的相机了,不然效果会很糟糕(可以试试)。

(4) 双目+IMU
./Stereo_Inertial_D435i ../../../Vocabulary/ORBvoc.txt ../../Stereo-Inertial/EuRoC.yaml false

效果如下。 可以看到,效果是非常差的。因为我们偷懒了,没有修改配置参数。

(5) RGBD
./RGBD_D435i ../../../Vocabulary/ORBvoc.txt ../../RGB-D/TUM1.yaml

效果如下。

总体而言,不谈精度,ORB-SLAM3所有配置的ROS节点都是可以使用D435i实时跑的。至此,本篇博客的主要内容就结束了。

本文作者原创,未经许可不得转载,谢谢配合

返回顶部