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