ROS2话题通信Python实现详解

📅 2026/7/7 1:41:12
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开发者有所帮助。