主要内容

使用基本的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])

图中包含一个轴对象。axis对象包含一个errorbar类型的对象。

保存和加载消息

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

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

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

下一个步骤

Baidu
map