行为树

发布于 2023-08-02  232 次阅读


知乎:fangcun ksun

行为树入门教程 - fangcun的文章 - 知乎 https://zhuanlan.zhihu.com/p/463182588
UE4行为树详解(持续更新,才怪) - ksun的文章 - 知乎 https://zhuanlan.zhihu.com/p/143298443

What

行为树 (Behavior Tree, BT) 是一个用于任务切换的结构,与其类似的结构有有限状态机 (Finite State Machine, FSM). 他们经常被用在机器人和游戏AI中,在这种场景中,对象的动作往往是提前编辑好的,但在什么时间或者地点使用什么动作是不确定的。因此需要使用行为树或状态机来实现这些智能体的决策任务。

  • 行为树是树:执行时从根结点开始按照指定的顺序遍历,直到到达终结状态。
  • 叶子结点都是可执行的行为:叶子结点会进行具体的操作,可以是一个简单的检测操作,也可以是一个更复杂的操作,结点会返回状态信息(成功,失败,运行中)。
  • 内部结点控制树的遍历:内部结点会根据孩子结点返回的状态信息,按照特定的规则确定下一个执行的结点。

在运行过程中,一个名为“tick”的信号会从树的根部发出,并在树中传播,直到到达叶节点。任何收到信号的 TreeNode 都会执行其回调。 此回调必须返回如下的三个状态:

成功
失败
运行

运行意味着动作需要更长的时间才能返回结果。叶节点是那些没有任何子节点的树节点,他们是实际的命令,即行为树所与机器人其他系统交互的节点。最常见的叶节点是动作节点。

控制节点

控制结点是行为树的内部结点,它们定义了遍历其孩子结点的方式。控制结点的孩子可以是执行结点,也可以是控制结点。

序列(Sequence)选择器(Selector)简单平行(Parallel)这3种类型的控制结点可以有任意数量的孩子结点,它们的区别在于对其孩子结点的处理方式。而装饰(Decorator)结点只能有一个孩子结点,用来对孩子结点的行为进行自定义修改。

Sequence

按顺序执行孩子结点直到其中一个孩子结点返回失败状态或所有孩子结点返回成功状态。

Selector

按顺序执行孩子结点直到其中一个孩子结点返回成功状态或所有孩子结点返回失败状态。一般用来实现角色的备选行为。

Parallel

“并行执行”所有孩子结点。直到至少M个孩子(M的值在1到N之间)结点返回成功状态或所有孩子结点返回失败状态。

装饰器

以装饰器是作用在行为树中的一种节点,作用是控制其他节点是否执行,或者打断正在执行的任务。

装饰器的ObserverAborts

当装饰器上级的 Composites 节点是 Selector,则 ObserverAborts 有4个可选值:None Self LowerPriority Both,当装饰器上级的 Composites 节点是 Sequence,则 ObserverAborts 有2个可选值:None Self

  • None:选了None的装饰器不起任何作用。个人认为是为了方便调试,你可以不用删除这个装饰器,选择None,可以忽略这个装饰器判断。
  • Self:(可以立刻停止自身的)若装饰器的计算结果为True,则执行修饰的任务,如果装饰器修饰Composites节点,则允许继续查找下级节点。如果装饰器结果是false,则不执行修饰的任务,如果这个任务修饰正在持续执行的任务,当装饰器计算结果由True改变为False时,当前任务会停止;如果装饰器修饰Composites节点,则不会继续查找下级节点。
  • LowerPriority:(可以立刻停止低优先级的)若当前装饰器计算结果为False,则不能执行当前修饰的节点,要执行比这个优先级低的节点。若装饰器计算结果True,会执行当前节点,并且会停止比当前节点低优先级的各种节点。进一步理解,当有一个任务是持续任务正在执行,修饰这个任务的 LowerPriority 装饰器,从True变成False,则不会停止持续任务,因为不是Self,但是如果这个任务结束了,下次再想执行,就不能执行了,因为装饰器是False。
  • Both:(既可以立刻停止自身的,又可以立刻停止低优先级的)单词意思是两者,哪两者?Self和Lower Priority。当这种装饰器为True,则可以执行当前节点,停止低优先级的节点。如果这装饰器为False,则停止当前修饰的节点,执行低优先级的节点。

任务节点

任务节点的作用是做特定的事情,是描述谁在什么时间做了什么,在行为树的最底部(叶子节点),是AI行为的终点。

每个任务都有执行时间,目标,任务结束时的状态。我们可以把任务节点的执行时间简单的分为2种:

  • 瞬间执行完成的任务
  • 持续一段时间的任务(非瞬间完成)

常见行为树规则

显示成功条件

显式成功条件(explicit success condition)使用备选结点(fallback node)在动作执行前检测条件是否已成立。

简单来说,就是在执行动作前总是先进行条件检测。比如,先检测机器人是否已经在A处,如果在就不执行去A处的动作,直接返回成功状态。如下图所示:

黑板

黑板是一块可以被结点读写的公共存储区。