ROS2进阶—ROS2生命周期节点

文章目录

生命周期节点介绍

ROS 2 生命周期节点(Lifecycle Node)通过显式状态机管理节点的启停过程,确保资源按正确顺序初始化/释放,避免"半启动"导致系统异常。

其中生命周期节点的状态流转如下:

而当流转到某个状态时,会触发对应的状态变更回调。但生命周期节点不能自己转换状态,需要由外部触发

节点示例

c 复制代码
#include "rclcpp_lifecycle/lifecycle_node.hpp"

using CallbackReturn = rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn;

class MyLifecycleNode : public rclcpp_lifecycle::LifecycleNode {
public:
    MyLifecycleNode() : LifecycleNode("my_lifecycle_node") {}

    CallbackReturn on_configure(const rclcpp_lifecycle::State & state) override {
        RCLCPP_INFO(get_logger(), "Configuring...");
        // 分配资源:创建订阅者、发布者(但不激活)
        pub_ = create_publisher<std_msgs::msg::String>("topic", 10);
        sub_ = create_subscription<std_msgs::msg::String>(
            "topic", 10, [this](auto msg){});
        return CallbackReturn::SUCCESS;
    }

    CallbackReturn on_activate(const rclcpp_lifecycle::State & state) override {
        RCLCPP_INFO(get_logger(), "Activating...");
        // 激活发布者(开始实际发送数据)
        pub_->on_activate();
        return CallbackReturn::SUCCESS;
    }

    CallbackReturn on_deactivate(const rclcpp_lifecycle::State & state) override {
        RCLCPP_INFO(get_logger(), "Deactivating...");
        pub_->on_deactivate();  // 停止发送
        return CallbackReturn::SUCCESS;
    }

    CallbackReturn on_cleanup(const rclcpp_lifecycle::State & state) override {
        RCLCPP_INFO(get_logger(), "Cleaning up...");
        pub_.reset();
        sub_.reset();
        return CallbackReturn::SUCCESS;
    }

    CallbackReturn on_shutdown(const rclcpp_lifecycle::State & state) override {
        RCLCPP_INFO(get_logger(), "Shutting down from %s...", state.label().c_str());
        return CallbackReturn::SUCCESS;
    }

private:
    rclcpp_lifecycle::LifecyclePublisher<std_msgs::msg::String>::SharedPtr pub_;
    rclcpp::Subscription<std_msgs::msg::String>::SharedPtr sub_;
};

常用命令

c 复制代码
# 查看生命周期节点列表
ros2 lifecycle nodes

# 查看当前状态
ros2 lifecycle get /my_lifecycle_node

# 查看节点状态变换记录	
ros2 lifecycle list /my_lifecycle_node
相关推荐
不悔哥5 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
未济5 天前
linux 配置环境变量
linux
傲世仙尊5 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
风合星语5 天前
2026 具身智能技术实战(一):VLA 到底怎么控制机器人?——用 LeRobot 跑通 SmolVLA 推理
pytorch·机器人·具身智能·vla·lerobot·smolvla
鲁邦通物联网5 天前
图书馆机器人跨楼层运行,机器人梯控低噪设计与架构分析
机器人·巡检机器人·机器人梯控·agv梯控·非侵入式采集·机器人乘梯·机器人自主乘梯
优信电子5 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
_艾伦 耶格尔.5 天前
进程间通信
linux
Liuqy-055 天前
Linux IO编程——静态库、动态库
linux
彧azz5 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
-梅5 天前
linux(8) 软硬链接
linux·运维·服务器