主要内容

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

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

该出版社与订户通信具有以下特点:

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

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

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

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

  • 等待,直到收到新消息

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

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

订阅和等待消息

在MATLAB®中使用rosinit命令

rosinit
启动ROS Core... .耗时2.0077秒。在http://192.168.0.10:55007上初始化ROS master。使用NodeURI http://dcc861032glnxa64:40405/初始化全局节点/matlab_global_node_00865

使用提供的帮助函数创建一个包含多个发布者和订阅者的示例ROS网络例如帮助错误创建SampleNetwork。

示例帮助错误创建SampleNetwork

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

rostopic列表
/姿势/旋转/扫描/tf

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

rostopic信息/扫描
类型:传感器\ msgs/激光扫描发布服务器:*/节点\ 3(http://dcc861032glnxa64:43055/)订阅服务器:*/node_1(http://dcc861032glnxa64:33161/)*/node_2(http://dcc861032glnxa64:46519/)

使用罗丝订户订阅/扫描主题。如果该主题已存在于ROS网络中(如此处所示),罗丝订户自动检测其消息类型,因此您无需指定它。使用struct格式的消息可提高效率。

激光订户(“/扫描”,“数据格式”,“结构”);暂停(2)

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

scandata =接收(激光、10)
斯堪的纳达=结构体字段:消息类型:“传感器/激光扫描”标题:[1x1结构]角度最小值:-0.5467角度最大值:0.5467角度增量:0.0017时间增量:0扫描时间:0.0330范围最小值:0.4500范围最大值:10个范围:[640x1单个]强度:[]

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

图2:罗斯普劳特(斯堪的纳维亚),“最大范围”7)

图中包含一个轴对象。标题为“激光扫描”的轴对象包含类型为line的对象。

使用回调函数订阅

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

订阅/构成主题,使用回调函数示例HelpErrorSposeCallback.

robotpose=rossubscriber(“/姿势”,@example helperrosecallback,“数据格式”,“结构”)
robotpose =订阅服务器的属性:TopicName: '/pose' LatestMessage: [] MessageType: 'geometry_msgs/Twist' BufferSize: 1 NewMessageFcn: @exampleHelperROSPoseCallback数据格式:'struct'

在主工作区和回调函数之间共享数据的一种方法是使用全局变量。定义两个全局变量销售时点情报系统东方.

全球的销售时点情报系统全球的东方

全局变量销售时点情报系统东方示例HelpErrorSposeCallback方法上接收到新消息数据时/构成的话题。

等待几秒钟,以确保订户能够接收消息。最新的位置和方向数据将始终存储在销售时点情报系统东方变量。

暂停(2)位置
pos =1×3-0.0242 -0.0091 0.0095
东方
东方=1×3-0.0238 0.0103 0.0211

如果你输入销售时点情报系统东方在命令行中有几次,可以看到值不断更新。

通过清除订阅服务器变量来停止订阅服务器

清晰的机器人姿势

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

发布消息

创建一个发送ROS字符串消息到/喋喋不休主题(见使用基本ROS消息).

chatterpub=rospublisher(“/喋喋不休”,“标准msgs/字符串”,“数据格式”,“结构”)
chatterpub=具有以下属性的发布者:TopicName:“/chatter”NumSubscribers:0 IsLatching:1 MessageType:'std_msgs/String'数据格式:'struct'
暂停(2)%等待以确保已注册发布者

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

chattermsg = rosmessage (chatterpub);chattermsg。Data =“你好,世界”
喋喋不休=结构体字段:MessageType: 'std_msgs/String' Data: 'hello world'

使用罗斯托普列表来验证/喋喋不休主题可在ROS网络中找到。

rostopic列表
/颤振/姿势/旋转/扫描/tf

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

chattersub=rossubscriber(“/喋喋不休”,@exampleHelperROSChatterCallback,“数据格式”,“结构”)
chattersub=具有以下属性的订阅服务器:TopicName:“/chatter”LatestMessage:[]消息类型:“std_msgs/String”缓冲区大小:1 NewMessageFcn:@exampleHelperROSChatterCallback数据格式:“struct”

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

发送(chatterpub chattermsg)暂停(2)
ans=‘你好,世界’

这个示例HelpErrorSchatterCallback函数在您发布字符串消息时立即调用。

关闭ROS网络

从ROS网络中删除示例节点、发布者和订阅者。清除全局变量销售时点情报系统朝向

exampleHelperROSShutDownSampleNetwork清晰全球的销售时点情报系统东方

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

罗斯赫顿
使用NodeURI http://dcc861032glnxa64:40405/关闭全局节点/matlab_global_node_00865

下一个步骤