对rostopic的一些新认识

12.ROS编程学习:ROS常用指令 阅读详情

学习使用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........






















ROS命令行工具 rostopic 1.列出目前所有正在进行的话题: rostopic list 结果如下: /rosout /rosout_agg /turtle1/cmd_vel /turtle1/color_sensor /turtle1/pose 2.从键盘发布消息: 话题 数据结构 具体数据 rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear: x: 0.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0 阅读详情

相关推荐

从零开始用ROS命令行控制小海龟:rosnode/rostopic/rosservice全流程演示

本文通过经典的ROS小海龟仿真器,手把手演示了如何使用rosnode、rostopic和rosservice等核心命令行工具。从启动ROS Master、控制海龟运动,到节点管理、话题通信、服务调用及数据记录回放,系统讲解了ROS分布式通信的完整流程与调试技巧,帮助初学者快速掌握ROS命令行操作精髓。

weixin_29313239的博客 302

rostopic pub用法

终于终于搞明白了! rostopic pub 能用来干嘛? 粗俗一点讲,就是可以不用改源程序,通过在话题的发布中改变一些参数的值,然后用subscriber接收 使用格式: rostopic pub +话题名+话题类型+需要改的参数以及值 1.话题名:粗俗一点讲,就是看源程序里面 例如:pub = rospy.Publisher(‘complex’,Complex) 其中的引号里面的就是话题名 2.话题类型: 格式:package-name/type-name 就是功能包的名字/消息类型 例如功能包是mya

weixin_42875283的博客 1万+

ROStopic 通信方式

