1. 课程导入

欢迎进入《ROS2多机器人行为树任务编排》课程。在多机器人系统从实验室演示走向仓储、巡检、农业与应急场景的过程中,真正的难点往往不是“让一台机器人动起来”,而是让多台机器人协同、可解释、可恢复地完成一项任务。行为树(Behavior Tree, BT)正是解决这一问题的关键工具:它把复杂任务拆成可复用的条件与动作节点,用树形结构描述执行顺序、并行关系与失败回退,使多机器人协作逻辑既清晰又易于调试。

本课程的核心目标:掌握在 ROS2 环境下,用行为树描述并执行多机器人任务,能够设计、运行、观测和排障一个完整的多机协作系统。

一、学习目标

完成本课程后,你应当具备以下能力:

  • 概念层:理解行为树的基本语义(Sequence、Fallback、Parallel、Decorator、Condition、Action),并能区分它与有限状态机(FSM)的适用边界。
  • 框架层:熟悉 ROS2 的节点、话题、服务、动作(Action)与生命周期节点机制,理解行为树如何通过 Action 接口与机器人底层能力对接。
  • 编排层:能够为多机器人任务设计命名空间、任务分配、资源互斥与冲突消解策略。
  • 工程层:能使用 BehaviorTree.CPP、Nav2 行为树、ROS2 Action 等工具搭建可运行系统,并通过日志、可视化与黑盒记录定位问题。
  • 复盘层:能识别常见误区,如节点粒度过粗、状态共享混乱、失败未回退、并行未设阈值等。

二、核心概念

行为树是一种带状态的树形任务调度结构。每个节点执行后返回三种状态之一:SUCCESS、FAILURE、RUNNING。父节点根据子节点返回值决定下一步走向。多机器人场景下,行为树通常与 ROS2 的分布式通信结合:每个机器人拥有独立命名空间,行为树节点通过 Action Client 调用对应机器人的能力接口。

关键概念包括:

  • Tick(滴答):行为树按固定频率从根节点向下“滴答”,驱动节点状态更新。
  • 黑板(Blackboard):节点间共享数据的键值存储,用于传递目标点、机器人 ID、任务状态等。
  • Action 节点:与 ROS2 Action 对接,支持长时间运行、反馈与取消,是机器人运动、抓取等操作的载体。
  • Decorator 装饰器:如 Inverter、Retry、Timeout、RateController,用于改变子节点行为。
  • 多机器人命名空间:如 /robot1、/robot2,隔离话题与服务,避免指令串扰。

三、整体框架

下图展示了本课程的整体技术框架:上层是任务编排层(行为树),中间是 ROS2 通信与调度层,下层是单机器人能力层(导航、感知、执行机构)。行为树通过 Action 接口驱动各机器人,同时通过黑板与状态反馈实现协同决策。

ROS2 多机器人行为树任务编排整体框架 任务编排层 · BehaviorTree.CPP 根节点 Sequence / Parallel 条件节点 Condition 动作节点 Action / ROS2 Action 黑板 Blackboard 共享任务状态 Action 调用 / 状态反馈 ROS2 通信与调度层 话题 Topic 状态广播 服务 Service 即时请求 动作 Action 长任务/反馈/取消 生命周期节点 受控启动 命名空间隔离 /robot1 /robot2 单机器人能力层 Robot 1 导航 Nav2 感知 / 执行 Robot 2 导航 Nav2 感知 / 执行 Robot N 导航 Nav2 感知 / 执行 共享资源 地图 / 充电桩 任务队列

四、典型应用场景

多机器人行为树编排在工业与服务领域已有大量落地。下表列出常见场景及其对应的行为树设计要点:

应用场景 任务特征 行为树设计要点
仓储搬运 多机取货、路径冲突、充电调度 Parallel 并行执行 + 资源互斥 Decorator + Fallback 回退充电
园区巡检 分区巡逻、异常上报、动态重规划 Sequence 顺序巡逻 + Condition 判断异常 + Retry 重试
农业采摘 多机协同采摘、避让、负载均衡 黑板共享任务队列 + Action 反馈进度 + Timeout 超时保护
应急搜救 区域覆盖、通信中断、任务重分配 Fallback 降级策略 + 状态监控 + 动态子树切换

五、方法流程与最小示例

一个典型的多机器人行为树任务流程如下:

  1. 启动各机器人节点,加载命名空间与生命周期配置。
  2. 行为树根节点 Tick,读取黑板中的任务列表。
  3. 条件节点判断机器人是否空闲、电量是否充足。
  4. 动作节点通过 ROS2 Action 下发导航或操作指令。
  5. 并行节点监控多机执行状态,任一失败则触发 Fallback 回退。
  6. 任务完成后更新黑板,进入下一轮调度。

下面是一个简化的行为树 XML 片段,展示多机器人并行执行与失败回退的基本结构:

<root main_tree_to_execute="MainTree">
  <BehaviorTree ID="MainTree">
    <Fallback>
      <Sequence>
        <Condition ID="AllRobotsReady"/>
        <Parallel success_count="2" failure_count="1">
          <Action ID="Navigate" robot_id="robot1" goal="{goal_a}"/>
          <Action ID="Navigate" robot_id="robot2" goal="{goal_b}"/>
        </Parallel>
      </Sequence>
      <Action ID="ReturnToCharge" robot_id="{failed_robot}"/>
    </Fallback>
  </BehaviorTree>
</root>
建议在课程初期就养成“先画树、再写 XML、后接 Action”的习惯。行为树的结构清晰度,直接决定多机器人系统的可维护性。

六、常见误区与复盘

初学者在多机器人行为树编排中容易踩以下坑:

  • 把行为树当流程图用:行为树是带状态的调度结构,不是一次性流程;忽略 RUNNING 状态会导致任务被重复触发。
  • 节点粒度过粗:一个 Action 包办导航、抓取、放置,失败后无法定位具体环节。
  • 黑板滥用:所有数据都塞进黑板,导致节点间隐式耦合,调试困难。
  • 并行无阈值:Parallel 节点未设置 success_count/failure_count,任务永远无法结束。
  • 忽略命名空间:多机器人共用话题名,指令互相覆盖,出现“幽灵运动”。
多机器人系统中最危险的不是单点失败,而是失败后没有回退路径。设计行为树时,务必为每个关键 Action 准备 Fallback 或 Retry 分支。