ROS中的图像数据

无论是USB摄像头还是RGBD摄像头,发布的图像数据格式多种多样,在处理这些数据之前,我们首先需要了解这些数据的格式。

二维图像数据

连接USB摄像头到PC端的USB接口,通过以下命令启动摄像头:

roslaunch usb_cam usb_cam-test.launch

启动成功后,使用以下命令查看当前系统中的图像话题信息

rostopic info /usb_cam/image_raw

ROS中的图像数据_第1张图片
可以使用以下命令查看该图像消息的详细定义

rosmsg show sensor_msgs/Image

运行结果
ROS中的图像数据_第2张图片

该类型图像数据的具体内容如下。

1)header:消息头,包含图像的序号、时间戳和绑定坐标系。

2)height:图像的纵向分辨率,即图像包含多少行的像素点,这里使用的摄像头为720。

3)width:图像的横向分辨率,即图像包含多少列的像素点,这里使用的摄像头为1280。

4)encoding:图像的编码格式,包含RGB、YUV等常用格式,不涉及图像压缩编码。

5)is_bigendian:图像数据的大小端存储模式。

6)step:一行图像数据的字节数量,作为数据的步长参数,这里使用的摄像头为 width×3=1280×3=3840字节。

7)data:存储图像数据的数组,大小为step×height字节,根据该公式可以算出这里使用的摄像头产生一帧图像的数据大小是:3840×720=2764800字节,即2.7648MB。

一帧720×1280分辨率的图像数据量就是2.76MB,如果按照30帧/秒的帧率计算,那么一秒钟摄像头产生的数据量就高达82.944MB!这个数据量在实际应用中是接受不了的,尤其是在远程传输图像的场景中,图像占用的带宽过大,会对无线网络造成很大压力。实际应用中,图像
在传输前往往会进行压缩处理,ROS也设计了压缩图像的消息类型——sensor_msgs/CompressedImage,该消息类型的定义如下图所示:

ROS中的图像数据_第3张图片

这个消息类型相比原始图像的定义要简洁不少,除了消息头外,只包含图像的压缩编码格式“format”和存储图像数据的“data”数组。图像压缩编码格式包含JPEG、PNG、BMP等,每种编码格式对数据的结构已经进行了详细定义,所以在消息类型的定义中省去了很多不必要的信息。

三维点云数据

在 Kinect数据显示中,rviz订阅camera/depth_registered/points话题后,主界面即可显示三维点云数据。

那么这种三维点云数据的消息类型是什么呢?可以使用如下命令查看

rostopic info /camera/depth_registered/points

ROS中的图像数据_第4张图片
该消息类型对应于rviz中Add可视化插件时所选择的插件类型,使用以下命令查看该消息类型的具体结构

rosmsg show sensor_msgs/PointCloud2

ROS中的图像数据_第5张图片

三维点云的消息定义如下:

1)height:点云图像的纵向分辨率,即图像包含多少行像素点。

2)width:点云图像的横向分辨率,即图像包含多少列像素点。

3)fields:每个点的数据类型。

4)is_bigendian:数据的大小端存储模式。

5)point_step:单点的数据字节步长。

6)row_step:一列数据的字节步长。

7)data:点云数据的存储数组,总字节大小为row_step×height。

8)is_dense:是否有无效点。

点云数据中每个像素点的三维坐标都是浮点数,而且包含图像数据,所以单帧数据量也很大。如果使用分布式网络传输,在带宽有限的前提下,需要考虑能否满足数据的传输要求,或者针对数据进行压缩。

你可能感兴趣的:(ROS2,AGV,人工智能,机器人,人工智能)