摘要:
行为树是一种模块化、层次化的决策框架,广泛用于机器人及自动驾驶系统。它通过树状结构组织任务节点,实现清晰的任务编排与动态响应,显著提升了复杂场景下的决策可读性、可维护性与可靠性。在自动驾驶中,行为树高效协调感知、规划与控制模块,是实现安全、智能驾驶的关键技术之一
1、基本概念
与有限状态机不同,行为树是由层次节点构成的树状结构,用于控制"任务"的执行流程。更适用于复杂行为决策的贯序动作,与FSM和HFSM相比优缺点:
| 特性 | 行为树 | 有限状态机 | 分层状态机 |
|---|---|---|---|
| 核心思想 | 模块化的任务执行与条件检查,通过树形结构组织。 | 系统在任何时刻处于一个确定状态,事件触发状态间转换。 | FSM的扩展,状态可包含子状态,形成层次以复用逻辑。 |
| 可读性与可维护性 | 优点:极高。树形结构清晰直观,模块化强,易于增删、复用节点。 | 缺点:低。当状态和转换增多时,会变成难以维护的"蜘蛛网"。 | 中等。优于普通FSM,层次化减少了转换复杂度,但大型系统仍可能混乱。 |
| 模块化与复用性 | 优点:极强。节点(如条件、动作、子树)是天然模块,可灵活组合与复用。 | 缺点:极弱。状态和转换逻辑紧耦合,复用性差。 | 中等。通过子状态复用部分逻辑,但整体转换网络依然僵硬。 |
| 动态响应与反应性 | 优点:优异。通过高频率的从根节点向下遍历,能持续监控条件变化,即时响应外部事件。 | 缺点:较差。依赖特定事件触发转换,对未建模的事件不响应,容易出现状态"停滞"。 | 中等。与FSM类似,依赖事件驱动,但可通过层次设计部分提升响应能力。 |
| 设计复杂度 | 优点:低。适合复杂、需要频繁调整的逻辑,设计过程直观(搭积木)。 | 优点:低。适合状态少、流程固定的简单逻辑。 | 中等。适合中等复杂度逻辑,能用层次简化设计,但仍有状态爆炸风险。 |
| 运行时效率 | 潜在缺点:可能较低。每帧遍历可能带来开销,需通过缓存、异步等优化。 | 优点:高。仅需处理当前状态的逻辑和输入事件,效率稳定。 | 优点:高。与FSM类似,仅处理当前活跃状态链。 |
| 适用场景 | 机器人、游戏AI、自动驾驶等需要高模块化、高反应性、逻辑复杂的动态决策系统。 | 简单控制器、UI流程、协议解析等状态明确、转换固定的场景。 | 嵌入式系统、复杂UI、中等规模游戏AI等需要结构化状态但逻辑相对固定的场景。 |
但是大多数开发场景是HFSM结合BehaviorTree组合使用,才能更灵活的实现复杂逻辑,实现框架逻辑上的优势互补
tick
一个时钟周期,也就是一个运行周期,一个名为"tick"的信号被发送到树的根部,并通过树传播,直到到达一个叶子节点。
节点状态 NodeStatus
cpp
enum class NodeStatus
{
IDLE = 0,
RUNNING = 1,
SUCCESS = 2,
FAILURE = 3,
SKIPPED = 4,
};
节点在一次tick周期中执行完一定会返回一个节点状态,节点枚举如上:一般返回RUNNING SUCCESS FAILURE三种状态,IDLE也可能
节点分类
ActionNode
2、BehaviorTree.CPP源码编译
github源码下载地址:
https://github.com/BehaviorTree/BehaviorTree.CPP
使用cmake编译时候会依赖zmq(负责和Groot开发)、sql(日志)以及gtest (单元测试),如果这些需要的话需要在本地进行安装,本文只是测试不需要这些,所以在cmakelsit中进行修改

这三个都给改成OFF就不会有依赖
然后命令行操作如下:
bash
mkdir build_release
cmake -S . -B build_release -DCMAKE_INSTALL_PREFIX=/home/qhr/Downloads/behavier
cmake --build build_release --parallel
cmake --install build_release --prefix /home/qhr/Downloads/behavier
/home/qhr/Downloads/behavier这个是编译产物的存放路径,大家可以根据自己的条件进行修改
生成的产物上图,至此测试需要的依赖头和库已经编译出来