Wiki
有限狀態機FSM與行為樹BT
約 3 分鐘閱讀
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
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、導航反饋和實車接入屬於後續整合工作。