主要内容

与ros2发布者和订阅者交换数据

ROS 2节点以交换数据的主要机制是发送和接收消息。消息在A上传输主题每个主题在ROS 2网络中都有一个唯一的名称。如果节点想要共享信息,则必须使用出版商将数据发送到主题。想要接收该信息的节点必须使用a订户同样的话题。除了它唯一的名称,每个主题还有一个消息类型,它确定允许在特定主题中传输的消息类型。

本出版商 - 订阅者通信具有以下特征:

  • 主题用于多对多的沟通。多个发布商可以向同一主题发送消息,并且多个订阅者可以接收它们。

  • 发布者和订阅者通过主题解耦,可以以任何顺序创建和销毁。即使没有活动订阅者,也可以将消息发布到主题。

这个示例展示了如何在ros2网络中发布和订阅主题。它还展示了如何:

  • 等到收到新消息或

  • 使用回调来处理背景中的新邮件

先决条件:从ROS 2开始连接到ROS 2网络

订阅和等待消息

创建一个有几个发布者和订户的ros2网络样本。

exampleHelperROS2CreateSampleNetwork

使用ros2主题列表要查看哪些主题可用。

ROS2.主题列表
/ parameter_events

假设你想订阅/扫描的话题。使用ros2subscriber.订阅/扫描的话题。使用订阅者指定节点的名称。如果主题已存在于ROS 2网络中,ros2subscriber.自动检测其消息类型,因此不需要指定它。

检测= ros2node(“/检测”);pause(2) laserSub = ros2subscriber(detectNode,“/扫描”);暂停(2)

使用收到等待新消息。指定10秒的超时时间。输出斯堪的数据包含收到的消息数据。地位指示消息是否已成功接收StatuStext.提供有关的其他信息地位

[scanData、状态、statustext] =接收(laserSub 10);

现在可以删除订阅者laserSub和与它相关联的节点。

清晰的laserSub清晰的侦探

使用回调函数订阅

而不是使用收到要获取数据,您可以在收到新消息时指定要调用的函数。这允许其他MATLAB代码在订阅者正在等待新消息时执行。如果要使用多个订阅者,回调是必不可少的。

订阅/构成主题,使用回调函数examplehelperros2posecallball.,它将接收到的消息作为输入。在主工作区和回调函数之间共享数据的一种方法是使用全局变量。定义两个全局变量p东方

CONTROLNODE = ROS2NODE(“/基站”);Poseub = ROS2subscriber(ControlNode,“/姿势”,@ examplehelperros2posecallball);全球的p全球的东方

全局变量p东方分配在examplehelperros2posecallball.方法上接收到新消息数据时/构成的话题。

函数exampleHelperROS2PoseCallback(消息)%声明全局变量来存储位置和方向全球的p全球的东方%从ROS消息中提取位置和方向并分配%数据到全局变量。pos = [message.linear.x message.linear.y message.linear.z];东方= [message.angular.x message.angular.y message.angular.z];结尾

等待网络发布另一个时刻/构成信息。显示更新的值。

暂停(3)disp (pos)
-0.0156 0.0281 0.0175
disp(东方)
-0.0493 0.0102 -0.0113

如果你输入p东方在命令行中几次,您可以看到这些值不断更新。

通过清除订户变量来停止姿势订阅服务器

清晰的poseSub清晰的ControlNode.

笔记:除了使用全局变量,还有其他方法可以从回调函数中提取信息。例如,可以将句柄对象作为附加参数传递给回调函数。看到回调函数定义有关定义回调函数的更多信息的文档。

发布消息

创建一个发送ROS 2字符串消息的发布者/喋喋不休的话题。

Chatterpub = ros2publisher(node_1,“/喋喋不休”“std_msgs / string”);

创建和填充ROS 2消息以发送到/喋喋不休的话题。

chattermsg = ros2message(Chatterpub);chattermsg.data ='你好,世界';

使用ros2主题列表来验证/喋喋不休ROS 2网络中的主题可用。

ROS2.主题列表
/ chatter / parameter_events / pose / scan

为此定义订阅者/喋喋不休的话题。examplehelperros2chattercallback.在接收到新消息时调用,并显示消息中的字符串内容。

chattersub = ros2subscriber(node_2,“/喋喋不休”,@ examplehelperros2chattercallback)
chatterSub = ros2subscriber with properties: TopicName: '/chatter' LatestMessage: [] MessageType: 'std_msgs/String' NewMessageFcn: @exampleHelperROS2ChatterCallback History: 'keeplast' Depth: 10 Reliability: 'reliable' Durability: 'volatile'

发布消息/喋喋不休的话题。观察订单回调显示字符串。

发送(chatterPub chatterMsg)暂停(3)
ans ='hello world'

examplehelperros2chattercallback.函数在订阅者收到字符串消息时调用。

断开ROS 2网络连接

从ROS 2网络中删除样本节点,发布者和订阅者。还清除全局变量p东方

清晰的全球的p东方清晰的

下一步