Intel RealSense D435i:简介、安装与使用(ROS、Python)

Sep 9,2020   7402 words   27 min

Tags: SLAM

实验室最近买了个Intel RealSense D435i相机让我来学习和采集数据,由于之前没有接触过相关内容,所以就简单学习了解了一下。这篇博客主要从使用角度对435i相机进行相关介绍,不涉及理论问题。插一句题外话,虽然Intel官网上RealSense相机看起来都很大的样子,但其实真正拿到手里会发现其实是非常小巧的,一个手就可以握住,如下图所示。

1.简介

Intel RealSense D435i是英特尔公司推出的一款消费级深度相机,它的主要构成如下图所示。 它主要包含一个RGB相机、两个红外相机以及一个红外发射器,此外还有一个IMU单元(这也就是D435i和D435的区别,i就表示imu)。简单来说它的深度成像原理是主动立体红外成像,不是传统意义上理解的双目RGB相机成像,这点需要注意一下。 有了深度图(3D点云)和对应的RGB影像,因此也就很容易获得RGB-D点云了。因此从输出的角度而言,D435i可以看做是一个RGB-D传感器相机。后续可以搭配ORB-SLAM中RGB-D的模式进行使用。当然,也可以只用单目RGB影像,以单目SLAM模式运行,或者单目结合IMU,以Mono-Initial模式运行。唯一不能运行的是双目RGB模式(因为两个红外相机是单通道的)。当然我们可以获取双目的红外影像,以此作为输入,进行双目SLAM,结果也是类似的。因此可以看出,D435i是一个比较“全能”的传感器,从单目、单目+IMU、双目、双目+IMU、RGB-D都可以使用。

对于它的一些技术上的参数,这里也简单列举一下:

  • 深度技术:主动立体IR
  • 图像传感器技术:3μm×3μm像素大小,全局快门
  • 深度视场(H×V):86°×57°(±3°)
  • 深度分辨率&帧率:1280×720,90FPS(最高)
  • RGB传感器技术:卷帘快门
  • RGB传感器分辨率&帧率:1920×1080,30FPS(最高)
  • RGB传感器FOV(H×V):69°×42°(±1°)
  • 最小深度距离(Min-Z):0.105m
  • 最大范围:约10m
  • 尺寸(长宽高):90mm × 25mm × 25mm

从上面的参数中,也可以看出来它的一些特点。比如深度图和RGB影像的大小是不同的,换句话说RGB影像中只有和深度图重叠的那部分才有深度信息,否则是没有的。同时帧率也不相同,如果需要使用RGB-D信息,那么时间同步也可能是个需要处理的问题。第二点是RGB传感器采用的是卷帘快门,因此在一些高速运动的场景下,可能会出现果冻效应。最后由于采用主动红外测距技术,而红外传感器本身发射的信号强度有限,最大10m左右,因此并不能适用于室外很大的场景。

2.安装与配置

在电脑端使用需要配合RealSense专门的驱动和SDK,这里以Ubuntu为例,介绍安装使用过程。

(1)添加Keys
apt-key adv --keyserver keys.gnupg.net --recv-key C8B3A55A6F3EFCDE || apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C8B3A55A6F3EFCDE
(2)添加Repositories

Ubuntu 16.04:

add-apt-repository "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial main" -u

Ubuntu 18.04:

add-apt-repository "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo bionic main" -u
(3)安装Libraries
apt-get install librealsense2-dkms
apt-get install librealsense2-utils
(4)安装Dev和Debug工具
apt-get install librealsense2-dev
apt-get install librealsense2-dbg

需要注意的是librealsense2-dbg比较大,大约110MB左右,又因为是外网,因此可能会下载一段时间。

3.测试与使用

首先,连接D435i到电脑上,然后在终端中输入realsense-viewer启动数据可视化界面,如下图所示。 然后点击左侧的Stereo Module可以开启深度图显示,RGB Module可以显示RGB影像,Motion Module会显示IMU相关数据,如下图所示。 如果可以正常显示上图中的画面,那么就说明RealSense的基本配置就成功了,可以向电脑传输数据了。

4.ROS接口安装

当然,上面是基础配置,买来RealSense不可能只是用它自带的Viewer看看数据,而是拿它来跑SLAM的。RealSense本身也提供了很多Wrapper,方便编程调用数据。 编译ROS接口,那么首先你电脑上得要有ROS环境,如果没有,可以参考这篇博客,这里就不再赘述。

首先,我们需要从GitHub上下载源码,仓库地址是这里

git clone https://github.com/IntelRealSense/realsense-ros.git

其实这个仓库也是比较大的,大约30MB。国内网速可能也需要很久,或者中途断掉。这样的话直接下载zip压缩包也是可以的。 然后将clone下来的源码的文件夹放到Catkin Workspace的src文件夹中去,比如笔者的文件夹是~/root/catkin_ws/src

