ArduPilot開源代碼之OpticalFlow_backend

ArduPilot開源代碼之OpticalFlow_backend

  • 1. 源由
  • 2. Library設計
  • 3. 重要例程
    • 3.1 OpticalFlow_backend::_update_frontend
    • 3.2 OpticalFlow_backend::_applyYaw
  • 4. 總結
  • 5. 參考資料

1. 源由

光流計是一種低成本定位傳感器,所有的光流計設備傳感驅動代碼抽象公共部分統一由OpticalFlow_backend實現。設計的核心思想是將光流傳感器的具體實現與其前端接口分離開來,通過純虛函數和友元類的機制,實現了靈活且可擴展的架構。

2. Library設計

OpticalFlow_backend類是一個抽象基類,用于表示光流傳感器的后端實現。它包含了一些基本的接口函數,如初始化、更新和消息處理函數。

  1. 公共部分使用虛函數,根據不同硬件傳感設備進行實現;
  • init函數是一個虛函數,允許子類在必要時重寫初始化過程。
  • update函數是一個純虛函數,強制所有子類必須實現自己的更新邏輯。
  • handle_msghandle_msp函數用于處理不同類型的消息,提供了默認的空實現,子類可以根據需要進行重寫。
  1. 保護部分直接抽象的公共部分的函數實現,如訪問前端對象、更新前端狀態、獲取縮放參數、計算偏航角等。
  2. AP_OpticalFlow類被聲明為友元類,允許它訪問OpticalFlow_backend的私有和保護成員。這表示AP_OpticalFlow可能是該后端類的管理類或控制類。
  3. **CLASS_NO_COPY(OpticalFlow_backend)**是一個宏,用于禁止該類的拷貝構造和賦值操作,確保每個對象都是唯一的。
class OpticalFlow_backend
{// 將AP_OpticalFlow類聲明為友元類,允許其訪問OpticalFlow_backend的私有成員friend class AP_OpticalFlow;public:// 構造函數,接受一個AP_OpticalFlow對象的引用OpticalFlow_backend(AP_OpticalFlow &_frontend);// 虛析構函數,允許子類重寫virtual ~OpticalFlow_backend(void);// 禁止拷貝構造和拷貝賦值操作CLASS_NO_COPY(OpticalFlow_backend);// 初始化傳感器的函數,默認實現為空virtual void init() {}// 從傳感器讀取最新的值并填充x, y和totals的純虛函數,必須在子類中實現virtual void update() = 0;// 處理光流的mavlink消息的虛函數,默認實現為空virtual void handle_msg(const mavlink_message_t &msg) {}#if HAL_MSP_OPTICALFLOW_ENABLED// 處理光流的msp消息的虛函數,默認實現為空virtual void handle_msp(const MSP::msp_opflow_data_message_t &pkt) {}
#endifprotected:// 前端對象的引用AP_OpticalFlow &frontend;// 更新前端狀態的函數void _update_frontend(const struct AP_OpticalFlow::OpticalFlow_state &state);// 獲取光流縮放參數的函數,返回一個包含X和Y軸縮放因子的向量Vector2f _flowScaler(void) const { return Vector2f(frontend._flowScalerX, frontend._flowScalerY); }// 獲取以弧度表示的偏航角的函數float _yawAngleRad(void) const { return radians(float(frontend._yawAngle_cd) * 0.01f); }// 應用偏航角到一個向量上的函數void _applyYaw(Vector2f &v);// 獲取ADDR參數值的函數uint8_t get_address(void) const { return frontend._address; }// 用于訪問共享前端數據的信號量HAL_Semaphore _sem;
};

3. 重要例程

3.1 OpticalFlow_backend::_update_frontend

// update the frontend
void OpticalFlow_backend::_update_frontend(const struct AP_OpticalFlow::OpticalFlow_state &state)
{frontend.update_state(state);
}

3.2 OpticalFlow_backend::_applyYaw

// apply yaw angle to a vector
void OpticalFlow_backend::_applyYaw(Vector2f &v)
{float yawAngleRad = _yawAngleRad();if (is_zero(yawAngleRad)) {return;}v.rotate(yawAngleRad);
}

4. 總結

