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
英文地址,請注明出處:http://en.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…