一些常用的ROS消息存储数据的格式,需要一些转换之前,可以用于进一步的处理。MATLAB®可以帮助你通过格式化这些专业ROS消息,方便使用。在本例中,您可以为激光扫描,探讨消息类型未压缩和压缩图像和点云处理。
先决条件:处理基本的ROS消息
加载一些示例消息。这些信息从各种机器人传感器收集的数据填充。
负载(“specialROSMessageData.mat”)
激光扫描仪在机器人常用的传感器。你可以看到激光扫描的标准ROS格式适当类型的消息通过创建一个空的消息。
使用rosmessage
创建消息。
emptyscan = rosmessage (“sensor_msgs /提升”,“DataFormat”,“结构”)
emptyscan =结构体字段:MessageType:“sensor_msgs /提升”标题:[1 x1 struct] AngleMin: 0 AngleMax: 0 AngleIncrement: 0 TimeIncrement: 0 ScanTime: 0 RangeMin: 0 RangeMax: 0范围:[0 x1单一]强度:[0 x1单)
既然你创建了一个空的消息,emptyscan
不包含任何有意义的数据。为了方便起见,exampleHelperROSLoadMessages
函数加载一个激光扫描的消息完全填充和存储在扫描
变量。
检查扫描
变量。主数据的消息范围
财产。中的数据范围
是一个向量的障碍距离记录在小角增量。
扫描
扫描=结构体字段:MessageType:“sensor_msgs /提升”标题:[1 x1 struct] AngleMin: -0.5467 AngleMax: 0.5467 AngleIncrement: 0.0017 TimeIncrement: 0 ScanTime: 0.0330 RangeMin: 0.4500 RangeMax: 10范围:x1单[640]强度:[0 x1单)
你可以测量的点在笛卡尔坐标使用rosReadCartesian
函数。
xy = rosReadCartesian(扫描);
这个填充xy
的列表(x, y)
坐标计算基于所有有效的阅读范围。使用可视化扫描信息rosPlot
功能:
图rosPlot(扫描,“MaximumRange”5)
MATLAB还提供了对图像信息的支持,这总万博1manbetx是有消息类型sensor_msgs /形象
。
创建一个空的图像信息使用rosmessage
看到的标准ROS格式图像的信息。
emptyimg = rosmessage (“sensor_msgs /形象”,“DataFormat”,“结构”)
emptyimg =结构体字段:MessageType: sensor_msgs /图片的标题:[1 x1 struct]高度:0宽度:0编码:“IsBigendian: 0步骤:0数据:[0 x1 uint8]
为了方便起见,exampleHelperROSLoadMessages
函数加载图像信息是完全填充和存储在img
变量。
检查图像信息变量img
在你的工作空间。中存储的图像的大小宽度
和高度
属性。ROS发送实际的图像数据使用一个向量数据
财产。
img
img =结构体字段:MessageType: sensor_msgs /图片的标题:[1 x1 struct]高度:480宽度:640编码:“rgb8”IsBigendian: 0步骤:数据:1920 [921600 x1 uint8]
的数据
属性存储原始图像数据,不能直接使用MATLAB处理和可视化。您可以使用rosReadImage
函数来检索图像的格式与MATLAB兼容。
imageFormatted = rosReadImage (img);
原始图像有一个‘rgb8编码。默认情况下,rosReadImage
返回图像在标准的480 - 640 - 3uint8
格式。查看这张图片使用imshow
函数。
图imshow (imageFormatted)
MATLAB®支万博1manbetx持所有ROS图像编码格式,和rosReadImage
处理图像数据转换的复杂性。除了彩色图像,MATLAB还支持单色和深度图像。万博1manbetx
许多活性氧系统把图像数据压缩格式。MATLAB支持这些压缩消息。万博1manbetx
创建一个空压缩消息使用rosmessage
。压缩图像ROS消息类型sensor_msgs / CompressedImage
和有一个标准的结构。
emptyimgcomp = rosmessage (“sensor_msgs / CompressedImage”,“DataFormat”,“结构”)
emptyimgcomp =结构体字段:MessageType:“sensor_msgs / CompressedImage”标题:[1 x1 struct]格式:“数据:[0 x1 uint8]
为了方便起见,exampleHelperROSLoadMessages
函数加载一个压缩的图像信息,已经填充。
检查imgcomp
变量被相机捕获。的格式
属性捕获的所有信息需要解压缩图像数据存储在MATLAB数据
。
imgcomp
imgcomp =结构体字段:MessageType:“sensor_msgs / CompressedImage”标题:[1 x1 struct]格式:“bgr8;jpeg压缩bgr8数据(30376:x1 uint8]
类似的图像信息,您可以使用rosReadImage
获取标准RGB格式的图像。尽管最初的编码压缩的图像bgr8
,rosReadImage
的转换。
compressedFormatted = rosReadImage (imgcomp);
使用可视化图像imshow
函数。
图imshow (compressedFormatted)
大多数图像格式支持压缩消息类型。万博1manbetx的16 uc1
和32 fc1
编码不支持压缩深度图像。万博1manbetx支持单色和彩色图像编码。万博1manbetx
点云可以被各种各样的传感器用于机器人技术,包括激光雷达,Kinect®,立体相机。最常见的消息类型ROS传送点云sensor_msgs / PointCloud2
和MATLAB为您提供一些专门的函数来处理这些数据。
你可以看到点云的标准ROS格式消息通过创建一个空的点云消息。
emptyptcloud = rosmessage (“sensor_msgs / PointCloud2”,“DataFormat”,“结构”)
emptyptcloud =结构体字段:MessageType:“sensor_msgs / PointCloud2”标题:[1 x1 struct]高度:0宽度:0字段:[0 x1 struct] IsBigendian: 0 PointStep: 0 RowStep: 0数据:[0 x1 uint8] IsDense: 0
查看存储在密集的点云的消息ptcloud
工作空间中的变量:
ptcloud
ptcloud =结构体字段:MessageType:“sensor_msgs / PointCloud2”标题:[1 x1 struct]高度:480宽度:640字段:x1结构[4]IsBigendian: 0 PointStep: 32 RowStep: 20480数据:[9830400 x1 uint8] IsDense: 0
点云信息编码的数据
消息的属性。你可以提取x,
y,
z作为一个坐标N3矩阵通过调用rosReadXYZ
函数。
xyz = rosReadXYZ (ptcloud)
xyz =307200 x3单一矩阵南南南南南南南南南南南南南南南南南南南南南南南南南南南南南南⋮
南
在点云数据表明一些x,
y,
z值是无效的。这是一个工件的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
自动提取x,
y,
z坐标和RGB颜色值(如果存在的话),向他们展示三维散点图。的rosPlot
函数忽略所有南
x,
y,
z坐标,即使RGB值存在。
图rosPlot (ptcloud)