Skip to content

Wiki

有限状态机FSM与行为树BT

About 3 min read

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

1.用 FSM 和 BT 组织机器人任务

机器人导航、等待、充电、取消与异常恢复都需要明确的执行顺序。FSM 和 BT 都能组织任务;选择时先看任务关系,再看当前工程采用的库和接口。

组织方式 先回答什么 常见表达
FSM,有限状态机 当前在哪个阶段,什么事件使它进入下一阶段 待机 → 导航 → 等待 → 完成
BT,行为树 当前条件允许执行哪些操作,先选哪个方案,怎样组合结果 条件检查 → 导航;失败后选择备用方案

FSM 也能组织复杂任务,BT 也需要维护持续动作的状态。决定可维护性的因素包括任务分解、事件处理、取消方式与数据边界,不是换一种图形就能自动解决。

2.按当前项目选择学习路线

你的情况 建议顺序
首次学习机器人任务决策 有限状态机 → v4 基本概念 → v4 编程实践 → Groot2
项目正在使用 BehaviorTree.CPP 3.x v3.8.7 教程 → Groot1;需要升级时再看迁移篇
已学完本组 v3 教程 版本区别与迁移 → v4 脚本和数据更新 → Groot2;按需回看 v4 基础实践
准备接入已有 ROS 2/Nav2 工程 先核对现有包、插件及其依赖版本,再决定使用哪条教程路线

也就是优先学习bt4而不是bt3

v3、v4 是两套库版本,Groot1、Groot2 是配套编辑与观察工具。ROS 2 发行版、BT 库版本和 Groot 版本需要分别核对。独立 v4 程序运行成功,不代表现有 Nav2 和自定义插件已经升级。

3.把能力实现与任务组织分开

任务决策层:选择目标、组织步骤、处理失败与取消
    ├── 可以采用 FSM
    └── 可以采用 BT
            ↓ 调用
能力模块:导航、定位、电量、传感器与执行器
            ↓
底层模块内部还可以使用自己的 FSM

例如,上层 BT 选择导航任务,导航节点内部用 FSM 管理“等待接受 → 正在执行 → 请求取消 → 结束”。这里描述的是软件职责,不表示 FSM 是行为树中一种新的节点类别。

一条任务结束时,要区分“动作已经成功”“任务失败”“运行中被取消”。取消实际导航、清理临时资源的职责必须落实到具体模块;仅改变树节点状态不会让外部设备自动停止。

4.本组实践的共同约定

使用通用移动机器人示例,以计数和数据更新模拟导航、充电及任务结果。工程沿用 C++20、现有 CMake 模板与 VSCode CMake Tools。每个完整程序说明文件位置、API 参数和返回值,并给出运行及断点观察步骤。

按“当前程序能够构建运行 → 对照执行过程 → 增加下一项功能”的方式推进。文中截图预留由学习时补齐;真实 ROS 2 Action、导航反馈和实车接入属于后续集成工作。