消息是ROS中交换数据的主要容器。主题和服务使用消息在节点之间传输数据。(见与ROS发布者和订阅者交换数据而且呼叫并提供ROS服务有关主题和服务的更多信息)
为了标识其数据结构,每条消息都有一个消息类型.例如,来自激光扫描仪的传感器数据通常以类型消息的形式发送sensor_msgs /提升
.每种消息类型标识消息中包含的数据元素。每个消息类型名称都是一个包名称,后跟一个正斜杠/和一个类型名称的组合:
MATLAB®支金宝app持在机器人应用程序中经常遇到的许多ROS消息类型。这个例子展示了在MATLAB中创建、探索和填充ROS消息的一些方法。
初始化ROS主节点和全局节点。
rosinit
启动ROS核心... .耗时1.8227秒。在http://192.168.0.10:60141上初始化ROS master。使用NodeURI http://dcc420950glnxa64:45161/初始化全局节点/matlab_global_node_78612
使用exampleHelperROSCreateSampleNetwork
用三个额外的节点以及样本发布者和订阅者来填充ROS网络。
exampleHelperROSCreateSampleNetwork
网络上有各种节点,它们都有一些主题和关联的发布者和订阅者。
您可以通过调用查看可用主题的完整列表rostopic
列表
.
rostopic列表
/pose /rosout /scan /tf
类发送的数据类型的详细信息/扫描
主题,使用rostopic信息
命令检查它。/扫描
是否有消息类型sensor_msgs /提升
.
rostopic信息/扫描
类型:sensor_msgs/LaserScan发布者:* /node_3 (http://dcc420950glnxa64:33313/)订阅者:* /node_1 (http://dcc420950glnxa64:32889/) * /node_2 (http://dcc420950glnxa64:34623/)
命令输出还告诉您哪些节点正在发布和订阅主题。要了解有关出版商和订阅者的信息,请参见呼叫并提供ROS服务.
方法创建相同类型的空消息,以了解有关主题的消息类型的更多信息rosmessage
函数。rosmessage
金宝app支持消息类型的TAB补全。若要完成消息类型名称,请键入要完成的名称的前几个字符,然后按选项卡关键。
为了在创建消息或通信时提高效率,请使用结构格式的消息。
丑闻=消息(“sensor_msgs /提升”,“DataFormat”,“结构”)
scandata =带字段的结构:MessageType: 'sensor_msgs/LaserScan'头:[1x1 struct] AngleMin: 0 AngleMax: 0 AngleIncrement: 0 TimeIncrement: 0 ScanTime: 0 RangeMin: 0 RangeMax: 0范围:[0x1 single]强度:[0x1 single]
创建的消息scandata
具有许多与通常从激光扫描仪接收到的数据相关的属性。例如,最小感测距离存储在RangeMin
场,最大感应距离为RangeMax
.
若要查看主题和服务可用的所有消息类型的完整列表,请使用rosmsg
列表
.
ROS消息是对象,消息数据存储在属性中。MATLAB具有方便的方法来查找和探索消息的内容。
如果你订阅了/构成
主题,您可以接收和检查发送的消息。
Posesub = rossubscriber(“/姿势”,“DataFormat”,“结构”)
posesub =带有属性的订阅器:TopicName: '/pose' LatestMessage: [] MessageType: 'geometry_msgs/Twist' BufferSize: 1 NewMessageFcn: [] DataFormat: 'struct'
使用收到
从订阅者获取数据。一旦接收到新消息,该函数将返回该消息并将其存储在posedata
变量(第二个参数是以秒为单位的超时)。
Posedata = receive(posesub,10)
posedata =带字段的结构:线性:[1x1 struct] Angular: [1x1 struct]
消息的类型为geometry_msgs /扭
.消息中还有两个字段:线性
而且角
.您可以通过直接访问这些消息字段来查看它们的值:
posedata。线性
ans =带字段的结构:MessageType: 'geometry_msgs/Vector3' X: 0.0315 Y: 0.0406 Z: -0.0373
posedata。角
ans =带字段的结构:MessageType: 'geometry_msgs/Vector3' X: 0.0413 Y: 0.0132 Z: -0.0402
这些消息字段的每个值实际上都是一条消息。它们的消息类型是geometry_msgs / Vector3
.geometry_msgs /扭
复合消息是由两个消息组成的吗geometry_msgs / Vector3
消息。
对这些嵌套消息的数据访问与访问其他消息中的数据完全相同。访问X
组成部分线性
使用此命令的消息:
xpos = posedata.Linear.X
Xpos = 0.0315
如果希望快速总结消息中包含的所有数据,请调用rosShowDetails
函数。rosShowDetails
处理任何类型的消息并递归地显示所有消息数据字段。
rosShowDetails (posedata)
ans = '线性消息类型:几何y_msgs/Vector3 X: 0.03147236863931789 Y: 0.04057919370756193 Z: -0.03730131837064939角消息类型:几何y_msgs/Vector3 X: 0.0413373758561390194 Y: 0.0131323592462254095 Z: -0.04024595950005905'
rosShowDetails
在调试期间和希望快速查看消息的内容时帮助您。
您还可以设置消息字段值。创建带有类型的消息geometry_msgs /扭
.
扭曲= rosessage (“geometry_msgs /扭曲”,“DataFormat”,“结构”)
捻=带字段的结构:线性:[1x1 struct] Angular: [1x1 struct]
此消息的数字字段被初始化为0
默认情况下。您可以修改此消息的任何属性。设置线性的。Y
分量等于5
.
twist.Linear.Y = 5;
查看消息数据以确保您的更改生效。
转折。线性
ans =带字段的结构:MessageType: 'geometry_msgs/Vector3' X: 0 Y: 5 Z: 0
一旦用您的数据填充了消息,您就可以将其用于发布者、订阅者和服务。看到与ROS发布者和订阅者交换数据而且呼叫并提供ROS服务的例子。
您可以保存消息并存储内容以供以后使用。
从订阅者获取一条新消息。
Posedata = receive(posesub,10)
posedata =带字段的结构:线性:[1x1 struct] Angular: [1x1 struct]
使用MATLAB将姿态数据保存到MAT文件中保存
函数。
保存(“posedata.mat”,“posedata”)
在将文件加载回工作空间之前,清除posedata
变量。
清晰的posedata
方法加载消息数据负载
函数。这将加载posedata
从上面进入messageData
结构。posedata
是结构的数据字段。
messageData = load(“posedata.mat”)
messageData =带字段的结构:Posedata: [1x1 struct]
检查messageData.posedata
查看邮件内容。
messageData.posedata
ans =带字段的结构:线性:[1x1 struct] Angular: [1x1 struct]
现在可以删除MAT文件。
删除(“posedata.mat”)
来自ROS的一些消息存储在或包含其他消息的数组中。
在您的工作空间中,变量特遣部队
包含一个示例消息。(exampleHelperROSCreateSampleNetwork
脚本创建了该变量。)在本例中,它是类型的消息tf / tfMessage
用于坐标变换。
特遣部队
tf =带字段的结构:message: 'tf/tfMessage'转换:[1x53 struct]
特遣部队
有两个字段:MessageType
包含标准数据数组和转换
包含一个对象数组。存储了53条消息转换
,它们都有相同的结构。
扩大特遣部队
在转换
看结构:
特遣部队。转换
ans =1×53包含字段的struct数组:MessageType头ChildFrameId转换
中的每个对象转换
有四个性质。您可以展开以查看变换
领域的转换
.
tformFields = tf.Transforms.Transform
注意:该命令输出返回53个单独的答案,因为每个对象都被求值并返回其值变换
字段。这种格式并不总是有用的,所以你可以用下面的命令将它转换为单元格数组:
cellTransforms = {tf.Transforms.Transform}
cellTransforms =1×53单元格数组列1到4 {1 x1 struct} {1 x1 struct} {1 x1 struct} {1 x1 struct}列5到8 {1 x1 struct} {1 x1 struct} {1 x1 struct} {1 x1 struct}列9到12 {1 x1 struct} {1 x1 struct} {1 x1 struct} {1 x1 struct}列13到16 {1 x1 struct} {1 x1 struct} {1 x1 struct} {1 x1 struct}列17到20 {1 x1 struct} {1 x1 struct} {1 x1 struct} {1 x1 struct}列21到24 {1 x1 struct} {1 x1 struct} {1 x1 struct} {1 x1 struct}列25到28日{1 x1 struct} {1 x1 struct} {1 x1 struct}{1x1 struct}第29至32列{1x1 struct} {1x1 struct} {1x1 struct} {1x1 struct} {1x1 struct}}第33至36列{1x1 struct} {1x1 struct} {1x1 struct}}第37至40列{1x1 struct} {1x1 struct} {1x1 struct} {1x1 struct}}第41至44列{1x1 struct} {1x1 struct} {1x1 struct} {1x1 struct} {1x1 struct}第45至48列{1x1 struct} {1x1 struct} {1x1 struct} {1x1 struct} {1x1 struct} {1x1 struct} {1x1 struct}第49至52列{1x1 struct} {1x1 struct} {1x1 struct} {1x1 struct} {1x1 struct} {1x1 struct}}第53列{1x1 struct}
这将把所有53个对象条目放在一个单元格数组中,使您能够通过索引访问它们。
此外,您可以以访问标准MATLAB向量的相同方式访问数组元素:
tf.Transforms (5)
ans =带字段的结构:ChildFrameId: '/imu_link'转换:[1x1 struct]
访问53个变换列表中第五个变换的翻译组件:
tf.Transforms .Transform.Translation (5)
ans =带字段的结构:MessageType: 'geometry_msgs/Vector3' X: 0.0599 Y: 0 Z: -0.0141
从ROS网络中删除示例节点、发布者和订阅者。
exampleHelperROSShutDownSampleNetwork
关闭ROS主机并删除全局节点。
rosshutdown
关闭全局节点/matlab_global_node_78612与NodeURI http://dcc420950glnxa64:45161/关闭ROS主http://192.168.0.10:60141。
看到使用专门的ROS消息例如处理图像、点云和激光扫描消息。
应用示例请参见开始与凉亭和模拟乌龟机器人或开始一个真正的乌龟机器人的例子。