当前位置: 首页 > news >正文

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;程序执行完毕,正常退出。
http://www.jsqmd.com/news/1247339/

相关文章:

  • 发展智慧农业,有哪些国家扶持政策?
  • AI视频生成工具:从原理到电商实战应用
  • 【优选推荐|2026 上海汽车隔音降噪门店实力排行】车主口碑实测,避坑指南收好! - 互联网科技品牌测评
  • HarmonyOS开发实战:小分享-SplashPage启动页设计与2秒延时跳转
  • 房颤必须要手术吗?——从临床数据与决策逻辑角度分析
  • 2026论文工具排行榜[特殊字符]实测好用的毕业论文辅助工具(性价比榜单)
  • DeepSeek-V4技术架构解析:万亿参数与多模态AI的突破
  • QoderWork:NAS-RL与业务流程优化的智能开发平台
  • VMD-CNN-LSTM融合算法在工业故障诊断中的应用
  • 营销前端高并发复盘:秒杀场景下的前端稳定性保障
  • 免费代理IP真的一无是处?爬虫老司机告诉你:能用,但要会用
  • 安全触边是什么?主要具备哪些保护功能与适用领域?
  • 重庆江津区江南职教中心2026年招生简章——交通方便,升学就业无忧 - 学习招生
  • ChatGPT Work:AI驱动的工作流自动化平台功能解析与部署指南
  • Java中的强引用、软引用、弱引用、虚引用
  • 自适应多步前瞻解码:扩散语言模型的高效加速技术解析
  • 成绩单翻译件需要学校盖章吗?不同申请场景的盖章要求
  • 小龙虾营销爆款方法论:从选题到转化的全链路拆解
  • 计算机毕业设计之基于springboot的商城后台管理系统的设计与实现
  • YOLOv8轻量化优化:Slim-Neck模块提升边缘设备检测效率
  • 药物研发数据的智能化管理:用知识图谱加速靶点发现的数据基座
  • Kimi K3与Claude API技术选型:成本控制与工程实践对比
  • 测试文章 001637 - 请忽略
  • 北京上门手表回收流程解析|2026 报价规则与正规回收机构筛选指南 - 全国二奢机构参考
  • 800G光模块的金钟罩:气密封装三道关怎么过?
  • 仅限高校图书馆员硕博导师领取:2024版《AI学术检索安全白皮书》——规避AI幻觉引用、自动标注伦理风险、生成可追溯检索日志的独家工作流(限时开放72小时)
  • TRF7960A RFID读写器固件调试:DBG宏与硬件触发联用实战
  • BQ28Z610阻抗跟踪算法:从核心原理到RSOC平滑、均衡配置实战
  • 华东理工:黑科技隐身材料来了!五元高熵合金 + 二维碳片,薄到 1.86mm 就能 “吃掉” 雷达波!
  • 2026跨境电商代账避坑指南:5大坑+辨别真假机构:深度解析合规路径与机构选型