OpticalFlow_backend繼承出來的硬件傳感設備在Ardupilot上,目前有以下幾類設備:

  • AP_OpticalFlow_CXOF
  • AP_OpticalFlow_HereFlow
  • AP_OpticalFlow_MAV
  • AP_OpticalFlow_MSP
  • AP_OpticalFlow_Onboard
  • AP_OpticalFlow_Pixart
  • AP_OpticalFlow_PX4Flow
  • AP_OpticalFlow_SITL
  • AP_OpticalFlow_UPFLOW

MATEKSYS Optical Flow & LIDAR 3901-L0X是其中的一種。

  • 傳感模塊:MATEKSYS Optical Flow & LIDAR 3901-L0X
  • [ArduPilot開源代碼之MatekSys Optical Flow 3901-L0X](ArduPilot開源代碼之MatekSys Optical Flow 3901-L0X)
  • ArduPilot開源飛控之AP_OpticalFlow

5. 參考資料

【1】ArduPilot開源飛控系統之簡單介紹
【2】ArduPilot之開源代碼Task介紹
【3】ArduPilot飛控啟動&運行過程簡介
【4】ArduPilot之開源代碼Library&Sketches設計
【5】ArduPilot之開源代碼Sensor Drivers設計

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43449.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43449.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43449.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[計網初識1] TCP/UDP

學習內容 1.TCP建立鏈接的3次握手,斷開連接的4次揮手 2.TCP報文段組成 內容 1.TCP 建立連接的3次握手? 假設主動方是客戶端,被動方是服務端。 第一次 客戶端給服務端發送 “hello,我是客戶端” (TCP段中 SYN1) 第二次 服務端給客戶端發送"我接…

從零開始的python學習生活2

