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网络中移除样本节点、发布者和用户。还要清除全局变量pos
和东方
清晰的全球pos东方清晰的