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
相关推荐
装不满的克莱因瓶10 小时前
【自动驾驶领域】学习 Cityscapes 数据集——城市街景语义理解的标准基准
人工智能·pytorch·python·深度学习·学习·机器学习·自动驾驶
vsropy11 小时前
Ubuntu网络图标消失问题/有网络问号
linux·运维·ubuntu
福建佰胜张工11 小时前
3HNA006643-001 BRACKET ZB/CCIB:ABB 喷涂机器人关键结构件深度解析
网络·机器人
coderwu11 小时前
Ubuntu 24.04 终端输入 openclaw config 提示未找到命令解决办法
linux·运维·ubuntu
才兄说12 小时前
机器人二次开发机器狗巡检?全环境稳定感知
人工智能·机器人
凡人叶枫13 小时前
Effective C++ 条款28:避免使用 handles 指向对象内部
linux·服务器·开发语言·c++·嵌入式开发
AI帮小忙13 小时前
Debian系linux操作系统里安装OpenClaw
linux·运维·debian
极创信息13 小时前
Linux挖矿病毒深度清理实战教程,从进程隐藏、Rootkit驻留到彻底根除
java·大数据·linux·运维·安全·tomcat·健康医疗
weixin_3077791314 小时前
Python写入Shell文件使用Linux系统的换行符
linux·开发语言·python·自动化
liulilittle15 小时前
Linux Swap 文件配置与持久化(虚拟内存)
linux·运维·服务器