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