对rostopic的一些新认识

本文探讨了ROS中topic的工作原理,包括节点如何通过topic通信,topic与node的关系,以及多个发布者和订阅者的情况。通过一系列实验,作者发现topic的存在依赖于至少有一个发布者或订阅者,当所有相关节点关闭后,topic也会消失。rostopic pub实际上是临时创建一个节点来发布消息。

学习使用ros的时候遇到的一个很“实际”的问题:一个节点怎样通过topic向另一个节点发送消息呢?

其实已有教程通过写简单发布器和订阅器来介绍如何利用topic进行节点间通信了:ROS与Python入门教程-写简单发布器和订阅器

看起来一个很简单的操作,我却想不通一些问题:

在talker.py里面实现了定义topic的publisher、定义了节点、发布消息这三件事,为什么topic和node要在一个程序里面定义,topic和node不应该是相对比较独立的两个东西吗?

命令行里面通过'rostopic pub'不是可以直接从topic发布msg吗?那么应该可以把topic的定义单独用一个程序实现,这样的话应该可以单独“启动”一个topic,但是我却没找到这种方法。

难道topic是必须由一个node来发布?这样的话node结束时topic不也没了?一个topic不是应该可以有多个订阅者和发布者吗?

(这个时候我对发布者、话题、订阅者的关系理解还比较抽象,认为topic是一个“中间商”,发布者和订阅者不需要直接接触,而是分别通过topic来发出和接收msg,topic就像是中间的一个buffer)

自己的理解和实际的现象产生了矛盾,使我很困惑。

于是尝试去了解ros的通信原理。。。

在阅读了两篇文章后,才发现机制不是原来想象的那么简单。

ROS通信原理介绍

ROS 通讯层模型


还存在这样一个东西:

Master node: master node 给ros系统中其他节点提供命名与注册的服务。它跟踪节点中的publisher与subscriber,service 的server与client,记录其他节点的位置(uri标明,host与port),并将这些信息通知给需要建立链接的节点。

Master可以认为是一个查询表,各个节点可以查询它要把消息发送到哪个节点。

我总结了一下差不多是这样:master通过每个node在“查询表”里面注册的topic信息来知道哪些node之间有需要传输数据的这种联系,然后告诉node如何去找自己需要传输数据的其他node,node知道目标node后,两个node就之间建立tcp连接来传输数据(没有中间商赚差价)

然而还是不知道怎么实现一个topic对应多个订阅者和发布者的,topic是否是独立于node的(比如发布topic1的节点node1如果关闭了,topic1的另一个发布者node2怎么办呢)

没办法,只有先看看实际是怎么样的一种情况。


于是我用talk.py和listener.py来做实验。

实验一:首先测试了多个发布者对一个topic发布消息以及多个订阅者对一个topic订阅消息(多开几个terminal,运行两个talker和两个listener),没有问题。

实验二:看看topic没有对应的发布者和订阅者会发生什么——在talker.py的程序里面把topic的名字改为"chatter_1",在listener.py里面把topic的名字改成"chatter_2",分别运行两个节点,这时两个节点当然不能通信,但是系统没有报错。这时运行rostopic list查看有哪些topic,发现列表里面存在/chatter_1和/chatter_2这两个节点。

实验三:如果节点关闭了,对应的topic会怎么样。在实验二的基础上,先关闭talk.py节点,再运行rostopic list查看topic列表的变换,发现/chatter_1不见了,再关闭listener.py节点,查看topic列表,发现/chatter_2不见了。

实验四:运行rostopic pub /chatter_3 /std_msg/String h 向chatter_3发布 消息,运行rostopic list查看topic列表,发现有/chatter_3


结论:topic是不能独立存在的,必须有node发布或者订阅才会存在topic,而且只要有发布者或者订阅者topic就会存在,但如果发布者和订阅者都不存在了,topic也就不存在了。


关于rostopic pub对topic发布msg其实原理也一样,实际上会生成一个节点来向这个topic发布消息。



虽然没有node来订阅这个/chatter_3但它却有它的发布者/rostopic_26077_153........






















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值