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
相关推荐
比昨天多敲两行15 小时前
Linux.基础I/O
linux
Irissgwe15 小时前
三、Socket 编程 TCP
linux·网络·tcp·socket编程
vortex515 小时前
Kali Linux 安装与使用 GitHub CLI (gh)教程
linux·运维·github
Garfield0_015 小时前
epoll软件架构及原理
linux
小匠石钧知15 小时前
01_以RockyLinux的镜像为基础_构建自己开发学习所需的镜像
linux·docker·jdk·mariadb
学无止境_永不停歇15 小时前
从零手写高性能 C++ TCP 服务器框架(一):项目介绍
linux·服务器·c++·中间件
dingxingdi15 小时前
Linux 清理过程
linux·运维·服务器
szxinmai主板定制专家15 小时前
基于ZYNQ MPSOC ARM+FPGA的超高清实时图像采集与压缩系统设计
linux·运维·服务器·arm开发·人工智能·嵌入式硬件·fpga开发
于小猿Sup16 小时前
ROS Noetic搭建PX4仿真环境
linux·c++·自动驾驶