ExoData.h - OpenExo

ExoData.h

  • 文件定位
  • 源代码
  • 1. 头文件依赖
  • 2. 核心类声明
  • 3. 主要成员函数
    • 关节遍历工具
    • 关节与配置相关
    • 数据/状态操作
    • 控制参数/校准
  • 4. 主要成员变量
  • 总结

文件定位

  • 位置src/ExoData.h

  • 作用定义 ExoData 类,作为 Exo 系统全局数据的核心容器。它将设备的所有关键状态、配置、各侧关节/传感器/控制器等,组织成统一接口供主控和其他模块访问。

  • 背景备注:头文件注释里说,把数据类和主控制类分开,是为了支持多板协同(如主控和BLE/GUI通讯分开)。


源代码

/*** @file Exo.h** @brief Declares exo class that all the other components will live in. * * @author P. Stegall * @date Jan. 2022
*/#ifndef Exo_h
#define Exo_h//Arduino compiles everything in the src folder even if not included so it causes an error for the nano if this is not included
#if defined(ARDUINO_TEENSY36)  || defined(ARDUINO_TEENSY41)#include "Arduino.h"#include "Side.h"
#include <stdint.h>
#include "ParseIni.h"
#include "Board.h"
#include "Utilities.h"
#include "SyncLed.h"
#include "StatusLed.h"
#include "StatusDefs.h"
#include "Config.h"class Exo
{public:Exo(ExoData* exo_data); //Constructor: uses initializer list for the Side objects./*** @brief Reads motor data from each motor used on that side and stores the values* * @return true if the code ran, ie tiiming was satisfied* @return false */bool run();  ExoData *data;      /**< Pointer to ExoData that is getting updated by the coms mcu so they share format.*/Side left_side;     /**< Left side object that contains all the joints and sensors for that side */Side right_side;    /**< Right side object that contains all the joints and sensors for that side */#ifdef USE_SPEED_CHECKutils::SpeedCheck speed_check; /**< Used to check the speed of the loop without needing prints */#endifSyncLed sync_led;       /**< Used to syncronize data with a motion capture system */StatusLed status_led;   /**< Used to display the system status */private:};
#endif#endif

1. 头文件依赖

#include "Arduino.h" 
#include "SideData.h" 
#include <stdint.h> 
#include "ParseIni.h" 
#include "Board.h" 
#include "StatusLed.h" 
#include "StatusDefs.h"
  • SideData.h:定义了每一侧(左/右)的数据结构。

  • ParseIni/Board/Status…:涉及配置解析、硬件定义和状态管理。


2. 核心类声明


class ExoData  
{   public:     ExoData(uint8_t* config_to_send); // 构造函数,传入配置数组      void reconfigure(uint8_t* config_to_send);  // 重新配置
  • 构造时传入配置数组,reconfigure可动态重加载参数。

3. 主要成员函数

关节遍历工具

// 遍历所有关节并执行回调 
template <typename F> 
void for_each_joint(F &&func) 
{     func(&left_side.hip, NULL);     func(&left_side.knee, NULL);     func(&left_side.ankle, NULL);     func(&left_side.elbow, NULL);     func(&right_side.hip, NULL);     func(&right_side.knee, NULL);     func(&right_side.ankle, NULL);     func(&right_side.elbow, NULL); 
} 
// 支持额外参数 
template <typename F> 
void for_each_joint(F &&func, float* args) { ... }
  • 统一遍历左右所有关节(髋、膝、踝、肘),批量操作非常方便。

关节与配置相关


uint8_t get_used_joints(uint8_t* used_joints);  // 获取正在用的关节ID列表  
JointData* get_joint_with(uint8_t id);         // 根据关节id返回指针
  • 方便上层通过ID访问各关节。

数据/状态操作


void print();                              // 打印所有数据 
void set_status(uint16_t status_to_set);   // 设置状态 
uint16_t get_status(void);                 // 获取状态

控制参数/校准


void set_default_parameters(); void set_default_parameters(uint8_t id);  void start_pretrial_cal(); // 启动实验前校准

4. 主要成员变量


bool sync_led_state;    // 同步LED状态 
bool estop;             // 急停状态 
float battery_value;    // 电池电压或电量 
SideData left_side;     // 左侧数据 
SideData right_side;    // 右侧数据 
uint32_t mark;          // 计时用 
uint8_t* config;        // 配置参数数组 
uint8_t config_len;     // 配置长度 
int error_code;         // 错误码 
int error_joint_id;     // 错误关节编号 
bool user_paused;       // 用户暂停标志  
int hip_torque_flag = 0;    // 使用力矩传感器标志(髋)
int knee_torque_flag = 0; 
int ankle_torque_flag = 0; 
int elbow_torque_flag = 0;  
private: uint16_t _status;   // 当前状态
  • SideData 下又分为各个关节(hip、knee、ankle、elbow),每个关节下有 motor/controller/sensor 等。

总结

  • ExoData 是整个外骨骼数据的“总线”,聚合了所有核心变量和状态。

  • 上层(如 Exo、通信模块、控制/校准流程)通过 ExoData 读写系统数据。

  • 提供遍历/查找/配置/打印/校准/状态管理等接口,极大方便模块间解耦和灵活拓展。

  • 结构清晰、面向对象,便于后续添加关节、传感器或新功能。

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

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

相关文章

缓存HDC内容用于后续Direct2D绘制.

思路&#xff1a;把HDC里的内容保存到Direct2D格式的位图里&#xff0c;后续直接调用 renderTarget->DrawBitmap即可。本例中&#xff0c;位图将保存为类的字段。本例中 COM 接口指针皆使用 com_ptr&#xff0c;这是 WinRT 的 COM 智能指针类&#xff0c;com_ptr<I>::…

“抓了个寂寞”:一次实时信息采集的意外和修复

1. 那天下午&#xff0c;舆情系统“迟到”了 那天下午&#xff0c;公司运营那边突然在群里喊&#xff1a;“XX事件都快上热搜榜前十了&#xff0c;咱们系统咋没反应&#xff1f;” 我愣了几秒&#xff0c;立马翻后台日志、爬虫执行记录&#xff0c;结果一查&#xff0c;还真有点…

数据结构之迪杰斯特拉算法

前言&#xff1a;前面两篇文章介绍了生成图的最小生成树的算法&#xff0c;接下来两篇文章会介绍图的最短路径的算法&#xff0c;迪杰斯特拉算法和弗洛伊德算法。迪杰斯特拉算法是用来计算一个点到其他所有点的最短路径&#xff0c;这个点称之为源点。 一、实现流程 回忆一下…

技术文档 | OpenAI 的 Kafka 演进之路与 Pulsar 迁移潜力

导读ChatGPT 用户量指数级暴涨&#xff0c;OpenAI 的 Kafka 集群在一年内增长 20 倍至 30 个集群[1]&#xff0c;其 Kafka 架构面临日均千亿级消息&#xff08;峰值 QPS 800万/秒&#xff09; 的压力。这揭示了一个关键事实&#xff1a;OpenAI 的成功不只依赖模型&#xff0c;更…

【bug】 jetson上opencv无法录制h264本地视频

在Jetson Orin NX上无法使用opencv直接录制h264/h265视频流&#xff08;h264格式的视频流才能在浏览器播放&#xff09; 解决&#xff1a; 软件编码&#xff1a;需要源码编译opencv 1.环境准备 pip uninstall opencv-python sudo apt install build-essential cmake git python…

解决http的web服务中与https服务交互的问题

问题背景&#xff1a; 需要在一个http的web服务中直接跟另一个https服务交互&#xff0c;不经过自身后端。 又来到了熟悉的跨域访问问题。 解决逻辑就是使用nginx转发&#xff0c;涉及到的文件也就是nginx.conf文件&#xff0c;前面解决minio链接时已经有经验了&#xff0c;但…

网站访问信息追踪系统在安全与性能优化中的关键作用——网络安全—仙盟创梦IDE

<?php // 收集访问信息 $visitorInfo未来之窗 [timestamp > date(Y-m-d H:i:s),ip > $_SERVER[REMOTE_ADDR] ?? unknown,page > $_SERVER[REQUEST_URI] ?? unknown,method > $_SERVER[REQUEST_METHOD] ?? unknown,user_agent > $_SERVER[HTTP_USER_A…

Oracle 时间处理函数和操作符笔记

前言 写sql时经常用到时间处理函数&#xff0c;我整理了一份Oracle的常用sql笔记,供大家参考。 如果对你有帮助&#xff0c;请点赞支持~ 多谢&#x1f64f; 笔记 -- 1. 获取当前日期和时间 -- SYSDATE, SYSTIMESTAMP, CURRENT_DATE, CURRENT_TIMESTAMP, LOCALTIMESTAMP SELE…

TDengine时序数据库 详解

1. TDengine 简介 TDengine 是一款 高性能、分布式、支持 SQL 的时序数据库&#xff08;Time-Series Database, TSDB&#xff09;&#xff0c;专为 物联网&#xff08;IoT&#xff09;、工业互联网、金融监控、日志分析 等场景设计。其核心特点包括&#xff1a; 超高性能&…

【IDEA】idea怎么修改注册的用户名称?

文章目录[toc]问题**方法 1&#xff1a;通过 JetBrains 账户网站修改****方法 2&#xff1a;通过 IDEA 内跳转修改&#xff08;快捷方式&#xff09;****注意事项****补充&#xff1a;修改 IDEA 内的项目级用户名**如何退出IDEA用户登录&#xff1f;问题 在 IntelliJ IDEA 中修…

AR眼镜重塑外科手术导航:精准“透视”新突破

在现代医学领域&#xff0c;增强现实&#xff08;AR www.teamhelper.cn &#xff09;技术正以前所未有的方式改变外科手术导航的面貌。通过为医生提供实时的三维可视化、精准的空间定位和智能交互功能&#xff0c;AR眼镜正在成为手术室中的重要工具。本文将系统介绍AR眼镜在手术…

服务端对接 HTTP 接口传输图片 采用base64还是 multipart/form-data

在服务端对接HTTP接口传输图片时&#xff0c;选择 multipart/form-data 还是 Base64 编码&#xff0c;需要根据具体场景权衡。以下是详细对比和建议&#xff1a;1. multipart/form-data 优点 更适合大文件传输&#xff1a; 直接以二进制流传输图片&#xff0c;无需编码/解码&am…

如何在 Windows 上安装 MongoDB 及常见问题

MongoDB 是一款 NoSQL 数据库&#xff0c;在数据管理和存储方面以其无与伦比的强大功能和多功能性而脱颖而出。该平台凭借其灵活性、可扩展性和高性能保持着领先优势&#xff0c;赢得了众多企业的信赖。在这方面&#xff0c;MongoDB 以及其在 Windows 操作系统中的表现&#xf…

JS与Go:编程语言双星的碰撞与共生

在编程语言的璀璨星河中&#xff0c;JavaScript&#xff08;简称JS&#xff09;与Go语言凭借各自独特的魅力&#xff0c;成为不同领域的佼佼者。前者以灵活多变的姿态征服了前端世界&#xff0c;后者则以高效稳健的特性在后端领域崭露头角&#xff0c;二者的碰撞与共生&#xf…

【开源】WpfMap:一个基于WPF(Windows Presentation Foundation)技术构建的数据可视化大屏展示页面

文章目录一、项目概述1.1 项目定位二、适用场景2.1 企业数据展示2.2 监控中心2.3 会议展示三、功能特性3.1 高度自定义3.2 实时更新3.3 丰富的可视化组件3.4 良好的用户体验四、技术资源4.1 开源地址一、项目概述 1.1 项目定位 WpfMap是一个基于WPF&#xff08;Windows Prese…

macbook安装homebrew

homebrew是什么&#xff1f;Homebrew 是 macOS&#xff08;以及 Linux&#xff09;上的一款包管理工具&#xff0c;被称为 “macOS 缺失的包管理器”&#xff0c;它能帮助用户轻松安装、卸载、更新各种命令行工具、开发环境、应用程序等。简单来说&#xff0c;它的作用类似手机…

ViLT: 无卷积或区域监督的视觉-语言Transformer

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" ViLT: 无卷积或区域监督的视觉-语言Transformer 摘要 视觉与语言预训练&#xff08;Vision-and-Language Pre-training, VLP&#xff09;在多种联合视觉与语言的下游任务中显著提升了性能。目前的 VLP 方法在很…

初识决策树-理论部分

决策树 前言 参考了大佬的博客&#xff1a;博客地址 适合分析离散数据&#xff0c;若是连续数据需要转换成离散数据再做分析(比如图中的年龄) 结构 决策树由节点和有向边组成&#xff1b;节点可分为内部节点和叶节点 内部节点:特征叶节点:类别有向边:特征的取值范围 在用决…

opencv--day02--图像颜色处理及图像仿射变换

文章目录前言一、 图像颜色处理1. 颜色加法1.1 OpenCV加法1.2 numpy加法1.3 颜色加权加法2.颜色空间2.1 RGB颜色空间2.2 HSV颜色空间3. 颜色转换3.1 读取的图片同时转换3.2 对已有图片转换4. 图像灰度化4.1 灰度图概念4.2 最大值灰度化4.3 平均值灰度化4.4 加权均值灰度化5. 图…

第一层nginx访问url如何透传到第二层nginx

要让第一层Nginx将客户端请求的URL完整透传到第二层Nginx&#xff0c;关键在于正确配置proxy_pass指令及路径拼接规则。以下是具体配置方法和注意事项&#xff1a; 核心配置原则 proxy_pass指令末尾是否添加/会直接影响URL的透传方式&#xff1a; 不带/&#xff1a;会将locatio…