使用基本的ROS 2消息
ROS消息是ROS 2中交换数据的主要容器。发布者和订阅者使用指定的消息交换数据主题在节点之间传输数据。有关发送和接收消息的详细信息,请参见与ROS 2发布者和订阅者交换数据.
为了标识其数据结构,每条消息都有一个消息类型.例如,来自激光扫描仪的传感器数据通常以类型消息的形式发送sensor_msgs /提升
.每种消息类型标识消息中包含的数据元素。每个消息类型名称都是一个包名称,后跟一个正斜杠/和一个类型名称的组合:
MATLAB®支持在机器人应用程序中经常遇到的许多ROS 2消息类型。本例研究了在MATLAB中创建、检查和填充ROS 2消息的一些方法。
先决条件:从ROS 2开始,连接到ROS 2网络
查找消息类型
使用exampleHelperROS2CreateSampleNetwork
用三个节点填充ROS 2网络,并在特定主题上设置示例发布者和订阅者。
exampleHelperROS2CreateSampleNetwork
使用Ros2主题列表-t
查找可用的主题及其关联的消息类型。
ros2主题列表- t
主题MessageType _____________________ _________________________________ {'/ parameter_events’}{' rcl_interfaces / ParameterEvent '}{/构成的}{geometry_msgs /“扭转操作”}{' / rosout '}{‘rcl_interfaces /日志’}{/扫描的}{' sensor_msgs /提升'}
要了解有关主题消息类型的更多信息,请使用ros2message
创建相同类型的空消息。ros2message
支持消息类型的TAB补全。若要快速完成消息类型名称,请键入要完成的名称的前几个字符,然后按选项卡关键。
scanata = ros2message(“sensor_msgs /提升”)
scanData =带字段的结构:MessageType: 'sensor_msgs/LaserScan' header: [1x1 struct] angle_min: 0 angle_max: 0 angle_increment: 0 time_increment: 0 scan_time: 0 range_min: 0 range_max: 0 ranges: 0 intensity: 0
创建的消息,scanData
,有许多字段与您通常从激光扫描仪接收到的数据相关。例如,最小感测距离存储在range_min
性质和最大感应距离在range_max
财产。
现在可以删除创建的消息。
清晰的scanData
若要查看主题和服务可用的所有消息类型的完整列表,请使用Ros2味精清单
.
探索消息结构并获取消息数据
ROS 2消息表示为结构,消息数据存储在字段中。MATLAB提供了查找和探索消息内容的方便方法。
使用Ros2味精显示
查看消息类型的定义。
ros2味精显示geometry_msgs /扭
#这表示自由空间中的速度,分解成线性部分和角部分。Vector3线性的,Vector3角的
如果你订阅了/构成
主题,您可以接收和检查发送的消息。
controlNode = ros2node(“/ base_station”);poseSub = ros2subscriber(controlNode,“/姿势”,“geometry_msgs /扭曲”)
poseSub = ros2subscriber with properties: TopicName: '/pose' LatestMessage: [] MessageType: 'geometry_msgs/Twist' NewMessageFcn:[]历史:' keepast '深度:10可靠性:'可靠'耐久性:'不稳定'
使用收到
从订阅者获取数据。一旦接收到新消息,该函数将其返回并将其存储在posedata
变量。指定接收消息的超时时间为10秒。
poseData = receive(poseSub,10)
poseData =带字段的结构:MessageType: 'geometry_msgs/Twist' linear: [1x1 struct] angular: [1x1 struct]
消息的类型为geometry_msgs /扭
.消息中还有两个字段:线性
而且角
.您可以通过直接访问这些消息字段来查看它们的值。
poseData.linear
ans =带字段的结构:MessageType: 'geometry_msgs/Vector3' x: -0.0181 y: -0.0076 z: 7.8583e-04
poseData.angular
ans =带字段的结构:MessageType: 'geometry_msgs/Vector3' x: -0.0414 y: -0.0238 z: 0.0301
您可以看到,这些消息字段的每个值实际上都是一条消息。geometry_msgs /扭
复合消息是由两个消息组成的吗geometry_msgs / Vector3
消息。
对这些嵌套消息的数据访问与访问其他消息中的数据完全相同。访问x
组成部分线性
使用此命令的消息:
xPose = poseData.linear.x
xPose = -0.0181
设置消息数据
您还可以设置消息属性值。创建带有类型的消息geometry_msgs /扭
.
Twist = ros2message(“geometry_msgs /扭曲”)
捻=带字段的结构:MessageType: 'geometry_msgs/Twist' linear: [1x1 struct] angular: [1x1 struct]
此消息的数值属性初始化为0
默认情况下。您可以修改此消息的任何属性。设置linear.y
字段到5。
Twist.linear.y = 5;
您可以查看消息数据以确保您的更改生效。
twist.linear
ans =带字段的结构:MessageType: 'geometry_msgs/Vector3' x: 0 y: 5 z: 0
一旦用您的数据填充了消息,您就可以将其用于发布者和订阅者。
复制信息
ROS 2消息是结构。可以直接复制它们以生成新的消息。副本和原始消息都有自己的数据。
制作一个新的空消息来传达温度数据,然后制作一个副本进行修改。
tempMsgBlank = ros2message(“sensor_msgs /温度”);tempMsgCopy = tempMsgBlank
tempMsgCopy =带字段的结构:MessageType: 'sensor_msgs/Temperature'头:[1x1 struct]温度:0方差:0
修改温度
的内容,并注意tempMsgBlank
保持不变。
tempMsgCopy。温度= 100
tempMsgCopy =带字段的结构:MessageType: 'sensor_msgs/Temperature'头:[1x1 struct]温度:100方差:0
tempMsgBlank
tempMsgBlank =带字段的结构:MessageType: 'sensor_msgs/Temperature'头:[1x1 struct]温度:0方差:0
保留一个空白的消息结构,并且仅在发送消息之前有数据时设置特定的字段,这可能是有用的。
热力节点= ros2node(“/温度计”);tempPub = ros2publisher(温度计节点,“/温度”,“sensor_msgs /温度”);tempMsgs(10) = tempMsgBlank;预分配消息结构数组为iMeasure = 1:10复制空白消息字段tempMsgs(iMeasure) = tempMsgBlank;记录样品温度tempMsgs (iMeasure)。温度= 20+randn*3;只有在观测到足够的数据后才计算变化如果iMeasure >= 5 tempMsgs(iMeasure).使用实例方差= var([tempMsgs(1:iMeasure).temperature]);结束将数据传递给订阅者发送(tempPub, tempMsgs (iMeasure))结束errorbar ([tempMsgs.temperature], [tempMsgs.variance])
保存和加载消息
您可以保存消息并存储内容以供以后使用。
从订阅者获取一条新消息。
poseData = receive(poseSub,10)
poseData =带字段的结构:MessageType: 'geometry_msgs/Twist' linear: [1x1 struct] angular: [1x1 struct]
方法将姿态数据保存到MAT文件中保存
函数。
保存(“poseFile.mat”,“poseData”)
在将文件加载回工作空间之前,清除poseData
变量。
清晰的poseData
方法加载消息数据负载
函数。这将加载poseData
从上面进入messageData
结构。poseData
是结构的数据字段。
messageData = load(“poseFile.mat”)
messageData =带字段的结构:poseData: [1x1 struct]
检查messageData.poseData
查看邮件内容。
messageData.poseData
ans =带字段的结构:MessageType: 'geometry_msgs/Twist' linear: [1x1 struct] angular: [1x1 struct]
现在可以删除MAT文件。
删除(“poseFile.mat”)
从ROS 2网络断开连接
从ROS 2网络中删除示例节点、发布者和订阅者。
exampleHelperROS2ShutDownSampleNetwork