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网络中删除样本节点、发布者和订阅者。
exampleHelperROS2ShutDownSampleNetwork