1. 创建第一个ROS2发布者节点

创建第一个ROS2发布者节点 学习卡片

任务目标

编写一个ROS2 Python发布者节点,以1Hz频率向/chatter话题发布字符串消息"Hello ROS2",并通过命令行工具验证话题通信链路正常。

环境准备

本案例基于ROS2 Humble(Ubuntu 22.04)或ROS2 Foxy(Ubuntu 20.04),需预先完成ROS2安装并source环境。Python版本要求3.8+,无需额外安装第三方依赖包。

完整实现代码

创建文件talker.py,内容如下:

#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class TalkerNode(Node):
    def __init__(self):
        super().__init__('talker_node')
        self.publisher_ = self.create_publisher(String, '/chatter', 10)
        self.timer = self.create_timer(1.0, self.timer_callback)  # 1Hz
        self.count = 0

    def timer_callback(self):
        msg = String()
        msg.data = f'Hello ROS2: {self.count}'
        self.publisher_.publish(msg)
        self.get_logger().info(f'Publishing: "{msg.data}"')
        self.count += 1

def main(args=None):
    rclpy.init(args=args)
    node = TalkerNode()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        pass
    finally:
        node.destroy_node()
        rclpy.shutdown()

if __name__ == '__main__':
    main()

运行与验证

打开两个终端,分别执行以下操作:

终端1 — 启动发布者节点:

source /opt/ros/humble/setup.bash
python3 talker.py

终端2 — 监听话题消息:

source /opt/ros/humble/setup.bash
ros2 topic echo /chatter

验证通过条件:

  • 终端1每1秒输出一条日志,格式为Publishing: "Hello ROS2: N",其中N为递增整数(0, 1, 2, ...);
  • 终端2持续显示相同内容的消息,证明发布-订阅链路正常;
  • 另开终端执行ros2 topic list可看到/chatter话题;执行ros2 topic hz /chatter显示频率约为1.0Hz。

若终端2能实时收到与终端1日志一致的消息内容,则判定话题通信验证通过。

常见问题

  • 找不到rclpy模块:确认已执行source /opt/ros/humble/setup.bash(版本号按实际安装调整);
  • 两个终端消息不一致:确认两端source的是同一ROS2发行版,且未设置ROS_DOMAIN_ID冲突;
  • 节点启动后立即退出:检查talker.py是否有执行权限(chmod +x talker.py),或改用python3 talker.py方式运行。