主要内容

处理基本的ROS 2消息

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

确定它的数据结构,每个消息都有一个消息类型。例如,传感器数据从一个激光扫描仪通常发送的消息类型sensor_msgs /提升。每个消息类型标识消息中包含的数据元素。每条消息类型名称的组合包名称,后跟一个斜杠/,和类型名称:

MATLAB®支金宝app持许多ROS 2消息类型常见的机器人应用程序。这个示例检查的一些方法来创建、检查、和填充ROS 2 MATLAB中的消息。

先决条件:开始使用ROS 2,连接到一个ROS 2网络

发现消息类型

使用exampleHelperROS2CreateSampleNetwork填充活性氧与三个节点和设置样品2网络出版商和用户对特定主题。

exampleHelperROS2CreateSampleNetwork

使用ros2主题列表- t寻找可用的主题和它们相关的消息类型。

ros2主题列表- t
主题MessageType _____________________ _________________________________ {' / parameter_events '} {' rcl_interfaces / ParameterEvent '}{/构成的}{geometry_msgs /“扭转操作”}{' / rosout '} {‘rcl_interfaces /日志’}{/扫描的}{' sensor_msgs /提升'}

找到更多关于这个话题的消息类型,使用ros2message创建一个空的相同类型的消息。ros2message金宝app支持消息类型选项卡完成。快速完成消息类型名称,类型的前几个字符的名字你想要完成,然后按下选项卡关键。

scanData = ros2message (“sensor_msgs /提升”)
scanData =结构体字段:MessageType:“sensor_msgs /提升”标题:[1 x1 struct] angle_min: 0 angle_max: 0 angle_increment: 0 time_increment: 0 scan_time: 0 range_min: 0 range_max: 0范围:0强度: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属性:TopicName:“/姿势”LatestMessage: [] MessageType:“geometry_msgs /扭曲”NewMessageFcn:[]历史:“keeplast”深度:10可靠性:可靠的耐久性:“动荡”

使用收到获取用户的数据。一旦收到新的消息,并将其存储在函数返回它posedata变量。指定一个10秒的超时接收消息。

poseData =接收(poseSub, 10)
poseData =结构体字段:MessageType: geometry_msgs /扭曲的线性:[1 x1 struct]角:[1 x1 struct]

的消息都有一个类型geometry_msgs /扭。有两个其他领域的信息:线性。你可以看到这些消息字段的值直接访问他们。

poseData.linear
ans =结构体字段:MessageType: ' geometry_msgs / Vector3 ' x: 0.0206 y: -0.0468 z: -0.0223
poseData.angular
ans =结构体字段:MessageType: ' geometry_msgs / Vector3 ' x: -0.0454 y: -0.0403 z: 0.0323

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

这些嵌套消息的数据访问和访问数据完全相同的工作在其他消息。访问x组件的线性消息使用这个命令:

xPose = poseData.linear.x
xPose = 0.0206

设置消息数据

你也可以设置消息属性值。创建一个消息类型geometry_msgs /扭

捻= ros2message (“geometry_msgs /扭曲”)
捻=结构体字段:MessageType: geometry_msgs /扭曲的线性:[1 x1 struct]角:[1 x1 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 /温度的标题:[1 x1 struct]温度:0方差:0

修改温度财产tempMsg和注意的内容tempMsgBlank保持不变。

tempMsgCopy。温度= 100
tempMsgCopy =结构体字段:MessageType: sensor_msgs /温度的标题:[1 x1 struct]温度:100方差:0
tempMsgBlank
tempMsgBlank =结构体字段:MessageType: sensor_msgs /温度的标题:[1 x1 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])

图包含一个坐标轴对象。坐标轴errorbar类型的对象包含一个对象。

保存和加载信息

您可以保存信息和内容存储起来,供以后使用。

从用户得到一个新的消息。

poseData =接收(poseSub, 10)
poseData =结构体字段:MessageType: geometry_msgs /扭曲的线性:[1 x1 struct]角:[1 x1 struct]

造成数据保存到垫文件使用保存函数。

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

在装货前的文件回到工作区,清除poseData变量。

清晰的poseData

现在,您可以通过调用加载消息数据负载函数。这个加载poseData从上面的messageData结构。poseData是一个结构体的数据字段。

messageData =负载(“poseFile.mat”)
messageData =结构体字段:poseData (1 x1结构):

检查messageData.poseData查看消息内容。

messageData.poseData
ans =结构体字段:MessageType: geometry_msgs /扭曲的线性:[1 x1 struct]角:[1 x1 struct]

现在,您可以删除垫文件。

删除(“poseFile.mat”)

ROS 2网络断开

删除示例节点,从ROS 2网络出版商和用户。

exampleHelperROS2ShutDownSampleNetwork

下一个步骤