主要依托于BehaviorTree.CPP进行介绍。
1 基本概念
1.1 是什么与用来做什么
官网 https://www.behaviortree.dev/docs/learn-the-basics/BT_basics
Unlike a Finite State Machine, a behavior Tree is a tree of hierarchical nodes that controls the flow of execution of “tasks”.
用于任务流控制的多层节点树。不是有限状态机。(有限状态机不能表示同时做多件事情,任务流可能会出现同时做多件事情,都结束后执行另外一件事情,任务流的本质是单起点有向图)
BehaviorTree.CPP 是一个c++库,能够比较方便的集成到应用中。
1.2 tick和node
1 tick (时间步脉冲,类似于bpmn的token)
每一个tick都会从tree的根节点root传递到叶节点leaf。
2 每个节点收到tick后会执行callback,并返回状态
SUCCESS
FAILURE
RUNNING
3 节点会传递tick给其子节点,每个节点类型都有其规则来确定是否,何时或多少次数的传递tick给某一个子节点。
4 叶节点。具体执行某个任务的节点,Action nodes是最普遍的叶节点。
1.3 节点类型
节点分为3类,控制节点,装饰节点,叶节点,其中叶节点是负责执行具体事务的节点,其它节点的作用是流程控制。根据功能的区别,每一种节点还可以继续细分。
叶节点分为条件节点与动作节点。
控制节点可以分顺序节点等。
节点类型 | 说明 |
---|---|
ControlNode 控制节点 | 常用节点类型为顺序节点 |
DecoratorNode 装饰节点 | 可修改子节点的返回,可多次tick子节点; Retry和 Inverter类型节点 |
ConditionNode 条件节点 | 不会返回running |
ActionNode 动作节点 | 执行某个任务的节点,分为同步和异步,同步会阻塞直到结束,返回 SUCCESS or FAILURE ,异步可能会返回RUNNING |
1.3.1 控制节点
1)顺序节点
顺序执行。如果全部成功则执行成功,如果一个失败则不执行后续节点,直接返回失败。
顺序执行,直到失败返回失败,如果全部成功返回成功。
相当于以下结构:
if( activity1 ){
if( activity2 ){
if(activity3 ){
return success;
} else{
return failure;
}
} else{
return failure;
}
} else{
return failure;
}
2)Fallback节点。
顺序执行,直到成功返回成功,如果全部失败返回失败。
在行为树(Behavior Tree)的上下文中,FallbackNodes 通常被用于创建一个"或"(OR)逻辑:子节点将按照特定的顺序执行,只要有一个子节点成功(返回SUCCESS),则整个 FallbackNode 也被视为成功,并且不会进一步执行其它的子节点。但是,如果所有子节点都失败了(返回FAILURE),则 FallbackNode 本身也会返回 FAILURE。
相当于以下结构:
if( activity1 ){
return success;
} else{
if( activity2 ){
return success;
} else{
if(activity3 ){
return success;
} else{
return failure;
}
}
}