主要内容

使用专门的ROS消息

一些常用的ROS消息以一种格式存储数据,这种格式需要进行一些转换,然后才能将其用于进一步处理。MATLAB®可以帮助您格式化这些专门的ROS消息,以方便使用。在本例中,您可以探索如何处理激光扫描、未压缩和压缩图像以及点云的消息类型。

先决条件:使用基本的ROS消息

加载示例消息

加载一些示例消息。这些信息由各种机器人传感器收集的数据填充。

负载(“specialROSMessageData.mat”

激光扫描信息

激光扫描仪是机器人技术中常用的传感器。您可以通过创建适当类型的空消息来查看激光扫描消息的标准ROS格式。

使用rosmessage创建消息。

emptyscan = rosmessage (“sensor_msgs /提升”“DataFormat”“结构”
emptyscan =结构体字段:MessageType: 'sensor_msgs/LaserScan' Header: [1x1 struct] AngleMin: 0 AngleMax: 0 AngleIncrement: 0 TimeIncrement: 0 ScanTime: 0 RangeMin: 0 RangeMax: 0 Ranges: [0x1 single]强度:[0x1 single]

因为你创建了一条空消息emptyscan不包含任何有意义的数据。为了方便起见,exampleHelperROSLoadMessages函数加载激光扫描消息,该消息已完全填充并存储在扫描变量。

检查扫描变量。消息中的主要数据在范围财产。中的数据范围是以小角度增量记录的障碍距离向量。

扫描
扫描=结构体字段:MessageType: 'sensor_msgs/LaserScan' Header: [1x1 struct] AngleMin: -0.5467 AngleMax: 0.5467 AngleIncrement: 0.0017 TimeIncrement: 0 ScanTime: 0.0330 RangeMin: 0.4500 RangeMax: 10 Ranges: [640x1 single]强度:[0x1 single]

你可以用笛卡尔坐标得到测量点rosReadCartesian函数。

xy = rosReadCartesian(扫描);

这个填充xy列出(x, y)根据所有有效距离读数计算的坐标。控件可视化扫描消息rosPlot功能:

图rosPlot(扫描,“MaximumRange”5)

图中包含一个轴对象。标题为“激光扫描”的轴对象包含一个字型线对象。

图像信息

MATLAB还提供了对图像消息的支持,图像金宝app消息总是具有消息类型sensor_msgs /形象

使用。创建空图像消息rosmessage查看图像消息的标准ROS格式。

emptyimg = rosmessage (“sensor_msgs /形象”“DataFormat”“结构”
emptyimg =结构体字段:MessageType: 'sensor_msgs/Image' Header: [1x1 struct] Height: 0 Width: 0 Encoding: " IsBigendian: 0 Step: 0 Data: [0x1 uint8]

为了方便起见,exampleHelperROSLoadMessages函数加载的图像消息已完全填充并存储在img变量。

检查图像消息变量img在你的工作空间。图像的大小存储在宽度高度属性。ROS使用向量发送实际的图像数据数据财产。

img
img =结构体字段:MessageType: 'sensor_msgs/Image' Header: [1x1 struct] Height: 480 Width: 640 Encoding: 'rgb8' IsBigendian: 0 Step: 1920 Data: [921600x1 uint8]

数据属性存储在MATLAB中不能直接用于处理和可视化的原始图像数据。你可以使用rosReadImage函数检索与MATLAB兼容的格式的图像。

imageFormatted = rosReadImage (img);

原始图像有一个'rgb8'编码。默认情况下,rosReadImage返回480 × 640 × 3的标准图像uint8格式。查看此图像使用imshow函数。

图imshow (imageFormatted)

图中包含一个轴对象。axis对象包含一个image类型的对象。

MATLAB®支金宝app持所有ROS图像编码格式rosReadImage处理转换图像数据的复杂性。除了彩色图像,MATLAB还支持单色和深度图像。金宝app

压缩消息

许多ROS系统以压缩格式发送图像数据。MATLAB提供对这些压缩图像消金宝app息的支持。

使用。创建空的压缩图像消息rosmessage.ROS中的压缩图像有消息类型sensor_msgs / CompressedImage并有一个标准的结构。

emptyimgcomp = rosmessage (“sensor_msgs / CompressedImage”“DataFormat”“结构”
emptyimgcomp =结构体字段:MessageType: 'sensor_msgs/ compres沉积物'报头:[1x1 struct] Format: " Data: [0x1 uint8]

为了方便起见,exampleHelperROSLoadMessages函数加载已填充的压缩图像消息。

检查imgcomp被摄像机捕捉到的变量。的格式属性捕获MATLAB需要解压缩存储在其中的图像数据的所有信息数据

imgcomp
imgcomp =结构体字段:MessageType: 'sensor_msgs/ compres沉积物' Header: [1x1 struct] Format: 'bgr8;数据:[30376x1 uint8]

类似于图像消息,您可以使用rosReadImage以获得标准RGB格式的图像。即使这个压缩图像的原始编码是bgr8rosReadImage的转换。

compressedFormatted = rosReadImage (imgcomp);

可视化图像使用imshow函数。

图imshow (compressedFormatted)

图中包含一个轴对象。axis对象包含一个image类型的对象。

压缩图像消息类型支持大多数图像格式。金宝app的16 uc132 fc1压缩深度图像不支持编码。金宝app支持单色和彩色图像编码。金宝app

点云

点云可以被机器人中使用的各种传感器捕捉,包括激光雷达、Kinect®和立体相机。ROS中最常见的传输点云的信息类型是sensor_msgs / PointCloud2MATLAB提供了一些专门的函数来处理这些数据。

您可以通过创建空点云消息来查看点云消息的标准ROS格式。

emptyptcloud = rosmessage (“sensor_msgs / PointCloud2”“DataFormat”“结构”
emptyptcloud =结构体字段:MessageType: 'sensor_msgs/PointCloud2' Header: [1x1 struct] Height: 0 Width: 0 Fields: [0x1 struct] IsBigendian: 0 PointStep: 0 RowStep: 0 Data: [0x1 uint8] IsDense: 0 . MessageType: 'sensor_msgs/PointCloud2' Header: [1x1 struct] Height: 0

视图中存储的填充点云消息ptcloud工作区中的变量:

ptcloud
ptcloud =结构体字段:MessageType: 'sensor_msgs/PointCloud2' Header: [1x1 struct] Height: 480 Width: 640 Fields: [4x1 struct] IsBigendian: 0 PointStep: 32 RowStep: 20480 Data: [9830400x1 uint8] IsDense: 0

将点云信息编码到数据属性。你可以提取xyz作为一个坐标N通过调用rosReadXYZ函数。

xyz = rosReadXYZ (ptcloud)
xyz =307200 x3单一矩阵NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN⋮

在点云数据中表明xyz值无效。这是Kinect®传感器的人工制品,你可以安全地移除所有值。

xyzvalid = xyz (~ isnan (xyz (: 1)):)
xyzvalid =193359 x3单一矩阵0.1378 -0.6705 1.6260 0.1409 -0.6705 1.6260 0.1433 -0.6672 1.6180 0.1464 -0.6672 1.6180 0.1502 -0.6705 1.6260 0.1526 -0.6672 1.6180 0.1556 -0.6672 1.6180 0.1587 -0.6672 1.6180 0.1618 -0.6672 1.6180 0.1649 -0.6672 1.6180⋮

一些点云传感器还为点云中的每个点分配RGB颜色值。如果存在这些颜色值,可以通过调用来检索它们rosReadRGB

rgb = rosReadRGB (ptcloud)
rgb =307200×30.8392 0.7059 0.5255 0.8392 0.7059 0.5255 0.8392 0.7137 0.5333 0.8392 0.7216 0.5451 0.8431 0.7137 0.5529 0.8431 0.7098 0.5569 0.8471 0.7137 0.5569 0.8549 0.7098 0.5569 0.8588 0.7137 0.5529 0.8627 0.7137 0.5490⋮

你可以用rosPlot函数。rosPlot自动提取xyz坐标和RGB颜色值(如果存在的话),并在3d散点图中显示它们。的rosPlot函数忽略所有xyz坐标,即使该点的RGB值存在。

图rosPlot (ptcloud)

图中包含一个轴对象。标题为“点云”的轴对象包含一个散点类型的对象。