ROS2 节点生命周期流程

📅 2026/7/23 11:13:32 👁️ 阅读次数 📝 编程学习
ROS2 节点生命周期流程
/*** @作者: 古月居(www.guyuehome.com) @说明: ROS2节点示例-发布“Hello World”日志信息, 使用面向对象的实现方式 ***/#include<unistd.h>#include"rclcpp/rclcpp.hpp"/*** 创建一个HelloWorld节点, 初始化时输出“hello world”日志 ***/classHelloWorldNode:publicrclcpp::Node{public:HelloWorldNode():Node("node_helloworld_class")// ROS2节点父类初始化{while(rclcpp::ok())// ROS2系统是否正常运行{RCLCPP_INFO(this->get_logger(),"=====Hello World=====");// ROS2日志输出sleep(1);// 休眠控制循环时间}}};// ROS2节点主入口main函数intmain(intargc,char*argv[]){// ROS2 C++接口初始化rclcpp::init(argc,argv);// 创建ROS2节点对象并进行初始化rclcpp::spin(std::make_shared<HelloWorldNode>());// 关闭ROS2 C++接口rclcpp::shutdown();return0;}

这个代码实现了一个最基础的 ROS2 节点,它的核心逻辑是:启动后,以每秒一次的频率在终端打印“Hello World”日志,直到程序被手动终止。

下面,我将结合你提供的代码,为你详细拆解一个 ROS2 节点的完整生命周期流程。

📜 ROS2 节点生命周期流程

一个 ROS2 节点的生命周期通常遵循以下四个核心步骤,我们可以将你的代码对应到每个步骤中:

1. 初始化 ROS2 客户端库

这是任何 ROS2 程序的起点。在main函数中,第一行代码rclcpp::init(argc, argv);的作用就是初始化 ROS2 的通信环境。它会解析命令行参数,并为后续的节点创建、话题通信等所有 ROS2 功能做好准备。

2. 创建并运行节点

这是程序的核心部分,包含两个动作:

  • 创建节点对象std::make_shared<HelloWorldNode>()这行代码创建了一个HelloWorldNode类的实例。

    • 这个类继承自rclcpp::Node,表明它就是一个 ROS2 节点。
    • 在它的构造函数HelloWorldNode()中,通过: Node("node_helloworld_class")调用了父类的构造函数,并给这个节点起了一个名字叫node_helloworld_class。这个名字在 ROS2 网络中必须是唯一的。
    • 构造函数内部还有一个while(rclcpp::ok())循环,只要 ROS2 系统正常运行,它就会不断地执行RCLCPP_INFO打印日志,然后sleep(1)一秒。
  • 运行节点rclcpp::spin(...)函数是让整个节点“活”起来的关键。它会将你创建的节点对象接管过来,使其进入一个持续运行的状态,开始处理各种回调(尽管这个简单示例中没有其他回调),并执行你在节点中定义的任务(比如打印日志)。只要spin函数在运行,节点就会一直工作。

3. 关闭 ROS2 客户端库

rclcpp::spin()函数结束时(通常是因为收到了关闭信号,比如你按下了Ctrl+C),程序会继续往下执行。rclcpp::shutdown();这行代码负责清理和释放 ROS2 占用的所有资源,优雅地关闭通信。

4. 程序退出

最后,main函数返回 0,表示程序正常结束。

📊 流程总结

为了让你更直观地理解,可以将整个流程总结如下:

流程步骤对应代码功能说明
1. 初始化rclcpp::init(argc, argv);启动 ROS2 通信系统,为创建节点做准备。
2. 创建与运行rclcpp::spin(std::make_shared<HelloWorldNode>());实例化一个名为node_helloworld_class的节点,并让它开始循环打印日志。
3. 关闭rclcpp::shutdown();节点停止后,清理并释放所有 ROS2 资源。
4. 退出return 0;程序执行完毕,正常退出。