主要内容

处理基本的ROS消息

这个例子展示了不同的方法来创建、探索,并填充在MATLAB®ROS消息,常见的机器人应用程序。

消息交换数据的主要容器ROS。主题和服务之间使用消息携带数据节点。(见与ROS交换数据发布者和订阅者调用并提供ROS服务有关主题的更多信息和服务)

先决条件:开始使用ROS,连接到一个ROS网络

确定它的数据结构,每个消息都有一个消息类型。例如,传感器数据从一个激光扫描仪通常发送的消息类型sensor_msgs /提升。每个消息类型标识消息中包含的数据元素。每条消息类型名称的组合包名称,后跟一个斜杠/,和类型名称:

发现消息类型

初始化ROS大师和全球节点。

rosinit
启动ROS核心……在3.6551秒内完成。初始化ROS主在http://192.168.178.1:54553上。初始化全局节点/ matlab_global_node_11113 NodeURI http://ah-csalzber: 65499 /

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

exampleHelperROSCreateSampleNetwork

有网络上的各个节点几个主题和附属发布者和订阅者。

你可以看到完整的可用主题通过调用的列表rostopic列表

rostopic列表
/ / rosout /扫描/ tf

如果你想知道更多关于数据通过光纤发送的类型/扫描话题,使用rostopic信息命令来检查它。/扫描有一个消息类型的sensor_msgs /提升

