跳到正文

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

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、導航反饋和實車接入屬於後續集成工作。