ROS之Topic话题与Message消息,以及如何发布话题(Publish)和订阅话题(Subscribe),以及如何梳理节点之间的关系?

devtools/2024/11/25 6:30:49/

1.什么是Topic话题与Message消息?

      在 ROS 中,Topic(话题)是节点Node之间通信的通道,用于实现消息的发布和订阅,类似广播频道;Message(消息)是通过 Topic 传输的数据内容,定义了数据的结构和类型。Topic 负责建立通信桥梁,而 Message 是传递的具体数据内容,两者共同实现节点间的解耦通信。

       需要注意的是数据只能从发布者(Publish)流向订阅者(Subscribe),没有直接的反馈机制,一个节点Node可以发布到多个(话题) Topic,也可以订阅多个 (话题)Topic,当然一个 (话题)Topic 也可以有多个发布者或订阅者。

2.如何发布相应的话题信息?

       我们以python为列,先给出完整的一个发布者代码:

#!/usr/bin/env python3
#coding=utf-8import rospy
from std_msgs.msg import Stringif __name__ == "__main__":rospy.init_node("www_node")rospy.logwarn("好好学习")pub = rospy.Publisher("NB888",String,queue_size=10)rate=rospy.Rate(1)while not rospy.is_shutdown():rospy.loginfo("开始次挨揍")msg=String()msg.data ="12341234\n"pub.publish(msg)rate.sleep()

     这段代码啥意思呢,首先告诉操作系统用 Python 3 来运行该脚本,以及指定脚本文件的编码格式为 UTF-8,也就是能够显示中文。接下来导入 ROS 的 Python 接口,以及消息的标准类型。

      之后是一个主函数,然后对节点进行初始化,然后在控制台打印警告信息 "好好学习",这个没用可以删了,接着定义一个发布者,其中,"NB888"是话题的名称,String是发布的消息类型(std_msgs/String),queue_size=10是消息队列大小,指定最多缓存 10 条未发送的消息,接下来是消息发布的频率。

       最后是一个主循环的退出条件是 ROS 节点被关闭,下面是提示信息,发不内容的格式以及发布的内容是12341234,调用发布者以及发布的频率。

3.如何订阅相应的话题信息?

         同样我们给出一个完整的订阅者代码:

#!/usr/bin/env python3
# coding=utf-8import rospy
from std_msgs.msg import String        def zzp_callback(msg):rospy.loginfo(f"NB888 String: {msg.data}")if __name__ == "__main__":rospy.init_node("ma_node")  # 初始化 ROS 节点# 订阅 NB888 的 String 消息sub_2 = rospy.Subscriber("NB888", String, zzp_callback, queue_size=10)rospy.spin()  # 保持节点运行

         这段代码跟上段代码差不多, 不同点在哪呢,一是定义了一个回调函数,用来发布接受的话题信息,接着是一个主函数,节点初始化,然后订阅了NB888 的 String 消息,并保持节点的运行。呢么对比发布者和订阅者的消息,我们可以发现都是通过rospy这个大管家来实现的,然后我们运行上述两个文件:

 ​​​​​

4.节点信息如何可视化?

输入一下代码,记得启动核心roscore,我理解为相当于开机

rqt_graph

之后会出现相应的节点和话题:

当然这只有一个订阅者和发布者不需要可视化,但出现很多的节点时,当出现很多时,这个就很香。


http://www.ppmy.cn/devtools/136770.html

相关文章

湛江市社保卡申领指南:手机获取电子照片回执单号

在湛江市,社保卡的申领流程已经实现了数字化,为市民带来了极大的便利。特别是通过手机获取数码照片回执单号,这一环节更是简化了申领过程。今天,我们将详细介绍如何不去照相馆,利用手机来获取数码照片回执单号&#xf…

Electron一些概念理解

前言 版本33.2.0 记录官方文档的一些初步理解 官方文档 自写demo: electron-demo 按钮点击发送http请求     主进程 一个Electron应用项目都会有一个主进程,启动入口 只有这个主进程,运行在Node.js环境中,可以require其他模块&#xf…

el-table vue3统计计算数字

固定合计在最下列 父组件 <template><el-tablev-loading"loading"tooltip-effect"light":data"list"style"width: 100%":max-height"maxHeight"element-loading-text"拼命加载中...":header-cell-styl…

蓝桥杯每日真题 - 第20天

题目&#xff1a;&#xff08;机房&#xff09; 题目描述&#xff08;13届 C&CG题&#xff09; 解题思路&#xff1a; 这道题目可以看作在一个无向图中查找两点之间的最短路径。题目中的 n 台电脑和 n−1 根网线形成了一棵树&#xff0c;树是一个特殊的无向图&#xff0c…

el-select 和el-tree二次封装

前言 本文章是本人在开发过程中&#xff0c;遇到使用树形数据&#xff0c;动态单选或多选的需求&#xff0c;element中没有这种组件&#xff0c;故自己封装一个&#xff0c;欢迎多多指教 开发环境&#xff1a;element-UI、vue2 组件效果 单选 多选 组件引用 <treeselec…

C++知识整理day2类与对象(上)——类的定义、实例化、this指针、构造、析构、拷贝构造函数

文章目录 1.类的定义1.1 类定义的格式1.2 访问限定符1.3 类域 2.实例化2.2 对象大小 3.this指针4.类的默认成员函数5.构造函数6. 析构函数7.拷贝构造函数 1.类的定义 1.1 类定义的格式 class为定义类的关键字&#xff0c;Stu为类的名字&#xff0c;{}中为类的主体&#xff0c;…

C++ 编程指南06 - 不要泄漏任何资源

一&#xff1a;概述 资源泄漏是指程序在运行过程中分配了某些资源&#xff08;如内存、文件句柄、网络连接等&#xff09;&#xff0c;但未正确释放或归还&#xff0c;导致这些资源持续占用&#xff0c;无法被其他部分使用。 例如&#xff1a; 动态分配的内存未释放。打开的文…

理解设计模式与 UML 类图:构建稳健软件架构的基石

在软件开发的广阔天地里&#xff0c;设计模式与 UML&#xff08;统一建模语言&#xff09;类图犹如两座灯塔&#xff0c;为开发者照亮前行的道路&#xff0c;指引着我们构建出高质量、可维护且易于扩展的软件系统。今天&#xff0c;就让我们一同深入探索单一职责、开闭原则、简…