Skip to content

Wiki

BehaviorTree.CPP v4.10.0

About 8 min read

Existing English translations were reused. 31 current source blocks remain in Simplified Chinese, without triggering paid translation.

1.BehaviorTree.CPP v4.10.0 学习路线

官方入口:BehaviorTree.CPP 文档、4.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。