主要内容

使用基本ROS 2消息

本例研究了在MATLAB中创建、检查和填充ROS 2消息的各种方法,这在机器人应用程序中是常见的。

ROS公司信息是ROS 2中交换数据的主要容器。发布者和订阅者使用指定的消息交换数据话题在节点之间传送数据。有关发送和接收消息的更多信息,请参阅与ROS 2发布者和订阅者交换数据.

为了识别其数据结构,每条消息都有一个消息类型例如,来自激光扫描仪的传感器数据通常以以下类型的消息发送传感器信号/激光扫描。每个消息类型标识消息中包含的数据元素。每个消息类型名称都是包名称、后接正斜杠/和类型名称的组合:

MATLAB®支持机器人应用程序中常见的许多ROS 2消息类型。本例研究了在MATLAB中创建、检查和填充ROS 2消息的一些方法。

前提条件:ROS 2入门,连接到ROS 2网络

查找消息类型

使用示例HelperROS2CreateSampleNetwork用三个节点填充ROS 2网络,并就特定主题设置示例发布者和订阅者。

示例HelperROS2CreateSampleNetwork

使用ros2主题列表-t以查找可用主题及其关联的消息类型。

玫瑰色2话题 列表 -t吨
主题消息类型_____________________    _________________________________{'/parameter_events'}{'rcl_interfaces/ParameterEvent'}{'/pose'}{'geometry_msgs/Twist'}{'/rosout'}{'rcl_interfaces/Log'}{“/scan”}{“sensor_msgs/LaserScan”}

要了解有关主题消息类型的更多信息,请使用ros2消息创建相同类型的空消息。ros2消息支持消息类型的制表符补全。要快速填写消息类型名称,请键入要填写的名称的前几个字符,然后按选项卡键。

scanData=ros2消息(“传感器信号/激光扫描”)
扫描数据=带字段的结构:消息类型:“sensor_msgs/LaserScan”标题:[1×1结构]角度最小值:0角度最大值:0角度增量:0时间增量:0扫描时间:0范围最小值:0范围最大值:0范围:0强度:0

创建的消息,扫描数据,有许多与通常从激光扫描仪接收的数据相关的字段。例如,最小感应距离存储在范围_分钟特性和最大感应距离最大范围属性。

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

清楚的扫描数据

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

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

ROS 2消息表示为结构,消息数据存储在字段中。MATLAB提供了查找和探索消息内容的便捷方法。

使用ros2味精秀查看消息类型的定义。

玫瑰色2消息 显示 geometry_msgs/扭曲
#这表示自由空间中被分解成线性部分和角部分的速度。矢量3线性矢量3角度

如果您订阅/姿势主题,您可以接收和检查发送的消息。

控制节点=ros2节点(“/base_station”);poseSub=ros2subscriber(控制节点,“/姿势”,“geometry_msgs/扭曲”)
poseSub=具有以下属性的ros2subscriber:主题名称:“/pose”最新消息:[]消息类型:“geometry_msgs/Twist”新消息Fcn:[]历史记录:'keeplast'深度:10可靠性:“可靠”耐久性:“挥发性”

使用接收从用户获取数据。收到新消息后,函数将返回该消息并将其存储在波塞达塔变量。指定接收消息的超时时间为10秒。

poseData=接收(poseSub,10)
姿势数据=具有字段的结构:消息类型:“geometry_msgs/Twist”线性:[1×1结构]角度:[1×1结构]

消息的类型为几何_msgs/扭曲。消息中还有其他两个字段:线性的有角度的。您可以通过直接访问这些消息字段来查看它们的值。

位置数据线性
安=带字段的结构:消息类型:“geometry_msgs/Vector3”x: 0.0206个y: -0.0468z: -0.0223
位置数据.角度
安=带字段的结构:消息类型:“geometry_msgs/Vector3”x: -0.0454y: -0.0403号z: 0.0323个

您可以看到,这些消息字段的每个值实际上本身就是一条消息。geometry_msgs/扭曲是由两部分组成的复合消息geometry_msgs/矢量3信息。

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

xPose=poseData.linear。x个
x位置=0.0206

设置消息数据

您还可以设置消息属性值。创建类型为的消息geometry_msgs/扭曲.

扭转=ros2消息(“geometry_msgs/扭曲”)
扭转=带字段的结构:消息类型:“geometry_msgs/Twist”线性:[1×1结构]角度:[1×1结构]

此消息的数字属性已初始化为0默认情况下。您可以修改此消息的任何属性。设置l线性。字段设置为5。

扭曲线性y=5;

您可以查看消息数据以确保更改生效。

扭转线性
安=带字段的结构:消息类型:“geometry_msgs/Vector3”x: 0个y: 5个z: 0个

一旦消息中填充了您的数据,您就可以将其用于发布者和订阅者。

复制消息

ROS 2消息是结构。可以直接复制它们以生成新消息。副本和原始消息都有各自的数据。

制作一条新的空消息来传递温度数据,然后制作一份副本进行修改。

tempMsgBlank=ros2消息(“传感器信号/温度”);tempMsgCopy=tempMs空白
临时消息副本=带字段的结构:消息类型:“sensor_msgs/Temperature”标题:[1×1结构]温度:0方差:0

修改温度属性,并注意tempMsg空白保持不变。

tempMsgCopy.temperature=100
临时消息副本=带字段的结构:消息类型:“sensor_msgs/Temperature”标题:[1×1结构]温度:100方差:0
临时消息空白
tempMsg空白=具有字段的结构:消息类型:“sensor_msgs/Temperature”标题:[1×1结构]温度:0方差:0

在周围保留空白消息结构,并且在发送消息之前仅在有数据时设置特定字段,这可能会很有用。

温度计节点=ros2节点(“/温度计”);tempPub=ros2publisher(温度计节点,“/温度”,“传感器信号/温度”);tempMsgs(10)=tempMsgBlank;%预分配消息结构数组
对于i测量=1:10%复制空白消息字段tempMsgs(iMeasure)=临时消息空白;%记录样品温度tempMsgs(iMeasure).温度=20+兰登*3;%只有在观察到足够的数据后才能计算变化
    如果iMeasure>=5tempMsgs(iMeasure).variance=var([tempMgs(1:iMeasure.temperature]);结束
    
    %将数据传递给订阅者发送(tempPub,tempMsgs(iMeasure))结束errorbar([温度],[温度变化])

保存和加载消息

您可以保存信息并存储内容以备将来使用。

从订阅者处获取新消息。

poseData=接收(poseSub,10)
位置数据=带字段的结构:消息类型:“geometry_msgs/Twist”线性:[1×1结构]角度:[1×1结构]

使用节约功能。

保存(“poseFile.mat”,“poseData”)

在将文件加载回工作区之前,请清除位置数据变量。

清楚的姿势数据

现在可以通过调用负载功能。这将加载姿势数据从上方进入消息数据结构。位置数据是结构的数据字段。

messageData=加载(“poseFile.mat”)
消息数据=带字段的结构:位置数据:[1×1结构]

检查消息数据.poseData查看消息内容。

消息数据.poseData
安=带字段的结构:消息类型:“geometry_msgs/Twist”线性:[1×1结构]角度:[1×1结构]

现在可以删除MAT文件。

删除(“poseFile.mat”)

断开与ROS 2网络的连接

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

示例HelperROS2ShutDownSampleNetwork

接下来的步骤