(西南科技大學(xué) 信息工程學(xué)院,四川 綿陽 621000)
智能車具有自主性、交互性、適應(yīng)性等特征,它融合了人工智能、自動控制、數(shù)字圖像處理、機械設(shè)計、信息傳輸?shù)榷鄠€專業(yè)領(lǐng)域的先進(jìn)研究成果[1]。而視覺系統(tǒng)作為智能車的“眼睛”,綜合了圖像處理、模式識別等相關(guān)領(lǐng)域的知識,使小車在各種復(fù)雜環(huán)境下都能快速而準(zhǔn)確地尋找到目標(biāo)。
近年來,隨著人工智能、計算機視覺等技術(shù)的快速發(fā)展,基于視覺跟蹤的智能車在物流運輸、科學(xué)勘察、生活服務(wù)等領(lǐng)域得到了廣泛的應(yīng)用[2]。同時,智能跟蹤小車的跟蹤效果、避障能力、智能程度、運輸能力等也受到了人們的高度重視。因此,研究運動目標(biāo)的檢測和跟蹤具有極為重要的理論意義和現(xiàn)實價值[3]。
目前市面上出現(xiàn)的智能跟蹤小車普遍存在兩種問題:一是小車只有固定的行駛路徑,智能化程度較低;二是只適合在一些比較空闊且平坦的場所進(jìn)行作業(yè),避障和適應(yīng)能力較差。而本設(shè)計的智能跟蹤小車以單片機為核心,通過視覺模塊完成對二維碼的采集和處理[4],保證了對標(biāo)記物的精準(zhǔn)鎖定,并借助超聲波測距模塊輔助完成跟蹤和道路勘測任務(wù),從而實現(xiàn)小車實時跟蹤和自主避障的功能。
智能跟蹤小車選用Arduino作為主控制器,外圍設(shè)備包括視覺模塊OpenMV、超聲波模塊、電機驅(qū)動模塊、電機與舵機模塊等,另外還包括12 V航模電池和12 V轉(zhuǎn)5 V的穩(wěn)壓模塊。電機驅(qū)動模塊由航模電池直接供電,而單片機的供電則需要將12 V通過穩(wěn)壓模塊降到5 V。系統(tǒng)設(shè)計如圖1所示。
圖1 系統(tǒng)設(shè)計框圖
小車在一個完整的智能跟蹤過程中主要完成以下兩項任務(wù)。
首先,鎖定標(biāo)記物。利用視覺模塊采集二維碼圖像,并發(fā)送二維碼坐標(biāo)給單片機,單片機根據(jù)位置信息調(diào)節(jié)舵機轉(zhuǎn)向,使小車正對標(biāo)記物,完成對標(biāo)記物的鎖定。
然后,跟蹤標(biāo)記物。無障礙物時,超聲波模塊實時測量小車與標(biāo)記物的距離并發(fā)送給單片機,單片機收到距離數(shù)據(jù)后及時進(jìn)行處理,并通過PID控制算法調(diào)節(jié)電機速度,保證小車對標(biāo)記物的實時跟蹤。當(dāng)有障礙物阻擋在小車與標(biāo)記物之間時,由于單片機檢測到超聲波測量的距離發(fā)生突變,因此判斷小車前方出現(xiàn)障礙,此時單片機通過調(diào)節(jié)電機舵機使小車避開障礙物,然后重新跟蹤標(biāo)記物。
智能跟蹤小車為了適用于各種場所運輸物品,所以對車身的穩(wěn)定性要求較高。小車在工作時需要保證車體的平衡能力,使其重量平均分布,重心盡量居中,以此避免在崎嶇路面行駛時發(fā)生側(cè)翻的情況,因此采用輪式移動結(jié)構(gòu)[5]。4個獨立的驅(qū)動輪在各自驅(qū)動電機的驅(qū)動下能夠在目標(biāo)環(huán)境中作全方位的移動,可以在目標(biāo)區(qū)域中完成前、后行駛、轉(zhuǎn)彎以及爬坡動作、下坡運動等[5]。小車車身如圖2所示。
圖2 小車車身圖
主控制器采用Arduino。Arduino具有開發(fā)簡單清晰、擴展模塊強大、開源性強等特點。無需掌握其硬件結(jié)構(gòu)和軟件底層原理就可輕松使用各種模塊,并且支持跨平臺開發(fā),因此應(yīng)用十分廣泛。本設(shè)計需要用Arduino的串口通信接收視覺模塊和超聲波測距模塊傳送來的數(shù)據(jù),輸出PWM控制電機和舵機等。
視覺模塊采用機器視覺開發(fā)組件OpenMV。在進(jìn)行開發(fā)時,可直接使用Python語言在OpenMV IDE上編程調(diào)用圖像處理相關(guān)算法和Python庫[6]。OpenMV最高像素可達(dá)30萬[6],由于只有OpenMV3及以上版本才能識別二維碼,所以本設(shè)計采用OpenMV系列的OpenMV3。
超聲波測距模塊采用HC-SR04。其具體工作過程為:I/O口Trig觸發(fā)測距,若有信號返回,則I/O口Echo輸出一個高電平,高電平持續(xù)的時間為測距時間,從而可算出小車距障礙物的距離s=高電平時間/2*聲速。
小車驅(qū)動模塊采用A4950全橋式DMOS PWM電動機驅(qū)動器,直流電動機的速度通過脈寬調(diào)制PWM來控制。此模塊可以控制2個電機正反轉(zhuǎn),4個PWM引腳就可以控制小車的前進(jìn)與后退,同時其使用方法比L298N更簡單,性能比TB6612更強。
電源模塊包括12 V航模電池和穩(wěn)壓模塊。航模電池供電電壓穩(wěn)定,使用廣泛。電機驅(qū)動模塊可由航模電池直接供電,而單片機以及其他模塊的供電范圍在4.25 V到6 V左右,因此必須采用12 V轉(zhuǎn)5 V的電源穩(wěn)壓模塊實現(xiàn)降壓。
穩(wěn)壓模塊是一個模擬電路構(gòu)成的集成塊,結(jié)構(gòu)復(fù)雜,穩(wěn)壓能力比穩(wěn)壓管強,穩(wěn)壓范圍更小,精度更高。
軟件總體設(shè)計主流程圖如下圖3所示。首先進(jìn)行所有設(shè)備的初始化,分配資源。然后視覺模塊開始掃描,獲取周圍環(huán)境中的二維碼圖像,并將獲取的二維碼進(jìn)行圖像處理和解碼信息判斷,若判斷為目標(biāo),則將數(shù)據(jù)發(fā)送給單片機,目標(biāo)鎖定完成,開始跟蹤。在跟蹤過程中,超聲波測距模塊實時測量小車與標(biāo)記物的距離,同時調(diào)整舵機轉(zhuǎn)向和電機速度,使小車能保持一定距離緊隨標(biāo)記物之后。
當(dāng)超聲波模塊測量的距離發(fā)生突變時,則表示有障礙物出現(xiàn),開始避障。與跟蹤不同的是,此時超聲波所測距離變?yōu)樾≤嚺c障礙物的距離。為了規(guī)避障礙,單片機控制舵機方向使小車左右偏轉(zhuǎn),并使電機減速,若小車與障礙物的距離又發(fā)生突變且攝像頭能掃描到二維碼,則避障結(jié)束,繼續(xù)跟蹤,否則小車?yán)^續(xù)左右偏轉(zhuǎn)直至避開障礙物。
圖3 軟件總體設(shè)計主流程圖
本設(shè)計在OpenMV視覺模塊基礎(chǔ)上,使用OpenMV IDE軟件和OpenCV庫完成圖像處理。OpenCV庫提供的許多常用視覺識別算法也為開發(fā)降低了難度[7]。
視覺模塊在掃描二維碼時,同時也掃描到了周圍環(huán)境中的圖像,為了更快地從圖像中提取二維碼,需先對所有圖像進(jìn)行圖像預(yù)處理。圖像預(yù)處理的主要目的就是消除圖像中噪聲信息,增強有用信息。預(yù)處理包括:導(dǎo)入圖像、去噪處理、圖像增強、彩色圖像轉(zhuǎn)變成灰度圖、灰度圖轉(zhuǎn)化成二值圖、邊緣檢測/分割、直方圖匹配/輪廓匹配[8]。
預(yù)處理工作完成后,得到了相應(yīng)的二值化圖像,二維碼的特征也變得更加明顯,然后對二維碼圖像進(jìn)行輪廓查找,即找到二維碼的3個定位區(qū)域[9]。如圖4所示的二維碼,其定位區(qū)域指的是左上、左下和右上的3個矩形區(qū)域。在軟件代碼中,主要通過調(diào)用OpenCV里的findContour函數(shù)來實現(xiàn)二維碼的識別和定位,即尋找出上述3個矩形區(qū)域。通過篩選輪廓邊長和邊長之間的比例來篩選出正確的輪廓,其中輪廓邊長比例必須滿足1:1:3:1:1的比例關(guān)系,如圖5所示。
圖4 二維碼
圖5 二維碼輪廓邊長比例關(guān)系圖
完成預(yù)處理后就可進(jìn)行二維碼解碼,將解碼得到的字符串與標(biāo)記物進(jìn)行比較:若相同,表示已經(jīng)尋找到標(biāo)記物并進(jìn)行跟蹤;若不同,攝像頭重新掃描。
解碼可通過兩種包:zbar和zxing完成,本設(shè)計使用的是zbar包。二維碼實際是由若干個黑白的幾何圖形組成的,并且每個幾何圖形對應(yīng)于一個二進(jìn)制數(shù)。所以解碼實際就是將每個黑白幾何圖形轉(zhuǎn)化為二進(jìn)制,然后在zbar包中去尋找到二進(jìn)制碼所對應(yīng)的字符串。二維碼識別與定位流程圖如圖6所示。在代碼實現(xiàn)中,可以直接調(diào)用OpenCV里的庫就能完成一些復(fù)雜的圖像處理,使程序進(jìn)一步簡化。
圖6 二維碼識別與定位流程圖
串口通信按照通信方式可分為串行和并行兩種方式。串行通信是將數(shù)據(jù)按位依次傳輸,并且只需地線、發(fā)送、接收這3根線就可以進(jìn)行數(shù)據(jù)傳輸,而并信通信是將數(shù)據(jù)的多個位同時傳輸[10]。串行通信根據(jù)數(shù)據(jù)流的傳輸方向又可分為單工、半雙工、全雙工3種傳輸方式[10]。由于本設(shè)計只需要單片機接收視覺模塊和超聲波模塊的數(shù)據(jù),所以采用串行單工傳輸。
波特率 、數(shù)據(jù)位 、奇偶校驗和停止位是串口通信最重要的參數(shù),兩個端口要進(jìn)行通信的前提是這些參數(shù)保持相同。本設(shè)計初始化串口為:uart = UART(3,115200),其中115 200為波特率。
PID控制是通過對偏差信號進(jìn)行比例、積分、微分運算的不同組合形式適用于不同系統(tǒng)的控制原理,從而使偏差趨于零[11]。
增量式離散PID計算公式如式(1)所示,其中e(k)表示本次誤差,e(k-1)表示上一次誤差,e(k-2)表示上上次誤差,Pwm表示增量輸出,Kp表示比例增益,Ki表示積分常數(shù),Kd表示微分常數(shù)。
PID調(diào)節(jié)指調(diào)節(jié)比例增益Kp、積分時間常數(shù)Ti、微分時間常數(shù)Td三個參數(shù),其傳遞函數(shù)如式(2)所示。本設(shè)計使用PID調(diào)節(jié)來控制電機,使速度變化更加穩(wěn)定,誤差更小,但只需要調(diào)節(jié)PI參數(shù)即可,即比例增益Kp和積分時間常數(shù)Ti。所以式(1)可簡化為式(3)所示。
Pwm+=Kp[e(k)-e(k-1)]+Ki×e(k)+
Kd[e(k)-2e(k-1)+e(k-2)]
(1)
G(s)=U(s)/E(s)=Kp(1+1/(Ti×s)+Td×s)
(2)
Pwm+=Kp[e(k)-e(k-1)]+Ki×e(k)
(3)
想要電機穩(wěn)定且按照預(yù)期的行進(jìn)路線行走,只是采用對左右電機的速度的調(diào)整很難達(dá)到預(yù)期的效果,本設(shè)計采用軟件代碼來克服這些問題,讓小車的行進(jìn)更加穩(wěn)定,具體過程如下。
轉(zhuǎn)向時雙輪調(diào)速。具體是指讓小車在轉(zhuǎn)向時能夠圍繞一個點選擇,而不只是讓左右電機的轉(zhuǎn)速不同。轉(zhuǎn)彎時,由于后雙輪行走的距離不同但是行駛的時間相同,因此,如果只是使左右的速度不同,顯然無法準(zhǔn)確地達(dá)到預(yù)期效果,所以采用后雙輪的差速行駛算法來實現(xiàn),原理如下:
令后雙輪的輪距為B,前后輪的間距為L,假設(shè)最優(yōu)路徑為左前方與車正前方成a夾角的直線(a可正可負(fù)),轉(zhuǎn)彎半徑為R,在左邊與后輪齊平,后左輪角速度為w_left,后右輪角速度為w_right,因為后雙輪的角速度相等,也就是:
w_left=w_right
(4)
那么:
v_left/R_in=v_right/R_out=v/R
(5)
其中:v_left為左后輪速度,v_right為右后輪速度,R_in為內(nèi)圈轉(zhuǎn)彎半徑,R_out為外圈轉(zhuǎn)彎半徑。假設(shè)后輪的中間速度為v(即速度設(shè)定值),而且滿足:
R=L/tana
(6)
R_in=R-B/2
(7)
R_out=R+B/2
(8)
可以推出:
v_left=v-v×B×tana/2L
(9)
v_right=v+v×B×tana/2L
(10)
上述兩個公式即可求出轉(zhuǎn)彎時后雙輪需要的速度,而不需要調(diào)試各個轉(zhuǎn)彎時所需要的左右速度,這不僅使電機速度的調(diào)節(jié)更加方便,還大大增強了小車的跟蹤效果。
1)搭載好車身,檢查外圍設(shè)備是否與主控穩(wěn)定連接。
2)選取合適的標(biāo)記物,將二維碼(尺寸為6 cm×6 cm)貼于標(biāo)記物正中心。
3)設(shè)定標(biāo)記物與攝像頭中心的距離即初始距離為D(首次為0.15 m),記錄小車鎖定目標(biāo)所需時間。
4)逐漸增加D(最大為1.05 m),重復(fù)步驟3)。
5)繼續(xù)增加D,直至小車無法鎖定目標(biāo),記錄小車能夠鎖定目標(biāo)的極限距離和鎖定時間。
6)保持初始距離D(首次為0.15 m)不變,從2 m逐漸增加跟蹤距離Y(最大為15 m),使標(biāo)記物移動,同時小車開始跟蹤,記錄跟蹤效果。
7)增加初始距離D(最大為1.05 m),重復(fù)步驟6)。
8)設(shè)置初始距離D(首次為0.15 m),跟蹤距離Y為10 m。將跟蹤距離Y分為五等分,當(dāng)標(biāo)記物剛經(jīng)過0 m、2 m、4 m、6 m、8 m的位置時,在小車與標(biāo)記物之間放入一個障礙,記錄小車經(jīng)過的障礙物個數(shù)N。
9)增加初始距離D(最大為1.05 m),重復(fù)步驟8)。
將記錄的數(shù)據(jù)進(jìn)行統(tǒng)計、處理,得到如表1、2、3所示的實驗數(shù)據(jù)。
表1 小車目標(biāo)鎖定效果
表2 小車跟蹤效果①
①小車跟蹤效果分成A、B、C、D四種等級,A:未出現(xiàn)目標(biāo)丟失情況;B:跟蹤7次,出現(xiàn)1-2次目標(biāo)丟失情況;C:跟蹤7次,出現(xiàn)3-5次目標(biāo)丟失情況;D:跟蹤7次,出現(xiàn)5次以上目標(biāo)丟失情況。
②初始距離同時也表示跟蹤過程中小車和標(biāo)記物之間的近似距離。
③跟蹤距離在2~8 m范圍內(nèi)時,路徑中無直角彎道;跟蹤距離為10 m、12 m、15 m時,路徑中分別有1、2、3個直角彎道。
表3 小車避障效果
觀察表1中的數(shù)據(jù)可知,小車鎖定目標(biāo)時間隨著初始距離的增加而變長。當(dāng)初始距離從0.15 m增加至0.60 m時,鎖定時間變化較小,而超過0.60 m后,時間變化較大,鎖定效果明顯下降,且1.28 m是小車能鎖定目標(biāo)的極限距離。因此,當(dāng)初始距離小于0.60 m時,小車的目標(biāo)鎖定效果較好。
由表2中的數(shù)據(jù)可知,小車跟蹤效果隨著初始距離和跟蹤距離的增大而有所降低,但主要影響因素是初始距離??梢钥闯?,初始距離在0.60~1.05 m范圍內(nèi)的總體跟蹤效果明顯不如初始距離在0.15~0.45 m范圍內(nèi)的。并且,初始距離大于0.45 m時,跟蹤效果在遇到直角彎道時下降地更為顯著。
根據(jù)表3中的數(shù)據(jù)可知,小車成功繞過的障礙物個數(shù)與初始距離近似呈正態(tài)分布。這是因為當(dāng)初始距離過小時,小車容易直接撞到障礙物,而當(dāng)距離過大時,小車容易在躲避障礙物之后丟失目標(biāo)??梢钥闯觯?dāng)初始距離近似為0.45 m時,小車的避障能力最好。
綜合實驗數(shù)據(jù)及以上分析可得,當(dāng)初始距離在0.30~0.45 m范圍內(nèi)時,智能跟蹤小車的整體性能表現(xiàn)最佳。
本文介紹了一款基于視覺模塊OpenMV的智能跟蹤小車,對小車硬件及軟件設(shè)計部分進(jìn)行了重點描述。經(jīng)實驗測試發(fā)現(xiàn),小車在一定范圍內(nèi)能夠較快鎖定標(biāo)記物,同時具有優(yōu)秀的跟蹤和避障能力。另外,小車的整體性能還有待進(jìn)一步提升,主要可通過升級相關(guān)硬件以及進(jìn)一步優(yōu)化軟件設(shè)計來實現(xiàn)。本智能跟蹤小車價格低廉,性能優(yōu)越,簡單改造即可很好地代替目前市場上一些智能化程度低、價格高昂的跟蹤小車,具有較為廣闊的應(yīng)用前景。