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无法退出:确认终端焦点在运行节点窗口,且未使用后台运行方式。