主要内容

处理基本ROS消息

消息是ROS中交换数据的主要容器。主题和服务使用消息在节点之间传输数据。(见与ROS发布者和订阅者交换数据而且呼叫并提供ROS服务有关主题和服务的更多信息)

为了标识其数据结构,每条消息都有一个消息类型.例如,来自激光扫描仪的传感器数据通常以类型的消息发送sensor_msgs /提升.每种消息类型标识消息中包含的数据元素。每个消息类型名都是包名后接正斜杠/和类型名的组合:

MATLAB®支金宝app持在机器人应用中经常遇到的许多ROS消息类型。这个例子展示了在MATLAB中创建、探索和填充ROS消息的一些方法。

先决条件:开始摄入ROS连接ROS网络

查找消息类型

初始化ROS主节点和全局节点。

rosinit
启动ROS Core…1.0037秒完成。在http://172.30.85.56:56256上初始化ROS master。使用NodeURI http://dcc823433glnxa64:37003/和MasterURI http://localhost:56256初始化全局节点/matlab_global_node_19626。

使用exampleHelperROSCreateSampleNetwork用另外三个节点和样本发布者和订阅者填充ROS网络。

exampleHelperROSCreateSampleNetwork

网络上有各种节点,其中包含一些主题和关联的发布者和订阅者。

您可以通过调用查看可用主题的完整列表rostopic列表

rostopic列表
/pose /rosout /scan /tf

方法发送的数据类型的详细信息/扫描主题,使用rostopic信息命令检查它。/扫描消息类型为sensor_msgs /提升

rostopic信息/扫描
类型:sensor_msgs/LaserScan publisher: * /node_3 (http://dcc823433glnxa64:44147/) subscriber: * /node_1 (http://dcc823433glnxa64:37193/) * /node_2 (http://dcc823433glnxa64:36883/)

命令输出还会告诉您哪些节点正在发布和订阅主题。要了解有关出版商和订阅者的信息,请参见呼叫并提供ROS服务

方法创建相同类型的空消息,以了解关于主题的消息类型的更多信息rosmessage函数。rosmessage金宝app支持消息类型的TAB补全。要完成消息类型名称,请键入要完成的名称的前几个字符,然后按选项卡关键。

为了提高创建消息或通信的效率,请使用结构格式的消息。

(英文)“sensor_msgs /提升”“DataFormat”“结构”
scandata =带有字段的结构: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]

创建的消息scandata具有许多与通常从激光扫描仪接收到的数据相关的属性。例如,最小感知距离存储在RangeMin,最大感应距离为RangeMax

要查看可用于主题和服务的所有消息类型的完整列表,请使用rosmsg列表

探索消息结构并获取消息数据

ROS消息是对象,消息数据存储在属性中。MATLAB提供了查找和探索消息内容的方便方法。

  • 如果你订阅了/构成主题,您可以接收和检查所发送的消息。

= 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 / Vector3geometry_msgs /扭复合消息是否由两个组成geometry_msgs / Vector3消息。

对这些嵌套消息的数据访问与访问其他消息中的数据完全相同。访问X的组成线性使用此命令的消息:

xpos = posedata.Linear.X
Xpos = 0.0315

如果需要消息中包含的所有数据的快速摘要,请调用rosShowDetails函数。rosShowDetails处理任何类型的消息并递归地显示所有消息数据字段。

rosShowDetails (posedata)
ans = ' MessageType: geometry_msgs/Twist线性MessageType: geometry_msgs/Vector3 X: 0.03147236863931789 Y: 0.04057919370756193 Z: -0.03730131837064939 Angular MessageType: geometry_msgs/Vector3 X: 0.04133758561390194 Y: 0.01323592462254095 Z: -0.04024595950005905'

rosShowDetails在调试期间和希望快速查看消息内容时提供帮助。

设置消息数据

您还可以设置消息字段值。创建带有类型的消息geometry_msgs /扭

扭转= rosmessage(“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]

保存姿势数据到一个MAT文件使用MATLAB的保存函数。

保存(“posedata.mat”“posedata”

在将文件加载回工作区之前,清除posedata变量。

清晰的posedata

方法可以加载消息数据负载函数。这将加载posedata从上面进入messageData结构。posedata是结构的数据字段。

messageData = load(“posedata.mat”
messageData =带有字段的结构:[1x1 struct]

检查messageData.posedata查看消息内容。

messageData.posedata
ans =带有字段的结构:线性:[1x1 struct] Angular: [1x1 struct]

现在可以删除MAT文件。

删除(“posedata.mat”

消息中的数组

来自ROS的一些消息存储在其他消息数组中或包含其他消息数组。

在您的工作空间中,变量特遣部队包含示例消息。(exampleHelperROSCreateSampleNetwork脚本创建了该变量。)在本例中,它是一个类型的消息tf / tfMessage用于坐标变换。

特遣部队
tf =带有字段的结构:MessageType: 'tf/tfMessage'转换:[1x53结构]

特遣部队有两个字段:MessageType包含标准数据数组和转换包含一个对象数组。有53条消息存储在转换,它们都有相同的结构。

扩大特遣部队转换要查看结构:

特遣部队。转换
ans =1×53带字段的struct数组: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结构}列29至32 {1x1结构}{1x1结构}{1x1结构}列33至36 {1x1结构}{1x1结构}{1x1结构}列37至40 {1x1结构}{1x1结构}{1x1结构}列41至44 {1x1结构}{1x1结构}{1x1结构}列45至48 {1x1结构}{1x1结构}{1x1结构}列49至52 {1x1结构}{1x1结构}{1x1结构}{1x1结构}列53 {1x1结构}

这将所有53个对象条目放在一个单元格数组中,使您能够通过索引访问它们。

此外,你还可以像访问标准MATLAB向量一样访问数组元素:

tf.Transforms (5)
ans =带有字段的结构:ChildFrameId: '/imu_link' Transform: [1x1 struct]

访问53个转换列表中第5个转换的翻译组件:

tf.Transforms .Transform.Translation (5)
ans =带有字段的结构:MessageType: 'geometry_msgs/Vector3' X: 0.0599 Y: 0 Z: -0.0141

关闭ROS网络

从ROS网络中删除示例节点、发布者和订阅者。

exampleHelperROSShutDownSampleNetwork

关闭ROS主节点并删除全局节点。

rosshutdown
使用NodeURI http://dcc823433glnxa64:37003/和MasterURI http://localhost:56256关闭全局节点/matlab_global_node_19626。在http://172.30.85.56:56256上关闭ROS master。

下一个步骤