楊廣峰
在第8期的《用樹莓派機(jī)器人實現(xiàn)更智能的垃圾分類搬運(yùn)》中,樹莓派六足機(jī)器人相繼實現(xiàn)了正對目標(biāo)物體的識別搬運(yùn)、任意位置目標(biāo)物體的識別搬運(yùn)。接下來,我們將考慮多個目標(biāo)物體的識別問題,嘗試讓機(jī)器人完成多任務(wù)的識別和搬運(yùn)工作。本文將在原來的程序中增加步驟判斷,實現(xiàn)一個任務(wù)完成后,自動進(jìn)入下一個目標(biāo)的搬運(yùn)任務(wù)。
實驗器材:樹莓派六足機(jī)器人一套(六足機(jī)器人、樹莓派4B、古德微擴(kuò)展板、電機(jī)驅(qū)動板、USB攝像頭),目標(biāo)物體兩個(紅色、藍(lán)色海綿正方體各一個,邊長為10厘米)(如圖1)。
創(chuàng)建物體檢測模型的步驟與前例相同。
1.登錄網(wǎng)站,開始“物體檢測
登錄古德微機(jī)器人網(wǎng)站(www.gdwrobot.cn),選擇“物體分類”進(jìn)入“遠(yuǎn)程使用樹莓派攝像頭進(jìn)行物體分類”頁面。
2.采集并標(biāo)注,訓(xùn)練與驗證
使用拍照功能,不斷變換機(jī)器人的位置與角度,進(jìn)行目標(biāo)圖片的添加,完成目標(biāo)圖片的采集工作。這個過程目標(biāo)圖片采集得越多,后期識別的效率和準(zhǔn)確度就會越高。
然后,完成對采樣的目標(biāo)圖片的物體的標(biāo)注工作。接下來,使用“開始訓(xùn)練”按鈕對采集的圖片進(jìn)行訓(xùn)練。最后對預(yù)覽圖片中的物體進(jìn)行分類驗證,目標(biāo)物體的分類識別置信度在80%以上,即說明訓(xùn)練模型具有較高的應(yīng)用價值。
3.下載訓(xùn)練模型文件,保存至樹莓派中
完成拍照采集與訓(xùn)練驗證后,點(diǎn)擊“下載樹莓派上使用的模型”,等到“模型轉(zhuǎn)換下載完成”提示。這時,文件下載到樹莓派的/home/pi/model/object_detection目錄下,模型文件為model.tflite,對應(yīng)標(biāo)簽文件為labels.txt。通過Windows的遠(yuǎn)程桌面連接進(jìn)入樹莓派進(jìn)行查看,labels.txt的文件內(nèi)容包含兩行,依次對應(yīng)訓(xùn)練模型的分類名稱:“紅色、藍(lán)色”。
本例中,機(jī)器人面向前方進(jìn)行拍照,自動尋找并識別目標(biāo)物體,讀取物體的位置數(shù)據(jù),計算物體的位置偏差,根據(jù)情況進(jìn)行相應(yīng)的偏差處理,機(jī)器人自動轉(zhuǎn)向,按照步數(shù)前進(jìn)至物體前方,并實施搬運(yùn),完成第一個任務(wù)后程序自動修改變量“步驟”值,開啟下一個任務(wù)。
1.程序初始化
首先,控制攝像頭兩個舵機(jī),調(diào)整其最佳拍攝角度,設(shè)置機(jī)器人的最初姿態(tài),將機(jī)器人任務(wù)的開關(guān)變量“步驟”設(shè)為1,創(chuàng)建“目標(biāo)列表”,記錄需要完成的目標(biāo)物體名稱,完成對機(jī)器人的初始化。這里設(shè)計了兩個任務(wù),其目標(biāo)物體的名稱為“紅色”和“藍(lán)色”,如需要更多的夾取任務(wù),在列表追加項目即可(如圖2)。
2.拍照與檢測函數(shù)
使用機(jī)器人攝像頭對前方拍照,調(diào)用物體檢測模型對照片進(jìn)行檢測,返回檢測結(jié)果列表(如圖3)。
3.讀取檢測結(jié)果函數(shù)
這個函數(shù)是從檢測結(jié)果列表中找到我們的目標(biāo)(紅色物體)的名稱和置信度。
通過判斷檢測結(jié)果列表的長度是否大于0來區(qū)分有沒有檢測結(jié)果,沒有檢測結(jié)果則需要跳出判斷重新檢測;有結(jié)果,則對檢測結(jié)果進(jìn)行下一步的處理。首先,循環(huán)讀取檢測結(jié)果列表中的每一個檢測結(jié)果字典,分別讀出這個檢測結(jié)果字典中的置信度和物體名稱。然后判斷物體名稱是否紅色物體,如果符合條件,則找到了我們的目標(biāo)名稱和置信度,中斷循環(huán),準(zhǔn)備下一個環(huán)節(jié)(如圖4)。
4.計算位置偏差函數(shù)
首先,從檢測結(jié)果字典中獲取檢測框的位置列表,分別獲取檢測框的左上和右下兩個點(diǎn)的橫、縱坐標(biāo)值。計算出檢測框的物體橫向像素位置(橫向中心),與圖片中心位置相比較獲取物體的位置偏差。這里使用的公式為:位置偏差=320-物體橫向位置。因為攝像頭拍出的照片是640×480,所以照片的橫向總寬度是640,照片的中心位置是320(如圖5)。
5.位置偏差處理函數(shù)
獲取了物體的位置偏差,接下來就需要控制機(jī)器人進(jìn)行相應(yīng)的旋轉(zhuǎn),以實現(xiàn)機(jī)器人能夠鎖定目標(biāo)物體進(jìn)行前進(jìn)??紤]到偏差較大的情況,我們還需要對位置偏差做偏差除以8進(jìn)行縮放,并且對偏差值進(jìn)行了一定范圍(從負(fù)10到正10)的限制。偏差處理結(jié)束后,機(jī)器人按照位置偏差的角度進(jìn)行相應(yīng)的旋轉(zhuǎn),最后將置信度設(shè)為0,完成本次拍照的識別糾正工作(如圖6)。
6.計算距離與步數(shù)函數(shù)
首先,計算出檢測框的物體橫向像素大?。M向長度),根據(jù)計算公式得到機(jī)器人與目標(biāo)物體之間的當(dāng)前距離。然后,計算出機(jī)器人到達(dá)物體所需要的前進(jìn)步數(shù)。最后,控制機(jī)器人按照步數(shù)前進(jìn)。為使機(jī)器人更加準(zhǔn)確地到達(dá)最佳夾取距離,這里對前進(jìn)步數(shù)進(jìn)行了限制,限制機(jī)器人每次識別后最少走1步,最多走10步,以實現(xiàn)反復(fù)拍照、識別和校正的目的(如圖7)。
7.智能搬運(yùn)物體
首先,判斷機(jī)器人是否到達(dá)最佳夾取位置,如果條件滿足,開始夾取物體。然后,控制機(jī)器人先向后移動,再左轉(zhuǎn)90度,再向前,到達(dá)指定的投放位置。接著,控制機(jī)器人放下物體,后退9步,到達(dá)地圖的中央位置,完成第一個智能搬運(yùn)工作。如果當(dāng)前任務(wù)是最后一個任務(wù),將變量“步驟”設(shè)為0,標(biāo)志著整個搬運(yùn)工作全部結(jié)束,否則將變量“步驟”加1,開啟下一個搬運(yùn)任務(wù)(如圖8)。
8.主程序
首先,調(diào)用程序初始化函數(shù)。然后,建立一個重復(fù)當(dāng)真的循環(huán),實現(xiàn)根據(jù)任務(wù)反復(fù)拍照、識別、糾偏、前進(jìn),直至到達(dá)最佳夾取位置,實現(xiàn)夾取任務(wù)。根據(jù)多任務(wù)的要求,每次循環(huán)前需要根據(jù)步驟從目標(biāo)列表中讀取當(dāng)前目標(biāo),目標(biāo)物體有效識別后,如果偏差較大,進(jìn)行合適的偏差縮小,機(jī)器人自動旋轉(zhuǎn)至目標(biāo)物體的正前方,根據(jù)距離計算出步數(shù),并進(jìn)行有限步數(shù)(1-10步)的前進(jìn),如果達(dá)到了最佳夾取距離,機(jī)器人完成夾取任務(wù)。最后,為了解決因為目標(biāo)物體不在機(jī)器的前方而造成的識別為空的情況,我們給機(jī)器人設(shè)置了一個識別不成功時,原地自行旋轉(zhuǎn)30度的操作,自動尋找識別(如圖9)。
經(jīng)過多次測試,機(jī)器人在任意角度、任意位置時均能成功夾取目標(biāo)物體,第一個任務(wù)結(jié)束后,能夠自動切換目標(biāo)任務(wù),繼續(xù)完成第二個目標(biāo)的智能搬運(yùn)工作,從而實現(xiàn)了任意目標(biāo)、任意位置、多任務(wù)的智能搬運(yùn)升級。在這個例子的基礎(chǔ)上,下一篇我們將為六足機(jī)器人添加更多的功能,如利用物聯(lián)網(wǎng)控件實現(xiàn)手機(jī)微信控制機(jī)器人,同時實現(xiàn)自動與手動切換控制機(jī)器人。