与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东方清晰的