1. 创建并运行第一个ROS2节点
任务目标
编写一个ROS2 Python节点,周期性地向话题 /chatter 发布字符串消息 "Hello ROS2",同时启动一个订阅端验证消息是否正确接收。通过本案例掌握ROS2节点创建、话题通信和命令行验证的基本流程。
环境准备
需要已安装ROS2(Humble或更新版本),并完成环境变量加载:
source /opt/ros/humble/setup.bash
完整实现
创建ROS2功能包并编写发布者与订阅者节点。以下为最小可运行实现:
# 创建功能包(在终端执行)
ros2 pkg create --build-type ament_python py_pubsub
# 编辑 py_pubsub/py_pubsub/publisher.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class Publisher(Node):
def __init__(self):
super().__init__('publisher')
self.pub = self.create_publisher(String, '/chatter', 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: {self.count}'
self.pub.publish(msg)
self.get_logger().info(f'发布: {msg.data}')
self.count += 1
def main(args=None):
rclpy.init(args=args)
node = Publisher()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
# 编辑 py_pubsub/py_pubsub/subscriber.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class Subscriber(Node):
def __init__(self):
super().__init__('subscriber')
self.sub = self.create_subscription(String, '/chatter', self.callback, 10)
def callback(self, msg):
self.get_logger().info(f'收到: {msg.data}')
def main(args=None):
rclpy.init(args=args)
node = Subscriber()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
在 setup.py 中注册入口点:
entry_points={
'console_scripts': [
'publisher = py_pubsub.publisher:main',
'subscriber = py_pubsub.subscriber:main',
],
},
运行与验证
- 构建并加载环境:
cd ~/ros2_ws
colcon build --packages-select py_pubsub
source install/setup.bash
- 启动发布者(终端1):
ros2 run py_pubsub publisher
- 启动订阅者(终端2):
ros2 run py_pubsub subscriber
- 另开终端查看话题列表与消息:
ros2 topic list
ros2 topic echo /chatter
通过条件:订阅者终端每秒打印一条 收到: Hello ROS2: N(N为递增数字),且 ros2 topic echo 能持续输出相同格式的消息,说明节点通信正常。
常见问题
- 找不到功能包:确认已执行
source install/setup.bash,且当前目录为工作区根目录。 - 话题无消息:检查发布者终端是否报错,确认话题名称完全一致(均为
/chatter)。 - 编译错误:确认
setup.py中入口点格式正确,且package.xml已声明对std_msgs和rclpy的依赖。