行为树概念
原文连接
行为树(behavior tree)是用来实现非人工角色复杂行为的工具,在机器人行业,使用行为树来实现复杂任务。特征:
- 行为树是树:执行时从根节点开始按照指定的顺序遍历,直到到达终结状态
- 叶子结点都是可执行的行为:叶子结点会进行具体的操作,结点会返回状态信息(成功、失败、进行中)
- 内部结点控制树的遍历:内部结点会根据孩子即诶单返回的状态信息,按照特定的规则确定下一个执行的结点。
行为树相关术语
行为树结点的一次触发称为一次tick,会返回成功(success)、失败(failure)、运行中(running)的状态信息给它的父节点。
- 执行结点(execution nodes):行为树的叶子结点,分为动作结点(action)和条件结点(condition)。
- 控制结点(control nodes):控制结点时行为树的内部结点,它们定义了遍历子结点的方式。控制结点的子结点可以是执行结点或控制结点。顺序(sequence),备选(fallback),并行(parallel)可以有任意子结点,而装饰(decorator)只能有一个子结点,用来对子结点的行为进行自定义修改。
控制结点中各结点特性
- 顺序结点(Sequence):按照顺序执行子结点,直到其中一个子结点返回失败状态或所有子结点返回成功状态。
- 备选结点(Fallback):按顺序执行子结点,直到其中一个子结点返回成功状态或所有子结点返回失败状态。
- 并行结点(Parallel):并行执行所有子结点,直到至少M(M的值在1到N之间)个子结点返回成功状态或所有子结点返回失败状态。
- 装饰结点(Decorator):以自定义的方式修改孩子结点的行为。比如Invert类型的装饰结点,可以反转其孩子结点返回的状态信息。
装饰器和黑板
使用装饰结点(Decorator)来对行为树进行优化,使用装饰结点可以定义一个规则为Repeat的装饰结点,用来重复执行它的子结点。使用队列来存储所有带搜寻的地点,每次迭代从队列中取出一个点滴进行搜索,队列为空时即为搜索完毕。
引入黑板(blackboard)的概念来存储可以被多个结点访问的共享信息。黑板是一块可以被结点读写的公共存储区。
行为树相关软件库
两个用于行为树编程的软件库:py_trees和BehaviorTree.CPP。
py_trees是由Daniel Stonier创建的一个python库。
- 使用python编写,支持在运行时动态修改行为树。
- 提供了可视化工具和日志工具。
BehaviorTree.CPP是C++库。
- 基于C++,方便嵌入式系统使用
- 基于XML工作流,可以使用其它XML编辑器编辑行为树,注册自定义结点类型。
- 可以使用Groot进行可视化编辑它所识别的XML文件。
- 但对于需要运行时动态修改行为树的情况需要手动编程,并且这种使用方式在可视化编辑器下支持较差。
行为树和有限状态机
行为树和状态机具有相同的表达能力,可以实现相同的功能。
行为树更方便进行组合和修改,状态机更方便进行反应式动作设计。