行为树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:带超时限制。
 

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 类,每类有多个子类:

ReactiveSequence:反应式每次都从tick开始执行,用于持续监控类;Sequence同步式下次tich从中断的位置继续(状态记忆))

image

 

▶ 模块 3:节点通信机制:黑板(Blackboard)

    • 作用:所有节点共享的键值存储(Key-Value Store),用于节点间传递参数(如目标位置、路径),避免全局变量。
    • image

▶ 模块 4:执行模型(Execution Model)

  • Tick 机制:每帧调用 tree.tickOnce(),从根节点递归执行。
  • 异步支持
    • BT::AsyncActionNode:子线程执行耗时操作(如路径规划)。
    • 返回 RUNNING 表示“任务进行中”,下次 tick 继续检查。
  • 事件驱动:支持外部中断(如“紧急停止”)。

 

▶ 模块 5:工厂与插件系统(Factory & Plugin)

  • BT::BehaviorTreeFactory:负责注册节点类型。

注册方式

image

 

▶ 模块 6:调试与可视化(Groot2)

  • Groot2:官方图形化工具(Qt 编写),可:
    • 编辑 XML 树
    • 实时连接运行中的树,查看节点状态(红/绿/黄)
    • 回放执行日志

3 开发步骤:

  nav2用yaml作为系统配置工具(避免硬编码,告诉 bt_navigator:加载哪个 XML 行为树文件;告诉 pluginlib:需要动态加载哪些 C++ 插件库(.so 文件);为自定义节点提供运行时参数),用xml作为行为逻辑配置文件(Groot2所需,缩进支持嵌套和注释;定义任务执行逻辑:节点如何组合(顺序、选择、并行);通过 {key} 引用黑板数据;节点名必须与 pluginlib 注册名一致),至于为何选用他们见导航《脚本配置文件》

image

 

  • 利用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 资源文档:

posted on 2025-11-28 10:56  杰瑞鼠  阅读(0)  评论(0)    收藏  举报