ROS2话题通信Python实现详解
目录一、引言二、准备工作2.1 安装ROS22.2 创建工作空间和功能包三、简单文本话题通信3.1 编写发布方代码publisher.py3.2 编写订阅方代码subscriber.py3.3 运行节点四、自定义接口话题通信4.1 定义自定义接口消息4.2 配置功能包4.3 编写发布方代码publisher_custom.py4.4 编写订阅方代码subscriber_custom.py4.5 运行节点五、总结一、引言在机器人操作系统ROS2中话题通信是实现节点间数据传输的重要方式之一。通过话题通信一个节点可以发布数据而其他节点可以订阅这些数据从而实现信息的共享和交互。本文将详细介绍如何使用Python代码在ROS2中实现话题通信并通过实际案例进行演示。二、准备工作2.1 安装ROS2确保已经在系统中正确安装了ROS2。以Ubuntu系统为例可以按照官方文档的步骤进行安装。2.2 创建工作空间和功能包打开终端进入想要创建工作空间的目录然后执行以下命令创建工作空间和功能包mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src ros2 pkg create --build-type ament_python py_topic_demo cd.. colcon build这将创建一个名为ros2_ws的工作空间并在其中创建一个名为py_topic_demo的Python功能包。三、简单文本话题通信3.1 编写发布方代码publisher.py在py_topic_demo功能包的src目录下创建publisher.py文件内容如下import rclpy from rclpy.node import Node from std_msgs.msg import String class SimplePublisher(Node): def __init__(self): super().__init__(simple_publisher) self.publisher_ self.create_publisher(String, topic, 10) timer_period 1 # 发布频率为1Hz self.timer self.create_timer(timer_period, self.timer_callback) self.i 0 def timer_callback(self): msg String() msg.data Hello, world! %d % self.i self.publisher_.publish(msg) self.get_logger().info(发布的消息: %s % msg.data) self.i 1 def main(argsNone): rclpy.init(argsargs) simple_publisher SimplePublisher() rclpy.spin(simple_publisher) simple_publisher.destroy_node() rclpy.shutdown()3.2 编写订阅方代码subscriber.py在同一src目录下创建subscriber.py文件内容如下import rclpy from rclpy.node import Node from std_msgs.msg import String class SimpleSubscriber(Node): def __init__(self): super().__init__(simple_subscriber) self.subscription self.create_subscription( String, topic, self.listener_callback, 10) self.subscription # 防止未使用变量警告 def listener_callback(self, msg): self.get_logger().info(订阅的消息: %s % msg.data) def main(argsNone): rclpy.init(argsargs) simple_subscriber SimpleSubscriber() rclpy.spin(simple_subscriber) simple_subscriber.destroy_node() rclpy.shutdown()3.3 运行节点打开两个终端分别执行以下命令终端1运行发布方source ~/ros2_ws/install/setup.bash ros2 run py_topic_demo publisher.py终端2运行订阅方source ~/ros2_ws/install/setup.bash ros2 run py_topic_demo subscriber.py此时发布方将以1Hz的频率发布文本消息订阅方将接收到这些消息并打印到终端。四、自定义接口话题通信4.1 定义自定义接口消息在py_topic_demo功能包下创建msg目录然后在其中创建Student.msg文件内容如下string name int32 age float32 height4.2 配置功能包编辑py_topic_demo功能包下的package.xml文件添加以下依赖build_dependmessage_generation/build_depend exec_dependmessage_runtime/exec_depend同时编辑setup.py文件添加以下内容from setuptools import setup from glob import glob package_name py_topic_demo setup( namepackage_name, version0.0.0, packages[package_name], data_files[ (share/ament_index/resource_index/packages, [resource/ package_name]), (share/ package_name, [package.xml]), (os.path.join(share, package_name,msg), glob(msg/*.msg)), ], install_requires[setuptools], zip_safeTrue, maintaineryour_name, maintainer_emailyour_emailexample.com, descriptionROS2 topic demo, licenseApache License 2.0, tests_require[pytest], entry_points{ console_scripts: [ publisher py_topic_demo.publisher:main, subscriber py_topic_demo.subscriber:main, ], }, package_dir{: python}, cmake_dependencies[], build_requires[ament_cmake, ], depends[rclpy,std_msgs,message_generation], classifiers[ Intended Audience :: Developers, License :: OSI Approved :: Apache Software License, Programming Language :: Python, Topic :: Software Development, ], )同时编辑setup.py文件添加以下内容from setuptools import setup from glob import glob package_name py_topic_demo setup( namepackage_name, version0.0.0, packages[package_name], data_files[ (share/ament_index/resource_index/packages, [resource/ package_name]), (share/ package_name, [package.xml]), (os.path.join(share, package_name,msg), glob(msg/*.msg)), ], install_requires[setuptools], zip_safeTrue, maintaineryour_name, maintainer_emailyour_emailexample.com, descriptionROS2 topic demo, licenseApache License 2.0, tests_require[pytest], entry_points{ console_scripts: [ publisher py_topic_demo.publisher:main, subscriber py_topic_demo.subscriber:main, ], }, package_dir{: python}, cmake_dependencies[], build_requires[ament_cmake, ], depends[rclpy,std_msgs,message_generation], classifiers[ Intended Audience :: Developers, License :: OSI Approved :: Apache Software License, Programming Language :: Python, Topic :: Software Development, ], )4.3 编写发布方代码publisher_custom.py在src目录下创建publisher_custom.py文件内容如下import rclpy from rclpy.node import Node from py_topic_demo.msg import Student class CustomPublisher(Node): def __init__(self): super().__init__(custom_publisher) self.publisher_ self.create_publisher(Student,student_topic, 10) timer_period 1 # 发布频率为1Hz self.timer self.create_timer(timer_period, self.timer_callback) self.i 0 def timer_callback(self): msg Student() msg.name 张三 msg.age 20 self.i msg.height 1.65 self.i * 0.01 self.publisher_.publish(msg) self.get_logger().info(发布的学生信息: name%s, age%d, height%.2f % (msg.name, msg.age, msg.height)) self.i 1 def main(argsNone): rclpy.init(argsargs) custom_publisher CustomPublisher() rclpy.spin(custom_publisher) custom_publisher.destroy_node() rclpy.shutdown()4.4 编写订阅方代码subscriber_custom.py在src目录下创建subscriber_custom.py文件内容如下import rclpy from rclpy.node import Node from py_topic_demo.msg import Student class CustomSubscriber(Node): def __init__(self): super().__init__(custom_subscriber) self.subscription self.create_subscription( Student, student_topic, self.listener_callback, 10) self.subscription # 防止未使用变量警告 def listener_callback(self, msg): self.get_logger().info(订阅的学生消息: name%s, age%d, height%.2f % (msg.name, msg.age, msg.height)) def main(argsNone): rclpy.init(argsargs) custom_subscriber CustomSubscriber() rclpy.spin(custom_subscriber) custom_subscriber.destroy_node() rclpy.shutdown()4.5 运行节点打开两个终端分别执行以下命令终端1运行发布方source ~/ros2_ws/install/setup.bash ros2 run py_topic_demo publisher_custom.py终端2运行订阅方source ~/ros2_ws/install/setup.bash ros2 run py_topic_demo subscriber_custom.py此时发布方将以1Hz的频率发布自定义的学生信息消息订阅方将接收到这些消息并打印到终端。五、总结通过以上两个案例我们详细介绍了如何使用Python代码在ROS2中实现简单文本话题通信和自定义接口话题通信。话题通信是ROS2中非常基础和重要的功能掌握它对于开发复杂的机器人应用具有重要意义。希望本文能对ROS2开发者有所帮助。

