ROS 2中相机驱动程序v4l2_camera软件包使用介绍

【编者注】本文由深圳季连科技有限公司kenny wang创作,知识产权归深圳季连科技有限公司所有。如需转载,敬请注明原文出处。

在ROS 2中,相机的驱动程序软件包是v4l2_camera,其中V4L2是Video4Linux2的简写。

软件包的安装

可以直接运行以下命令安装该软件包的二进制包:

sudo apt-get install ros-<ros_release>-v4l2-camera

将上述命令中的<ros_release>替换成您机器上安装的ROS 2发行版,例如foxy、galactic或者humble即可。

也可以从源代码编译安装该软件包,执行以下命令:

$ git clone --branch foxy https://gitlab.com/boldhearts/ros2_v4l2_camera.git src/v4l2_camera
$ colcon build

大多数用户也会希望使用下面的依赖包设置压缩视频传输。

软件包的使用

可以直接运行以下命令使用默认参数发布相机图像数据:

    ros2 run v4l2_camera v4l2_camera_node

在另一个终端窗口中运行以下命令来查看发布的相机图像:

ros2 run rqt_image_view rqt_image_view

运行v4l2_camera_node节点会发布视频图像话题,其默认话题名称为image_raw。但如果其它程序订阅的话题名称为其它名称(如image_raw/upperright_cam),而不是默认的话题名称image_raw,则需要在运行v4l2_camera_node节点时将话题名称重映射为所需的话题名称,如下所示:

ros2 run v4l2_camera v4l2_camera_node --ros-args --remap image_raw:=image_raw/upperright_cam

软件包的依赖项

软件包image_transport可以设置图像的压缩传输,因此,需要在您的工作空间中安装image_common存储库中image_transport软件包的ROS 2分支。命令如下:

git clone --branch ros2 https://github.com/ros-perception/image_common.git src/image_common

注意:默认情况下软件包image_transport仅支持原始图像的传输,如果要对相机图像进行压缩传输,则需要额外的插件,具体方法详见后面的“5. 图像压缩传输”。

软件包的v4l2_camera_node节点

该软件包的节点v4l2_camera_node以标准的V4L2设备为接口,并以sensor_msgs/Image消息接口类型对相机图像数据进行发布。

该节点发布的话题名称为/image_raw;消息接口类型为sensor_msgs/Image;发布的数据内容为相机图像数据。

该节点具有以下可选参数:

(1)video_device——字符串类型参数,用于指定要发布其图像数据的相机设备名称,默认值为"/dev/video0",对应计算机上的第一个摄像头。如果机器上连接有多个摄像头,需要指定具体打开哪个摄像头(/dev/video0、/dev/video1等),则应使用此参数,命令如下:

ros2 run v4l2_camera v4l2_camera_node --ros-args -p video_device:=/dev/video1

(2)pixel_format——字符串类型参数,用于指定从相机请求的图像像素格式,必须是V4L2和您的相机支持的有效四字符“FOURCC”代码,此节点在启动时会输出您的相机支持的可用像素格式,目前支持" YUYV "和" GREY "两种格式,默认值为" YUYV "。

(3)output_encoding——字符串类型参数,用于指定输出图像的编码,当前支持"rgb8"、" yuv422"、"mono8"编码,默认值为"rgb8"。

(4)image_size——整型数组类型参数,用于指定图像的宽、高(像素数),默认值为[640, 480]。

(5)相机控制参数——诸如亮度、对比度、白平衡等会被自动作为参数提供用于相机控制。该驱动程序节点会枚举所有的相机控制,并为每个控制创建一个具有相应值类型的参数。参数名称来源于相机驱动程序报告的控制名称,并会变成小写,去掉逗号,空格替换为下划线。因此,Brightness会变成brightness,而White Balance, Automatic会变成white_balance_automatic。

5. 压缩图像传输

默认情况下软件包image_transport仅支持原始图像传输,需要插件来启用压缩图像传输。在image_transport_plugins存储库中有这样的标准插件可用。这些都依赖于vision_opencv存储库提供的OpenCV工具。可以运行下面的命令以将这些存储库克隆到您的工作空间中:

cd path/to/workspace
git clone https://github.com/ros-perception/vision_opencv.git --branch ros2 src/vision_opencv
git clone https://github.com/ros-perception/image_transport_plugins.git --branch ros2 src/image_transport_plugins

在Ubuntu中,需要运行以下命令安装相关软件包后才能编译这些插件:

sudo apt install libtheora-dev libogg-dev libboost-python-dev

如果编译好了这些压缩插件并安装在当前工作空间中,它们将会被相机驱动程序自动使用,并且额外的/image_raw/compressed话题也将可用。

Rviz2或showimage还没有使用image_transport。因此,为了能够查看压缩图像话题,需要重新发布未压缩图像话题。image_transport软件包中含有republish节点,可以用来执行话题重新发布操作:

ros2 run image_transport republish compressed --ros-args --remap in/compressed:=image_raw/compressed --ros-args --remap out:=image_raw/uncompressed

上面这条命令中republish节点的参数有:

(1)compressed——用于指定传输的输入,可以是压缩图像或者原始图像,在本例中为'compressed'即压缩图像,即对压缩图像进行重新发布。也可以将其替换为'raw',这样就会重新发布原始图像;

(2)in/compressed:=image_raw/compressed——默认情况下,republish节点使用话题in和out,例如如果传输输入是压缩图像即'compressed',则要使用in/compressed话题。可以将此话题重映射到要使用的有意义的实际话题名称image_raw/compressed。

(3)out:=image_raw/uncompressed——将传输输出话题out重映射到要使用的有意义的实际话题名称image_raw/uncompressed。

在不使用transport进行压缩传输的情况下,只有订阅image_raw话题才能浏览视频。如果使用transport进行压缩传输,则可以订阅image_raw话题或者image_raw/uncompressed话题以浏览视频。

英语原文网址:gitlab.com/boldhearts/r