在Ubuntu上用ros2,python编写一个发布者和订阅者节点 在终端打印出来 还有他们的连接关系 用(rqt_graph看)内容不限
时间: 2025-06-10 11:08:26 浏览: 18
<think>好的,我现在需要帮助用户在Ubuntu上使用ROS2和Python编写一个发布者和订阅者节点,并在终端中打印消息,同时用rqt_graph查看它们的连接关系。让我仔细想想应该怎么做。
首先,用户可能对ROS2有一定的了解,但作为新手,可能需要详细的步骤指导。我需要确保每一步都清晰,避免遗漏关键点。首先,应该确认用户已经安装了ROS2,这里假设是Humble版本,因为这是当前比较常见的版本。
接下来,创建工作空间和功能包。ROS2的节点通常放在功能包中,所以需要指导用户创建必要的目录结构。使用ament_python作为构建类型,因为用户要用Python编写节点。
然后是编写发布者和订阅者节点。我需要提供两个Python脚本的例子,分别对应发布者和订阅者。发布者需要定期发布消息,订阅者接收并处理这些消息。消息类型可以选择std_msgs/String,这样简单明了,容易在终端显示。
在编写代码时,要注意ROS2的Python库导入,比如rclpy和Node的用法。发布者需要创建定时器来周期性地发布消息,而订阅者需要设置回调函数来处理接收到的消息。同时,要确保节点的初始化、创建、销毁流程正确,避免资源泄漏。
接下来是修改package.xml和setup.py,添加必要的依赖和入口点。用户可能会忽略这一步,导致无法正确运行节点,所以需要特别强调。
然后是编译和运行。使用colcon build来构建功能包,并用source安装环境变量。运行节点时,需要打开两个终端分别启动发布者和订阅者,这样他们就能看到终端输出的消息了。
最后,使用rqt_graph来可视化节点之间的连接关系。这里需要提醒用户安装rqt_graph工具,并指导如何运行和解读图形。确保用户能够看到发布者和订阅者通过话题连接起来。
可能用户会遇到的问题包括环境变量未正确设置、依赖未安装、话题名称不一致等。需要提前考虑到这些常见错误,并在步骤中给出提示,比如检查话题名称是否正确,确保所有终端都source了安装文件。
总结一下,步骤应该是:环境准备→创建工作区→编写代码→配置构建文件→编译→运行节点→验证输出→使用rqt_graph查看连接。每个步骤都要详细说明,确保用户能够一步步跟随操作,顺利完成目标。</think>以下是在Ubuntu上使用ROS2 Humble和Python编写发布者/订阅者节点的完整指南:
1. 环境准备
- 确保已安装ROS2 Humble
- 创建并进入工作空间:
```bash
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
```
2. 创建功能包
```bash
ros2 pkg create my_py_pkg --build-type ament_python
cd my_py_pkg/my_py_pkg
```
3. 创建发布者节点(publisher_node.py)
```python
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MyPublisher(Node):
def __init__(self):
super().__init__('my_publisher')
self.publisher_ = self.create_publisher(String, 'my_topic', 10)
self.timer = self.create_timer(1.0, self.timer_callback)
self.count = 0
def timer_callback(self):
msg = String()
msg.data = f'Hello ROS2! Count: {self.count}'
self.publisher_.publish(msg)
self.get_logger().info(f'Published: "{msg.data}"')
self.count += 1
def main(args=None):
rclpy.init(args=args)
node = MyPublisher()
try:
rclpy.spin(node)
except KeyboardInterrupt:
pass
finally:
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
4. 创建订阅者节点(subscriber_node.py)
```python
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MySubscriber(Node):
def __init__(self):
super().__init__('my_subscriber')
self.subscription = self.create_subscription(
String,
'my_topic',
self.listener_callback,
10)
self.subscription # 防止未使用警告
def listener_callback(self, msg):
self.get_logger().info(f'Received: "{msg.data}"')
def main(args=None):
rclpy.init(args=args)
node = MySubscriber()
try:
rclpy.spin(node)
except KeyboardInterrupt:
pass
finally:
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
5. 配置功能包
修改`setup.py`:
```python
entry_points={
'console_scripts': [
'publisher_node = my_py_pkg.publisher_node:main',
'subscriber_node = my_py_pkg.subscriber_node:main',
],
}
```
6. 编译运行
```bash
cd ~/ros2_ws
colcon build --packages-select my_py_pkg
source install/setup.bash
```
7. 启动节点(分两个终端运行)
```bash
# 终端1
ros2 run my_py_pkg publisher_node
# 终端2
ros2 run my_py_pkg subscriber_node
```
8. 查看连接关系
```bash
ros2 run rqt_graph rqt_graph
```
此时会显示:
```
my_publisher (节点) → /my_topic [std_msgs/msg/String] → my_subscriber
```
关键说明:
1. 通信机制:基于DDS的发布/订阅模型
2. 话题名称:`my_topic`
3. 消息类型:`std_msgs/String`
4. QOS设置:默认使用可靠性策略(Reliable)和历史策略(Keep Last)
5. 节点关系:
- 发布者节点(`my_publisher`) → 话题 → 订阅者节点(`my_subscriber`)
- 自动发现机制:节点自动发现匹配话题的发布/订阅关系
常见问题排查:
1. 如果rqt_graph不显示连接,检查:
- 所有节点是否使用相同的ROS_DOMAIN_ID
- 话题名称是否完全一致(区分大小写)
- 消息类型是否匹配
2. 消息未接收:确认订阅者的回调函数参数正确
3. 编译问题:确保setup.py中的entry_points配置正确
这个示例完整演示了ROS2 Python节点的开发流程,实现了:
- 周期性消息发布(1Hz频率)
- 消息内容的动态更新
- 终端日志输出
- 可视化节点拓扑关系
阅读全文
相关推荐


