操作演示,对 topic 通信方式的理解请看:点击打开链接开启终端,运行 roscore新开一个终端(已经安装好(ros-<distro>-ros-tutorials 包,否则运行  sudo apt-get install ros-<distro>-ros-tutorials ,<distro> 为 ROS 发行版本名称),运行 rosrun turtles...

Nikki_o3o的博客 5473

rostopic pub

rostopic pub -r 10 /cmd_vel geometry_msgs/Twist -- '[0.2,0,0]' '[0,0,0.5]' or rostopic pub /cmd_vel geometry_msgs/Twist -r 10 -- '[0.2,0,0]''[0,0,0.5]' 语法: rostopic pub [topic] [msg_type] [args...

weixin_40721097的博客 4225

ROS学习--rostopic工具

rostopic包含rostopic命令行工具,用于显示有关ROS主题的调试信息,包括发布者,订阅者,发布率和ROS消息。它还包含一个实验性Python库,用于动态获取有关主题的信息并与之交互。 rostopic bw (bandwidth 带宽) $ rostopic bw /topic_name 注意:报告的带宽是接收的带宽。如果存在网络连接问题,或者如果rostopic跟不上发布者,则报告的数字可能低于实际带宽。 rostopic delay $ rostopic delay /topic_nam

努力加油,冲~ 8069

详细的Rostopic命令系列(包括消息发布等实例操作)

详细的rostopic命令行指令,包含有“如何使用rostopic pub发布带有header类类型对象的消息,如何发布带有map键值对类型的数据“等操作,还有响应的操作示例

超级霸霸强的博客 3万+

rostopic list 、rosbag说明

rostopic rosbag

胜天半子祁厅的博客 3310

ROS学习(1):初识小海龟

ROS的安装以及环境的配置就不多做解释了,搜素一下就有 1.启动ROS roscore 出现这样结果证明ros已经启动,接下来便是启动小海龟节点。 2.启动小海龟节点 重新打开一个终端输入: rosrun turtlesim turtlesim_node rosrun:启动新的节点 turtlesim:功能包 turtlesim_node:功能包下的节点 出现如图所示的小海龟,证明节点启动成功。 3.启动键盘控制 rosrun turtlesim turtle_teleop_key 将鼠标放.

bigbosszh的博客 1372

ROS入门-常见的rostopic命令及其用法的示例

从ROS包(.bag)文件中回放消息,而不是实时显示。通过此命令,您可以获取特定话题的详细信息,包括消息类型、发布者和订阅者等。:指定要显示的消息数量,默认为0(显示所有消息)。使用此命令,您可以在终端上实时显示特定话题的消息内容。使用此命令,您可以以指定的速率持续发布消息到话题。通过这个命令,您可以手动发布消息到指定的话题。使用此命令,您可以显示话题的最新消息内容。:不要以字符串形式打印字符串字段的内容。此命令将显示当前系统中可用的所有话题。此命令将显示指定话题的发布频率。将只显示最新的1条消息。

点云兔子的博客 3282

ROS学习篇(七)rostopic消息记录、回放、转.txt

一、通过bag文件记录话题消息 当发布话题的节点运行后,可以通过rostopic list 列出当前运行的话题,然后记录: mkdir bagfile cd bagfile rosbag record -a #记录所有的话题 当消息记录完成后,结束ctrl+c终止record的命令行,在新建的bagfile文件中会生成2018-08-**.bag文件。...

Tansir94的博客 2万+

ros自学系列之rostopic

本章博客是网络公开课 “[ROS tutorial] Chapter 2.1 : ROS Topics #Part 1”, 的上课笔记,网址链接为https://www.youtube.com/watch?v=wOlfT8GUcCk&index=4&list=PLK0b4e05LnzZWg_7QrIQWyvSPX2WN2ncc

zhangdadadawei的博客 1982

ROS中运行rostopic echo话题名 出现 Cannot load message class错误

当运行ROS时,在新开启的一个终端运行rostopic echo话题名时,出现ERROR: Cannot load message class for [plumbing_pub_sub/Person]. Are your messages built?(其中Person为自定义的message类型) 解决方法:这是因为这个话题名的消息类型并不是ros本身拥有的,而是自定义的,因此我们须在这个新的终端中先刷新一下环境 source ./devel/setup.bash配置工作空间,用于刷新环境,将当前的工

lyydcg的博客 6010

ROS自学笔记8--常用命令

1 rospack 查找某个okg的地址 $rospack find package name 列出本地所有pkg $rospack list 2 roscd 跳转到某个package路径下 roscd package_name 3 rosls 列出pkg下面所有的文件信息 rosls package_name 4 rosed 编辑pkg中的文件...

二毛的博客 1849

【入门 ROS2】ros常用命令

清理已经关闭但仍在ROS Master中注册的节点。:发布消息到某个话题(一次性或以固定频率)。:将参数服务器中的参数保存到YAML文件中。:显示某个话题的信息,包括发布者和订阅者。:打印某个话题的消息内容到终端。:打印指定数量的消息后退出。:以CSV格式打印消息内容。:列出当前运行的所有节点。:列出当前存在的所有话题。:显示某个话题的发布频率。:列出当前存在的所有服务。:调用某个服务并传递参数。

qq_28791753的博客 1493

高德地图+Three.js实战:手把手教你打造数字农场3D可视化大屏(附完整源码)

本文详细介绍了如何利用高德地图JS API与Three.js技术栈,构建一个功能强大的数字农场3D可视化大屏。文章从技术选型、架构设计出发,深入讲解了坐标对齐、图层管理、性能优化等核心工程实践,并提供了完整的模块化代码示例,旨在为智慧农业及类似场景的3D地理可视化项目提供一套可复用的解决方案。

k8s6orchestrator的博客 890

新代永久解锁西门子smart S7-200PLC 上传程序步骤

西门子 SMART S7-200 PLC 程序上传步骤 打开编程软件 或左下角依次打开 程序 所有程序 Siemens Automation Simatic STEP 7-MicroWIN SMART V2.4 STEP 7-MicroWIN SMART 技术交流 plcjiesuo1 2. 确认plc电源端以及输入电压; 3.用网线连接plc与电脑技术交流 plcjiesuo1 4.plc通电; 5.打开编程软件,双击通讯 6.按照...

m0_60773720的博客 2万+

2、ROS命令行工具

发布话题消息,按下Ctrl+C,指令发布停止。

luoshuihean的博客 227

生成模型实战 | VQ-GAN(Vector Quantized-Generative Adversarial Network)

向量量化生成对抗网络 (Vector Quantized-Generative Adversarial Network, VQ-GAN) 结合了向量量化变分子自编码器 (VQ-VAE) 和生成对抗网络 (GAN) 的优势,通过向量量化 (Vector Quantised, VQ) 构建离散潜空间,结合感知损失与对抗损失,在保持语义一致性的同时能够生成纹理细节丰富的图像。在本节中,我们将详细解释 VQ-GAN 的技术原理和各个组成,并使用 PyTorch 从零开始实现 VQ-GAN。

盼小辉丶的博客 6669

rostopic pub的一些问题汇总解决

1使用rostopic pub给/cmd_vel topic指定了速度,但是gazebo中的模拟机器人并未发生运动 介绍: 打开模拟器 模拟器打开。记录位置执行命令,就是手动控制小车运动的查看节点,发现了控制的那个节点(如下如下)/robot_teleop 并 用rosnode info查看 (接下来有没有发现,publications里边有两个topic,其中的那个叫做/cmd_vel_mux/...

muyutianzhilan的博客 6893

【RBF预测】基于粒子群算法优化RBF神经网络实现数据回归预测含Matlab源码

1 简介 原油含水率预测对于确定油井水,油层位以及估计原油产量有着非常重要意义.BP神经网络是最近常用的原油含水率预测方法,然而,由于BP神经网络存在容易陷入局部极小值,收敛速度慢等问题,影响了其预测的实用性和准确性,对此,提出基于粒子群优化RBF神经网络(PSO-RBFNN)的原油含水率预测方法,粒子群优化算法用于RBF神经网络参数优化.在分析原油含水率预测的影响因素基础上,建立粒子群优化RBF神经网络的原油含水率预测模型.实验结果表明,在原油含水率预测中,基于粒子群优化RBF神经网络比BP神经网络有着

qq_59747472的博客 1232

【异常检测】【EfficientAD】论文简单梳理与代码实现

EfficientAD作为较近的一篇异常检测网络,主要还是从S-T网络入手,对齐进行了相关改进。修改特征提取器引入自动编码器hard loss以及惩罚项。

胡侃有料的博客 2855

rostopic pub通过命令行发布话题

作用 使用指定的话题名称发布消息 用法 rostopic pub [话题名称] [消息类型] [参数] Usage: rostopic pub /topic type [args...] 选项 -h, --help show this help message and exit. -v print verbose output. -r RATE, --rate=RATE ...

Keep Learning, Keep Growing, Keep Succeeding! 1万+

Vue/React动态页面爬取:不用Playwright也能抓全数据的3个JS逆向技巧(附Python代码)

Vue/React动态页面的爬取核心是“绕过渲染,直达数据”:90%的场景下,API接口或初始数据足以满足需求,Playwright等渲染工具只应作为“最后手段”(如无API、参数加密极复杂)。记住:爬虫的效率与“模拟真实浏览器的程度”成反比——越少模拟浏览器,效率越高。掌握JS逆向技巧,既能避开Playwright的性能坑,又能提升爬虫的抗反爬能力,这才是动态页面爬取的最优解。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1598
上一篇: 将launch文件转换成关系图-----roslaunch_to_dot
下一篇: rgbdslamv2安装
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值