然后返回Catkin Workspace根目录,使用catkin_make命令进行编译即可。编译的过程中可能会遇到说缺少包的情况,这种情况下根据提示信息安装缺少的包即可,例如笔者安装的时候缺少的是ddynamic_reconfigure库。下载好以后,把代码放到Catkin工作空间的src文件夹下,catkin_make即可。

最后别忘了source ~/.bashrc更新一下。

5.ROS接口使用

其实Realsense的ROS接口可以理解为一个读取数据并发布topic的节点,我们在写自己的ROS程序的时候订阅这个节点发出的topic即可,因此使用起来并没有什么特殊的情况。 输入一下命令即可以启动RealSense的ROS节点。

roslaunch realsense2_camera rs_camera.launch

正常情况下就会出现如下的输出。 出现“RealSense Node Is Up!”就说明节点启动成功了,这个节点会发布以下一些Topic,我们可以利用rostopic list查看现有的Topic,或者利用RViz或者rqt_image_view等工具订阅这些Topic,就可以显示数据了。

/camera/color/camera_info
/camera/color/image_raw
/camera/depth/camera_info
/camera/depth/image_rect_raw
/camera/extrinsics/depth_to_color
/camera/extrinsics/depth_to_infra1
/camera/extrinsics/depth_to_infra2
/camera/infra1/camera_info
/camera/infra1/image_rect_raw
/camera/infra2/camera_info
/camera/infra2/image_rect_raw
/camera/gyro/imu_info
/camera/gyro/sample
/camera/accel/imu_info
/camera/accel/sample

这里我们使用rqt_image_view订阅image_raw话题,显示如下图所示。 可以看到通过这个Topic就订阅了RealSense发布的数据,可以进行后续处理了。

另外需要注意的是,前面提到D435i是支持双目的红外影像输出的,但是它默认是关闭这一选项的,也就是说它不会有双目红外影像的Topic。我们需要在对应的Launch文件中修改相关参数,就可以获得红外影像了。具体如下。

首先,我们打开Realsense-ROS节点的Launch文件夹,如下。 找到rs_camera.launch文件,并打开。 可以看到,这里有非常多的参数可以供我们设置,我们需要找到enable_infraenable_infra1enable_infra2这三个参数,并且都设置为true。这样,我们下次再运行的时候,就会出现双目红外影像的Topic了,如下。 和上面一样,我们还是可以通过RQT来可视化影像,如下。 左影像 右影像

可以看到,相对于常规RGB影像,它多了很多“星星”一样的斑点,这些斑点就是发射出去的红外光,D435i正是通过这种主动红外光进行距离估计,有点类似于结构光。

5.Python接口安装

Python的接口安装其实非常简单,pip一行命令即可。

pip install pyrealsense2

6.Python接口使用

下面内容取自PyRealSense2包的介绍页面。

import pyrealsense2 as rs
pipe = rs.pipeline()
profile = pipe.start()
try:
  for i in range(0, 100):
    frames = pipe.wait_for_frames()
    for f in frames:
      print(f.profile)
finally:
    pipe.stop()

如果能成功运行,输入如下结果: 就说明安装是成功的了。

7.其它注意事项

(1)IMU信息的融合

前面的Topic List里也看到了,D435i可以输出陀螺仪和加速度计的信息,我们可以分开读取,也可以将/camera/gyro/sample/camera/accel/sample两个Topic合并到一起,叫做/camera/imu,这样一个Topic里既有陀螺仪的数据也有加速度计的数据。具体方法也很简单,还是修改Launch文件里的配置选项。在rs_camera.launch文件中找到unite_imu_method这个参数,把它的值可以设置为copy或者linear_interpolation,这样再次启动rs_camera节点启动D435i就可以在Topic列表里看到/camera/imu这个Topic了。

(2)深度图对齐问题

D435i可以输出原始的深度图(/camera/depth/image_rect_raw)以及和单目RGB影像对齐的深度图(/camera/aligned_depth_to_color/image_raw),这两个深度图是不一样的。在采集数据的时候尤其需要注意。比如在采集RGBD数据的时候需要的是对齐的深度,如果不小心采成了原始深度,那基本就是不能用的了。如何输出对齐的深度图,也非常简单,修改Launch文件里的配置选项。在rs_camera.launch文件中找到align_depth这个参数,把它的值可以设置为true即可。(设置这个选项之前,记得打开enable_depth,要不然是没有数据的)

另外需要注意的是,前面也提到过,D435i的深度测量是通过红外发射器实现的,因此如果想要准确的深度数据,千万不能遮挡红外发射器。

(3)红外散斑问题

因为D435i会主动发射红外散斑,因此可以获得相对准确的深度信息。但这些红外散斑会显示在双目红外相机拍摄的图片中,对于较大或者较亮的场景,红外散斑不是很明显。但如果在较小或者较暗的场景,红外散斑会非常明显。这样带来的一个显著影响是会严重干扰视觉SLAM的特征点提取。由于散斑很亮、很明显,而且位置相对固定,很多时候会被认为是特征点,这样在帧间匹配的时候会让SLAM误认为机器人没有运动。导致采集的数据不能用。如下图所示。 因此如果想使用红外相机拍摄的影像做视觉SLAM,在较暗或者较小场景下,一定要记得关闭红外发射器。当然,如果关闭了红外发射器,深度信息就不太准了。采集的数据就无法用于RGBD模式。所以对于较暗或者较小场景,RGBD数据和红外双目数据得要分开采集,否则就会出现上面提到的情况。红外散斑严重干扰视觉匹配。

