主要内容

使用基本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 '} {' / rosout '}{‘rcl_interfaces /日志’}{/扫描的}{' sensor_msgs /提升'}

要了解关于主题消息类型的更多信息,请使用ros2message创建相同类型的空消息。ros2message支持消息类型的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 intensity: 0

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

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

清晰的scanData

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

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

ROS 2消息表示为结构,消息数据存储在字段中。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: ' keepplast ' Depth: 10可靠性:'reliable'耐久性:'volatile'

使用收到从订阅者处获取数据。一旦接收到新消息,该函数将其返回并将其存储在posedata变量。指定接收消息的超时时间为10秒。

poseData =接收(poseSub, 10)
poseData =结构体字段:MessageType: 'geometry_msgs/Twist' linear: [1x1 struct] angular: [1x1 struct]

该消息的类型为geometry_msgs /扭.消息中还有两个字段:线性而且.您可以通过直接访问这些消息字段来查看它们的值。

poseData.linear
ans =结构体字段:MessageType: 'geometry_msgs/Vector3' x: -0.0270 y: 0.0344 z: -0.0305
poseData.angular
ans =结构体字段:MessageType: 'geometry_msgs/Vector3' x: -0.0274 y: -0.0329 z: -0.0272

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

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

xPose = poseData.linear.x
xPose = -0.0270

设置消息数据

您还可以设置消息属性值。创建带有类型的消息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 =结构体字段: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' header: [1x1 struct] Temperature: 100 variance: 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])

图中包含一个axes对象。axes对象包含一个类型为errorbar的对象。

保存和加载消息

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

从订阅者处获取新消息。

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”

断开活性氧2网络

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

exampleHelperROS2ShutDownSampleNetwork

下一个步骤

Baidu
map