1. 创建并运行第一个ROS2节点

任务目标

创建一个ROS2 Python节点,完成节点的初始化与优雅关闭,并在启动和退出时输出日志信息。通过本案例掌握ROS2节点生命周期的最小可运行闭环。

环境准备

  • 已安装ROS2(Humble或更新版本),并完成环境变量加载:source /opt/ros/humble/setup.bash
  • 创建工作空间(若未创建):mkdir -p ~/ros2_ws/src

关键完整代码

创建文件 ~/ros2_ws/src/first_node/first_node/simple_node.py(包结构见下方说明),内容如下:

import rclpy
from rclpy.node import Node

class SimpleNode(Node):
    def __init__(self):
        super().__init__('first_simple_node')
        self.get_logger().info('节点已启动:first_simple_node')
        # 创建定时器,每秒触发一次回调,验证节点事件循环正常运行
        self.timer = self.create_timer(1.0, self.timer_callback)

    def timer_callback(self):
        self.get_logger().info('定时器触发:节点运行中...')

    def shutdown_hook(self):
        self.get_logger().info('节点正在关闭,执行清理操作...')

def main(args=None):
    rclpy.init(args=args)
    node = SimpleNode()
    try:
        rclpy.spin(node)  # 阻塞运行,直到收到Ctrl+C
    except KeyboardInterrupt:
        pass
    finally:
        node.shutdown_hook()  # 自定义关闭日志
        node.destroy_node()
        rclpy.shutdown()
        print('节点已完全退出')

if __name__ == '__main__':
    main()

包配置与编译

在 ~/ros2_ws/src/first_node/ 下创建 package.xml 和 setup.py(或使用 ros2 pkg create 自动生成)。关键配置如下:

# package.xml 中需声明依赖
<depend>rclpy</depend>
<exec_depend>rclpy</exec_depend>

# setup.py 中 entry_points 注册命令
entry_points={
    'console_scripts': [
        'simple_node = first_node.simple_node:main',
    ],
}

编译并运行:

cd ~/ros2_ws
colcon build --packages-select first_node
source install/setup.bash
ros2 run first_node simple_node

验证方法与通过条件

  • 启动验证:运行上述命令后,终端应依次输出 节点已启动:first_simple_node,随后每秒输出一次 定时器触发:节点运行中...。这证明节点初始化成功且事件循环正常。
  • 关闭验证:按 Ctrl+C,终端应输出 节点正在关闭,执行清理操作... 和 节点已完全退出,且进程无报错退出。这证明关闭流程被正确执行。
  • 节点发现验证(可选):另开终端执行 ros2 node list,应能看到 /first_simple_node。若能看到,说明节点已正确注册到ROS2图网络中。

通过标准:上述三条日志按顺序出现,且 ros2 node list 能发现该节点,即视为案例通过。

常见问题

  • 找不到 rclpy:确认已执行 source /opt/ros/humble/setup.bash,且Python环境为ROS2自带的(通常无需额外配置)。
  • 编译时提示找不到包:检查 package.xml 中包名与目录名一致,且 setup.py 的 name 字段正确。
  • Ctrl+C无法退出:确认终端焦点在运行节点窗口,且未使用后台运行方式。