主要内容

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

活性氧的主要机制2节点交换数据发送和接收消息。消息传播的主题和每个主题都有一个惟一名称ROS 2网络。如果一个节点想分享信息,它必须使用出版商发送数据到一个话题。一个节点想要得到这些信息必须使用订阅者相同的主题。除了其独特的名字,每个主题也有一个消息类型,决定了类型允许的消息传播的特定主题。

这个publisher-subscriber通信具有以下特点:

  • 主题是用于多对多通信。多个发布者可以将消息发送到相同的主题和多个订阅者可以收到它们。

  • 发布者和订阅者通过主题是解耦的,可以按照任何顺序创建和销毁。一个消息可以发表一个主题即使没有活跃的用户。

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

  • 等到收到新的消息,或

  • 使用回调函数来处理新信息的背景

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

订阅,等待消息

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

exampleHelperROS2CreateSampleNetwork

使用ros2主题列表看到哪些话题是可用的。

ros2主题列表
/ parameter_events姿势/ rosout /扫描

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

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

使用收到等待新的消息。指定一个10秒的超时。输出scanData包含接收到的消息数据。状态显示一个消息是否成功statustext提供额外的信息状态

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

现在,您可以删除用户laserSub和相关联的节点。

清晰的laserSub清晰的detectNode

订阅使用回调函数

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

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

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

的全局变量pos东方被分配的exampleHelperROS2PoseCallback当收到新消息数据的函数/构成的话题。

函数exampleHelperROS2PoseCallback(消息)%声明全局变量来存储位置和姿态全球pos全球东方%从活性氧中提取位置和姿态信息和分配%数据全局变量。pos = [message.linear。x message.linear。y message.linear.z];东方= [message.angular。x message.angular。y message.angular.z];结束

稍等,网络出版/构成消息。显示更新后的值。

暂停(3)disp (pos)
-0.0321 -0.0161 -0.0290
disp(东方)
0.0010 0.0406 0.0129

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

停止造成用户通过清除用户变量

清晰的poseSub清晰的controlNode

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

发布消息

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

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

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

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

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

ros2主题列表
/聊天/ parameter_events / / rosout /扫描

定义一个用户的/喋喋不休的话题。exampleHelperROS2ChatterCallback被称为收到新消息时,消息中显示的字符串内容。

chatterSub = ros2subscriber (node_2,“/喋喋不休”@exampleHelperROS2ChatterCallback)
chatterSub = ros2subscriber属性:TopicName: /喋喋不休的LatestMessage: [] MessageType:“std_msgs /字符串”NewMessageFcn: @exampleHelperROS2ChatterCallback历史:“keeplast”深度:10可靠性:可靠的耐久性:“动荡”

发布的消息/喋喋不休的话题。观察到的字符串显示用户的回调函数。

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

exampleHelperROS2ChatterCallback函数被调用时,用户收到的字符串消息。

ROS 2网络断开

删除示例节点,发布者和订阅者的ROS 2网络。也明确了全局变量pos东方

清晰的全球pos东方清晰的

下一个步骤