本文将以 Ubuntu 20.04 和 ROS2 foxy 环境为例,详细介绍如何在 ROS2 中使用奥比中光 Orbbec Astra Pro 深度相机。在这一篇文章中,你会学到如何创建工作空间,使用 usb_cam 功能包,编译安装使用 ros_astra_camera 等。

1. 引言

前面的文章《ROS2 机器人操作系统入门和安装以及如何使用 .NET 进行开发》中提到,组成机器人的关键部分主要是电机、传感器、软件和电池。机器人的智能感知主要通过视觉传感器,视觉传感器对于机器人来说,就像人类之于眼睛的关系,可说非常重要。那么如何通过 ROS 获取远端机器人的摄像机传感器的图像信息呢?

1.1 视觉传感器

视觉传感器是机器人的一种常用传感器,用于检测机器人周围的环境信息,并将其转化为机器人可以理解的信息。机器人视觉传感器可以分为两类:光学传感器和摄像机传感器。

光学传感器是通过检测周围环境的光线强度变化来获取信息的。常见的光学传感器有激光雷达传感器、光敏电阻传感器等。

摄像机传感器是通过摄像头来获取信息的。摄像机传感器可以分为两类:彩色摄像机传感器和黑白摄像机传感器。彩色摄像机传感器可以检测周围环境的颜色信息,而黑白摄像机传感器只能检测周围环境的亮度信息。

深度相机是一种特殊的视觉传感器,它可以在图像中测量每个像素点的深度信息。通常,深度相机使用激光或其他方法来测量物体到相机的距离,并在图像中标记出来。这样,机器人就可以通过深度相机获取到周围环境中物体的三维信息。

机器人视觉传感器在机器人导航、物品检测、物品抓取等方面有着广泛的应用。例如,机器人可以通过视觉传感器来识别路径,然后按照规划的路径导航;机器人也可以通过视觉传感器来检测周围环境中的物品,然后通过机械臂或其他装置进行物品抓取。

1.2 常见的视觉传感器

USB 摄像头是一种常见的视觉传感器,通过USB接口连接到计算机或嵌入式设备,实现图像采集和传输。这类摄像头具有易于安装、兼容性好、成本相对较低等优点,广泛应用于计算机视觉、机器人导航、人脸识别等领域。

在 ROS 中使用这一类设备非常简单,我们可以直接通过 usb_cam 功能包来驱动它,获取 USB 摄像头的二维图像数据,这一系列的文章,我们也从这类设备开始。

对于此功能包的测试我们能可以直接使用 Orbbec Astra Pro 深度相机,因为其和普通的 USB 摄像头一样,遵循 UVC(USB Video Class)协议,可以直接免驱使用。在 Ubuntu 20.04 中我们可以通过系统自动的应用“茄子”直接打开看到摄像头画面。

在 ROS 中使用

普通摄像头

安装

对于 usb_cam 功能包的安装,我们可以使用直接使用 apt 来安装:

sudo apt install ros-foxy-usb-cam

也可以使用源码进行编译安装,但是不建议尝试。

测试

安装完成后,使用下面的命令启动节点:

ros2 run usb_cam usb_cam_node_exe

然后即可在 rqt 的插件 Image View 中查看或者通过 rviz2 查看 /image_raw 话题发布的图像信息。

另外,根据控制台我们可以看到程序启动会加载用户目录的配置文件 ~/.ros/camera_info/default_cam.yaml ,若不存在,则会使用 /opt/ros/foxy/share/usb_cam/config/params.yaml 这个配置文件,默认使用摄像头设备为 /dev/video0。关于详细的配置和参数设置可以前往 ROS wiki usb_cam 查询。

RGB-D 摄像头

奥比中光 Orbbec Astra Pro 是一款 RGB-D 摄像头,在许多场景下,我们可以利用它获取更丰富的环境信息。

操作前准备

在操作前我们需要先创建好自己的 ROS 工作空间,如果你已经拥有了自己的工作空间,可以跳过这一步骤。

创建一个新的文件夹来作为工作空间的根目录,名字可以自定义。在该文件夹中创建一个名为 “src” 的子文件夹,用于存放工作空间中的软件包。例如:

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

然后需要前往奥比中光官网下载最新的ROS2 SDK 驱动包。虽然有个 orbbec/ros_astra_camera 的github仓库的ros2-development分支,但内容不是最新的,需要去官网下载。

下载后上传到 ~/ros2_ws/src ,执行解压缩:

tar -zxvf OpenNI_SDK_ROS2_v1.0.2_20220809_b32e47_linux.tar.gz -C src
编译依赖安装

编译前,需要安装好一些编译所需要的依赖:

sudo apt install libgflags-dev nlohmann-json3-dev ros-foxy-image-transport ros-foxy-image-publisher

安装 glog,这个是谷歌的日志记录模块。

cd ~/ros2_ws
wget -c https://github.com/google/glog/archive/refs/tags/v0.6.0.tar.gz  -O glog-0.6.0.tar.gz
tar -xzvf glog-0.6.0.tar.gz
cd glog-0.6.0
mkdir build && cd build
cmake .. && make -j6
sudo make install
sudo ldconfig
cd ~/ros2_ws
rm glog-0.6.0 -rf
rm glog-0.6.0.tar.gz

安装 magic_enum

wget -c https://github.com/Neargye/magic_enum/archive/refs/tags/v0.8.2.tar.gz -O  magic_enum-0.8.2.tar.gz
tar -xzvf magic_enum-0.8.2.tar.gz
cd magic_enum-0.8.2
mkdir build && cd build
cmake .. && make -j6
sudo make install
sudo ldconfig
cd ~/ros2_ws
rm magic_enum-0.8.2 -rf
rm magic_enum-0.8.2.tar.gz

安装 libuvc

git clone https://github.com/libuvc/libuvc.git
cd libuvc
mkdir build && cd build
cmake .. && make -j6
sudo make install
sudo ldconfig
cd ~/ros2_ws
rm libuvc -rf
编译安装 ros_astra_camera

在编译前先按照说明处理 libusb 的一些规则。执行 install.sh

cd ~/ros2_ws/src/ros2_astra_camera/astra_camera/scripts
sudo bash install.sh
sudo udevadm control --reload-rules && sudo udevadm trigger

然后转到工作目录,开始编译:

cd ~/ros2_ws
colcon build --event-handlers  console_direct+  --cmake-args  -DCMAKE_BUILD_TYPE=Release

整体编译速度还是非常快的,等待编译完成即可:

注意:如果你在看本教程之前尝试过编译 astra_camera 并出现问题,则需要先清理该工作目录的 buildinstall

测试

首先使环境生效,启动相机节点:

source ~/ros2_ws/install/setup.bash
ros2 launch astra_camera astra_mini.launch.py

然后另开一个控制台,打开 rviz2 添加一个 Image 控件选择 /camera/depth/image_raw 话题或者直接通过该话题创建 Image 控件。需要注意的是:下图的三个 Policy 设置均需选择为 System Default 否则不会显示画面。