文章目录
- 序言
- 1. ros2两种节点类型
- 2. LCN是什么
- 3. LCN状态转换
- 4. LCN状态转换要做的事
- 5. LCN节点功能划分
- 6. ros2节点的LCN改写
序言
- 背景:ros2节点改写为lifecycle node节点
1. ros2两种节点类型
- Node:和ros1中一样的节点基类
- LifecycleNode:可管理状态的节点基类
2. LCN是什么
- LCN = lifecycle node,生命周期节点,或者受控节点
- 为了解决ros1中节点启动顺序无法控制的问题,ros2引入了生命周期节点的概念;与LCN相对应的是,LMN = lifecycle management node,控制节点
- 支持控制节点LMN对各个受控节点LCN节点的管理
3. LCN状态转换
- 有4个基础状态和6个切换状态,不同状态之间转换关系如下
- 4个主状态:unconfigured + inactive + active + shutdown
- 6个切换状态:Configuring + Activating + Deactivating + CleaningUp + ShuttingDown + ErrorProcessing
状态转换说明:
- 不同状态之间的转换需要调用对应的回调函数如OnConfigure()等来实现,这些函数在对节点进行LCN改写时需要重新实现,即将不同功能划分到不同函数进行控制;
- LMN和LCN之间通过service模式进行通信,LMN作为client,LCN作为server,LMN发起service request给LCN请求LCN状态转移操作
- 节点运行时ros2会为每个节点配置默认的service,LCN会有特殊的service配置如
change_state、get_state等
4. LCN状态转换要做的事
-
Configuring状态:调用on_configure回调函数
- 加载配置:生命周期中必须被执行一次的任务,比如申请内存、配置topic订阅/发布等
- 以及必要的设置:初始的配置参数,整个生命周期中必须保留的topic订阅器/发布器等
-
Activating状态:调用on_activate回调函数,尝试激活节点,为进入active状态做最后准备
- 获取只在节点active期间会用到的资源,比如对硬件的访问权限
- 避免执行需要很耗时的准备工作
-
Deactivating状态:调用on_deactivate函数,为后续 CleaningUp 做准备
- 执行清理操作
- 做与on_activate相反的操作,去激活与释放资源
-
CleaningUp状态:调用on_cleanup回调函数
- 回调函数中应清除所有状态,并返回与初次创建时一样的状态
-
ShuttingDown状态:调用on_shutdown回调函数
- 节点销毁前的清除操作
-
ErrorProcessing状态:调用on_error回调函数
- 清除所有错误的地方,可从所有状态进入该状态
- 错误处理成功,进入UnConfigured状态;失败进入Finalized状态等待被销毁
5. LCN节点功能划分
- 需要先对要改写的节点进行功能划分,确认哪些功能应该归在哪一状态下去实现
6. ros2节点的LCN改写
- LifecycleNode 类型节点目前只可以在C++中使用
- 初步总结,改写涉及以下几个方面
- CMakeLists.txt修改
- 添加lifecycle node类
- 实现状态切换的脚本函数
- 生命周期节点main函数改写
创作不易,如有帮助,请点赞收藏支持
created by shuaixio, 20223.05.30