相关新闻

FPG平台:从公开信息出发,梳理信息披露习惯与流程清晰度

FPG平台:从公开信息出发,梳理信息披露习惯与流程清晰度

在外汇行业语境里,表达越清晰、信息越透明,越容易建立稳定预期。在FPG平台的外汇服务中,从公开信息与使用体验出发,梳理其更值得肯定的能力点与细节表现。在外汇相关服务中,读者最在意的通常是信息是否清楚、提示是否到…

2026/7/7 1:35:55 阅读更多 →
第 二 章线性代数

第 二 章线性代数

文章目录2.1 标量与向量2.1.1 标量与向量的概念2.1.2 向量运算2.1.3 向量范数2.2 矩阵与张量2.2.1 矩阵的概念2.2.2 矩阵乘法2.2.3 矩阵转置2.2.4 矩阵的逆2.2.5 其他矩阵运算2.2.6 张量2.3 矩阵求导2.3.1 常用求导结果2.3.2 Jacobian矩阵与梯度矩阵2.3.3 一阶实矩阵微分&#…

2026/7/7 1:33:55 阅读更多 →
JVM 直接内存排障:堆没满,进程也可能被杀

JVM 直接内存排障:堆没满,进程也可能被杀

JVM 直接内存排障:堆没满,进程也可能被杀 一、内存问题不只发生在 Java 堆 线上 Java 服务被 OOMKill 时,很多人第一反应是看堆内存。可是堆使用率不高,进程仍然被系统杀掉,这种情况并不少见。原因可能是直接内存、线程…

