顾名思义,行为树是描述事物(人,动物,机器人,虚拟角色等等)行为的树形结构。游戏行业使用行为树为角色行为建模。现在行为树建模技术正在向其它领域渗透,比如工业产线编排,机器人控制。
另一方面,从一些自动化厂商的技术发展趋势可以看出,开放自动化正朝着从底层编程,建模技术逐步上移,采用更高级的领域语言和高层建模技术,逐步走向基于自然语言的编程与建模的目标。
行为树和有限自动机是两种主要的行为建模方式。
行为树由三类预定义的节点(node)构建的树,它们分别是 根(root),工作流(workflow)和执行节点。用它们来描述“某些”行为。节点的返回是成功(Success),失败(Failure )和运行(Running)
设想你感觉饿了,准备去烹饪一个肉,或者订购一份外卖。我们可以用下面的行为树来描述:
也许你并不知道SELECTOR
和 SEQUENCE的含义,但是你大致了解行为树描述的行为模型的意义。只有一个节点会成功,做成一份肉,或者点了一份外卖。
节点类型
(动作/任务/叶)Action/Task/Leaf nodes
叶节点分为两类:
- 动作: 完成某类动作,例如:开门
- 条件: 检测某类条件
复合节点(Composite nodes)
复合节点是有多个子节点(Child)的节点,主要包括下列三种:
顺序(Sequence)
顺序节点包含多个子节点,一旦执行,将顺序执行子节点。其中一个子节点执行错误便返回失败。
for child in children:
status = child.run()
if status == RUNNING or status == FAILURE:
return status
return SUCCESS
选择器(Selector)
选择器节点具有多个子节点,一旦执行,它执行所有节点,直到某一个成功,否则便失败。你可能看出来,它正好与顺序节点相反。
for child in children:
status = child.run()
if status == RUNNING or status == SUCCESS:
return status
return FAILURE
修饰器节点(Decorator)
修饰器只有一个子节点,它大多数用于实用节点(utility Nodes),例如
- Repeater: 无限制执行,或者执行一段时间子节点。
- Inverter: 子节点的结果取反
- AlwaysSucceed: 失败变成成功.
- UntilFail: 运行直到出错
其它的复合节点包括
- 并行执行
- 随机执行
黑板(Blackboard)
几乎在大多数情况下,某个节点需要与其它的节点对话,行为树具有数据存储的能力,它们被称为黑板或者数据脉络(blackboard, data context),比如一个节点发现最近的敌人,而另一个节点袭击它。它们之间要交换敌人的方位信息
行为树的应用
- 游戏
- 对话AI
- 机器人
行为树在工业软件中的应用
在制造业中,人们使用行为树为工作流程建模。例如将制造行业的标准工单(SOP-Standard Operation Procedure)转换成为行为树模型。构建了行为树模型之后,工业软件能够将行为树转换成为执行程序,每个节点对应与一个功能块(function block)。从而实现工作流自动化和低代码。
搜索Github 可以找到许多Python和C++ 的行为树库。也有专门支持ROS 的机器人行为树库。
行为树与功能块相结合
开放自动化领域中的功能块是一种模块化技术,将完成某个单一功能的程序段封装成功能块,并且提供规范的功能块接口。功能块适合图形化编程。显然,使用功能块实现行为树是有效的方法。能够方便地将行为树图模型转换成为功能块图网络。
模型和代码的分层架构
结束语
行为树作为一种行为建模方式,在工制造业的基于标准工单的作业流控制,机器人,AGV 等场合具有广阔的市场应用。
不过也应该指出,行为树和有限状态机一样,它是一种建模方法,并不是一个技术标准。在具体应用中有灵活的应用方法。行为树模型和其它建模方法相结合,能够成为高层建模方法,例如OPCUA 和IEC61499 基于事件功能块信息模型。进一步地,随着chatGPT 大语言模型的行业应用的普及,能够与基于自然语言的领域语言DSL 相结合。促进建模技术向更高层,有高效的方式的应用。
俗话说,“基础不牢,地动山摇”。当我们研究和学习新技术和创新思想时候,基础技术需要掌握的。与此同时,也要借鉴其它行业的成功经验,这样才能够到达“它山之石,可以攻玉”的境界。