最近有个项目需要设计一个任务调度的功能。最初的需求只需要实现一个简单、固定的行为树应付客户。但对于我来说,不做通用的软件不是我的风格,这会增加我后面的工作量。
因此我决定做一款多任务行为树调度。
什么是行为树?
行为树其实就是一种任务流程图,也有叫任务链的。本质是上一个带有状态机的树状数据结构。
行为树的技术在其他技术里都被广泛应用,比如LLM、机器人控制等。
行为树状态
行为树状态存在三个状态:RUNNING、SUCCESS、FAILURE。
行为树节点
行为树按照功能分类存在五种节点:根节点(Root)、行为节点(Action)、条件节点(Conditional)、组合节点(Composite)、装饰节点(Decorator)。
根节点(Root)
行为树的最顶部节点,也是入口节点。
行为节点(Action)
没有子节点,用以执行具体行为的节点。
条件节点(Conditional)
没有子节点,用以判定条件是否成立的节点。
组合节点(Composite)
连接多个子节点,比较常见的组合节点有:选择节点(Selector)、序列节点(Sequence)。
选择节点(Selector)
一旦存在一个成功执行的子节点,后续的子节点将不再执行。
序列节点(Sequence)
每个子节点按照顺序依次执行,一旦有一个子节点未能成功执行,后续的子节点将不会被调用。
装饰节点(Decorator)
只有一个子节点,用以执行特定的逻辑。
多任务行为树调度
系统框架设计

我设计了一个五层结构,分为用户/任务输入层、任务规划与生成层、行为树引擎层、数据管理层、硬件抽象层。
插件管理系统
如何将节点更加便捷的进行扩展?使用插件管理系统。

插件管理系统可以让开发者自己自定义开发功能节点,只需生成一个C++动态库(.so)。通过插件系统加载指定路径下的动态库进行功能节点的热插拔。每个节点需要继承一个约定好的抽象类,且统一好C++版本,避免因为ABI导致的问题。
如何编辑及显示行为树?
Groot和Groot2软件是一个针对行为树编辑与显示的GUI软件,也是一个开源的Qt项目(Groot2不开源)。

这是我通过Groot魔改的Groot2。这两个GUI软件不同的就是BehaviorTreeCPP版本,前者是3.7.0版本,后者4.7.0版本,差异较大。

评论(0)
暂无评论