Wiki
BehaviorTree.CPP v4.10.0
Existing English translations were reused. 31 current source blocks remain in Simplified Chinese, without triggering paid translation.
1.BehaviorTree.CPP v4.10.0 学习路线
本教程面向第一次接触行为树的读者,从基本概念开始,逐步写出能够运行的 C++ 程序,再学习任务组合和图形调试。示例统一使用 BehaviorTree.CPP 4.10.0、C++20、Ubuntu 22.04 和 VSCode CMake Tools。
2.先从一个导航任务认识行为树
假设机器人收到一个目标,需要先检查电量,再前往目标,最后报告到达:
一次导航任务
├── 检查电量是否足够
├── 前往指定目标
└── 报告任务完成
这张图先表达任务由哪些步骤组成。实际执行时,还要决定:电量不足后怎么办,导航没有结束时怎样继续检查,导航失败时是否重试,取消任务时怎样停止。
行为树(Behavior Tree,简称 BT)用有层次的节点组织这些条件和操作。上层节点决定执行顺序与方案选择,下面的节点完成具体检查或动作。 各类节点怎样处理成功、失败和运行中的结果,会从“基本概念”开始逐步介绍。
BehaviorTree.CPP 是实现行为树的 C++ 库。 本教程用 C++ 编写节点逻辑,用 XML 文件组织节点,再由主程序驱动整棵树执行。 学会编写和运行程序后,再使用 Groot2 编辑树结构、观察节点状态和回放日志。
3.学习前需要准备什么
需要具备 C++ 基础,能够阅读函数、类、继承、枚举和 std::string。工程构建使用 CMake工程模板;不熟悉模板时,可以先看它的目录结构和 Configure、Build、运行操作。
前两篇先建立行为树概念,不需要提前准备 BT 工程。到“第一个完整程序”时,会从获取模板、创建文件开始,完整说明依赖配置、编写代码、构建运行和断点观察。
示例使用模拟电量、目标和导航进度,在独立 CMake 程序中运行,不需要提前启动 ROS 2 或连接机器人。先把树的执行与数据传递看清楚,再考虑将模拟操作替换成真实模块。
4.从概念到完整任务
| 文档 | 主要内容 | 阶段 |
|---|---|---|
| 基本概念 | tick、五种状态与四类节点 | 概念 |
| 控制与装饰规则 | 顺序、备选、响应式检查、重试、重复和超时 | 概念 |
| 第一个完整程序 | 固定版本依赖、注册节点、加载 XML、条件与目标传递 | 基础实践 |
| 节点之间传数据 | 自定义类型、端口默认值与外部 Blackboard | 基础实践 |
| 持续任务与中止 | 回调调用链、多次 tick、条件变化和主动停止 | 基础实践 |
| 组合实际任务 | 子树隔离与映射、多 XML 文件、有限重试及失败报告 | 基础实践收尾 |
| 脚本与前后置条件 | Script、条件属性、SKIPPED 与中止后的任务结果 | 进阶实践 |
| 全局Blackboard与数据更新 | 全局层、更新序号、时间戳与数据处理策略 | 进阶实践 |
| Groot2 | 节点模型、图形编辑、实时监控和日志回放 | 工具实践 |
已经学过 v3.8.7 时,可以先读 区别与迁移,再运行组合任务与进阶实践。新读者直接按表格顺序学习,不需要先完成 v3。
5.练习工程怎样逐步建立
第一个工程在“第一个完整程序”中从 CMake 模板建立,命名为 bt4_first_tree。先运行一个打印动作,再在同一个工程里逐步加入电量检查、目标输入和节点之间的数据传递。
后续主题会在已经完成的本系列工程上建立副本,让不同练习分别保存在自己的文件夹中:
| 学习主题 | 工程目录 | 从哪里开始 |
|---|---|---|
| 第一个完整程序 | bt4_first_tree |
获取 CMake 模板,按本篇步骤建立第一个 BT 工程 |
| 节点之间传数据 | bt4_ports |
复制本系列“第一个完整程序”中建立的 bt4_first_tree |
| 持续任务与中止 | bt4_running |
复制本系列“节点之间传数据”中的 bt4_ports |
| 组合实际任务 | bt4_mission |
复制本系列“持续任务与中止”中的 bt4_running |
| 脚本与前后置条件 | bt4_script |
同样从“持续任务与中止”的 bt4_running 建立副本 |
| 全局 Blackboard 与数据更新 | bt4_updates |
复制“脚本与前后置条件”中的 bt4_script,复用构建配置 |
| Groot2 | bt4_groot |
从“持续任务与中止”的 bt4_running 建立副本,增加监控与日志 |
bt4_ 是本系列练习目录的命名前缀。具体复制哪个文件夹、怎样修改项目名、哪些文件需要替换,都在对应篇章中说明,不必现在一次建好这些工程。
复制工程后,副本中的旧 build、install 目录需要清理,因为它们记录的是原工程的构建路径和结果。随后通过 Configure、Build 为新工程重新生成。CMake 配置与 XML 路径的具体作用,会在第一个程序中解释。
6.每一步怎样学习
先运行当前程序,看到输出并理解执行过程,再增加下一项功能。需要观察调用和数据时,按文中的位置设置断点,查看节点状态、输入值和成员变量。
修改 C++ 后,保存并 Build,再 Launch;只修改 XML 时,保存后重新 Launch。各篇都会给出本次应看到的结果和对照操作,截图位置供学习时补齐。
基础实践从一个动作逐步扩展到完整运输任务。之后再学习脚本条件、共享外部数据和 Groot2,让任务表达、数据处理与运行观察连成完整流程。
7.本组验证范围
完整程序已在 Ubuntu 22.04 的 Humble 容器中,以 CMake 3.22.1、GCC 11.4 和 C++20 编译运行。依赖模块分别验证了固定 4.10.0 源码嵌入与精确安装包查找;源码验证使用已下载并核对哈希的标签内容。验证程序输出的库版本为 4.10.0。
已检查同步示例、端口固定值与默认值、缺失或错误输入、条件中止、主动停止、普通与响应式 Sequence、两段导航重试、错误子树映射、脚本跳过与失败、全局数据重复读取及同值重新写入。Groot2 的模型加载、编辑、实时连接和成功/中止日志读取也已验证。
验证范围是教程的独立模拟程序。真实 ROS 2 Action 或 Nav2 的接入属于后续集成工作。截图预留供学习时补齐,按自己的实际运行情况推进。
官方网页当前版本标签不一定与 4.10.0 相同,函数声明、控制节点行为和构建开关以本教程固定版本的源码与运行结果为准。库自身使用 C++17,练习程序使用 C++20。