行为树BehaviorTree.CPP
BehaviorTree.CPP:
BehaviorTree.CPP 本质上就是一个用现代 C++11/14 编写的、专注于行为树执行的开源库,不是 ROS 专属,但被 ROS 2 生态广泛采用最为行为规划树(尤其是 Nav2)。
1.1 核心思想
行为树是一种模块化、可复用、可调试的决策结构,用于描述智能体(如机器人)在复杂环境中的任务执行逻辑。相比传统状态机(FSM),它更灵活、层次清晰、易于扩展。
- 节点类型(关键):
- 控制节点(Control Nodes):
Sequence:顺序执行子节点,任一失败则整体失败。Fallback(或Selector):顺序尝试子节点,任一成功则整体成功。Parallel:并行执行多个子节点,按成功/失败数量决定结果。
- 执行节点(Leaf Nodes):
Action:执行具体动作(如“移动到A点”)。Condition:判断条件(如“是否到达目标?”)。
- 装饰节点(Decorator):
Inverter:反转子节点结果。RepeatUntilFailure:重复执行直到失败。Timeout:带超时限制。
- 控制节点(Control Nodes):
1.2 为什么 ROS 2 选择行为树?
- 可读性强:XML 或代码可直观表示任务流程。
- 动态重配置:运行时可热加载新树。
- 与导航栈深度集成:如
Nav2默认使用 BT 作为高层决策器。 - 跨语言支持:C++ 编写高性能节点,Python 用于快速原型。
1.3 组件关系:
BehaviorTree.CPP (底层库)
↓
Nav2 BT Navigator (ROS 2 插件)
↓
用户自定义 BT 节点(C++/Python)
↓
XML 描述任务流程
1.4 使用方法:
- 替换默认树:修改
nav2_params.yaml中的default_bt_xml_filename。 - 扩展节点:实现如 “避障后重规划”、“充电后继续任务” 等自定义逻辑。
- 调试工具:使用
Groot2(官方 GUI)可视化运行时树状态。
2 架构分析:
▶ 模块 2.1:树结构定义(Tree Structure)
- BT::Tree:表示整棵树的运行时对象。
- BT::Node:所有节点的基类(抽象类)。
- XML 解析器:支持从 XML 文件构建树(使用
tinyxml2)。
▶ 模块 2:节点类型体系(Node Types)
BehaviorTree.CPP 将节点分为 4 类,每类有多个子类:

▶ 模块 3:节点通信机制:黑板(Blackboard)
- 作用:所有节点共享的键值存储(Key-Value Store),用于节点间传递参数(如目标位置、路径),避免全局变量。
-

▶ 模块 4:执行模型(Execution Model)
- Tick 机制:每帧调用
tree.tickOnce(),从根节点递归执行。 - 异步支持:
BT::AsyncActionNode:子线程执行耗时操作(如路径规划)。- 返回
RUNNING表示“任务进行中”,下次 tick 继续检查。
- 事件驱动:支持外部中断(如“紧急停止”)。
▶ 模块 5:工厂与插件系统(Factory & Plugin)
- BT::BehaviorTreeFactory:负责注册节点类型。
注册方式:

▶ 模块 6:调试与可视化(Groot2)
- Groot2:官方图形化工具(Qt 编写),可:
- 编辑 XML 树
- 实时连接运行中的树,查看节点状态(红/绿/黄)
- 回放执行日志
3 开发步骤:
nav2用yaml作为系统配置工具(避免硬编码,告诉 bt_navigator:加载哪个 XML 行为树文件;告诉 pluginlib:需要动态加载哪些 C++ 插件库(.so 文件);为自定义节点提供运行时参数),用xml作为行为逻辑配置文件(Groot2所需,缩进支持嵌套和注释;定义任务执行逻辑:节点如何组合(顺序、选择、并行);通过 {key} 引用黑板数据;节点名必须与 pluginlib 注册名一致),至于为何选用他们见导航《脚本配置文件》

- 利用Groot2图形工具设计流程图(拖拽式设计,调试验证),生成xml文件给nav2用做行为逻辑配置文件(行为树的地图),后者用其生成对应节点(C++用tinyxml2进行解析生成节点)。
- 系统启动Nav2:加载参数文件yaml,启动一下核心模块:
amcl(定位)global_planner(全局路径规划,如 SmacPlanner)local_controller(局部跟踪,如 DWBController)bt_navigator(行为树导航器) ← 主角
-
bt_navigator初始化- 读取配置中的
default_bt_xml_filename(例如navigate_w_replanning_and_recovery.xml) - 使用 BehaviorTree.CPP 的
BehaviorTreeFactory加载所有注册的节点插件(通过pluginlib) - 构建
BT::Tree对象(但不立即执行)
- 读取配置中的
- 用户发送导航目标,
bt_navigator作为 Action Server,收到该请求将目标存入黑板(Blackboard)【黑板是全局共享的 Key-Value 存储,所有 BT 节点都能读写】 -
行为树开始执行(BT Execution Loop),启动主循环
tree.tickOnce(),从根节点开始递归执行子节点 - 执行更新目标condition节点, 执行
ComputePathToPose(Action 节点),执行FollowPath(Action 节点),处理异常
1.x 资源文档:
- 推荐中文教程/文章:
- 古月居:ROS 2 行为树入门(搜索“行为树”)
- CSDN 系列:BehaviorTree.CPP 源码解析(适合 C++ 开发者)
- B站视频:《ROS2 行为树原理与实战》(搜索关键词)
- 官方 GitHub:https://github.com/BehaviorTree/BehaviorTree.CPP
- 官方文档(英文):https://www.behaviortree.dev/
-
- https://github.com/ly0/BehaviorTree-RTThread(个人移植,无维护)
- https://github.com/ixydo/rt-thread-bt-demo(基于 RT-Thread 4.0 + STM32F4)