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
相关推荐
笨笨饿14 分钟前
# 59_CSDN博客自动写流程文章
linux·jvm·stm32·单片机·嵌入式硬件·mcu·51单片机
味悲18 分钟前
Nginx笔记
linux·运维·笔记·nginx
Escalating_xu20 分钟前
【Linux 网络编程】传输层协议 UDP:从 8 字节首部到消息边界、缓冲区与 MTU
linux·网络·udp
tianxuanjg22 分钟前
采购指南|工业无人机高强度结构件怎么选?
人工智能·经验分享·机器人·无人机·制造
嵌入式分享28 分钟前
驱动之路#43:一文理清 I2C 子系统架构
嵌入式
Lucky_Turtle41 分钟前
【Linux】ip命令,路由表相关配置
linux·运维·tcp/ip
dawnsky.liu1 小时前
在 RHEL 中使用 goose 实现主机运维
linux·运维·aiops
碧海银沙音频科技研究院1 小时前
基于炬芯ATS308X的BLE 无线方式离线日志传输导出功能实现
java·linux·服务器
feasibility.1 小时前
具身智能的进化分水岭:GPT-6-Astra踏进能力门,却卡在实用门——商汤联合团队开源RoboRSI:Harness递归改进能否填平这道落地鸿沟?
人工智能·gpt·机器人·具身智能·vla·harness·rsi
kkkkkkkkkk_Z1 小时前
新手自学嵌入式 | 学习日记: Linux驱动进阶 —— Platform总线与I2C子系统实战
linux·运维·学习