2. 创建第一个ROS2订阅者节点
任务目标
在ROS2环境中创建一个订阅者节点,订阅指定字符串话题,并在控制台打印接收到的每条消息。通过本案例,验证ROS2发布-订阅通信模型的基本工作流程。
环境准备
本案例需要已安装ROS2(Humble或Foxy版本均可),并完成环境变量加载。以下命令假设使用Humble版本,若为其他版本请对应调整。
# 加载ROS2环境(以Humble为例)
source /opt/ros/humble/setup.bash
完整实现代码
创建一个Python文件 subscriber_node.py,代码如下:
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class StringSubscriber(Node):
def __init__(self):
super().__init__('string_subscriber')
self.subscription = self.create_subscription(
String,
'chatter',
self.listener_callback,
10
)
self.subscription # 防止被垃圾回收
def listener_callback(self, msg):
self.get_logger().info(f'收到消息: {msg.data}')
def main(args=None):
rclpy.init(args=args)
node = StringSubscriber()
try:
rclpy.spin(node)
except KeyboardInterrupt:
pass
finally:
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
运行与验证
按照以下步骤执行,即可完成发布-订阅通信验证:
- 运行订阅者节点(终端1):
python3 subscriber_node.py
- 启动命令行发布者(终端2,同样先加载ROS2环境):
ros2 topic pub /chatter std_msgs/msg/String "data: 'Hello ROS2'" --once
- 观察结果:在终端1中应看到类似
[INFO] [timestamp] [string_subscriber]: 收到消息: Hello ROS2的日志输出。
通过判定标准:终端1成功打印出与终端2发布内容一致的消息,且无报错信息,即表示订阅者节点工作正常,发布-订阅通信链路已打通。
常见问题排查
- 找不到模块:确认已正确安装ROS2 Python接口(
rclpy),并已执行source /opt/ros/humble/setup.bash。 - 话题不匹配:检查订阅者代码中的话题名(
chatter)与ros2 topic pub命令中的话题名是否完全一致。 - 消息类型错误:确保发布者使用的消息类型为
std_msgs/msg/String,与订阅者代码中导入的类型一致。