boxmoe_header_banner_img

Hello! 欢迎来到盒子萌!

加载中

文章导读

多任务行为树调度


avatar
whaledream 2026年 7月 30日 6

最近有个项目需要设计一个任务调度的功能。最初的需求只需要实现一个简单、固定的行为树应付客户。但对于我来说,不做通用的软件不是我的风格,这会增加我后面的工作量。

因此我决定做一款多任务行为树调度。

什么是行为树?

行为树其实就是一种任务流程图,也有叫任务链的。本质是上一个带有状态机的树状数据结构。

行为树的技术在其他技术里都被广泛应用,比如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)

查看评论列表

暂无评论


发表评论

表情 颜文字

插入代码