朱偉枝,楊亞萍,陳 智
(廣東理工學(xué)院,廣東肇慶 526100)
智能搬運(yùn)小車(chē)是一種無(wú)需人操作的搬運(yùn)設(shè)備,是智慧工廠(chǎng)和快遞行業(yè)重要的設(shè)備之一。隨著經(jīng)濟(jì)的快速發(fā)展,傳統(tǒng)的生產(chǎn)方式已經(jīng)無(wú)法滿(mǎn)足企業(yè)的需求,企業(yè)越來(lái)越重視現(xiàn)代化生產(chǎn)觀念,因此智能搬運(yùn)小車(chē)也隨之飛快發(fā)展[1]。智能小車(chē)在倉(cāng)庫(kù)、碼頭、快遞等多種行業(yè)起著關(guān)鍵作用,可以用于人類(lèi)不宜或者無(wú)法勞動(dòng)的工作環(huán)境中。運(yùn)用智能小車(chē)的運(yùn)送,不僅提高了運(yùn)輸效率,減少搬運(yùn)行業(yè)的成本,而且還可以使工人免受傷害,因此對(duì)智能小車(chē)研究顯得十分重要[2-3]。
本文提供了一種基于OpenMV[4]的智能小車(chē)路徑規(guī)劃及定點(diǎn)擺放棋子的可實(shí)踐的合理化設(shè)計(jì)方案,通過(guò)OpenMV 視覺(jué)系統(tǒng)模塊作為圖像處理工具,以Arduino[5]控制智能小車(chē)實(shí)現(xiàn)循跡行駛,協(xié)同完成路徑規(guī)劃[6]及定點(diǎn)擺放棋子功能,滿(mǎn)足卸載的搬運(yùn)任務(wù)的要求。
本文設(shè)計(jì)的智能小車(chē)總體結(jié)構(gòu)主要分為3 個(gè)部分:傳感器、控制中心和執(zhí)行機(jī)構(gòu)。傳感器讀取外界的信號(hào),將周?chē)h(huán)境的信息以數(shù)據(jù)的方式反饋給控制中心;控制中心通過(guò)處理相應(yīng)的信息給執(zhí)行機(jī)構(gòu)發(fā)送執(zhí)行的命令。其總體布置如圖1所示。整個(gè)車(chē)體由底盤(pán)、主控制板、轉(zhuǎn)向舵機(jī)、電動(dòng)機(jī)、車(chē)輪等所組成,主控制板上安置機(jī)械臂、主控器、傳感器、攝像頭等來(lái)實(shí)現(xiàn)小車(chē)的功能[7]。
Arduino Uno R3是一款使用AT mega328P進(jìn)行研發(fā)的單片機(jī)。一邊有14個(gè)數(shù)字輸入/輸出引腳,其中6個(gè)數(shù)字口可用作PWM 輸出使用,另外還有2 路是串口鏈接端口;而在另一邊有6 路模擬輸出串口。ARDUINO UNO R3 自帶電源芯片,可以直接給ARHDUINO板供電。
圖1 總體布置
OpenMV 攝像頭是一款體積小,功耗低,成本低的電路板,適用于智能小車(chē)的視覺(jué)系統(tǒng),使用高級(jí)Python 語(yǔ)言進(jìn)行開(kāi)發(fā)。OpenMV的主要工作是讀取周?chē)h(huán)境的信息,并將信息傳輸給控制中心進(jìn)行處理,相當(dāng)于人的眼睛。OpenMV讀取信息主要是按照以下方式進(jìn)行。
(1)接通電源后,OpenMV初始化,設(shè)定目標(biāo)。
(2)OpenMV開(kāi)始拍攝照片,將拍攝完的照片以元組的方式把相關(guān)的參數(shù)返回給OpenMV處理器上。
(3)OpenMV處理器判斷是否檢測(cè)到目標(biāo),如果沒(méi)有檢測(cè)到目標(biāo),就發(fā)送一對(duì)數(shù)值相等、符號(hào)相反的參數(shù)到控制中心;如果檢測(cè)到目標(biāo),就通過(guò)PID 算法[8]計(jì)算出小車(chē)的速度,并將速度值發(fā)送到控制中心。
主控制板上安裝的機(jī)械臂的設(shè)計(jì)要滿(mǎn)足以下要求。
(1)機(jī)械臂要有適合的自由度,能靈活?yuàn)A起物體。
(2)機(jī)械臂要有一定的預(yù)緊力,能在斷電的時(shí)候保持把棋子夾緊,防止棋子掉落。
(3)要確定視覺(jué)系統(tǒng)的安裝位置。安裝的位置需要滿(mǎn)足: 1 保證視覺(jué)系統(tǒng)要能監(jiān)測(cè)到前面的路況,給控制系統(tǒng)反饋智能小車(chē)行駛的路況; 2 要有足夠的高度,能檢測(cè)到目標(biāo); 3 能夠跟隨機(jī)械臂的運(yùn)動(dòng)而運(yùn)動(dòng),否則無(wú)法完成對(duì)物體的夾取。本文把視覺(jué)系統(tǒng)的安裝位置確定在機(jī)械主臂上。
智能小車(chē)通電后首先運(yùn)行超聲波模塊,判斷智能小車(chē)前面是否有障礙物,如果檢測(cè)到有障礙物,則通過(guò)視覺(jué)系統(tǒng)判斷是否已經(jīng)檢測(cè)到目的地,本文使用矩形的綠色本子作為目的地的標(biāo)記,如果檢測(cè)到目的地,那么智能小車(chē)就運(yùn)行避障程序避開(kāi)前面的障礙物,當(dāng)智能小車(chē)行駛到距離目的地在指定閾值范圍內(nèi)的時(shí)候,智能小車(chē)就運(yùn)行通過(guò)機(jī)械臂放置棋子的程序,完成定點(diǎn)擺放棋子的任務(wù);如果超聲波沒(méi)有檢測(cè)到障礙物,則通過(guò)視覺(jué)系統(tǒng)判斷是否已經(jīng)檢測(cè)到目的地,如果檢測(cè)到達(dá)目的地,智能小車(chē)就直接運(yùn)行規(guī)劃路徑的程序,如果沒(méi)有檢測(cè)到目的地,智能小車(chē)就繼續(xù)運(yùn)行檢測(cè)目的地的程序。
如圖2 所示,當(dāng)接收到檢測(cè)目的地的信號(hào)時(shí),系統(tǒng)首先判斷機(jī)械臂底座舵機(jī)轉(zhuǎn)動(dòng)周期信號(hào)是否為1,本文定義的機(jī)械臂底座舵機(jī)轉(zhuǎn)動(dòng)周期是指機(jī)械臂底座舵機(jī)向左向右各轉(zhuǎn)動(dòng)45°,信號(hào)為1 時(shí)表示已經(jīng)完成轉(zhuǎn)動(dòng),信號(hào)為0 時(shí)則表示未完成轉(zhuǎn)動(dòng)。如果判斷出機(jī)械臂底座舵機(jī)周期信號(hào)為1時(shí),則意味著智能小車(chē)在當(dāng)前區(qū)域未能檢測(cè)到目的地,智能小車(chē)就會(huì)移動(dòng)到其他位置繼續(xù)檢測(cè),機(jī)械臂底座舵機(jī)轉(zhuǎn)動(dòng)周期信號(hào)重新置0。如果判斷出機(jī)械臂底座舵機(jī)周期信號(hào)是為0時(shí),機(jī)械臂底座舵機(jī)就會(huì)向左向右各轉(zhuǎn)動(dòng)45°進(jìn)行檢測(cè),期間如果檢測(cè)到目的地就會(huì)停止轉(zhuǎn)動(dòng),接著運(yùn)行追蹤目的地的程序;如果完成向左向右各轉(zhuǎn)動(dòng)45°后仍未檢測(cè)到目的地,機(jī)械臂底座舵機(jī)則停止轉(zhuǎn)動(dòng),機(jī)械臂底座舵機(jī)轉(zhuǎn)動(dòng)周期信號(hào)置1,系統(tǒng)重新開(kāi)始判斷機(jī)械臂底座舵機(jī)的轉(zhuǎn)動(dòng)周期信號(hào)。
圖2 目的地檢測(cè)
智能小車(chē)根據(jù)視覺(jué)系統(tǒng)反饋回來(lái)的信息判斷是否有檢測(cè)到目的地,如果檢測(cè)到目的地,智能小車(chē)就對(duì)目的地直線(xiàn)的距離進(jìn)行計(jì)算,計(jì)算出距離后,讀取當(dāng)前機(jī)械臂底座舵機(jī)的轉(zhuǎn)動(dòng)參數(shù),并輸出給轉(zhuǎn)向舵機(jī),從而控制轉(zhuǎn)向舵機(jī)進(jìn)行轉(zhuǎn)向。智能小車(chē)往目的地方向移動(dòng)并保持目的地一直處于視覺(jué)中心的位置,途中運(yùn)用超聲波模塊進(jìn)行避障。智能小車(chē)到達(dá)目的地后停止運(yùn)行,并通過(guò)控制機(jī)械臂將棋子放下。
智能小車(chē)執(zhí)行擺放棋子動(dòng)作之前,首先確認(rèn)定點(diǎn)位置的顏色和形狀,本文設(shè)置的定點(diǎn)為綠色的矩形。首先通過(guò)Open-MV 的形狀識(shí)別功能采用四元檢測(cè)算法進(jìn)行矩形識(shí)別,運(yùn)用ImageReader 類(lèi)的 image.find_rects() 函數(shù),設(shè)置好threshold,然后通過(guò)OpenMV 的顏色識(shí)別功能設(shè)定 LAB 值為(28,57,-55,-6,-5,39)。
設(shè)定好 LAB 值和 mage.find_rects()函數(shù)后,OpenMV 只會(huì)識(shí)別綠色矩形的定點(diǎn),當(dāng)OpenMV 追蹤不到定點(diǎn)區(qū)域時(shí),OpenMV 便會(huì)發(fā)信號(hào)給主控模塊,主控模塊就會(huì)發(fā)出相應(yīng)的指令讓小車(chē)調(diào)整位置直到追蹤到綠色的區(qū)域?yàn)橹梗划?dāng) OpenMV 追蹤到定點(diǎn)區(qū)域就會(huì)發(fā)信號(hào)給主控模塊,主控模塊就會(huì)發(fā)出相應(yīng)指令控制智能小車(chē)靠近定點(diǎn)區(qū)域,如圖3所示。
圖3 智能小車(chē)靠近定點(diǎn)區(qū)域
在小車(chē)左前方放置一個(gè)障礙物,智能小車(chē)通過(guò)OpenMV視覺(jué)系統(tǒng)檢測(cè)正前方是否有定點(diǎn)目標(biāo),如果檢測(cè)到定點(diǎn)目標(biāo),智能小車(chē)就運(yùn)行程序直接追蹤目標(biāo);如果沒(méi)有檢測(cè)到定點(diǎn)目標(biāo),智能小車(chē)就通過(guò)移動(dòng)位置以及控制機(jī)械臂底座舵機(jī)轉(zhuǎn)動(dòng)直到檢測(cè)到定點(diǎn)目標(biāo)為止。
如圖4 所示,由于在智能小車(chē)左前方放置了障礙物,小車(chē)首先檢測(cè)到離起始點(diǎn)位置距離較近的目標(biāo)1,但是當(dāng)靠近目標(biāo)1時(shí),識(shí)別到目標(biāo)1并不是目的地,智能小車(chē)就通過(guò)運(yùn)行避障程序避開(kāi)障礙物,繼續(xù)檢測(cè)其他目標(biāo);當(dāng)檢測(cè)到目標(biāo)2 并靠近時(shí),識(shí)別到目標(biāo)2是目的地,智能小車(chē)就通過(guò)控制機(jī)械臂將棋子放下,完成定點(diǎn)擺放功能。
圖4 路徑測(cè)試
本文設(shè)計(jì)的智能搬運(yùn)小車(chē),通過(guò)OpenMV 的識(shí)別與控制、Arduino的驅(qū)動(dòng)控制,提供了一種可拓展可實(shí)踐的結(jié)構(gòu)設(shè)計(jì)方案,能夠完成路徑規(guī)劃及定點(diǎn)擺放棋子的任務(wù)。小車(chē)在完成任務(wù)的前提下仍有很多的設(shè)計(jì)與拓展的空間,如車(chē)身的材料、機(jī)械臂的靈活度、小車(chē)的運(yùn)動(dòng)速度以及成本方面等仍有待改進(jìn)。通過(guò)對(duì)智能小車(chē)的研究和實(shí)踐,可以初步構(gòu)建智能汽車(chē)的模型,為智慧工廠(chǎng)和無(wú)人駕駛技術(shù)提供更多的可能。