2026/7/7 1:33:55 阅读更多 →

最新新闻

ComfyUI整合包+KREA2模型:AI绘画本地部署全攻略

ComfyUI整合包+KREA2模型:AI绘画本地部署全攻略

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在为AI绘画的复杂环境配置而头疼,特别是想要体验最新的KREA2模型却苦于繁琐的安装过程,那么萝卜大佬的…

2026/7/7 2:34:11 阅读更多 →
芯片的测试

芯片的测试

SCK是移位时钟,RCK是锁存时钟,SCK是移位就变,RCK是八位一起变这个数组的值是在字模软件里面设置的offset是i的,然后数组里面有24个要显示的,24-816

2026/7/7 2:34:11 阅读更多 →
Seedance2.5本地AI生图与视频生成部署实践指南

Seedance2.5本地AI生图与视频生成部署实践指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 1. 先搞清楚 seedance2.5 到底解决什么实际问题 如果你正在找一款能本地运行、不依赖网络、免费且效果不错的 AI 生图和视频工具&…

2026/7/7 2:32:11 阅读更多 →
Seedance 2.5本地部署指南:免费AI生图与视频生成实战

Seedance 2.5本地部署指南:免费AI生图与视频生成实战

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在寻找一款真正免费、无限制的AI生图和视频生成工具,那么Seedance 2.5的发布绝对值得你关注。与市面上需要付费订…

2026/7/7 2:32:11 阅读更多 →
山东大学软件学院与集成电路学院2026年7月大学物理期末考试试卷回忆版

山东大学软件学院与集成电路学院2026年7月大学物理期末考试试卷回忆版

自从软院和集电合并招生以来第一次大物考试,为发扬软院优秀传统与互联网精神,特此记录,部分题目可能回忆不全(比如缺少必要参数之类 )或者顺序不完全相符,但是题目内容是大致相似的,供同学们参考…

2026/7/7 2:32:11 阅读更多 →
2026 供应商关系管理系统排行榜前十强,选型必看

2026 供应商关系管理系统排行榜前十强,选型必看

选对供应商关系管理系统,是采购数字化落地的核心前提,也是企业最容易踩坑的环节。流程脱节、版本锁死、数据孤岛,大量 SRM 项目上线半年便形同虚设,实际价值远不及预期。 据 IDC 2025 年《中国供应资源管理软件市场份额报告》测算…

2026/7/7 2:30:10 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