接上封裝 class Phone:__volt0.5def __keepsinglecore(self):print("讓cpu以單核運行")def if5G(self):if self.__volt>1:print("5G通話已開啟")else:self.__keepsinglecore()print("電量不足,無法使用5G通話,已經設置為單…

Django項目創建的準備工作【 2 】

【 一 】調整后端目錄 #1 目錄結構 """ ├── luffy_api├── logs/ # 項目運行時/開發時日志目錄 - 包├── manage.py # 腳本文件├── luffy_api/ # 項目主應用,開發時的代碼保存 - 包├── apps/ …

【Git基本操作】添加文件 | 修改文件 | 及其各場景下.git目錄樹的變化

目錄 1. 添加文件&add操作和commit操作 2. .git樹狀目錄的變化 3. git其他操作 4. 修改文件 4.1 git status 4.2 git diff 1. 添加文件&add操作和commit操作 add操作:將工作區中所有文件的修改內容 添加進版本庫的暫存區中。commit操作:…

云端編碼:將您的技術API文檔安全存儲在iCloud的最佳實踐

云端編碼:將您的技術API文檔安全存儲在iCloud的最佳實踐 作為一名技術專業人士,管理不斷增長的API文檔庫是一項挑戰。iCloud提供了一個無縫的解決方案,允許您在所有設備上存儲、同步和訪問您的個人技術API文檔。本文將指導您如何在iCloud中高…

系統服務綜合實驗(dns服務,nfs服務)

題目:現有主機 node01 和 node02,完成如下需求: 1、在 node01 主機上提供 DNS 和 WEB 服務 2、dns 服務提供本實驗所有主機名解析 3、web服務提供 www.rhce.com 虛擬主機 4…

three-tile: 1. 第一個three-tile程序

上篇介紹了:three-tile: 一個開源的輕量級三維瓦片庫-CSDN博客 three-tile 是一個開源的輕量級三維瓦片庫,它基于threejs使用typescript開發,提供一個三維地形模型,能輕松給你的應用增加三維瓦片地圖。 項目地址&…

C#知識|賬號管理系統:UI層-添加賬號窗體設計思路及流程。

哈嘍,你好啊,我是雷工! 前邊練習過詳情頁窗體的設計思路及流程: 《C#知識|上位機UI設計-詳情窗體設計思路及流程(實例)》 本節練習添加賬號窗體的UI設計,以下為學習筆記。 01 效果展示 02 添加窗體 在UI層添加Windows窗體,設置名稱為:FrmAddAcount.cs 設置窗體屬…

Nginx七層(應用層)反向代理:UWSGI代理uwsgi_pass篇

Nginx七層(應用層)反向代理 UWSGI代理uwsgi_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

數據結構模板2

Trie樹&#xff1a;用來高效存儲和查找字符串集合的數據結構&#xff1a; 模板題&#xff1a;https://www.acwing.com/problem/content/837/ AC代碼&#xff1a; #include<bits/stdc.h> using namespace std; int son[100010][26],cnt[100010],idx; char str[100010]; …

數據的洞察力:SQL Server Analysis Services在數據分析中的卓越應用

數據的洞察力&#xff1a;SQL Server Analysis Services在數據分析中的卓越應用 在商業智能和數據分析領域&#xff0c;SQL Server Analysis Services (SSAS) 是一款強大的工具&#xff0c;它提供了多維數據和數據挖掘模型的創建、部署和管理功能。本文將深入探討如何在SQL Se…

云端生活,智能管理:在iCloud中打造您的個人購物清單與預算計劃

云端生活&#xff0c;智能管理&#xff1a;在iCloud中打造您的個人購物清單與預算計劃 在快節奏的現代生活中&#xff0c;個人財務管理和購物規劃變得尤為重要。iCloud提供了一個強大的平臺&#xff0c;讓我們能夠存儲、同步和共享個人購物清單與預算計劃。本文將詳細介紹如何…

代碼隨想錄算法訓練營第二十九天

452. 用最少數量的箭引爆氣球 這道題目我原本的想法是只要當前的氣球半徑范圍在已有的箭頭能夠擊穿的氣球半徑內就可以實現 但是 箭射出去的地方是一個值 而不是一個范圍 因此有相同的重疊范圍的許多氣球并一定都有相同的值&#xff0c;因此這種方法不可取 這題的主要局部最…

最短路徑算法(算法篇)

算法之最短路徑算法 最短路徑算法 概念&#xff1a; 考查最短路徑問題&#xff0c;可能會輸入一個賦權圖(也就是邊帶有權的圖)&#xff0c;則一條路徑的v1v2…vN的值就是對路徑的邊的權求和&#xff0c;這叫做賦權路徑長&#xff0c;如果是無權路徑長就是單純的路徑上的邊數。…

mac安裝配置cmake

本機是2015 macbook pro mid&#xff0c;已經有點老了&#xff0c;用homebrew下cmake老出問題 其實cmake官網安裝也不麻煩 一、官網下載對應安裝包 Download CMake 和所有dmg文件一樣安裝 二、改成命令行使用 一般來說 tutorial 給的都是命令行build 命令行的設置如下&am…

手機下載APP (uniapp/vue)

一、uniapp <template><view class"content"><view class"appName">{{ formData.appName }}</view><view class"appInfo">{{ formData.appInfo }}</view><image class"logo" :src"formDa…

批量修改Git歷史commit信息中的username

之前很長一段時間GitHub上的提交都在使用工作賬戶, 導致私人倉庫中的提交者比較混亂. 在StackOver里面找到了一個bash腳本可以批量修改username, 在這里記錄一下. 修改的步驟一共兩步: 執行修改腳本將本地修改同步到Git服務器 首先我們來看腳本: #!/bin/shgit filter-branch…

SFUZZ模糊測試平臺全新升級,從標準到實踐助力車企安全出海

開源網安模糊測試平臺SFuzz全新升級&#xff0c;參照各國相關標準要求進行針對性建設&#xff0c;可為智能網聯汽車信息安全測試提供更為強大的工具支持。SFuzz向被測系統輸入大量隨機數據&#xff0c;模擬各種異常情況&#xff0c;可以發現被測系統內潛在的缺陷和漏洞&#xf…

Spring中如何操作Redis

Spring畢竟是Java中的一個主流框架&#xff0c;如何在這個框架中使用Redis呢&#xff1f; 創建項目并引入相關依賴 然后進行創建。 至此就將Redis的相關依賴引入進來了。 編寫Redis配置 將application.properties修改成application.yml 然后編寫如下配置&#xff1a; spr…

usbserver工程師手記(二)設置定時任務

概述 部分銀行ukey 長時間不使用后會導致休眠&#xff0c;出現雖然有連接&#xff0c;但是讀不到證書&#xff0c;可以用定時重置端口的辦法&#xff0c;調用接口 http://ip/usb_server/reset_port,參數為 {"port":"B5-1-2","vid_pid":"09…