Wiki
有限状态机FSM与行为树BT
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
- 有限状态机 FSM:通过事件切换状态,使用非阻塞等待推进任务。
- BehaviorTree.CPP v3.8.7:已有完整主线和 Groot1 实践。
- BehaviorTree.CPP v4.10.0:独立可读的新版本教程,配套 Groot2。
- v3 与 v4 区别及迁移:结合已有工程比较接口、XML、运行语义和工具。
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、导航反馈和实车接入属于后续集成工作。