ROS2 :Node 与 Topic 初探(Python)

在 ROS2 中,节点(Node)话题(Topic) 是最基础、最常用的通信机制。掌握如何查询、监控、调试它们,是每一位 ROS2 开发者必备的技能。本文将简单介绍 ROS2 中 Node 和 Topic 的基本操作,包括命令行工具和 Python 代码实现,并教你如何快速定位“谁在发布、谁在订阅”。

1. 概念速览

  • Node:ROS2 图中的一个计算单元,可以完成特定任务(如读取传感器、控制电机)。每个节点都有自己的命名空间。
  • Topic:节点间传递消息的“总线”。节点可以发布(publish) 消息到某个话题,也可以订阅(subscribe) 该话题接收消息。话题采用异步、多对多的通信模式。

2. 常用命令行操作(查询、列表、结构、数据、频率)

以下命令基于 ROS2 Humble,在其他版本中基本一致。

2.1 节点操作

目的命令
列出所有活跃节点ros2 node list
查看节点详细信息ros2 node info <node_name>
列出节点中定义的话题/服务ros2 node info 输出中会显示
$ ros2 node list /talker /listener $ ros2 node info /talker /talker Subscribers: /parameter_events: rcl_interfaces/msg/ParameterEvent Publishers: /chatter: std_msgs/msg/String /parameter_events: rcl_interfaces/msg/ParameterEvent Services: /talker/describe_parameters: rcl_interfaces/srv/DescribeParameters ...

2.2 话题操作

目的命令
列出所有活跃话题ros2 topic list(加 -t 可显示消息类型)
查看话题详细信息(类型、发布/订阅者数量)ros2 topic info <topic_name>
实时打印话题数据ros2 topic echo <topic_name>
查看话题发布频率(Hz)ros2 topic hz <topic_name>
查看话题带宽(B/s)ros2 topic bw <topic_name>
手动发布数据到话题ros2 topic pub <topic_name> <msg_type> '<data>'
查找使用某消息类型的话题ros2 topic find <type_name>
查看话题的消息结构ros2 interface show <msg_type>ros2 topic echo --once
# 列出话题和消息类型 $ ros2 topic list -t /chatter [std_msgs/msg/String] /parameter_events [rcl_interfaces/msg/ParameterEvent] /rosout [rcl_interfaces/msg/Log] # 查看话题详细信息 $ ros2 topic info /chatter Type: std_msgs/msg/String Publisher count: 1 Subscription count: 1 # 实时监控数据 $ ros2 topic echo /chatter data: "Hello ROS2" # 查看发布频率(稳定后才能显示) $ ros2 topic hz /chatter average rate: 10.012 Hz

3. 如何知道谁发布、谁订阅?

两种方法:

  1. 使用 ros2 node info:对每个节点查看其 publishers 和 subscribers 列表。
  2. 使用 ros2 topic info:只告诉你发布者和订阅者的数量,不直接给节点名。要获得节点名,可以结合 ros2 node listros2 node info 逐个查询。

更快捷的技巧
运行 rqt_graph 图形化工具,它会动态绘制出所有节点、话题以及发布/订阅关系。

rqt_graph

4. Python 代码示例:创建一个发布者节点和一个订阅者节点

我们将编写两个简单的 Python 节点:

  • talker:每秒发布一次字符串消息到 /chatter 话题。
  • listener:订阅 /chatter 话题并打印收到的消息。

4.1 创建功能包

source /opt/ros/humble/setup.bash ros2 pkg create --build-type ament_python my_py_nodes --dependencies rclpy std_msgs

4.2 编写发布者节点 talker.py

my_py_nodes/my_py_nodes/ 目录下创建 talker.py

#!/usr/bin/env python3 import rclpy from rclpy.node import Node from std_msgs.msg import String import time class Talker(Node): def __init__(self): super().__init__('talker') # 创建发布者,话题为 /chatter,队列大小10 self.publisher_ = self.create_publisher(String, '/chatter', 10) timer_period = 1.0 # 秒 self.timer = self.create_timer(timer_period, self.timer_callback) self.counter = 0 def timer_callback(self): msg = String() msg.data = f'Hello ROS2, count: {self.counter}' self.publisher_.publish(msg) self.get_logger().info(f'Publishing: "{msg.data}"') self.counter += 1 def main(args=None): rclpy.init(args=args) node = Talker() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()

4.3 编写订阅者节点 listener.py

在相同目录下创建 listener.py

#!/usr/bin/env python3 import rclpy from rclpy.node import Node from std_msgs.msg import String class Listener(Node): def __init__(self): super().__init__('listener') # 创建订阅者,话题为 /chatter,回调函数为 callback self.subscription = self.create_subscription( String, '/chatter', self.callback, 10 ) self.subscription # 防止被垃圾回收 def callback(self, msg): self.get_logger().info(f'I heard: "{msg.data}"') def main(args=None): rclpy.init(args=args) node = Listener() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()

4.4 修改 setup.py

entry_points 中添加两个可执行程序:

entry_points={ 'console_scripts': [ 'talker = my_py_nodes.talker:main', 'listener = my_py_nodes.listener:main', ], },

4.5 编译与运行

colcon build --packages-select my_py_nodes source install/setup.bash

终端1(启动发布者):

ros2 run my_py_nodes talker

终端2(启动订阅者):

ros2 run my_py_nodes listener

现在应该能看到订阅者终端打印出发布者发送的消息。

5. 调试与监控实例

在运行上述两个节点后,可以实践之前的命令:

