基于Arduino Mega 2560 DIY遙控車(chē)的項(xiàng)目:在車(chē)上實(shí)現(xiàn)機(jī)器學(xué)習(xí)模型
掃描二維碼
隨時(shí)隨地手機(jī)看文章
我想和大家分享我的DIY遙控車(chē)的項(xiàng)目,在車(chē)上實(shí)現(xiàn)機(jī)器學(xué)習(xí)模型,這可能會(huì)給它帶來(lái)自主功能。下一個(gè)生物就在這里,稍低一點(diǎn)。我受到了新技術(shù),機(jī)器人,無(wú)人機(jī)的啟發(fā),并決定做一些與這個(gè)領(lǐng)域相關(guān)的事情。有一種想法是制造一種帶有遙控器的東西,它可以飛行或駕駛,有可能播放視頻和探測(cè)物體。我使用樹(shù)莓板+攝像頭作為圖像處理單元,檢測(cè)物體。Arduino Mega 2560以無(wú)線電模塊為硬件核心來(lái)驅(qū)動(dòng)汽車(chē)。此時(shí)通過(guò)SSH流建立視頻傳輸。所以,讓我們繼續(xù)前進(jìn)吧!
項(xiàng)目結(jié)構(gòu):
- openCV, ML模型和圖像處理
-nRF24L01+無(wú)線電模塊
-騎上車(chē)
- RPi4 Arduino通訊
OpenCV, ML模型和圖像處理
一個(gè)很好的機(jī)會(huì)來(lái)處理圖像,視頻,流等等給了我們OpenCV庫(kù)。我想每個(gè)人都注意到了一個(gè)綠色的框架,它會(huì)在我們的手機(jī)攝像頭中尋找人臉。這是將其應(yīng)用于移動(dòng)軟件的一個(gè)很好的例子。它從90年代開(kāi)始,這些年來(lái)一直在進(jìn)步。OpenCV與神經(jīng)網(wǎng)絡(luò)、機(jī)器學(xué)習(xí)模型一起工作,這取決于它的目標(biāo)。從人臉識(shí)別系統(tǒng)到醫(yī)學(xué)癌癥檢測(cè)模型。聽(tīng)起來(lái)很酷,不是嗎?OpenCV庫(kù)可用于大多數(shù)編程語(yǔ)言,并擁有強(qiáng)大的支持社區(qū)。它是如何工作的?簡(jiǎn)而言之,每個(gè)圖像都可以表示為一個(gè)像素?cái)?shù)組,其值從0到255,如果用rgb比例著色,則可以表示為多維數(shù)組。視頻實(shí)際上是一組圖像,這些圖像是結(jié)構(gòu)化的,每秒顯示24次。OpenCV可以在迭代循環(huán)中處理它。關(guān)鍵時(shí)刻是在OpenCV中使用神經(jīng)網(wǎng)絡(luò)/ML模型。例如,在擁擠的地方的照片上數(shù)人。如果我們只有20個(gè)人,這可能很容易,但如果這是一張來(lái)自無(wú)人機(jī)的照片,而且有無(wú)數(shù)的照片呢?在這里,ML模型可以幫助您。Tensorflow, pythorch, utralistyolo模型已經(jīng)有了訓(xùn)練好的對(duì)象識(shí)別和分類(lèi)模型。
它可以以0.44的概率檢測(cè)和分類(lèi)右側(cè)的人。
所有這些庫(kù)的主要特點(diǎn)是有機(jī)會(huì)根據(jù)您的特定需求訓(xùn)練您自己的模型。
我嘗試過(guò)使用TensorFlow、Ultralytics Yolo和Edge Impulse,但由于文檔和軟件包支持組織不佳,我無(wú)法推薦第一個(gè)。對(duì)于我這個(gè)初學(xué)這個(gè)領(lǐng)域的人來(lái)說(shuō),它看起來(lái)很亂。
Ultralytics Yolo看起來(lái)好多了。
這里有必要強(qiáng)調(diào)一下邊緣實(shí)現(xiàn)的ML主題。這里有可能使我們的模型在邊緣設(shè)備上工作,如微控制器,手機(jī),嵌入式系統(tǒng)等,與我們的PC相比,它們具有極低的RAM內(nèi)存和CPU性能。
首先,針對(duì)邊緣設(shè)備,我嘗試用TensorFlow訓(xùn)練一個(gè)自定義模型,因?yàn)樗幸粋€(gè)專門(mén)設(shè)計(jì)的工具來(lái)提取邊緣設(shè)備模型的精簡(jiǎn)版本,我遇到了很多障礙,與系統(tǒng)不兼容,依賴等。
Ultralytics有可能將ML模型轉(zhuǎn)換為您希望的任何格式,更不用說(shuō)。但在Raspberry Pi 4上部署它時(shí),我使用USB網(wǎng)絡(luò)攝像頭每秒只能拍到1幀,看起來(lái)真的很慢。
Edge Impulse真的幫了我大忙。他們的方法為我提供了一個(gè)性能提高15倍的定制模型!
在他們的網(wǎng)站和YouTube上有組織良好的文檔。
可能部署你的模型作為一個(gè)zip庫(kù)在Arduino或構(gòu)建它直接到你的RPi板從邊緣脈沖web服務(wù)器!不可思議。
下載后,您將獲得一個(gè)帶有Python腳本的生成的Python SDK包,我們可以在項(xiàng)目中使用它。
有很多關(guān)于如何使用其他框架/庫(kù)(如TensorFlow, Yolo等)訓(xùn)練自定義模型的資源。
nRF24L01無(wú)線電模塊
它可能會(huì)給你的背部帶來(lái)一點(diǎn)疼痛。如果你沒(méi)有準(zhǔn)備好,可能會(huì)多一點(diǎn)。
這是市場(chǎng)上最便宜的選擇,但有幾個(gè)時(shí)刻可能會(huì)讓你發(fā)瘋。
為了避免在模塊之間建立通信的所有問(wèn)題,我強(qiáng)烈建議您在這里學(xué)習(xí)nRF24文檔:
如果你還在與困難作斗爭(zhēng),你必須:
?直接在模塊上的VCC和GND引腳上焊接約50μF的電容器。
?檢查模塊是否工作,因?yàn)橛泻芏嗄K是直接從生產(chǎn)線上壞掉的。
使用這段代碼來(lái)檢查你的模塊是否可以掃描無(wú)線電環(huán)境:
如果你的模塊處于工作狀態(tài),它必須在串行監(jiān)視器中顯示類(lèi)似的東西:
每一行代表一個(gè)掃描循環(huán)。從左到右,數(shù)字對(duì)應(yīng)于每個(gè)通道。0表示該頻道不受家庭無(wú)線電發(fā)射器(如WiFi、手機(jī)等)的影響。
如果每一行都是零表示-這是壞消息。盡量選擇一個(gè)免費(fèi)的無(wú)線電頻道,以減少噪音和干擾,例如WiFi。
車(chē)輪上的
在造車(chē)之前,我一直在琢磨如何把它變成現(xiàn)實(shí)。
我跟著這些想法走:
樹(shù)莓派4從USB網(wǎng)絡(luò)攝像頭獲取視頻,對(duì)其進(jìn)行處理,并將帶有移動(dòng)或不移動(dòng)信息的數(shù)據(jù)發(fā)送到Arduino,等等。
同時(shí),Arduino有2種模式:遙控模式和自主模式。
遠(yuǎn)程控制模式意味著等待來(lái)自nRF24L01模塊的數(shù)據(jù),如果來(lái)自發(fā)射器的數(shù)據(jù)處于中立位置,則保持移動(dòng)值x和y為0(操縱桿未動(dòng),以數(shù)字表示輸出1023中的512)。
如果無(wú)線電模塊斷電,Arduino會(huì)切換到自主模式,并嘗試掉頭。在攝像機(jī)視圖中有可能捕捉到一個(gè)目標(biāo),然后如果它發(fā)生了,它將停止轉(zhuǎn)身并向目標(biāo)(球)移動(dòng)。
預(yù)建的車(chē)輛平臺(tái)可以在網(wǎng)絡(luò)市場(chǎng)上找到。例如:
問(wèn)題是,我不確定如何嵌入樹(shù)莓派和arduino板與電池,如何使輪子驅(qū)動(dòng),因此決定建立它在我自己的幾個(gè)細(xì)節(jié)從aliexpress和木制板
野馬準(zhǔn)備好了全副武裝
要控制這個(gè)正在使用DIY的玩具遙控器:
這里使用了兩個(gè)Arduino操縱桿,一個(gè)Arduino Nano板和一個(gè)NRFL01無(wú)線電模塊。接線原理圖如下:
發(fā)射機(jī)代碼如下:
car的代碼看起來(lái)不像以前那樣簡(jiǎn)單。問(wèn)題是我應(yīng)該連接并結(jié)合raspberry pi4和arduino mega。其工作原理如下:RPI4使用usb網(wǎng)絡(luò)攝像頭來(lái)處理傳入的視頻與opencv庫(kù)。然后,檢測(cè)到的對(duì)象的坐標(biāo)必須通過(guò)端口傳遞到arduino板。同時(shí),2個(gè)伺服器直接連接到rpi4 gpio引腳上,目的是針對(duì)被檢測(cè)對(duì)象。汽車(chē)配線如下:
據(jù)我們所知,RPI4板對(duì)功耗非常敏感,因此決定使用單獨(dú)的電源。值得一提的是,rpi4和arduino板之間的邏輯電平移位器使用的是uart端口,因?yàn)殡娐钒逯g的邏輯電壓不兼容會(huì)損壞rpi4。
Arduino scetch車(chē)輛如下:
在樹(shù)莓派方面,代碼正在python環(huán)境中使用opencv庫(kù)以及預(yù)訓(xùn)練的機(jī)器學(xué)習(xí)模型執(zhí)行。如上所述,在從邊緣脈沖服務(wù)器下載機(jī)器學(xué)習(xí)模型時(shí)生成Python代碼。需要注意的一點(diǎn)是,我們必須根據(jù)自己的需要對(duì)其進(jìn)行修改。在我的情況下,我必須提取對(duì)象的x, y坐標(biāo)值,通過(guò)art傳遞給arduino板。
Python腳本生成的邊緣脈沖波紋。我只是添加了一個(gè)函數(shù),傳遞值到伺服:
結(jié)論:
?在Raspberry Pi 4設(shè)備上部署用于對(duì)象識(shí)別的ML模型是可能的。
?與其他產(chǎn)品相比,Edge Impulse提供了最好的性能。缺點(diǎn)是它是為大型培訓(xùn)任務(wù)提供的付費(fèi)服務(wù)。
?盡管我在RPi4上獲得了相對(duì)較好的FPS分?jǐn)?shù),但對(duì)于較大的任務(wù)來(lái)說(shuō),它仍然很慢。
為了更好地開(kāi)發(fā)項(xiàng)目,將平臺(tái)轉(zhuǎn)換為帶有g(shù)pu或npu的平臺(tái)是一個(gè)不錯(cuò)的選擇。
本文編譯自hackster.io