(4)红外发射器的开关

上面提到关闭红外发射器,如何开关也十分简单。在启动rs_camera节点运行D435i以后,打开一个新的终端,输入rosrun rqt_reconfigure rqt_reconfigure启动Reconfigure节点,如下。 然后选择左边的stereo_module,然后找到emitter_enabled选项,选择”关闭”即可。开关的效果如下图所示。 当然,如果细心的话会发现,这里面除了红外发射器,还有非常多的选项可以设置,比如曝光度、增益等等,可以按需调整。

(5)D435i的不同分辨率

D435i的RGB、深度以及双目等影像都可以支持不同的分辨率和帧率。但是需要注意的一点是,这并不意味着可以任意指定分辨率和帧率,而是在几个支持的模式下选择。那么我们怎么知道D435i到底支持哪些分辨率和帧率呢?方法也很简单,我们可以直接在终端中输入realsense-viewer打开Realsense Viewer,在对应模块的设置里就可以查看了,如下图所示。 这里为了方便,就简单把支持的分辨率和帧率总结一下:

  • 单目相机(RGB影像):分辨率:320×180,320×240,424×240,640×360,640×480,848×480,960×540,1280×720,1920×1080;帧率:6,15,30,60
  • 双目红外相机(灰度影像&深度影像):分辨率:256×144,424×240,480×270,640×360,640×400,640×480,848×100,848×480,1280×720,1280×800;帧率:6,15,25,30,60,90,100,300
  • IMU(加速度计&陀螺仪):加速度计帧率:63,250;陀螺仪帧率:200,400

需要注意的是,上面的分辨率和帧率也并不是任意组合的,比如红外的640×480分辨率最高支持到90帧,如果设置成100或者300帧同样是会报错的。所以一个稳妥的方法就是,如果不清楚分辨率和帧率的组合,打开Realsense Viewer,先设置一下,如果可以成功运行,就说明是支持的,否则就换一个配置。

另外需要说明的是,D435i支持的最低帧率是6Hz,如果要求更低帧率,就需要后续进一步处理了。关于如何处理,可以参考我写的另一篇有关于ROS Bag处理的博客。另外,虽然说最低6Hz,但实际测试发现,如果降低到6Hz,RGB相机很容易出现果冻效应,因此如果不是特殊需求,并不建议把帧率设的太低。可以使用默认帧率,后续处理成低帧率。

(6)D435i相机默认参数查看

D435i相机在出厂时有一个默认的内参。查看方式有非常简单,在运行D435i以后,我们可以在Topic列表中看到很多叫camera_info的Topic,这些Topic就是对应的相机内参等参数。如下,查看的是RGB相机的参数。 所以如果有什么不清楚的,直接查看对应Topic下面的camera_info即可。

(7)数据采集的常规流程

这里简单给出一些D435i数据采集的建议。首先,如果要采RGBD数据,那么一定要记得录对齐后的深度,而非原始输出深度。第二,如果采集场景是较暗或者较小的场景,那么可能会有很多红外斑点出现在双目红外影像中。如果想用双目影像做视觉SLAM,那么一定记得关闭红外发射器。

下面以一个利用D435i进行单目RGB、红外双目、IMU数据采集的过程为例,介绍一般流程与步骤。

首先明确要采集的数据类型、影像的大小、帧率、深度是否对齐等信息,这些都在rs_camera.launch文件的对应参数里设置。

然后,在终端中输入roslaunch realsense2_camera rs_camera.launch启动D435i。启动以后如果需要关闭红外发射器,按照上面提到的第三点进行操作即可。

然后,利用rqt_image_view进行可视化。可以打开多个rqt_image_view节点,分别查看RGB影像、左右红外影像等。

最后,打开终端,输入rosbag record /camera/color/image_raw /camera/infra1/image_rect_raw /camera/infra2/image_rect_raw /camera/imu,这样就开始录制了。录制完成后,按Ctrl+C保存退出即可。

以上就是本篇博客的主要内容了。之后随着学习和了解的深入,会进一步介绍RealSense D435i其它的内容,如标定、跑实际的SLAM、采集数据等等。

8.参考资料

  • [1]https://www.intelrealsense.com/zh-hans
  • [2]https://www.intelrealsense.com/zh-hans/depth-camera-d435i
  • [3]https://www.pianshen.com/article/2177388157
  • [4]https://github.com/IntelRealSense/realsense-ros
  • [5]https://blog.csdn.net/sinat_36502563/article/details/89174282
  • [6]https://pypi.org/project/pyrealsense2/

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

返回顶部