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