主要内容

使用基本的ROS消息

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

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

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

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

发现消息类型

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

罗斯尼特
启动ROS Core... . 1.8227秒在http://192.168.0.10:60141上初始化ROS master。使用NodeURI http://dcc420950glnxa64:45161/初始化全局节点/matlab_global_node_78612

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

exampleHelperROSCreateSampleNetwork

网络上有不同的节点,有一些主题和附属出版商和订阅者。

可以通过调用来查看可用主题的完整列表叛逆列表

叛逆列表
/pose / roout /scan /tf

如果您想了解更多关于通过/扫描话题,使用rostopic信息命令检查它。/扫描消息类型为sensor_msgs /提升

叛逆信息/扫描
类型:sensor_msgs/LaserScan Publishers: * /node_3 (http://dcc420950glnxa64:33313/)订户:* /node_1 (http://dcc420950glnxa64:32889/) * /node_2 (http://dcc420950glnxa64:34623/)

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

要了解有关主题消息类型的更多信息,请使用rosmessage函数。rosmessage金宝app支持消息类型的TAB补全。要完成消息类型名称,请键入要完成的名称的前几个字符,然后按选项卡钥匙。

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

scandata = rosmessage (“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提供了查找和探索消息内容的方便方法。

  • 如果你订阅/姿势主题,您可以收到并检查已发送的消息。

posesub = rossubscriber (“/姿势”“DataFormat”“结构”
posesub =订阅服务器的属性:TopicName: '/pose' LatestMessage: [] MessageType: 'geometry_msgs/Twist' BufferSize: 1 NewMessageFcn: [] DataFormat: 'struct'

使用收到从订阅者获取数据。一旦接收到新消息,该函数将返回该消息并将其存储在postata.变量(第二个参数是在秒内超时)。

posedata =接收(posesub, 10)
posedata =结构体字段:MessageType: 'geometry_msgs/Twist'

消息的类型为geometry_msgs / twist..消息中还有两个其他字段:线性.你可以通过直接访问这些消息字段来查看它们的值:

posedata。线性
ans =结构体字段:X: 0 Y: 0 Y: 0
posedata。角
ans =结构体字段:X: 0 Y: 0 Y: 0 Z: -0

这些消息字段的每个值实际上本身就是一条消息。它们的消息类型是Geometry_msgs / Vector3.geometry_msgs / twist.复合消息是由两个组成的吗Geometry_msgs / Vector3.消息。

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

xpos = posedata.linear.x.
XPOS = 0.0315.

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

Rosshowdetails(Posedata)
ANS = '消息类型:geometry_msgs /扭转线性消息类型:geometry_msgs /的Vector3 X:0.03147236863931789 Y:0.04057919370756193 Z:-0.03730131837064939角消息类型:geometry_msgs /的Vector3 X:0.04133758561390194 Y:0.01323592462254095 Z:-0.04024595950005905'

rosShowDetails在调试期间以及希望快速浏览消息内容时,可提供帮助。

设置消息数据

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

捻= rosmessage (“geometry_msgs /扭曲”“DataFormat”“结构”
捻=结构体字段:MessageType: 'geometry_msgs/Twist'

此消息的数字字段初始化为0默认情况下。您可以修改此消息的任何属性。设置线性的。Y进入等于5

twist.Linear.Y = 5;

查看消息数据以确保更改生效。

转折。线性
ans =结构体字段:X: 0 Y: 5 Z: 0

一旦消息被您的数据填充,您就可以与发布者、订阅者和服务一起使用它。看到与ROS发布商和订阅者交换数据呼叫和提供ROS服务的例子。

保存和加载消息

您可以保存消息并存储内容以备以后使用。

从订阅者获取一条新消息。

posedata =接收(posesub, 10)
posedata =结构体字段:MessageType: 'geometry_msgs/Twist'

保存姿态数据到MAT文件使用MATLAB的保存函数。

保存(“posedata.mat”“posedata”

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

清除postata.

现在,您可以通过调用负载函数。这个加载postata.从上到下Messageata.结构。postata.是结构体的数据字段。

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

检查Messageata.Postata.查看消息内容。

Messageata.Postata.
ans =结构体字段:MessageType: 'geometry_msgs/Twist'

您现在可以删除垫文件。

删除(“posedata.mat”

数组的消息

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

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

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

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

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

特遣部队。转换
ans =1×53带有字段的结构数组:MessageType Header ChildFrameId Transform

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

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 x1struct} {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} {1 x1 struct}列29日通过32 {1 x1 struct} {1 x1 struct} {1 x1 struct} {1 x1 struct} 33列通过36 {1 x1 struct} {1 x1 struct} {1 x1 struct} {1 x1 struct}列通过40 {1 x1 37第45列到第48列{1x1 struct} {1x1 struct} {1x1 struct} {1x1 struct}

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

此外,您可以访问Array Element,同样访问标准MATLAB向量:

tf.Transforms (5)
ans =结构体字段:MessageType: 'geometry_msgs/TransformStamped' Header: [1x1 struct] ChildFrameId: '/imu_link' Transform: [1x1 struct]

在53的列表中访问第5个变换的平移组件:

tf.Transforms .Transform.Translation (5)
ans =结构体字段:X: 0 Y: 0 Z: -0.0141

关闭ROS网络

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

examplehelperrosshutdownsamplenetwork

关闭ROS master,删除全局节点。

rosshutdown
使用nodeuri关闭全局节点/ matlab_global_node_78612 http:// dcc420950glnxa64:45161 /关闭ros master http://192.168.0.10.10:60141。

下一个步骤