ROS消息是ros2中交换数据的主要容器。发布者和订阅者使用指定的消息交换数据主题在节点之间传送数据。有关发送和接收消息的更多信息,请参见与ros2发布者和订阅者交换数据.
为了识别其数据结构,每条消息都有一个消息类型.例如,来自激光扫描仪的传感器数据通常以信息的形式发送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' 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强度:0
创建的消息,scanData
,有许多与通常从激光扫描仪接收到的数据相关的字段。例如,最小传感距离存储在range_min
特性和最大感应距离range_max
财产。
您现在可以删除创建的消息。
清晰的scanData
要查看主题和服务可用的所有消息类型的完整列表,请使用ros2味精列表
.
ros2消息表示为结构,消息数据存储在字段中。MATLAB提供了查找和探索消息内容的方便方法。
使用ros2味精显示
查看消息类型的定义。
ros2味精显示geometry_msgs /扭
#这表示自由空间中的速度分解为线性和角部分。向量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'
使用收到
从订阅者处获取数据。函数一旦接收到新消息,就返回该消息并将其存储在posedata
变量。指定接收消息的超时时间为10秒。
poseData =接收(poseSub, 10)
poseData =结构体字段:MessageType: 'geometry_msgs/Twist' linear: [1x1 struct] angular: [1x1 struct]
消息的类型为geometry_msgs /扭
.消息中还有两个其他字段:线性
和角
.您可以通过直接访问这些消息字段来查看它们的值。
poseData.linear
ans =结构体字段:x: 0.0315 y: 0.0406 z: -0.0373
poseData.angular
ans =结构体字段:x: 0.0413 y: 0.0132 z: -0.0402
您可以看到,这些消息字段的每个值实际上本身就是一条消息。geometry_msgs /扭
复合消息是由两个组成的吗geometry_msgs / Vector3
消息。
这些嵌套消息的数据访问工作原理与访问其他消息中的数据完全相同。访问x
组件的线性
使用此命令的消息:
xPose = poseData.linear.x
xPose = 0.0315
您还可以设置消息属性值。创建具有类型的消息geometry_msgs /扭
.
捻= ros2message (“geometry_msgs /扭曲”)
捻=结构体字段:MessageType: 'geometry_msgs/Twist' linear: [1x1 struct] angular: [1x1 struct]
此消息的数字属性初始化为0
默认情况下。您可以修改此消息的任何属性。设置linear.y
场5。
twist.linear.y = 5;
您可以查看消息数据以确保更改生效。
twist.linear
ans =结构体字段:x: 0 y: 5 z: 0
一旦消息中填充了您的数据,您就可以与发布者和订阅者一起使用它。
ros2消息是结构。它们可以直接复制成新的信息。复制消息和原始消息都有自己的数据。
创建一个新的空消息来传递温度数据,然后创建一个副本以进行修改。
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
在周围保留一个空白的消息结构,并且在发送消息之前只在有数据时设置特定字段可能会很有用。
thermometerNode = ros2node (“/温度计”);tempPub = ros2publisher (thermometerNode,“/温度”,“sensor_msgs /温度”);tempMsgs (10) = tempMsgBlank;%预分配消息结构数组为iMeasure = 1:10%复制空白消息字段tempMsgs (iMeasure) = tempMsgBlank;记录样品温度tempMsgs (iMeasure)。温度= 20+randn*3;%只有在观测到足够的数据时才计算变化如果iMeasure >= 5 tempMsgs(iMeasure)。方差= var ([tempMsgs (1: iMeasure)均]);结束将数据传递给订阅者发送(tempPub, tempMsgs (iMeasure))结束errorbar ([tempMsgs.temperature], [tempMsgs.variance])
您可以保存消息并存储内容以备以后使用。
从订阅者获取一条新消息。
poseData =接收(poseSub, 10)
poseData =结构体字段:MessageType: 'geometry_msgs/Twist' linear: [1x1 struct] angular: [1x1 struct]
保存姿势数据到MAT文件使用保存
函数。
保存(“poseFile.mat”,“poseData”)
在将文件加载回工作区之前,清除poseData
变量。
清晰的poseData
现在,您可以通过调用负载
函数。这个加载poseData
从上到下messageData
结构。poseData
是结构体的数据字段。
messageData =负载(“poseFile.mat”)
messageData =结构体字段:poseData (1 x1结构):
检查messageData.poseData
查看消息内容。
messageData.poseData
ans =结构体字段:MessageType: 'geometry_msgs/Twist' linear: [1x1 struct] angular: [1x1 struct]
您现在可以删除MAT文件。
删除(“poseFile.mat”)
从ROS 2网络中删除样本节点、发布者和订阅者。
exampleHelperROS2ShutDownSampleNetwork