# 查看所有节点 ros2 node list # 输出: /talker /listener # 查看话题列表 ros2 topic list -t # 查看 /chatter 的发布/订阅关系 ros2 node info /talker # 看到 Publisher: /chatter ros2 node info /listener # 看到 Subscriber: /chatter # 实时打印话题数据 ros2 topic echo /chatter # 查看话题发布频率(发布者以 1Hz 发送) ros2 topic hz /chatter # 输出:average rate: 1.000 Hz

6. 进阶操作:ros2 topic pub 手动发布

即使没有发布者节点,也可以手动向话题发送消息。例如:

ros2 topic pub /chatter std_msgs/msg/String "{data: 'Manual message'}" --once

如果希望以固定频率重复发送,加 --rate 2 参数(每秒2次)。

7. 常见问题与技巧

  • 话题消息类型不匹配:使用 ros2 topic info 查看期望类型,再与你的消息对比。
  • 看不到数据:检查是否所有节点使用了相同的 ROS_DOMAIN_ID(默认0)。
  • 频率不稳定:检查回调函数是否执行耗时操作,或者使用 create_wall_timer 控制发布频率。
  • 查看消息结构ros2 interface show std_msgs/msg/String

8. 总结

通过本文,你应该已经掌握了:

  • 使用 ros2 noderos2 topic 命令行工具查询节点、话题的列表、类型、发布/订阅关系、数据内容和频率。
  • 如何快速找到“谁发布了哪个话题,谁订阅了它”。
  • 用 Python 编写发布者和订阅者节点,并运行、调试。
  • 手动发布测试消息的方法。

这些技能是构建和调试复杂 ROS2 机器人系统的基础。在实际项目中,你还可以结合 rqt_graphros2 bag 录制话题数据等工具进一步提升效率。现在,去构建你自己的 ROS2 应用吧!

                                                老徐,2026/04/04

Read more

Stable Diffusion + kohya_ss 的安装教程

Stable Diffusion + kohya_ss 的安装教程

工具简介 * Stable Diffusion (SD): 开源的文本到图像生成模型,支持通过提示词生成高质量图像,内置自动标注功能(如BLIP、DeepBooru等)。 * kohya_ss (KS): 基于SD的轻量级微调工具,支持LoRA、DreamBooth等训练方法,优化显存占用与训练效率。 一.SD的安装 对于SD大家可以通过github链接来下载 https://git-scm.com/ Automatic 1111:https://github.com/AUTOMATIC1111 这里提供的链接,下载的SD是最基础的,如果大家想要让他有其他的扩展功能就需要下载相关的插件(后面会写一个关于下载插件的教程请大家持续关注)。 1.准备 Conda 环境 1.1 创建并激活 Conda 环境 # 创建名为 sd-webui 的环境(Python 3.10 推荐,需匹配仓库要求) conda

大模型本地部署神器:llama.cpp使用介绍

大模型本地部署神器:llama.cpp使用介绍

介绍llama.cpp 本节主要介绍什么是llama.cpp,以及llama.cpp、llama、ollama的区别。同时说明一下GGUF这种模型文件格式。 什么是llama.cpp llama.cpp是一个由Georgi Gerganov开发的高性能C++库,主要目标是在各种硬件上(本地和云端)以最少的设置和最先进的性能实现大型语言模型推理。 主要特点: * 纯C/C++实现,没有任何依赖 * 对Apple Silicon(如M1/M2/M3芯片)提供一流支持 - 通过ARM NEON、Accelerate和Metal框架优化 * 支持x86架构的AVX、AVX2、AVX512和AMX指令集 * 支持1.5位、2位、3位、4位、5位、6位和8位整数量化,实现更快的推理和更低的内存使用 * 为NVIDIA GPU提供自定义CUDA内核(通过HIP支持AMD GPU,通过MUSA支持摩尔线程MTT GPU)

【Model】【llm38】Llama API - 示例

【Model】【llm38】Llama API - 示例

案例目标 Llama API是一个托管的Llama 2 API服务,支持函数调用功能。本案例展示了如何通过LlamaIndex集成Llama API,实现基本的文本补全、对话交互、函数调用和结构化数据提取功能。Llama API为开发者提供了一个便捷的方式来使用Llama 2模型,无需本地部署,可以直接通过API调用模型服务,大大简化了使用流程。同时,该API支持函数调用功能,使得模型能够与外部工具和服务进行交互,扩展了应用场景。 环境配置 1. 安装依赖 安装必要的依赖包: %pip install llama-index-program-openai %pip install llama-index-llms-llama-api !pip install llama-index 2. 获取API密钥 要运行此示例,您需要从Llama API官网获取API密钥。 3. 导入库并设置API密钥 导入必要的库并设置API密钥: from llama_index.llms.llama_api import LlamaAPI

Microi吾码:从零到服装ERP:低代码打造企业级系统的实战之旅

Microi吾码:从零到服装ERP:低代码打造企业级系统的实战之旅

个人主页:chian-ocean 文章专栏 从零到服装ERP:吾码平台打造企业级系统的实战之旅 关键词:吾码平台、低代码、服装ERP、多表关系、自动化、开发实例 引言 在传统的服装行业管理中,ERP系统已成为提高效率、降低成本、优化资源分配的核心工具。然而,开发一个功能全面、覆盖采购、库存、销售、财务等模块的ERP系统,往往需要投入大量时间和人力资源。在吾码低代码平台的支持下,1人仅用1个月便完成了包含100+表的企业级服装ERP系统。本文将从项目概述、开发细节到关键代码段详细剖析整个开发过程,展示低代码技术的强大能力。 第一部分:项目概览 1.1 项目背景 * 项目需求: * 支持采购、库存、销售、客户管理、财务报表等多个模块。 * 包括100+数据表,涵盖复杂的业务逻辑与数据关联。 * 需实现流程自动化(如采购审批、库存提醒)。 * 开发目标: * 快速完成开发,并保证系统稳定性与扩展性。