主要内容

与ROS 2发布者和订阅者交换数据

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

这种出版者-订阅者交流具有以下特点:

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

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

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

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

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

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

订阅和等待消息

与几个发布者和订阅者创建一个示例ROS 2网络。

exampleHelperROS2CreateSampleNetwork

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

ros2主题列表
/parameter_events /pose /rosout /scan

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

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

使用收到等待新消息。指定10秒的超时时间。输出scanData包含接收到的消息数据。状态表示消息是否被成功接收statustext提供有关的附加信息状态

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

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

清晰的laserSub清晰的detectNode

使用回调函数订阅

而不是使用收到为了获取数据,你可以指定一个函数在接收到新消息时被调用。这样就可以在订阅者等待新消息时执行其他的MATLAB代码。如果你想使用多个订阅者,回调是必不可少的。

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

controlNode = ros2node (“/ base_station”);pause(5) 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.0398 -0.0109 -0.0445
disp(东方)
0.0001 -0.0068 0.0498

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

通过清除订阅者变量停止pose订阅者

清晰的poseSub清晰的controlNode

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

发布消息

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

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

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

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

使用ros2主题列表验证/喋喋不休该主题可在ROS 2网络中获得。

ros2主题列表
/chatter /parameter_events /pose /rosout /scan . /

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

chatterSub = ros2subscriber (node_2,“/喋喋不休”@exampleHelperROS2ChatterCallback)
chatterSub = ros2subscriber with properties: TopicName: '/chatter' LatestMessage: [] MessageType: 'std_msgs/String' NewMessageFcn: @exampleHelperROS2ChatterCallback History: 'keeplast' Depth: 10可靠性:'reliable'耐久性:'volatile'

发布消息到/喋喋不休的话题。注意到该字符串是由订阅者回调函数显示的。

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

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

断开与ROS 2网络的连接

从ROS 2网络中删除示例节点、发布者和订阅者。还要清除全局变量pos东方

清晰的全球pos东方清晰的

下一个步骤

Baidu
map