ROS2::Lifecycle_nodes(托管)
ros2添加的新功能,让一个节点被托管到一个专门负责管理其他节点的功能。 实现方式为:某个节点在实现的时候继承Lifecycle_nodes的类,给Lifecycle_nodes类传入需要的参数,这样这个节点在启动的时候就自动被托管了。
以map_server节点为例: MapServer继承了nav2_util::LifecycleNode
class MapServer : public nav2_util::LifecycleNode
MapServer的构造函数在构造nav2_util::LifecycleNode类时传入需要的参数
MapServer::MapServer() : nav2_util::LifecycleNode("map_server")
nav2_util::LifecycleNode类又继承了rclcpp_lifecycle::LifecycleNode类,
class LifecycleNode : public rclcpp_lifecycle::LifecycleNode
托管节点的主要功能是通过一个服务接口map_server/change_state 接受外部指令切换MapServer节点的状态。
map_server/change_state:
uint8 TRANSITION_CREATE = 0
uint8 TRANSITION_CONFIGURE = 1
uint8 TRANSITION_CLEANUP = 2
uint8 TRANSITION_ACTIVATE = 3
uint8 TRANSITION_DEACTIVATE = 4
uint8 TRANSITION_UNCONFIGURED_SHUTDOWN = 5
uint8 TRANSITION_INACTIVE_SHUTDOWN = 6
uint8 TRANSITION_ACTIVE_SHUTDOWN = 7
uint8 TRANSITION_DESTROY = 8
uint8 TRANSITION_ON_CONFIGURE_SUCCESS = 10
uint8 TRANSITION_ON_CONFIGURE_FAILURE = 11
uint8 TRANSITION_ON_CONFIGURE_ERROR = 12
uint8 TRANSITION_ON_CLEANUP_SUCCESS = 20
uint8 TRANSITION_ON_CLEANUP_FAILURE = 21
uint8 TRANSITION_ON_CLEANUP_ERROR = 22
uint8 TRANSITION_ON_ACTIVATE_SUCCESS = 30
uint8 TRANSITION_ON_ACTIVATE_FAILURE = 31
uint8 TRANSITION_ON_ACTIVATE_ERROR = 32
uint8 TRANSITION_ON_DEACTIVATE_SUCCESS = 40
uint8 TRANSITION_ON_DEACTIVATE_FAILURE = 41
uint8 TRANSITION_ON_DEACTIVATE_ERROR = 42
uint8 TRANSITION_ON_SHUTDOWN_SUCCESS = 50
uint8 TRANSITION_ON_SHUTDOWN_FAILURE = 51
uint8 TRANSITION_ON_SHUTDOWN_ERROR = 52
uint8 TRANSITION_ON_ERROR_SUCCESS = 60
uint8 TRANSITION_ON_ERROR_FAILURE = 61
uint8 TRANSITION_ON_ERROR_ERROR = 62
uint8 TRANSITION_CALLBACK_SUCCESS = 97
uint8 TRANSITION_CALLBACK_FAILURE = 98
uint8 TRANSITION_CALLBACK_ERROR = 99
uint8 id
string label
有4个主要主要状态: Unconfigured //没有初始化,通信接口没有初始化,没有加载参数 Inactive //没有激活,通信接口已经初始化好但是不会执行回调 Active //节点正常功能,回调正常执行 Finalized //最终状态,被销毁之前立即结束的状态
有 6 个转换状态,它们是请求转换期间的中间状态: Configuring //正在初始化,如果转换成功节点将转换为Inactive CleaningUp //正在清理,清除所有状态并将节点转换为Unconfigured ShuttingDown //销毁之前进行任何必要的清理 Activating //成功,节点将转换为Active Deactivating /成功,节点将转换为Inactive. ErrorProcessing //这种过渡状态是可以清除任何错误的地方
有 7 种暴露给监管的状态: 通过服务/map_server/get_state 可以获取map_server当前处于什么状态。 该服务请求为空,响应为当前的状态。 create //被创建 configure //已经初始化 cleanup //被清除 activate //激活 deactivate //没有激活 shutdown //关闭 destroy //销毁
状态之间不能随意转换,具体的转换规则可以参看下图。
Unconfigured:未配置 这是节点在实例化后立即所处的生命周期状态。这也是发生错误后可以将节点重新调整到的状态。在这种状态下,map_server只调用了构造函数,没有初始化各个接口,也没有加载参数。
此状态下可以转换到Inactive和Finalized。 调用服务设置id=TRANSITION_CONFIGURE;//3 即可以将map_server节点切换到Inactive状态,并执行初始化功能,初始化通信接口但并不会执行回调功能。 调用服务设置id=TRANSITION_UNCONFIGURED_SHUTDOWN;//5 即可以将map_server节点切换到Finalized状态。
Inactive:非激活状态 此状态表示当前节点未执行任何处理。此状态的主要目的是允许(重新)配置节点(更改配置参数,添加和删除主题发布/订阅等)而不改变其运行时的行为。在这种状态下,节点将不会读取主题、执行数据处理、响应功能服务请求等。任何map_server数据都不会被读取和/或处理。数据保留将与QoS配有关策略。对处于非活动状态的节点的服务请求都不会得到响应(调用者将立即收到调用失败信息)
其他状态之间的转换请看官方图示:
lifecycle_manager
此功能包可以理解为托管中心,可以把很多个能被托管的节点交给这个托管中心统一管理,统一启动、挂起、关闭等。
/xxxxx/manage_nodes服务接口同意管理
uint8 command
---
bool success
例如:/lifecycle_manager_navigation/manage_nodes 可以将被管理的节点统一设置为以下几个状态:
uint8 STARTUP = 0
uint8 PAUSE = 1
uint8 RESUME = 2
uint8 RESET = 3
uint8 SHUTDOWN = 4
|