rostopic信息/扫描
类型:sensor_msgs /提升出版商:* / node_3 (http://ah-csalzber: 63490 /)用户:* / node_1 (http://ah-csalzber: 63478 /) * / node_2 (http://ah-csalzber: 63484 /)

命令输出也告诉你哪些节点发布和订阅的主题。了解出版商和用户,看看调用并提供ROS服务

找到更多关于这个话题的消息类型,创建一个空消息相同类型的使用rosmessage函数。rosmessage万博1manbetx支持消息类型选项卡完成。完成消息类型名称,类型的前几个字符的名字你想要完成,然后按下选项卡关键。

为了更好的效率在创建消息或交流时,使用消息结构格式。

scandata = rosmessage (“sensor_msgs /提升”,“DataFormat”,“结构”)
scandata =结构体字段:MessageType:“sensor_msgs /提升”标题:[1×1 struct] AngleMin: 0 AngleMax: 0 AngleIncrement: 0 TimeIncrement: 0 ScanTime: 0 RangeMin: 0 RangeMax: 0范围:[0×1单]强度:(0×1个)

创建消息scandata有许多属性相关的数据通常来自激光扫描仪。例如,存储在最低感应距离RangeMin场,最大感应距离RangeMax

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

探索消息结构和消息数据

ROS消息对象和消息数据存储在属性中。MATLAB功能方便的方法来发现和探索的内容信息。

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

posesub = rossubscriber (“/姿势”,“DataFormat”,“结构”)
posesub =用户属性:TopicName:“/姿势”LatestMessage: [] MessageType:“geometry_msgs /扭曲”BufferSize: 1 NewMessageFcn: [] DataFormat:“结构”

使用收到用户的数据。一旦收到新的消息,并将其存储在函数将返回它posedata变量(第二个参数是一个超时以秒为单位)。

posedata =接收(posesub, 10)
posedata =结构体字段:MessageType: geometry_msgs /扭曲的线性:[1×1 struct]角:[1×1 struct]

的消息都有一个类型geometry_msgs /扭。有两个其他领域的信息:线性。你可以看到这些消息字段的值直接访问他们:

posedata.Linear
ans =结构体字段:MessageType: ' geometry_msgs / Vector3 ' X: -0.0139 Y: 0.0120 Z: 0.0311
posedata.Angular
ans =结构体字段:MessageType: ' geometry_msgs / Vector3 ' X: -0.0481 Y: -0.0416 Z: 0.0475

每一个这些消息字段的值实际上是一个消息本身。的消息类型geometry_msgs / Vector3geometry_msgs /扭是一个复合的消息由两个吗geometry_msgs / Vector3消息。

这些嵌套消息的数据访问和访问数据完全相同的工作在其他消息。访问X组件的线性消息使用这个命令:

xpos = posedata.Linear.X
xpos = -0.0139

如果你想要一个快速的摘要中包含的所有数据信息,调用rosShowDetails函数。rosShowDetails适用于任何类型的消息和递归地显示所有数据字段的消息。

rosShowDetails (posedata)
ans = ' MessageType: geometry_msgs /扭线性MessageType: geometry_msgs / Vector3 X: -0.01389779508053391 Y: 0.01202784270710855 Z: 0.03111508851002852角MessageType: geometry_msgs / Vector3 X: -0.04807425225858586 Y: -0.04161264917171002 Z: 0.04748016671848904”

rosShowDetails帮助你在调试期间,当你想要迅速探索一条消息的内容。

设置消息数据

你也可以设置消息字段值。创建一个消息类型geometry_msgs /扭

捻= rosmessage (“geometry_msgs /扭曲”,“DataFormat”,“结构”)
捻=结构体字段:MessageType: geometry_msgs /扭曲的线性:[1×1 struct]角:[1×1 struct]

此消息的数值字段初始化0默认情况下。您可以修改此消息的属性。设置Linear.Y条目相当于5

twist.Linear。Y = 5;

查看消息数据以确保您所做的更改生效。

twist.Linear
ans =结构体字段:MessageType: ' geometry_msgs / Vector3 ' X: 0 Y: 5 Z: 0

一旦消息填充您的数据,您可以使用它与出版商,用户和服务。看到与ROS交换数据发布者和订阅者调用并提供ROS服务的例子。

保存和加载信息

您可以保存信息和内容存储起来,供以后使用。

从用户得到一个新的消息。

posedata =接收(posesub, 10)
posedata =结构体字段:MessageType: geometry_msgs /扭曲的线性:[1×1 struct]角:[1×1 struct]

将造成数据保存到一个文件使用MATLAB的垫子保存函数。

保存(“posedata.mat”,“posedata”)

在装货前的文件回到工作区,清除posedata变量。

清晰的posedata

现在,您可以通过调用加载消息数据负载函数。这个加载posedata从上面的messageData结构。posedata是一个结构体的数据字段。

messageData =负载(“posedata.mat”)
messageData =结构体字段:posedata(1×1结构):

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

messageData.posedata
ans =结构体字段:MessageType: geometry_msgs /扭曲的线性:[1×1 struct]角:[1×1 struct]

现在,您可以删除垫文件。

删除(“posedata.mat”)

数组的消息

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

在你的工作区中,变量特遣部队包含一个示例消息。(exampleHelperROSCreateSampleNetwork脚本创建的变量)。在这种情况下,它是一种消息类型tf / tfMessage用于坐标转换。

特遣部队
tf =结构体字段:MessageType: tf / tfMessage的转换:[1×53 struct]

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

扩大特遣部队转换的结构:

tf.Transforms
ans =1×53结构体数组字段:MessageType头ChildFrameId变换

每个对象在转换有四个属性。你可以看到扩张变换领域的转换

tformFields = tf.Transforms.Transform

注意:命令输出返回53个人的答案,因为每个评估对象,并返回它的价值变换字段。这种格式并不总是有用的,所以你可以将它转换成一个单元阵列使用下面的命令:

cellTransforms = {tf.Transforms.Transform}
cellTransforms =1×53单元阵列{1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct}

这使得所有53个对象条目单元阵列,使您能够访问索引。

此外,您可以访问数组元素相同的方式访问标准MATLAB向量:

tf.Transforms (5)
ans =结构体字段:MessageType:“geometry_msgs / TransformStamped”标题:[1×1 struct] ChildFrameId: / imu_link的变换:[1×1 struct]

访问的翻译组件第五变换53的列表:

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

ROS关闭网络

删除示例节点,从ROS网络出版商和用户。

exampleHelperROSShutDownSampleNetwork

关闭ROS掌握全球节点和删除。

rosshutdown
关闭全局节点/ matlab_global_node_11113 NodeURI http://ah-csalzber: 65499 /关闭ROS主在http://192.168.178.1:54553上。

下一个步骤