ros2 lifcycle介绍

ros2 lifcycle

简介

ROS 2 引入了托管节点(Managed Nodes)的概念,这类节点也被称为生命周期节点(LifecycleNode )。 LifecycleNode 内部包含一个 有限状态机,通过调用表示连续后继状态的转换ID即可实现状态切换。

实现方案区分了主要状态 (Primary States)和过渡状态(Transition States)。 主要状态是节点可持续执行相应任务的稳定状态;而过渡状态则作为转换过程中的临时中间状态,LifecycleNode 都会处于以下状态之一:

  • Primary States (steady states):

    • unconfigured
    • inactive
    • active
    • finalized
  • Transition States (intermediate states):

    • configuring
    • activating
    • deactivating
    • cleaningup
    • shuttingdown

状态转换图如下:

  • 状态跳转触发事件如下,通过外部指令(如终端指令)去触发 :
    • configure
    • activate
    • deactivate
    • cleanup
    • shutdown

以 lidar驱动 正常工作流程 作为示例描述状态跳转:

  • 创建驱动实例(new) : * --> unconfigured
  • 配置ip端口等参数(configure) : unconfigured --> configuring --> inactive
  • 启动lidar 连接,开始发送数据(activate) : inactive --> activating --> active
  • 关闭lidar 连接,停止发送数据(deactivate) : active --> deactivating --> inactive
  • 清理资源(cleanup) : inactive --> cleanup --> unconfigured
  • 结束(shutdown) : unconfigured --> shuttingdown --> finalized
  • 删除实例(delete) : finalized --> o

代码结构及使用

  • state.hpp : 状态定义
  • transition.hpp : 跳转
  • lifecycle_node_impl.hpp,lifecycle_node.hpp : 状态机实现
  • lifecycle_node_interface.hpp : 定义的事件响应函数(虚函数),这个就是子类需要继承实现的,如下所示:
c++ 复制代码
/// rclcpp_lifecycle/include/rclcpp_lifecycle/node_interfaces/lifecycle_node_interface.hpp

 enum class CallbackReturn : uint8_t
  {
    SUCCESS = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_SUCCESS,
    FAILURE = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_FAILURE,
    ERROR = lifecycle_msgs::msg::Transition::TRANSITION_CALLBACK_ERROR
  };


virtual CallbackReturn on_configure(const rclcpp_lifecycle::State & previous_state);
virtual CallbackReturn on_activate(const rclcpp_lifecycle::State & previous_state);
virtual CallbackReturn on_deactivate(const rclcpp_lifecycle::State & previous_state);
virtual CallbackReturn on_cleanup(const rclcpp_lifecycle::State & previous_state);
virtual CallbackReturn on_shutdown(const rclcpp_lifecycle::State & previous_state);
  • 例如要写 liddar驱动,继承关系为 LidarDriver --> LifecycleNode --> LifecycleNodeInterface ;
  • 需要 override 以上函数,和自己的内部实现相关;

命令行指令

获取当前状态

bash 复制代码
$ ros2 lifecycle get /lc_talker

unconfigured [1]

发送事件,开始状态跳转

bash 复制代码
$ ros2 lifecycle set /lc_talker configure

Transitioning successful

查看当前可跳转状态

bash 复制代码
$ ros2 lifecycle list lc_talker

- configure [1]
  Start: unconfigured
  Goal: configuring
- shutdown [5]
  Start: unconfigured
  Goal: shuttingdown

查看所有跳转状态

bash 复制代码
$ ros2 lifecycle list lc_talker -a

- configure [1]
  Start: unconfigured
  Goal: configuring
- transition_success [10]
  Start: configuring
  Goal: inactive
- transition_failure [11]
  Start: configuring
  Goal: unconfigured
- transition_error [12]
  Start: configuring
  Goal: errorprocessing

[...]

- transition_error [62]
  Start: errorprocessing
  Goal: finalized

参考

相关推荐
乌托邦的逃亡者5 分钟前
Linux系统中配置history命令显示时间、IP、账号和操作命令
linux·运维·安全
趙小贞10 分钟前
字符设备驱动开发流程与实战:以 LED 驱动为例
linux·c语言·驱动开发
咔咔咔的40 分钟前
3461. 判断操作后字符串中的数字是否相等 I
c++
liulilittle1 小时前
LwIP协议栈MPA多进程架构
服务器·开发语言·网络·c++·架构·lwip·通信
艾莉丝努力练剑2 小时前
【C++:继承】面向对象编程精要:C++继承机制深度解析与最佳实践
开发语言·c++·人工智能·继承·c++进阶
penguin_bark2 小时前
C++ 异步编程(future、promise、packaged_task、async)
java·开发语言·c++
Wang's Blog2 小时前
Linux小课堂: Vim与Emacs之Linux文本编辑器的双雄格局及Vim安装启动详解
linux·vim·emacs
观山岳五楼2 小时前
unbuntu系统配置IPV6的三种模式
linux·服务器·ip·1024程序员节
运维行者_2 小时前
AWS云服务故障复盘——从故障中汲取的 IT 运维经验
大数据·linux·运维·服务器·人工智能·云计算·aws
王道长服务器 | 亚马逊云2 小时前
AWS Systems Manager:批量服务器管理的隐藏利器
linux·网络·云计算·智能路由器·aws