在ros2,python编写一个发布者和订阅者节点 在终端打印出来 还有他们的连接关系 用(rqt_graph看)内容不限
时间: 2025-06-12 15:11:23 浏览: 23
<think>嗯,用户想在ROS2里用Python写一个发布者和订阅者节点,还要在终端打印信息,并且用rqt_graph查看他们的连接关系。好的,首先我需要回忆一下ROS2的基本概念。发布者和订阅者是ROS中的基本通信机制,通过话题进行数据传输。ROS2使用的是DDS作为底层通信,所以节点的发现和连接应该是自动的。
首先,用户可能需要创建一个工作空间,然后建立一个功能包。记得在ROS2中,功能包的创建方式跟ROS1不同,用的是ament构建系统。需要用colcon build来编译。然后,在功能包里创建两个Python文件,一个作为发布者,一个作为订阅者。
发布者节点的结构大概是这样的:导入rclpy库,定义节点类,继承自Node,然后在构造函数里创建发布者,定时器定期发布消息。同时,在回调函数里打印信息到终端。订阅者节点类似,不过是在回调里接收消息并打印。
然后,需要编写setup.py文件,确保这两个节点被注册为可执行文件。编译之后,运行这两个节点,应该就能看到他们之间的通信了。之后用rqt_graph来可视化节点和话题的连接关系,可能需要安装rqt_graph包,如果还没安装的话。
需要注意的是,Python脚本需要可执行权限,否则运行时会报错。所以用户可能需要用chmod +x来添加权限。另外,在编写发布者和订阅者时,话题名称要一致,否则无法通信。消息类型这里可能用的是String,不过也可以是其他标准类型或者自定义类型。但用户提到的是打印字符串,所以用String比较合适。
测试的时候,可能需要分别在不同的终端运行发布者和订阅者,或者用launch文件一起启动。运行后,在另一个终端执行rqt_graph,应该能看到两个节点通过话题连接。此外,用户可能还希望看到终端里的输出,比如发布者发送的消息和订阅者接收后的打印信息。
可能用户遇到的问题包括:节点没有正确编译,话题名称不一致,权限问题,或者依赖项未正确声明。需要提醒用户检查这些方面。另外,rqt_graph可能需要刷新或者选择正确的命名空间才能看到节点。
总结步骤的话,应该是创建功能包,编写发布者和订阅者代码,配置构建文件,编译,运行节点,然后用rqt_graph查看。确保每个步骤都解释清楚,特别是对于ROS2的新用户来说,路径和命令的正确性很重要。同时,给出示例代码时要注意缩进和语法正确,因为Python对缩进敏感。</think>好的,我将分步骤为您讲解如何在ROS2中用Python编写发布者/订阅者节点,并展示它们的连接关系。以下是详细实现方案:
---
### 一、创建功能包
1. 新建工作空间
```bash
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
```
2. 创建Python功能包
```bash
ros2 pkg create pub_sub_demo --build-type ament_python --dependencies rclpy std_msgs
```
---
### 二、编写发布者节点
在 `pub_sub_demo/pub_sub_demo` 目录下创建 `publisher_member_function.py`:
```python
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MinimalPublisher(Node):
def __init__(self):
super().__init__('minimal_publisher')
self.publisher_ = self.create_publisher(String, 'topic', 10)
timer_period = 1.0 # 1秒周期
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(args=None):
rclpy.init(args=args)
minimal_publisher = MinimalPublisher()
rclpy.spin(minimal_publisher)
minimal_publisher.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
---
### 三、编写订阅者节点
在同一目录创建 `subscriber_member_function.py`:
```python
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MinimalSubscriber(Node):
def __init__(self):
super().__init__('minimal_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(args=None):
rclpy.init(args=args)
minimal_subscriber = MinimalSubscriber()
rclpy.spin(minimal_subscriber)
minimal_subscriber.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
---
### 四、配置package.xml和setup.py
1. 在 `package.xml` 确认已有:
```xml
<exec_depend>rclpy</exec_depend>
<exec_depend>std_msgs</exec_depend>
```
2. 修改 `setup.py`:
```python
entry_points={
'console_scripts': [
'talker = pub_sub_demo.publisher_member_function:main',
'listener = pub_sub_demo.subscriber_member_function:main',
],
},
```
---
### 五、编译运行
1. 编译功能包
```bash
cd ~/ros2_ws
colcon build --packages-select pub_sub_demo
source install/setup.bash
```
2. 启动发布者
```bash
ros2 run pub_sub_demo talker
```
3. 启动订阅者(新终端)
```bash
ros2 run pub_sub_demo listener
```
---
### 六、查看连接关系
1. 安装rqt_graph(如果未安装)
```bash
sudo apt install ros-<distro>-rqt-graph
```
2. 运行可视化工具
```bash
rqt_graph
```
3. 预期效果图:
```
+------------------+ +-------------------+
| minimal_publisher| ----> | topic (std_msgs/String) | ----> | minimal_subscriber |
+------------------+ +-------------------+
```
---
### 七、关键特性说明
1. **自动发现机制**:ROS2基于DDS实现节点自动发现
2. **QoS配置**:默认使用兼容性最好的QoS策略
3. **日志输出**:使用`self.get_logger().info()`实现终端打印
4. **消息类型**:使用标准std_msgs/String消息
实际运行效果:发布者每秒发送递增消息,订阅者实时接收并打印到终端。
阅读全文
相关推荐


















