1. 创建第一个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方式运行。