主要内容

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

ROS节点交换数据的主要机制是发送和接收消息.消息在a上传输的话题,每个主题在ROS网络中都有一个唯一的名称。如果节点希望共享信息,则使用出版商向主题发送数据。想要接收该信息的节点使用订阅者同样的话题。除了唯一的名字,每个主题还有一个消息类型,它决定了在该主题下能够传输的消息类型。

这种发布者与订阅者之间的通信具有以下特点:

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

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

主题、发布者和订阅者的概念如下图所示:

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

  • 等待,直到收到新消息

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

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

订阅并等待消息

启动ROS master在MATLAB®使用rosinit命令。

rosinit
启动ROS核心…用时0.4251秒。在http://172.29.200.150:56911上初始化ROS master。初始化全局节点/matlab_global_node_44033,使用NodeURI http://dcc396515glnxa64:46047/和MasterURI http://localhost:56911。

使用所提供的帮助器函数创建包含几个发布者和订阅者的示例ROS网络exampleHelperROSCreateSampleNetwork

exampleHelperROSCreateSampleNetwork

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

rostopic列表
/pose /rosout /scan /tf

使用rostopic信息来检查是否有节点正在发布到/扫描的话题。下面的命令显示了这一点node_3正在向它发布。

rostopic信息/扫描
类型:sensor_msgs/LaserScan发布者:* /node_3 (http://dcc396515glnxa64:35087/)订阅者:* /node_1 (http://dcc396515glnxa64:34719/) * /node_2 (http://dcc396515glnxa64:38927/)

使用rossubscriber订阅/扫描的话题。如果主题已经存在于ROS网络中(如这里所示),rossubscriber自动检测其消息类型,因此不需要指定它。为了提高效率,使用struct格式的消息。

激光“/扫描”“DataFormat”“结构”);暂停(2)

使用收到等待新消息。(第二个参数是一个以秒为单位的超时。)输出scandata包含接收到的消息数据。

scanata =接收(激光,10)
scandata =带字段的结构:MessageType: 'sensor_msgs/LaserScan'头:[1x1 struct] AngleMin: -0.5467 AngleMax: 0.5467 AngleIncrement: 0.0017 TimeIncrement: 0 ScanTime: 0.0330 RangeMin: 0.4500 RangeMax: 10 range: [640x1 single]强度:[]

某些消息类型具有与之关联的可视化器。对于LaserScan消息,rosPlot绘制扫描数据。的MaximumRange名称-值对指定最大绘图范围。

图rosPlot (scandata,“MaximumRange”7)

图中包含一个轴对象。标题为Laser Scan的axis对象包含一个类型为line的对象。

使用回调函数订阅

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

订阅/构成主题,使用回调函数exampleHelperROSPoseCallback

机器人姿势= rossubscriber(“/姿势”@exampleHelperROSPoseCallback,“DataFormat”“结构”
robotpose =带有属性的订阅器:TopicName: '/pose' LatestMessage: [] MessageType: 'geometry_msgs/Twist' BufferSize: 1 NewMessageFcn: @exampleHelperROSPoseCallback DataFormat: 'struct'

在主工作区和回调函数之间共享数据的一种方法是使用全局变量。定义两个全局变量pos而且东方

全球pos全球东方

全局变量pos而且东方分配给exampleHelperROSPoseCallback上接收到新消息数据时使用/构成的话题。

等待几秒钟,以确保订阅者能够收到消息。最新的位置和方向数据将始终存储在pos而且东方变量。

暂停(2)pos
pos =1×3-0.0133 0.0488 -0.0462
东方
东方=1×30.0385 0.0413 0.0296

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

通过清除订阅者变量停止姿势订阅者

清晰的robotpose

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

发布消息

对象发送ROS字符串消息的发布者/喋喋不休主题(见使用基本ROS消息).

聊天酒吧=俄罗斯出版商(“/喋喋不休”“std_msgs /字符串”“DataFormat”“结构”
chatterpub = Publisher with properties: TopicName: '/chatter' numsubscriber: 0 IsLatching: 1 MessageType: 'std_msgs/String' DataFormat: 'struct'
暂停(2)等待以确保发布服务器已注册。

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

Chattermsg = rosmessage(聊天酒吧);chattermsg。Data =“hello world”
chattermsg =带字段的结构:消息类型:'std_msgs/String'数据:'hello world'

使用rostopic列表要验证/喋喋不休主题在ROS网络中可用。

rostopic列表
/颤振/姿态/rosout /扫描/tf

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

Chattersub = rossubscriber(“/喋喋不休”@exampleHelperROSChatterCallback,“DataFormat”“结构”
chattersub =带有属性的订阅器:TopicName: '/chatter' LatestMessage: [] MessageType: 'std_msgs/String' BufferSize: 1 NewMessageFcn: @exampleHelperROSChatterCallback DataFormat: 'struct'

对象发布消息/喋喋不休的话题。该字符串由订阅者回调显示。

发送(chatterpub chattermsg)暂停(2)
Ans = 'hello world'

exampleHelperROSChatterCallback函数在发布字符串消息时立即被调用。

关闭ROS网络

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

exampleHelperROSShutDownSampleNetwork清晰全球pos东方

关闭ROS主机并删除全局节点。

rosshutdown
使用NodeURI http://dcc396515glnxa64:46047/和MasterURI http://localhost:56911关闭全局节点/matlab_global_node_44033。在http://172.29.200.150:56911上关闭ROS master。

下一个步骤