ROS2 节点生命周期流程 /*** 作者: 古月居(www.guyuehome.com) 说明: ROS2节点示例-发布“Hello World”日志信息, 使用面向对象的实现方式 ***/#includeunistd.h#includerclcpp/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_sharedHelloWorldNode());// 关闭ROS2 C接口rclcpp::shutdown();return0;}这个代码实现了一个最基础的 ROS2 节点它的核心逻辑是启动后以每秒一次的频率在终端打印“Hello World”日志直到程序被手动终止。下面我将结合你提供的代码为你详细拆解一个 ROS2 节点的完整生命周期流程。 ROS2 节点生命周期流程一个 ROS2 节点的生命周期通常遵循以下四个核心步骤我们可以将你的代码对应到每个步骤中1. 初始化 ROS2 客户端库这是任何 ROS2 程序的起点。在main函数中第一行代码rclcpp::init(argc, argv);的作用就是初始化 ROS2 的通信环境。它会解析命令行参数并为后续的节点创建、话题通信等所有 ROS2 功能做好准备。2. 创建并运行节点这是程序的核心部分包含两个动作创建节点对象std::make_sharedHelloWorldNode()这行代码创建了一个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()函数结束时通常是因为收到了关闭信号比如你按下了CtrlC程序会继续往下执行。rclcpp::shutdown();这行代码负责清理和释放 ROS2 占用的所有资源优雅地关闭通信。4. 程序退出最后main函数返回 0表示程序正常结束。 流程总结为了让你更直观地理解可以将整个流程总结如下流程步骤对应代码功能说明1. 初始化rclcpp::init(argc, argv);启动 ROS2 通信系统为创建节点做准备。2. 创建与运行rclcpp::spin(std::make_sharedHelloWorldNode());实例化一个名为node_helloworld_class的节点并让它开始循环打印日志。3. 关闭rclcpp::shutdown();节点停止后清理并释放所有 ROS2 资源。4. 退出return 0;程序执行完毕正常退出。

本月热点