py_trees源码分析之基础行为
版本信息
Python: 3.9
py_trees: 2.2.3
本文的代码与示例绝大部分来自github,只分析了部分重要的代码,包含基础行为模块、通用行为模块、通用模块、组合节点模块、装饰节点模块、黑板模块,且较简单的模块用表格汇总。
基础行为(Behaviour)
自定义方法
setup
行为树在tick之前调用,用来检查中间件或者设备是否可用(建议重写)
initialise
- 初始化/重置/清除变量
- 启动定时器
- 检查变量是否有效
Update -> Status
注意,子类必须实现该方法,因为这是行为树主要的工作函数,每一次Tick都会通过Update进行状态更新、数据存储等,它决定当前分支的走向,返回当前分支的状态(成功?失败?运行中?无效)
私有方法
绑定黑板
参数
- name:客户端黑板标识符(非必填,则为uuid)
- namespace:用于黑板操作键/变量名操作的前缀
作用
实例化黑板
公有方法
tick_once
作用
在忽略tick返回结果的情况下进行迭代,那么tick返回的结果是什么呢?迭代器
tick -> typing.Iterator[Behaviour]
作用
核心方法,使用生成器,在行为树进行迭代,推动事件发展
注意最后使用yield self
,在这里self指当前的Behavior对象
代码
def tick(self) -> typing.Iterator[Behaviour]:
self.logger.debug("%s.tick()" % (self.__class__.__name__))
// 如果当前是非运行状态,则先进行初始化
if self.status != common.Status.RUNNING:
self.initialise()
# don't set self.status yet, terminate() may need to check what the current state is first
// 进行核心update方法,获取更新完的状态
new_status = self.update()
if new_status not in list(common.Status):
self.logger.error(
"A behaviour returned an invalid status, setting to INVALID [%s][%s]"
% (new_status, self.name)
)
new_status = common.Status.INVALID
// 如果状态不是运行中(不管成功/失败),都将停止行为树,并返回状态
if new_status != common.Status.RUNNING:
self.stop(new_status)
// 更新状态
self.status = new_status
yield self
方法列表
方法名 | 参数 | 作用 | 返回 |
---|---|---|---|
iterate | direct_descendants:直译为直系后代,如果为True则仅获取当前节点的子节点,False则获取当前节点的所有后代节点 | 获取子节点 | typing.Iterator[Behaviour] |
visit | visitor:访问类 | 用于调用访问类的run方法,相当于一个代理,集成到Behavior类中统一调用 | |
stop | New_status: 状态 | 以新状态终止该分支,调用terminate 方法和tick 方法 |
|
has_parent_with_name | name: 匹配名称 | 查找名称为name的节点 | Bool(是否找到) |
has_parent_with_instance_type | instance_type: 实例类型 | 查找与目标实例匹配的节点 | Bool(是否找到) |
tip | 如果节点状态非无效,则返回本身 | typing.Optional[Behaviour] |