节点有四个主要状态:1
2
3
4Unconfigured
Inactive
Active
Finalized
还存在6个过渡状态1
2
3
4
5
6Configuring
CleaningUp
ShuttingDown
Activating
Deactivating
ErrorProcessing
在转换状态中,将执行逻辑以确定转换是否成功。
有7个函数用于监督流程,它们是:1
2
3
4
5
6
7create
configure
cleanup
activate
deactivate
shutdown
destroy
当一个节点启动时,它处于未配置状态,只处理节点的构造函数,该构造函数不应包含任何 ROS 网络设置或参数读取。
在配置阶段,触发 on_configure()
方法,将设置所有参数、ROS网络接口,以及安全系统,所有动态内存的分配。在激活阶段、触发 on_activate() 方法的将激活ROS网络接口,并设置程序中的任何状态以开始处理信息。要关闭(该节点)即过渡到停用需要清理、关闭,并以最终状态结束。
有7个函数用于监督流程,它们是:1
2
3
4
5
6
7create
configure
cleanup
activate
deactivate
shutdown
destroy
ros2 lifecycle 系列命令
- 获取节点状态
ros2 lifecycle get /my_lifecycle_node
. 返回 unconfigured [1]
- 转换节点的状态
转换为configure
状态: ros2 lifecycle set /my_lifecycle_node configure
除了configure,还可以是 cleanup
, activate
, deactivate
, shutdown
- 获取节点状态转换时的信息
ros2 topic echo /my_lifecycle_node/transition_event
比如上面的状态转换过程,话题transition_event
会输出1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22timestamp: 0
transition:
id: 0
label: ''
start_state:
id: 1
label: unconfigured
goal_state:
id: 10
label: configuring
---
timestamp: 0
transition:
id: 0
label: ''
start_state:
id: 10
label: configuring
goal_state:
id: 2
label: inactive
---
也就是状态从unconfigured
转换到了configuring
,再到inactive
状态转换必须按顺序,比如unconfigured
,如果直接set activate,会失败,然后有提示信息。
- 获取当前状态可转换的目标状态
ros2 lifecycle list my_lifecycle_node
- 列出当前所有的生命节点
ros2 lifecycle nodes
service 获取当前节点的状态
ros2 service call /my_lifecycle_node/get_state lifecycle_msgs/srv/GetState
/change_state - 调用触发合法转换
/get_available_transitions - 显示合法的转换
/get_available_states - 列出所有状态
/get_transition_graph - 显示完整状态机
有用的函数
1 | const State & get_current_state () |
问题
- map_server 切换到active状态后报错
应该是试图多次切换到active状态,由于已经是active,所以会报错