高层功能架构详解 - openExo

高层功能架构详解

  • 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 协议扩展新接口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90063.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【西北工业大学公开课】导引系统原理(全61讲)周军 -个人笔记版 5000字

【严正声明】此文档为个人笔记:仅供个人与同学参考学习,记录学习过程,严谨商业转载,或商业售卖!感谢西北工业大学公开课知识分享,公开资料开源!视频链接:【【西北工业大学】导引系统…

《命令行参数与环境变量:从使用到原理的全方位解析》

前言 当我们在终端输入 ls -l /home 查看目录详情,或用 gcc -o hello hello.c 编译代码时,或许很少思考:这些空格分隔的 “指令 选项 路径” 是如何被程序识别的?为什么 PATH 变量能让系统找到可执行文件,而 HOME 变…

C++设计模式:单例模式 (现代C++主流实现方式Meyer‘s Singleton + 使用CRTP模板化)

文章目录单例模式创建单例类饿汉式or懒汉式现代C单例模式的主流实现方式——Meyers Singleton使用 CRTP 模板化单例类单例模式 单例模式是指程序中只需要一个实例化对象,在全局作用域或整个代码架构中,此对象只被实例化一次,就可以达到在整个…

Eureka 和 Nacos

一、基本介绍EurekaEureka 是 Netflix 公司开发的一款基于 REST 风格的服务注册与发现组件,专为分布式系统设计。它遵循 AP 原则(可用性、分区容错性优先),强调在网络分区等异常情况下的服务可用性,是 Spring Cloud Ne…

文件IO笔试题

目录前言一、核心概念:二、关键操作步骤:三、为什么需要文件IO?四、常见类型:五、标准IO源码六、笔试真题和练习1.代码实现1代码实现22.代码实现3.代码实现4.代码实现5.代码实现七、总结前言 文件IO(文件输入/输出&am…

前端学习 5:DFT

DFT技术 DFT (design for testability):指在设计系统和电路的同时,考虑测试的需求,通过增加一定的硬件开销,获得最大可测性的设计过程。(因为增加了硬件,所以也带来了不足&#xff…

最长递增子序列(LIS)问题详解

最长递增子序列LIS问题详解一、问题定义与核心特征1.1 问题描述1.2 核心特征二、基础解法:动态规划(DP)2.1 解法思路2.2 Java代码实现2.3 复杂度分析三、优化解法:二分查找贪心3.1 核心思路3.2 二分查找的作用3.3 Java代码实现代码…

什么是HTTP长连接、短连接?谁更能抗DoS攻击?

想象你在快餐店点餐: 你:“一个汉堡”收银员:“好的,15元”交易结束,你离开队伍你想加杯可乐,重新排队你:“一杯可乐”收银员:“好的,8元”再次离开… 这种每次沟通后立即…

微软徽标认证是什么?如何快速获取驱动签名?

在Windows系统中安装硬件驱动时,是否遇到过“无法验证发布者”的警告?这正是驱动数字签名在背后发挥作用。对于软件开发者而言,驱动数字签名不仅是系统兼容性的保障,更是企业品牌信任度的核心。一、驱动数字签名的核心作用驱动数字…

Apache Ignite缓存基本操作

这段内容主要讲解了 Apache Ignite 中缓存(IgniteCache)的基本操作,包括获取缓存、创建缓存、销毁缓存、执行原子操作以及异步操作等。下面我将用中文对这些内容进行详细解释,帮助你更好地理解。一、获取缓存实例(Gett…

最新基于R语言结构方程模型分析与实践技术应用

现代统计学理论和方法的不断完善,使科研工作对统计方法的要求也越来越高,面对纷繁复杂的数据,如何选择最为合适的数据分析方法已成为科研工作者,尤其是广大刚处于科研生涯起步阶段的研究生们最为棘手问题。随着科学的发展&#xf…

物联网_TDengine_EMQX_性能测试

一、Tdengine接口开发文档 1、数据库 1.创建数据库 URL /dp/createdb/ method post 请求示例 {"db_name":"demo01" // 必填 }响应示例 // 成功 {"code": 1,"data": {"成功创建数据库": "demo04"},"error…

从分析到优化:Amazon Q CLI 助力 EKS 网络调用链剖析与运维实践

1. 引言 在 Amazon EKS(Elastic Kubernetes Service)环境中,理解从 ALB(Application Load Balancer)到 Pod 的完整网络调用链对运维人员至关重要。本文将展示如何利用 Amazon Q CLI 这一 AI 助手工具,通过…

Class10简洁实现

Class10简洁实现 import torch from torch import nn from d2l import torch as d2l# 输入为28*28,输出为10类,第1、2隐藏层256神经元 num_inputs, num_outputs, num_hiddens1, num_hiddens2 784, 10, 256, 256 # 第1个隐藏层丢弃率为0.2,第…

【多线程篇22】:ConcurrentHashMap的并发安全原理剖析

文章目录一、HashMap 的“不安全”:问题的根源1. 数据结构回顾 (JDK 1.8)2. 并发下的致命缺陷:put 操作二、ConcurrentHashMap 的安全之道 (JDK 1.8)1. 核心数据结构2. 安全的 put 操作:分场景精细化加锁3. 安全的 size() 计算:并…

【Java + Vue 实现图片上传后 导出图片及Excel 并压缩为zip压缩包】

系统环境: Java JDK:1.8.0_202 Node.js:v12.2.0 Npm:6.9.0 Java后端实现 Controller /*** xxxx-导出* param response 返回信息体* param files 上传的图片文件* param param1 参数1* param param2 参数2*/PostMapping("/ex…

安科瑞:能源微电网助力工业园区“绿色”发展

朱以真近日,厦门市工业和信息化局印发工业园区绿色智慧微电网建设,拟开展全市工业园区绿色智慧微电网试点通知,那么对于如何实现绿色园区的建设是今天的话题。对工业园区绿色智慧微电网建设需求,其核心价值体现在“源-网-荷-储-充…

VUE2 学习笔记3 v-on、事件修饰符、键盘事件

事件处理v-on用于事件交互。语法:v-on:要绑定的事件“事件触发时执行的函数” (函数这里可以写括号,也可以不写,没有影响)简写::事件触发时要执行的函数,在Vue配置参数中,通过method…

变换域通讯系统CCSK的matlab仿真

CCSK(Cyclic Code Shift Keying)通信系统的MATLAB仿真。实现完整的CCSK调制、AWGN信道传输和解调过程,并计算了误码率(BER)。 % CCSK通信系统仿真 clear; clc; close all;% 参数设置 L 31; % m序列…

技术演进中的开发沉思-40 MFC系列:多线程协作

今天说说MFC的线程,当年用它实现中间件消息得心应手之时,可以实现一边实时接收数据,一边更新界面图表图文信息,顺滑得让人想吹声口哨。 MFC 多线程它像给程序装上了分身术,让原本只能 “单任务跑腿” 的代码&#xff0…