高层功能架构详解
- 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 协议扩展新接口。