高層功能架構詳解
- 1. 系統整體結構與模塊化設計
- 2. 兩大核心類:ExoData 與 Exo
- A. ExoData
- B. Exo
- C. 數據結構的層級關系
- 3. 多微控制器協作與BLE通信
- 4. 主控軟件運行流程(主循環偽代碼)
- 5. 架構優點小結
- 6. 與 Code Structure 的關系
- 實用建議
1. 系統整體結構與模塊化設計
OpenExo 軟件架構高度模塊化。系統可根據需要自由組裝各個功能模塊,由一個 Arduino 級別的主控 MCU 統一調度。每個模塊(如電機、控制器、傳感器、LED 顯示等)都是獨立的,可插拔、可擴展,便于支持不同的實驗和應用場景。
2. 兩大核心類:ExoData 與 Exo
A. ExoData
-
定位:ExoData 作為數據與參數的載體,負責保存系統的所有遙測(telemetry)數據和當前控制參數。
-
結構特點:ExoData 的層級與 Exo 的模塊化硬件結構一一對應,實現了“軟硬件一體化抽象”。
-
作用:
-
存儲和實時更新各傳感器數據(如力敏電阻FSR、力矩傳感器、馬達反饋等);
-
存儲和同步當前所有控制器參數、狀態(如各關節的目標/實際力矩、控制模式等)。
-
B. Exo
-
定位:Exo 類是真正“驅動外骨骼硬件邏輯”的主對象,負責所有部件的實際控制和數據流轉。
-
作用:
-
組織、調度所有底層模塊(如馬達、控制器、傳感器、LED等);
-
每輪主循環執行run(),完成數據采集、控制運算、命令下發等任務。
-
C. 數據結構的層級關系
可以用如下樹狀結構理解 Exo/ExoData 關系:
Exo / ExoData
├── StatusLed // 狀態指示燈模塊
├── SyncLed // 同步指示燈模塊
├── FSRs // 足底壓力傳感器模塊
└── Side / SideData // 左/右側模塊└── Joint / JointData // 每個關節(如髖、踝、肘等)├── TorqueSensor // 力矩傳感器├── Motor / MotorData // 電機驅動與反饋└── Controller/ControllerData // 控制器及其參數
說明:
-
“/” 表示 Exo 和 ExoData 的同層鏡像關系
-
每一層的Data對象存儲該模塊的狀態和參數
-
這樣做方便主控、藍牙、遠程上位機等任意環節“全局訪問/更新/同步”當前設備狀態
-
Exo:總控制器,調度所有下級模塊。
-
StatusLed/SyncLed/FSRs:與外部交互的硬件模塊。
-
Side(如左/右腿):每側獨立實例,可適配不同任務(如左踝+右髖)。
-
Joint:每個關節可配置不同的傳感器、電機和控制策略(比如左側髖關節是直驅,右側踝關節是Bowden拉索)。
-
各模塊的 Data:每層對象都有與之配套的數據描述類(如 JointData),實現參數與狀態分離(方便持久化/同步/通信)。
3. 多微控制器協作與BLE通信
-
有的硬件會配備兩個 MCU:
-
主 MCU(主控):執行核心控制任務(如實時采集、計算控制量、下發馬達指令)。
-
通信 MCU(如 Arduino Nano BLE 33):處理藍牙通信和一些“軟實時”任務(如數據上傳/接收、遠程調參)。
-
-
兩者通過 UART 通信,ExoData 作為協議“橋梁”,同步數據/參數。
-
常見相關類有:
-
ComsMCU / ExoData:通信 MCU 端的數據容器
-
ExoBLE / ExoData:藍牙接口的數據容器
-
BleParser:負責BLE數據解析與命令分發
-
4. 主控軟件運行流程(主循環偽代碼)
-
從SD卡讀取配置
- 如關節數量、類型、參數、控制器配置等
-
創建 ExoData 實例
- 靜態變量方式保存主數據結構
-
創建 Exo 實例
- 同樣靜態變量,管理所有外設/模塊
-
每周期運行流程:
-
讀取藍牙/串口/本地消息,更新 exo_data
- 包括參數調整、控制模式切換、狀態同步等
-
調用 exo.run()
-
依次調度所有子模塊(如各關節、各傳感器、LED 等)
-
完成采集、運算、指令下發
-
-
典型主循環C++偽代碼:
void loop() {// 1. 讀取外部消息(如藍牙參數、命令)BleParser.parseIncoming(&exo_data);// 2. 更新數據、同步狀態exo_data.update();// 3. 調用核心控制邏輯exo.run(&exo_data);// 4. 采集/上報/存儲數據等exo_data.log();
}
5. 架構優點小結
-
完全模塊化,軟硬件結構高度鏡像,易于維護、擴展、可視化;
-
所有參數/狀態集中于 ExoData,方便通信與遠程配置;
-
硬件更換、控制策略切換非常方便,只需變更 SD 卡配置,無需代碼大改;
-
支持多MCU分布式架構(實時主控+通信/可視化分工),適合科學實驗和實際場景使用。
6. 與 Code Structure 的關系
高層功能模塊是所有底層 C++ 代碼和硬件抽象的核心“骨架”。每一個子模塊(如 Joint、Motor、Controller)都可在詳細的 Code Structure 章節查找對應的實現、繼承和接口規范。
實用建議
- 如需開發新功能,只需擴展 Joint/Motor/Controller 的派生類,并在 ExoData 里加入參數描述即可;若需遠程調參/數據可視化,可直接基于 ExoData 實例和 BLE 協議擴展新接口。