機(jī)械狗應(yīng)用開發(fā)指南_第1頁
機(jī)械狗應(yīng)用開發(fā)指南_第2頁
機(jī)械狗應(yīng)用開發(fā)指南_第3頁
機(jī)械狗應(yīng)用開發(fā)指南_第4頁
機(jī)械狗應(yīng)用開發(fā)指南_第5頁
已閱讀5頁,還剩84頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南文檔版本01發(fā)布日期2023-11-14HUAWEI文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司i非經(jīng)本公司書面許可,任何單位和個人不得擅自摘抄、復(fù)制本文檔內(nèi)容的部分或全部,并HUAWEl和其他華為商標(biāo)均為華為技術(shù)有限公您購買的產(chǎn)品、服務(wù)或特性等應(yīng)受華為公司商業(yè)合同和條款的約束,本文檔中描述的全部或部分特性可能不在您的購買或使用范圍之內(nèi)。除非合同另有約定,華為公司對本文檔內(nèi)容不做任何明示由于產(chǎn)品版本升級或其他原因,本文檔內(nèi)容會不定期進(jìn)行更地址:深圳市龍崗區(qū)坂田華為總部辦公樓郵編:518129網(wǎng)址:客戶服務(wù)郵箱:support@客戶服務(wù)電話:4008302118文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司ii華為公司對產(chǎn)品漏洞管理的規(guī)定以“漏洞處理流程”為準(zhǔn),該政策可參考華為公司官方網(wǎng)站的網(wǎng)址:https:///cn/psirt/vul-response-process。如企業(yè)客戶須獲取漏洞信息,請訪問:/enterprise/cn/security-advisory。Atlas200IDKA2開發(fā)者套件文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司iii 1.1外觀結(jié)構(gòu) 11.2功能與原理介紹 31.3控制與運動部分 31.4循跡行走部分 51.5鎖定追蹤部分 5 102.1準(zhǔn)備組件 10 11 3.1地圖繪制 173.2配置無線Wi?模塊 183.3配置ESP32開發(fā)板燒錄軟件 193.4配置STM32開發(fā)板燒錄軟件 223.5獲取代碼 243.5.1ESP32代碼 243.5.2STM32代碼 263.5.3機(jī)械狗代碼 30 314.1手動控制機(jī)械狗姿態(tài)變換 314.2手動控制機(jī)械狗運動 344.3機(jī)械狗自動行走 344.4機(jī)械狗鎖定目標(biāo)追蹤 35 375.1主要代碼文件介紹 375.2機(jī)械狗控制邏輯入口 375.3手動控制機(jī)械狗行走 405.4機(jī)械狗巡引導(dǎo)線行走 415.5機(jī)械狗鎖定目標(biāo)追蹤 42Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南1樣例介紹文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司11樣例介紹基于Atlas200IDKA2開發(fā)者套件板(以下簡稱為開發(fā)板)的算力基礎(chǔ)與接口豐富度,在實現(xiàn)Chatbot/智能小車/機(jī)械臂/語音臺燈等樣例之后,希望能夠擴(kuò)展兼容性和多領(lǐng)域適配度,實現(xiàn)另外一個復(fù)雜樣例并且能夠兼顧更加繁瑣的下位機(jī)操作,板開發(fā)了本機(jī)械狗樣例,能夠?qū)崿F(xiàn)站立坐下以及左右的姿態(tài)變化,能走,另外能夠追蹤目標(biāo)追隨遛狗,并且能夠在多人的情境下,仍然穩(wěn)1.1外觀結(jié)構(gòu)1.2功能與原理介紹1.3控制與運動部分1.4循跡行走部分1.5鎖定追蹤部分1.四個具有2自由度的機(jī)械腿以及中間的主體部分實現(xiàn)的,機(jī)械腿的曲柄連桿結(jié)構(gòu)保證了機(jī)械狗可以單獨操作每一條腿的運動,每條腿上的兩個關(guān)節(jié)由2.下位機(jī)由帶有串口擴(kuò)展板的兩個STM32單片機(jī)開發(fā)板構(gòu)成,分為主控F405和從控F103,位于機(jī)械狗身體內(nèi)部。3.使用補充的3D連接固定件固定攝像頭云臺、開發(fā)板以及開發(fā)板電源4.攝像頭云臺連接一塊ESP32下位機(jī)控制攝像頭的移動,再通過USB擴(kuò)展塢將所有的線連接到開發(fā)板上,再使用Wi?模塊連接到開發(fā)板上。Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南1樣例介紹文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司2文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司3機(jī)械狗分為上位機(jī)即Atlas200IDKA2開發(fā)者套件板,下位機(jī)即STM32和ESP32單片機(jī),通過命令行以及手勢語音等方式輸入到機(jī)械狗上的各類傳感器以及場景切換后進(jìn)入到主函數(shù),初始化各類硬件底層設(shè)備完成之后,就可以景對應(yīng)的模塊中進(jìn)行信息拉取和推理進(jìn)程了。以攝像頭的為例,利用攝頻信息之后,輸入到場景循環(huán)函數(shù)中,經(jīng)過CV模型得到推理結(jié)果,再將后處理的結(jié)果回傳到場景循環(huán)模塊中,針對控制模塊做動作下發(fā),傳遞到STM32下位機(jī)上控制四足●在上位機(jī)(開發(fā)者套件)上部署離線推理模型后,在上位機(jī)上根據(jù)推理結(jié)果生成果串口處接收到是上位機(jī)發(fā)出的指令,則會進(jìn)入到對應(yīng)的中斷函數(shù)a.會開啟多個任務(wù)序列,包括初始化電機(jī)零點位置、陀螺儀初始化、顯示屏顯示、LED燈顯示、蜂鳴器初始化及串口發(fā)到上位機(jī)發(fā)出的指令后,下位機(jī)進(jìn)行解析,獲取機(jī)器狗的姿c.進(jìn)入到機(jī)械狗的運動解析部分進(jìn)行運算,解析接下來的運動需中每一個機(jī)械腿的運動位置,以及八個電機(jī)需要轉(zhuǎn)到的目標(biāo)位置,并下發(fā)d.同時,為了防止運動過程中機(jī)械同方向上的非水平位置變化,然后加入到機(jī)械腿的運動控制中機(jī)械腿的目標(biāo)位置后,可以通過機(jī)械腿路徑規(guī)劃算法實現(xiàn)實時機(jī)械狗應(yīng)用開發(fā)指南●偏移糾正模型:通過回歸計算左右兩條引導(dǎo)線,計算出兩條引導(dǎo)線的中線,并與直線行走,不會走出引導(dǎo)線。若偏轉(zhuǎn)角是鈍角或者銳角,則說明機(jī)●轉(zhuǎn)向輔助模型:識別轉(zhuǎn)彎標(biāo)識以及調(diào)頭標(biāo)識通過兩個模型的交替進(jìn)行,再針對轉(zhuǎn)向角和機(jī)械狗的速度做映射和微調(diào)Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南1樣例介紹文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司6文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司7文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司8文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司91.在啟動主程序后,首先進(jìn)行攝像頭和共享內(nèi)存的初始化,拉流后在運動控制器端初始化,獲取STM32和ESP32的端口信息。2.其中,外設(shè)的連接端口號ttyUSB*中具需要提前查詢端口信息并返回到主程序中。而后在追蹤任務(wù)的進(jìn)程開啟兩個手勢識別和人體檢測的模型進(jìn)程,分別進(jìn)行初始化,然后機(jī)設(shè)置舵機(jī)的角度,調(diào)整到方便機(jī)械狗追蹤的角度,將識別鎖定追3.在拉流分發(fā)的進(jìn)程中開啟循環(huán)獲取frame并放入共享內(nèi)存中,然后再啟動循環(huán)并開始并行的手勢識別和人體識別的推理進(jìn)程。此處使用兩個消息隊列別和人體識別出現(xiàn)異幀不同步的情況,將兩個過程同步之后返回兩個bboxes,分a.在出現(xiàn)比值大于0.9的幀時,計數(shù)器值加1,在連續(xù)五幀都超過這個比值后,將鎖定目標(biāo)的FLAG置為True,然后設(shè)置舵機(jī)若在已經(jīng)鎖定目標(biāo)的狀態(tài)下就需要鎖定到該框并且使用卡爾曼行目標(biāo)框的匹配,進(jìn)而推算出要追隨的目標(biāo),即使在有多人存b.在超過20幀沒有識別到目標(biāo)之后以及出現(xiàn)解鎖的手勢超過5幀之后就會將機(jī)械狗的下位機(jī)中的運動FLAG設(shè)定為停止,然后上位機(jī)上的解鎖標(biāo)志回歸為解Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南2樣例組裝2樣例組裝2.1準(zhǔn)備組件須知須知當(dāng)前樣例僅在UbuntuOS適配驗證過,未在openEulerOS適配驗證,推薦燒錄鏡像數(shù)量/個1否1是1是1是118°廣角無畸變模組ESP32機(jī)器人開發(fā)板1是主板+Type-C數(shù)據(jù)線38400mah移動電源1是12V9V5V三輸出40是M2.5*7+640是M4*7+6文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司10Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南2樣例組裝數(shù)量/個40是M440是M2.540是40是M2.5*5載文件后通過3D打?。?是1是單USB轉(zhuǎn)4口USB3.0MicroUSB數(shù)據(jù)傳1是USBWi?模塊1是-步驟1首先將機(jī)械狗裸機(jī)平放在地面上,然后將3D打印好的三個支撐板用單頭六角銅柱和防文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司11Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南2樣例組裝從上到下依次為攝像頭承載板、開發(fā)板承載板以及電池倉,按照圖中的文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司12步驟3將開發(fā)者套件從底板上拆下并固定到3D打印出來的開發(fā)板承載板上,如圖3固定開發(fā)步驟4將兩軸云臺上原有的普通攝像頭拆下,替換上無畸變的文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司13其中上半部分的舵機(jī)連接到ESP32上的26號接口,棕色線接地靠近5V一側(cè),下半部分的舵機(jī)連接到ESP32上的25號接口,棕色線接地靠近5V一側(cè)。文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司14Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南2樣例組裝文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司15步驟6將各個電源線連接好后,需要使用一根MicroUSB數(shù)據(jù)線連接到機(jī)械狗內(nèi)部的主控F405一側(cè)的MicroUSB端口,另一端連接到插到開發(fā)板上的USB擴(kuò)展塢上,再將USBWifi模塊插到開發(fā)板的USB接口上,將USB攝像頭和ESP32接到USB擴(kuò)展塢上,即Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南2樣例組裝文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司16Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南3運行環(huán)境準(zhǔn)備3運行環(huán)境準(zhǔn)備3.1地圖繪制3.2配置無線Wi?模塊3.3配置ESP32開發(fā)板燒錄軟件3.4配置STM32開發(fā)板燒錄軟件3.5獲取代碼機(jī)械狗的自動行走依賴于模型的訓(xùn)練,因此需要設(shè)計一張地圖,用于自訓(xùn)練過程和推理結(jié)果驗證。此處提供地圖設(shè)計方案,開發(fā)者可以直接使文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司17機(jī)械狗應(yīng)用開發(fā)指南圖3-1樣例地圖須知須知另外光滑的表面會產(chǎn)生強(qiáng)烈的反光,影響機(jī)械狗通過攝像頭采集的3.2配置無線Wi?模塊步驟1確保路由器和開發(fā)者套件已按步驟6中所述連接。步驟2參見登錄開發(fā)者套件選擇任意一種登錄方式使用root用戶(默認(rèn)密碼為Mind@123)步驟3參見通過USBWiFi網(wǎng)卡聯(lián)網(wǎng)配置USBWiFi設(shè)置。結(jié)束Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南3運行環(huán)境準(zhǔn)備Arduino是一套便捷、靈活、容易上手的硬件開發(fā)平臺,它包括多種型號的Arduino控步驟1進(jìn)入Arduino官網(wǎng)下載程序安裝包“arduino-ide_version_Windows_64bit.exe”,并1.單擊“File>Preferences”,如圖3-2所示。2.單擊“Language”下拉菜單,選擇“中文(簡體)”,如圖3-3所示。單擊OK保存步驟3安裝ESP32開發(fā)板。文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司19Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南3運行環(huán)境準(zhǔn)備1.單擊“文件>首選項”,如2.在“其他開發(fā)板管理器地址”中輸入“/package_esp32_index.json”與“/espressif/arduino-esp32/ghs/package_esp32_index.json”或單擊圖標(biāo)在文3.離線安裝ESP32開發(fā)板,單擊鏈接下載Arduino的ESP32開發(fā)板安裝包,下載完成后雙擊安裝文件進(jìn)行默認(rèn)安裝,安裝完成后重啟ArduinoIDE。文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司20Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南3運行環(huán)境準(zhǔn)備文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司214.在“開發(fā)板”中選擇ESP32開發(fā)板,如圖3-7所示。此步驟中安裝ESP32組件,推薦使用離線安裝的方式,用戶也可以自行搜索在線安裝的方步驟4用USB數(shù)據(jù)線連接PC和ESP32開發(fā)板,單擊“工具>端口”,選擇新增的COM串行端口作為Arduino與ESP32開發(fā)板傳輸數(shù)據(jù)的通道,如圖3-8所示。若沒有出現(xiàn)COM串行端口,可能是由于電腦沒有安裝USB串口驅(qū)動,需自行下載并安裝CH340文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司22Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南3運行環(huán)境準(zhǔn)備文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司23步驟2按照默認(rèn)配置通過注冊機(jī)安裝KeiluVision5軟件及工具包。步驟3打開KeiluVision5軟件,單擊工具欄按鈕,進(jìn)入包管理工具。步驟4在搜索框中搜索STM32F1Series與STM32F4Series并安裝所有包。步驟5左鍵單擊待下載的包,單擊右側(cè)工具框中的“Install”按鈕安裝。Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南3運行環(huán)境準(zhǔn)備獲取鏈接,單擊鏈接下載樣例代碼壓縮包“ascend-devkit-master.zip”到PC并解壓,獲得ESP32開發(fā)板代碼目錄“ascend-devkit-master\src\E2E-Sample\dogee\dogee_control\esp32_code”。將dogee_control\esp32_code下的“ESP32_Servo.cpp”、“ESP32_Servo.h”、文件復(fù)制到Arduino庫文件路徑下,例如:“C:\Users\10459\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\cores\esp32”。步驟1在PC使用Arduino工具單擊“文件>打開”按鈕,選擇“dogee_control\esp32_code\dogee_ctrl_esp32.ino”文件打開。文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司24步驟2在Arduino工具中單擊按鈕燒錄控制代碼至ESP32單片機(jī),如圖3-13和圖3-14所文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司25獲取鏈接,單擊鏈接下載樣例代碼壓縮包“ascend-devkit-master.zip”到PC并解壓,獲得STM32開發(fā)板代碼目錄“ascend-devkit-master\src\E2E-Sample\dogee\dogee_control\stm32_code”將stm32_code中的代碼復(fù)制到原始產(chǎn)品提供的代碼步驟1在PC使用KeiluVision5選擇工具欄“File>Open”,打開替換文件后“\QuadrupedF405\QuadrupedF405\USER”目錄下的“QuadrupedF405.uvprojx”文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司26文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司27圖3-18405主控板1.由于STLINK的USB端串口位置固定,與STM32無法一一對應(yīng),所以需要使用杜邦線連接STLINK的USB端的串口,使其能夠與開發(fā)板的串口對應(yīng),STM32串口位置如圖3-19所示,STLINK的USB端串口位置如圖3-20所示。圖3-19STM32串口引腳文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司29機(jī)械狗應(yīng)用開發(fā)指南bashE2E_samples_download_tool.sh-ddownload_destination_path-ssource_repositotarget_pathAtlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南4快4快速體驗4.1手動控制機(jī)械狗姿態(tài)變換4.2手動控制機(jī)械狗運動4.3機(jī)械狗自動行走4.4機(jī)械狗鎖定目標(biāo)追蹤4.1手動控制機(jī)械狗姿態(tài)變換步驟1在機(jī)械狗上電啟動之前,需要手動將機(jī)械狗的四個腿置1.以單條腿為例,扶起整個腿部,使底部黑色支持腳立于3.以攝像頭方向為頭部,將每條腿部的后側(cè)金屬腿與機(jī)械狗外殼突出部分的角對文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司31Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南4快4.按下銀色圓形的金屬電源鍵,等待藍(lán)色燈圈出現(xiàn),中間的STM32開發(fā)板顯示屏幕亮起,等待15s左右聽到蜂鳴器出現(xiàn)一次蜂鳴后,機(jī)械狗就會自動站起。文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司32Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南4快速文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司33cdcd/home/HwHiAiUser/E2ESample/ascend-devkit-master/src/E2E-Sample/dogee/demopip3pip3install-rrequirements.txtpython3python3dogee_pose.pyikjlSpaceAtlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南4快速4.2手動控制機(jī)械狗運動在手動控制機(jī)械狗姿態(tài)變化之后,需要重新啟動機(jī)械狗cdcd/home/HwHiAiUser/E2ESample/ascend-devkit-master/src/E2E-Sample/dogee/demopython3python3main.pyWSADSpace4.3機(jī)械狗自動行走將機(jī)械狗放置于地圖上的車道引導(dǎo)線中,請參見3.cdcd/home/HwHiAiUser/E2ESample/ascend-devkit-master/src/E2E-Sample/dogee/demopython3python3main.py--mode=easy文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司34Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南4快文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司354.4機(jī)械狗鎖定目標(biāo)追蹤步驟1將機(jī)械狗放置在距離追蹤目標(biāo)人2-3m距離。cdcd/home/HwHiAiUser/E2ESample/ascend-devkit-master/src/E2E-Sample/dogee/demopython3python3main.py--mode=tracking機(jī)械狗應(yīng)用開發(fā)指南●面對機(jī)械狗,手掌對向攝像頭,五指張開,持續(xù)3s左右,開發(fā)者套件遠(yuǎn)程登錄界面回顯中出現(xiàn)unlock字樣,即表示解除了鎖定,機(jī)械狗會保持靜止●快速脫離機(jī)械狗的視線超過10s左右,機(jī)械狗會認(rèn)為丟失目標(biāo),開發(fā)者套件遠(yuǎn)程登錄界面回顯中出現(xiàn)unlock字樣,即表示解除了鎖定,機(jī)械狗會保持靜止?fàn)顟B(tài)。Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南5代碼實現(xiàn)5代碼實現(xiàn)5.1主要代碼文件介紹5.2機(jī)械狗控制邏輯入口5.3手動控制機(jī)械狗行走5.4機(jī)械狗巡引導(dǎo)線行走5.5機(jī)械狗鎖定目標(biāo)追蹤demo/main.py機(jī)械狗demo運行入口文件。demo/requirements.txtdemo/src/actionsdemo/src/utils工具類python文件包含OpenCV、acl工具等。demo/src/scenesdemo/src/models“main.py”是機(jī)械狗控制代碼的主入口,定義了控制模式及對應(yīng)模式的后續(xù)調(diào)用實importimportosfromargparseimportArgumentParser文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司37Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南5代碼實現(xiàn)文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司38fromfrommultiprocessingimportProcess,Queuefromsrc.actionsimportStopfromsrc.scenesimportManual,scene_initiatorfromsrc.utilsimportgetkey,log,CameraBroadcaster,SystemInfo,Controller,get_port,STM32_NAME,ESP32_NAME定義出可選參數(shù)更改小車的控制模式,可選命令行cmd控制(預(yù)留接口),手動控),defdefparse_args():parser=ArgumentParser()parser.add_argument('--mode',type=str,required=False,default='manual',choices=['cmd','voice','tracking','easy','manual'])returnparser.parse_args()遵循簡單性的原則,在程序的主入口需判斷模式的設(shè)定后,進(jìn)入到對遵循簡單性的原則,在程序的主入口需判斷模式的設(shè)定后,進(jìn)入到對if__name__=='__main__':#獲取STM32和ESP32設(shè)備的端口stm32_port=get_port(STM32_NAME)esp32_port=get_port(ESP32_NAME)#使用獲得的端口創(chuàng)建SystemInfo實例system_info=SystemInfo(stm32_port=stm32_port,esp32_port=esp32_port)#初始化Controllerctrl=Controller()args=parse_args()('start')#創(chuàng)建一個最大大小為1的消息隊列msg_queue=Queue(maxsize=1)camera=CameraBroadcaster(system_info)shared_memory_name=camera.memory_namecamera_process=Process(target=camera.run)camera_process.start()ifargs.mode=='manual':task=Manual(shared_memory_name,system_info,msg_queue)process=Process(target=task.loop)process.start()try:whileTrue:key=getkey()ifkey=='esc':process.join()camera.stop_sign.value=Truecamera_process.join()breakelse:msg_queue.put(key)except(KeyboardInterrupt,SystemExit):camera.stop_sign.value=Truecamera_process.join()os.system('sttysane')('stopping.')elifargs.mode=='cmd':process_list=[]record_map={}try:(f'startreadingcmd')whileTrue:文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司39commandcommand=input().strip()ifcommand=='stop':#如果命令是'stop',終止所有進(jìn)程,包括攝像頭,并退出循環(huán)forpinprocess_list:p.kill()(f'startputstopsign')ctrl.execute(Stop())camera.stop_sign.value=Truecamera_process.join()breakelifcommand=='clear':#如果命令是'clear',清空進(jìn)程列表,重置控制器,并繼續(xù)forpinprocess_list:p.kill()process_list.clear()ctrl=Controller()ctrl.execute(Stop())(f'clearsucc')continueelifcommand=='Manual':log.error(f'Doesnotsupportswitchingfromcmdmodetomanualmode')continue(f'buildingscene{command}')scene=scene_initiator(command)(f'{scene}')ifsceneisnotNone:scene_obj=scene(shared_memory_name,system_info,msg_queue)process=Process(target=scene_obj.loop)process.start()process_list.append(process)#處理鍵盤中斷或系統(tǒng)退出,停止攝像頭進(jìn)程和所有場景進(jìn)程except(KeyboardInterrupt,SystemExit):camera.stop_sign.value=Truecamera_process.join()forprocessinprocess_list:process.kill()('stopping.')elifargs.mode=='voice':raiseNotImplementedError('voicecontrolisnotcurrentlysupported.')elifargs.mode=='easy':process_list=[]task2=scene_initiator('LF')(shared_memory_name,system_info,msg_queue)process_list.append(Process(target=task2.loop))forprocessinprocess_list:process.start()try:whileTrue:key=getkey()ifkey=='esc':forprocessinprocess_list:process.kill()camera.stop_sign.value=Truecamera_process.join()breakelse:msg_queue.put(key)except(KeyboardInterrupt,SystemExit):camera.stop_sign.value=Truecamera_process.join()os.system('sttysane')('stopping.')elifargs.mode=='tracking':#對于跟蹤模式,啟動對應(yīng)場景(Tracking)的單獨進(jìn)程文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司40processprocess_list=[]task1=scene_initiator('Tracking')(shared_memory_name,system_info,msg_queue)process_list.append(Process(target=task1.loop))forprocessinprocess_list:process.start()try:whileTrue:key=getkey()ifkey=='esc':forprocessinprocess_list:process.kill()camera.stop_sign.value=Truecamera_process.join()breakelse:msg_queue.put(key)except(KeyboardInterrupt,SystemExit):#處理鍵盤中斷或系統(tǒng)退出,停止攝像頭進(jìn)程camera.stop_sign.value=Truecamera_process.join()os.system('sttysane')('stopping.')importimportdatetimeimportosimportcv2importnumpyasnpfromsrc.actionsimportMoveForward,SetServo,Stop,MoveBack,BaseActionfromsrc.scenes.base_sceneimportBaseScenefromsrc.utilsimportlogclassManual(BaseScene):def__init__(self,memory_name,camera_info,msg_queue):super().__init__(memory_name,camera_info,msg_queue)#初始速度設(shè)置為100self.speed=100self.save_dir=os.path.join(os.getcwd(),'capture')ifnotos.path.exists(self.save_dir):os.makedirs(self.save_dir,exist_ok=True)definit_state(self):#初始化狀態(tài),執(zhí)行設(shè)置Servo的動作self.ctrl.execute(SetServo(servo=[91,10]))defloop(self):ret=self.init_state()log.error(f'{self.__class.name__}initfailed.')returnframe=np.ndarray((self.height,self.width,3),dtype=np.uint8,buffer=self.broadcaster.buf)(f'{self.__class.name__}loopstart')#設(shè)置攝像頭的角度為91,10last_action=SetServo(servo=[91,10])whileTrue:try:ifnotself.msg_queue.empty():key=self.msg_queue.get()文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司41elseelse:continueexceptKeyboardInterrupt:self.ctrl.execute(Stop())break#degree為z軸的角度數(shù),正數(shù)為左轉(zhuǎn),負(fù)數(shù)為右轉(zhuǎn)degree=0ifkey=='up':self.speed=min(self.speed+1,100)elifkey=='down':self.speed=max(self.speed-1,100)elifkey=='right':last_action=SetServo(servo=[91,10])elifkey=='left':last_action=SetServo(servo=[91,90])elifkey=='w':last_action=MoveForward(x=self.speed)elifkey=='a':last_action=MoveForward()degree=40elifkey=='s':last_action=MoveBack(x=self.speed)elifkey=='d':last_action=MoveForward()degree=-40elifkey=='space':last_action=Stop()elifkey=='esc':self.ctrl.execute(Stop())breakelifkey=='c':save_img=frame.copy()cv2.imwrite(os.path.join(self.save_dir,f'{datetime.datetime.now()}.jpg'),save_img)(f'imagesaved.')else:continueifisinstance(last_action,BaseAction):last_action.updatezspeed=Falselast_action.updatexspeed=Falselast_action.z_speed=degreelast_action.speed_setting=last_action.generate_speed_setting(self.speed,degree)self.ctrl.execute(last_action)importimportosimporttimeimportnumpyasnpfromsrc.actionsimportSetServo,Stopfromsrc.modelsimportLFNetfromsrc.scenes.base_sceneimportBaseScenefromsrc.utilsimportlogclassclassLF(BaseScene):def__init__(self,memory_name,camera_info,msg_queue):super().__init__(memory_name,camera_info,msg_queue)=Noneself.forward_spd=22文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司42defdefinit_state(self):(f'startinit{self.__class.name__}')lfnet_path=os.path.join(os.getcwd(),'weights','lfnet.om')ifnotos.path.exists(lfnet_path):log.error(f'Cannotfindtheofflineinferencemodel(.om)fileneededfor{self.__class.name__}scene.')returnT=LFNet(lfnet_path)(f'{self.__class.name__}modelinitsucc.')#設(shè)置舵機(jī)水平角度90度,垂直角度10度self.ctrl.execute(SetServo(servo=[90,10]))returnFalsedefloop(self):ret=self.init_state()log.error(f'{self.__class.name__}initfailed.')returnframe=np.ndarray((self.height,self.width,3),dtype=np.uint8,buffer=self.broadcaster.buf)(f'{self.__class.name__}loopstart')try:whileTrue:ifself.stop_sign.value:breakifself.pause_sign.value:continuestart=time.time()img_bgr=frame.copy()curr_steering_val=float(.infer(img_bgr)[0])(f'lfnet:{curr_steering_val}')(f'infercost{time.time()-start}')exceptKeyboardInterrupt:self.ctrl.execute(Stop())importimportosfrommultiprocessingimportProcess,Queueimportnumpyasnpfromsrc.actionsimportSetServo,Stop,MoveForwardfromsrc.modelsimportYoloV5fromsrc.models.yolov7importYoloV7fromsrc.scenes.base_sceneimportBaseScenefromsrc.utilsimportlogfromsrc.utils.cv_utilsimportcal_iou,xyxy_to_xywh,xywh_to_xyxy,cal_inter_smallfromsrc.utils.constantimportSTATE_OBSERVATION_MATRIX,STATE_TRANSITION_MATRIX,PROCESS_NOISE_COVARIANCE_MATRIX,\OBSERVATION_NOISE_COVARIANCE_MATRIXclassTracking(BaseScene):def__init__(self,memory_name,camera_info,msg_queue):super().__init__(memory_name,camera_info,msg_queue)self.in_queue1=Queue(1)self.in_queue2=Queue(1)self.out_queue1=Queue(1)self.out_queue2=Queue(1)definit_state(self):(f'startinit{self.__class.name__}')yolov5_model_path=os.path.join(os.getcwd(),'weights','yolo.om')yolov7_model_path=os.path.join(os.getcwd(),'weights','hand_det.om')Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南5代碼實現(xiàn)文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司43ififnotos.path.exists(yolov5_model_path)ornotos.path.exists(yolov7_model_path):log.error(f'Cannotfindtheofflineinferencemodel(.om)fileneededfor{self.__class.name__}scene.')returnTruelock_process=Process(target=YoloV7(yolov7_model_path).infer,args=(self.in_queue2,self.out_queue2))tracking_process=Process(target=YoloV5(yolov5_model_path).infer,args=(self.in_queue1,self.out_queue1))lock_process.start()tracking_process.start()(f'{self.__class.name__}modelinitsucc.')self.ctrl.execute(SetServo(servo=[91,60]))returnFalsedefget_start_bbox(self,tracking_bboxes,lock_bboxes):"""判斷當(dāng)前是否存在鎖定目標(biāo),判斷條件為:人體的檢測框與手勢的檢測框的相交面積/手勢檢測框的面積@paramtracking_bboxes:所有的人體檢測框@paramlock_bboxes:所有的手勢檢測框@return:"""fives=[]fori,(x1,y1,x2,y2,cls,conf)inenumerate(lock_bboxes):ifcls!=6:continuefives.append([x1,y1,x2,y2])fori,(x1,y1,x2,y2,cls,conf)inenumerate(tracking_bboxes):human_box=[x1,y1,x2,y2]fori,(xx1,yy1,xx2,yy2)inenumerate(fives):hand_box=[xx1,yy1,xx2,yy2]iou=cal_inter_small(hand_box,human_box)ifiou>0.9:return[x1,y1,x2,y2]returnNonedefget_count(self,target_box,lock_bboxes):"""判斷當(dāng)前鎖定目標(biāo)是否解鎖,判斷條件為:人體的檢測框與手勢的檢測框的相交面積/手勢檢測框的面積@paramtarget_box:當(dāng)前鎖定目標(biāo)的檢測框@paramlock_bboxes:所有的手勢檢測框@return:"""fori,(x1,y1,x2,y2,cls,conf)inenumerate(lock_bboxes):ifcls!=8:continuehand_box=[x1,y1,x2,y2]iou=cal_inter_small(hand_box,target_box)ifiou>0.9:return1return0defloop(self):ret=self.init_state()log.error(f'{self.__class.name__}initfailed.')returnself.ctrl.execute(SetServo(servo=[91,60]))#創(chuàng)建np數(shù)組,綁定共享內(nèi)存frame=np.ndarray((self.height,self.width,3),dtype=np.uint8,buffer=self.broadcaster.buf)(f'{self.__class.name__}loopstart')locked=Falselocked_count=0unlocked_count=0lost_count=0Atlas200IDKA2開發(fā)者套件機(jī)械狗應(yīng)用開發(fā)指南5代碼實現(xiàn)文檔版本01(2023-11-14)版權(quán)所有?華為技術(shù)有限公司44iouiou_threshold=0.3#匹配時的閾值x_posterior=Nonex_speed=70z_speed=40last_action=SetServo(servo=[91,60])whileTrue:action=Stop()ifself.stop_sign.value:breakifself.pause_sign.value:continueimg_bgr=frame.copy()self.in_queue1.put(img_bgr)self.in_queue2.put(img_bgr)tracking_bbox=self.out_queue1.get()lock_bbox=self.out_queue2.get()ifnotlocked:start_bbox=self.get_start_bbox(tracking_bbox,lock_bbox)ifstart_bboxisNone:locked_count=0continueelse:locked_count+=1(f'Gesturerecognitionsuccessful,lockedcountincrementedbyone.lockedcount:{locked_count}')iflocked_count>4:locked=Truelocked_count=0action=SetServo(servo=[91,60])(f'locked')initial_box_state=xyxy_to_xywh(start_bbox)initial_state=np.array([[initial_box_state[0],initial_box_state[1],initial_box_state[2],initial_box_state[3],0,0]]).T#[中心x,中心y,寬w,高h(yuǎn),dx,dy]iflocked:(f'======================================================')ifx_posteriorisNone:x_posterior=np.array(initial_state)p_posterior=np.array(np.eye(6))z=np.array(initial_state)max_iou=iou_thresholdmax_iou_matched

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論