行为树
行为树
行为树是什么
在构建较为复杂的机器人项目时,我们会发现让机器人自动执行动作的逻辑会随着业务需求的增加而变得非常复杂,用有限状态机(FSM)去管理状态之间的切换逻辑的维护成本也大幅提升。比方说现在想要从一个结构较为完整的机器人上删去某个动作节点或者判断逻辑,那我们需要在状态机的图上删去所有和这个源节点相连的关系,还要处理其他节点的依赖关系。更不用说其他令人头疼的问题了:- 代码复杂、难以阅读:用状态机维护的行为逻辑会越来越复杂,交织的网络关系呈现出来可能是上千行的代码,给谁看都不乐意,徒增维护成本
- 逻辑修复困难:像上面提到的那样,删除节点、新增节点之前需要开发者对整个逻辑框架有良好的认知,需要在明确知晓操作影响的前提下再进行操作
- 运行监控和日志管理:机器人的状态监控需要远程和本地输出调试信息,一般情况信息较为复杂,难以管理
为了解决这些问题,BehaviorTree.CPP应运而生,它使用四种抽象节点的树状关系来管理逻辑:序列节点、选择节点、并行节点和装饰节点。通过树状结构的层次关系,行为树能够更清晰地表达复杂的行为逻辑,同时也更容易维护和扩展。
基本概念与入门
行为树由四种基本节点组成:- 序列节点(Sequence):按顺序执行子节点,所有子节点都成功时返回成功,否则返回失败。
- 选择节点(Selector):按顺序执行子节点,任一子节点成功时返回成功,否则返回失败。
- 并行节点(Parallel):同时执行所有子节点,根据设定的成功条件返回成功或失败。
- 装饰节点(Decorator):修改子节点的行为,例如添加条件判断、重复执行等。
行为树的执行流程是从根节点开始,按照树的结构依次发送tick消息并执行子节点。每个节点根据其类型和子节点的执行结果返回成功、失败或运行中状态。这种结构使得行为树能够清晰地表达复杂的行为逻辑,同时也更容易维护和扩展。
比方说,对于如下的行为树,机器人的执行逻辑清晰可见,在顺序执行动作的时候还会有可执行性的检查,如果门是关着的就先开门。
我写到这里发现自己写的越来越不像是自己的学习笔记,反倒像是一篇蹩脚的教程。明明自己都没有正确认知行为树的概念和用法,却开始照着教程进行一味的搬运和抄写,这属实不太像一篇合格的博客。这种写作习惯也不利于我进行高效快速的学习和笔记撰写。于是我打算接下来的内容以我本人的心得为主,而不是照搬现成的知识点。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.

