主要内容

处理基本ROS 2消息

ROS.消息是用于在ROS 2中交换数据的主容器。发布者和订户使用指定的消息交换数据话题要在节点之间携带数据。有关发送和接收邮件的更多信息,请参阅与ROS 2发布商和订阅者交换数据

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

MATLAB®支金宝app持许多ROS 2消息类型,这些类型通常遇到在机器人应用程序中。此示例检查在Matlab中创建,检查和填充ROS 2消息的一些方法。

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

查找消息类型

examplehelperros2createsamplenetwork填充ROS 2网络,具有三个节点和设置示例发布者和订阅者在特定主题上。

examplehelperros2createsamplenetwork

Ros2主题列表-t找到可用的主题及其关联的消息类型。

ros2话题列表-T.
主题MessageType  _____________________ _________________________________ {'/ parameter_events’}{' rcl_interfaces / ParameterEvent '}

要了解有关主题消息类型的更多信息,请使用ros2message创建相同类型的空消息。ros2message金宝app支持消息类型的TAB补全。要快速完成消息类型名称,请键入要完成的名称的前几个字符,然后按标签钥匙。

scanData = ros2message (“sensor_msgs /提升”
scanData =结构与字段:MessageType:'sensor_msgs / laserscan'标题:[1x1 struct] Angle_min:0 Angl_max:0 Angle_Increment:0 Time_Increment:0 Scan_time:0 Range_min:0 Range_max:0范围:0强度:0

创建的消息,scanData,有许多与您通常从激光扫描仪接收的数据相关联的字段。例如,存储最小感测距离存储在Range_min.特性和最大感应距离range_max财产。

您现在可以删除创建的消息。

清除scanData

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

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

ROS 2消息表示为结构,消息数据存储在字段中。Matlab提供了查找和探索消息内容的方便方法。

ros2味精显示查看消息类型的定义。

ros2味精显示geometry_msgs / twist.
#这表示自由空间中的速度分解为线性和角部分。向量3线性向量3角向量

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

controlNode = ros2node (“/ base_station”);poseSub = ros2subscriber (controlNode,“/姿势”“geometry_msgs /扭曲”
poseSub = ros2subscriber with properties: TopicName: '/pose' LatestMessage: [] MessageType: 'geometry_msgs/Twist' NewMessageFcn: [] History: 'keeplast' Depth: 10 Reliability: 'reliable' Durability: 'volatile'

收到从订户获取数据。一旦收到了新消息,函数就会返回它并将其存储在其中Postata.变量。指定接收消息的超时时间为10秒。

poseData =接收(poseSub, 10)
posedata =结构与字段:MessageType:'geometry_msgs / twist'linear:[1x1 struct] Angular:[1x1 struct]

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

poseData.linear
ans =结构与字段:* * * * * * * * * * * * * * * * *
poseData.angular
ans =结构与字段:x: -0.0358 y: -0.0078 z: - 0.0416

您可以看到,这些消息字段的每个值实际上本身就是一条消息。geometry_msgs / twist.复合消息是由两个组成的吗Geometry_msgs / Vector3.消息。

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

xose = posedata.linear.x.
x波纹= 0.0457.

设置消息数据

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

twist = ros2message(“geometry_msgs /扭曲”
捻=结构与字段:MessageType:'geometry_msgs / twist'linear:[1x1 struct] Angular:[1x1 struct]

此消息的数字属性被初始化为0默认情况下。您可以修改此消息的任何属性。设置L.inear.y字段到5。

twist.linear.y = 5;

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

twist.linear
ans =结构与字段:x: 0 y: 5 z: 0

填充数据后,您可以使用发布者和订阅者使用它。

复制信息

ROS 2消息是结构。它们可以直接复制以进行新留言。副本和原始邮件每个都有自己的数据。

制作一个新的空消息来传达温度数据,然后制作修改副本。

tempmsgblank = ros2message(“sensor_msgs /温度”);tempmsgcopy = tempmsgblank.
tempMsgCopy =结构与字段:MessageType: 'sensor_msgs/Temperature'报头:[1x1 struct]温度:0方差:0

修改温度TEMPMSG的财产,并注意到内容tempmsgblank.保持不变。

tempmsgcopy.temperature = 100.
tempMsgCopy =结构与字段:MessageType: 'sensor_msgs/Temperature'报头:[1x1 struct]温度:100方差:0
tempmsgblank.
tempMsgBlank =结构与字段:MessageType: 'sensor_msgs/Temperature'报头:[1x1 struct]温度:0方差:0

保持空白消息结构可能很有用,并且在发送消息之前只有数据时,只设置特定字段。

thermometerNode = ros2node (“/温度计”);tempPub = ros2publisher (thermometerNode,“/温度”“sensor_msgs /温度”);tempMsgs (10) = tempMsgBlank;%预分配消息结构数组Imeasure = 1:10%复制空白消息字段tempmsgs(imeasure)= tempmsgblank;记录样品温度tempmsgs(Imeasure).temperature = 20 + Randn * 3;只有在观察到足够的数据时,才能计算变化如果iMeasure >= 5 tempMsgs(iMeasure)。方差= var ([tempMsgs (1: iMeasure)均]);结束将数据传递给订阅者发送(tempPub, tempMsgs (iMeasure))结束错误栏([tempmsgs.temperature],[tempmsgs.variance])

图包含轴。轴包含误差栏类型的对象。

保存和加载消息

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

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

poseData =接收(poseSub, 10)
posedata =结构与字段:MessageType:'geometry_msgs / twist'linear:[1x1 struct] Angular:[1x1 struct]

使用介绍将构成数据保存到MAT文件节省函数。

保存(“posefile.mat”“posedata”

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

清除Postata.

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

messageata = load(“posefile.mat”
messageData =结构与字段:poseData (1 x1结构):

检查messageata.postata.postata.查看消息内容。

messageata.postata.postata.
ans =结构与字段:MessageType:'geometry_msgs / twist'linear:[1x1 struct] Angular:[1x1 struct]

您现在可以删除垫文件。

删除(“posefile.mat”

断开ROS 2网络

从ROS 2网络中删除样本节点、发布者和订阅者。

exampleHelperROS2ShutDownSampleNetwork

下一个步骤