主要内容

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

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

这种出版商与订户之间的通信具有以下特点:

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

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

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

  • 等待直到收到新消息,或者

  • 使用回调在后台处理新消息

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

订阅和等待消息

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

exampleHelperROS2CreateSampleNetwork

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

ros2主题列表
/ parameter_events

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

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

使用收到等待新消息。指定10秒的超时时间。输出scanData包含接收的消息数据。

scanData =接收(laserSub, 10);

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

清晰的laserSub清晰的detectNode

使用回调函数订阅

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

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

controlNode = ros2node (“/ base_station”);poseSub = ros2subscriber (controlNode,“/姿势”, @exampleHelperROS2PoseCallback);全球pos全球东方

的全局变量pos东方exampleHelperROS2PoseCallback方法上接收到新消息数据时/构成的话题。

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

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

暂停(3)disp (pos)
-0.0178 0.0285 -0.0029
disp(东方)
-0.0464 -0.0324 0.0222

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

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

清晰的poseSub清晰的controlNode

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

发布消息

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

chatterPub = ros2publisher (node_1,“/喋喋不休”“std_msgs /字符串”);

创建并填充一个ROS 2消息发送到/喋喋不休的话题。

chatterMsg = ros2message (chatterPub);chatterMsg。data =“hello world”

使用ros2主题列表来验证/喋喋不休topic在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网络中移除样本节点、发布者和用户。还要清除全局变量pos东方

清晰的全球pos东方清晰的

下一个步骤