朱晨曦,高軍偉,房國棟,孔德帥
(青島大學(xué) 自動化學(xué)院,青島 266071)
作為娛樂機器人的一個分支,人機象棋正逐漸成為人們研究的熱點。早期,人們通過設(shè)計和制作電子棋盤傳感器的方式定位和識別人機象棋棋子,但制作電子棋盤的過程繁瑣;伴隨機器視覺的發(fā)展,圖像處理相關(guān)算法被廣泛應(yīng)用,人機象棋在視覺定位和識別方面正深入研究。
象棋定位方面,傳統(tǒng)字符[1]的定位方法需要不斷調(diào)整每個閾值,過程繁瑣。文獻(xiàn)[2]使用依據(jù)圓檢測和棋子修正的二次定位方法,存在流程運算時間和個別字符識別準(zhǔn)確度的問題;象棋識別方面,關(guān)于年輪統(tǒng)計[3]的識別方法雖可避免文字任意性,但特征值與字體有關(guān),王殿君等[4]提出采用BP神經(jīng)網(wǎng)絡(luò)對棋子進(jìn)行識別,但算法過程存在局部極值和擬合現(xiàn)象,收斂速度慢,出現(xiàn)新加樣本需對整體重新訓(xùn)練。文獻(xiàn)[5]提出的使用文字連通數(shù)與孔數(shù)的方法,在非理想情況下進(jìn)行字符識別,受實際光線等因素影響較大。
故針對以上問題,本文以三自由度機械臂為例,以人機象棋平面博弈為任務(wù),通過剪切法和對數(shù)極坐標(biāo)&傅里葉變換的模板匹配法定位與識別棋子,后續(xù)調(diào)用博弈算法和蟻群算法,結(jié)合機械臂運動學(xué)的模型分析,給出了人機象棋平面博弈的實現(xiàn)方法。
系統(tǒng)總體設(shè)計主要由棋子定位和識別、走法產(chǎn)生、路徑規(guī)劃、機械臂控制四部分組成。
1)攝像頭捕捉棋盤圖像并傳進(jìn)計算機,計算機使用象棋識別算法識別棋盤信息。
2)結(jié)合圖像識別結(jié)果,通過調(diào)用博弈算法獲得棋局下一步走法。
3)將走法賦給蟻群算法規(guī)劃走法間路徑并得出坐標(biāo)信息。
4)根據(jù)坐標(biāo)信息,結(jié)合運動學(xué)逆解,Arduino控制機械臂實現(xiàn)棋子起落及平面移動,完成人機對弈,系統(tǒng)框圖如圖1所示。
圖1 人機博弈系統(tǒng)框圖
1)桶形畸變矯正 系統(tǒng)使用分辨率1280×1024的攝像頭捕捉圖像,因鏡頭使用凸透鏡,故需對圖像進(jìn)行桶形矯正,如圖2所示。
圖2 桶形畸變矯正
2)圖像區(qū)域裁剪
對于定位問題,由棋盤本身布局所決定,棋子僅會在90個固定交叉點位置起落,故攝像頭固定后,利用image viewer分別測出圖片90個交叉點坐標(biāo)值,再根據(jù)坐標(biāo)值依次將整張圖片裁剪成以各個交叉點為中心的90張小區(qū)域圖片,并對這些裁剪圖片進(jìn)行內(nèi)容識別即可。
3)象棋有無與顏色判斷
已知RGB顏色模型,轉(zhuǎn)換成HSV彩色空間后通過調(diào)整其分量閾值[6],可對交叉點區(qū)域內(nèi)的象棋有無與顏色進(jìn)行判斷。
4)棋子提取及處理
判斷90張小區(qū)域圖片中存在棋子后,通過中值濾波保存邊緣信息;通過灰度二值化和hough變換圓檢測法提取圖片中棋子,通過腐蝕膨脹使棋子平滑,并統(tǒng)一成50×50尺寸。如圖3所示。
圖3 提取的棋圖
面對棋子在移動時存在的旋轉(zhuǎn)變化量問題,本系統(tǒng)使用對數(shù)極坐標(biāo)&傅里葉的模板匹配法[7]識別旋轉(zhuǎn)量棋子。將棋子圖像的旋轉(zhuǎn)變化經(jīng)對數(shù)極坐標(biāo)變換轉(zhuǎn)化為平移變化,再結(jié)合Fourier平移變換的模值不變性,實圖像的旋轉(zhuǎn)不變性。
2.2.1 對數(shù)極坐標(biāo)變換
在圖像處理中,對數(shù)極坐標(biāo)變換是將圖像從笛卡爾坐標(biāo)系(x,y)經(jīng)極坐標(biāo)系(ρ,θ)過渡后,轉(zhuǎn)換至對數(shù)坐標(biāo)系(u,v)[8],轉(zhuǎn)換公式為:
式中,(xc,yc)為坐標(biāo)變換中心,k1,k2為如需放大圖像所引入的細(xì)化常量。圖4為笛卡爾-對數(shù)極坐標(biāo)對應(yīng)示意圖。
圖4 笛卡爾-對數(shù)極坐標(biāo)對應(yīng)示意圖
根據(jù)式(1),當(dāng)原圖像旋轉(zhuǎn)βrad時,有:
式中,v和v1表示對數(shù)極坐標(biāo)中圖像轉(zhuǎn)動前后對應(yīng)的橫坐標(biāo)。由此可知,笛卡爾坐標(biāo)系中旋轉(zhuǎn)變化可轉(zhuǎn)化成對數(shù)極坐標(biāo)系中平移變化。圖5為棋子“車”在不同旋轉(zhuǎn)角度下的平移變化。
圖5 圖像旋轉(zhuǎn)及對數(shù)極坐標(biāo)變換
2.2.2 傅立葉變換
在時域空間中,傅里葉變換的模值具有平移不變特性。在圖像處理時,圖像給出的信號為二維離散型,所以采用二維離散傅里葉變換[9]。則尺寸M×N的圖像函數(shù)f(x,y)對應(yīng)二維離散傅里葉變換f(u,v)為:
得到平移前后的模值為:
由此模值知,其時域平移不變的特性,故圖像通過式(1)~式(5)實現(xiàn)自身旋轉(zhuǎn)不變性。
為檢驗算法效果,本文利用11張各類型的棋子圖片進(jìn)行測試,分別對這些圖片做出一定的角度轉(zhuǎn)動,并計算轉(zhuǎn)動前后兩張圖像間相關(guān)系數(shù)。計算如表1所示。
表1 棋子轉(zhuǎn)動前后兩圖像間相關(guān)系數(shù)
表中數(shù)據(jù)知,部分角度如90°270°時相關(guān)系數(shù)良好,部分角度如45°、135°時相關(guān)系數(shù)稍低點,其主要是受亮度、位置等實際因素的影響。
為建立模板庫,對11種棋子類型的每種圖片(對于顏色不同但變換相同的棋子,黑車和紅車,黑炮和紅炮,黑馬和紅馬則歸為一類),每張依次選擇0°、10°、20°、30°、40°、50°、60°、70°、80°各9個不同旋轉(zhuǎn)狀態(tài)的圖片,共 99張圖片作為模板儲存和調(diào)用。
綜上過程,本系統(tǒng)棋子識別流程為:
1)建立模板庫。
2)判斷裁剪的90張小圖片中有無棋子及顏色,再經(jīng)灰度、二值化等步驟提取棋子。
3)將待識棋子圖像和模板庫里的圖像作對算法變換并得到相關(guān)系數(shù),最后將其匹配至模板庫中相關(guān)系數(shù)最大的一類。匹配結(jié)果如空白、黑將、黑車等分別用0、1、2等數(shù)字表示。
4)以10×9的矩陣形式呈現(xiàn)出所識別的90張小圖片數(shù)字結(jié)果,以利于后續(xù)博弈及蟻群算法對識別結(jié)果的調(diào)用。
5)下次識別重復(fù)步驟2)~4)。
為測試識別方法的有效性,本文選取100張棋子位置、旋轉(zhuǎn)方向皆不同的棋盤圖像在MATLAB環(huán)境下運用,經(jīng)檢測,識別后正確率約為98%。
每當(dāng)棋子完成移動,棋盤出現(xiàn)變化的位置,有且僅有兩處,所以不需對全部90張區(qū)域小圖片進(jìn)行重復(fù)識別,只需對位置發(fā)生變化的小圖片進(jìn)行識別。故系統(tǒng)選用差分法[10]對每張小圖片信息是否發(fā)生變化進(jìn)行判斷,之后對信息變化的小
圖片按序識別其內(nèi)容,并以新的10×9數(shù)字矩陣顯示結(jié)果,可有效提高系統(tǒng)識別速度與可靠性,圖6為棋子識別結(jié)果。
圖6 棋子識別結(jié)果
博弈算法的作用是列出棋局當(dāng)前所有可能走法,并在可能走法中搜索得出最優(yōu)走法,最后用四個數(shù)字,如1234的形式(1行2列移至3行4列)將走法表示出來,其共有四個核心部分。
棋盤表示部分,通過使用[10]×[9]的二維數(shù)組方式來存取棋盤信息,在棋盤上每一個交點[11]都對應(yīng)數(shù)組中一個字節(jié),所呈現(xiàn)的數(shù)值則代表在此交點有無棋子或種類。
走法部分列出棋局當(dāng)前所有可能走法,由估值部分對局面當(dāng)前情況進(jìn)行優(yōu)劣評估,后經(jīng)搜索部分搜索出最佳走法。搜索部分選用Alpha_Bate剪枝搜索算法,具有減少不必要節(jié)點搜索的優(yōu)勢。
c++為人機博弈算法編程語言,Visual Studio 2017為其開發(fā)平臺,先在開發(fā)平臺中調(diào)試好該博弈算法,然后再通過MATLAB軟件的mex功能使MATLAB能對其進(jìn)行讀取。將視覺識別所得的數(shù)字矩陣傳入象棋人機博弈算法,通過節(jié)點搜索,擇優(yōu)得到棋局下一步走法,之后調(diào)用蟻群算法,對棋子走法間平面移動路徑進(jìn)行規(guī)劃。
棋子存在兩種移動,一種按走法移動,另一種被吃掉后放在指定位置的移動。蟻群算法的作用是對棋子平面移動路徑進(jìn)行避障規(guī)劃,避免棋子在平面移動中受其他棋子的阻礙。
系統(tǒng)對博弈算法當(dāng)前調(diào)用的10×9棋盤數(shù)字矩陣進(jìn)行實時擴充并柵格化,有棋子位置置1,其余位置置0,最終得到一個20×20的01矩陣。
在棋盤柵格中,粒子和障礙物面積應(yīng)都按照象棋半徑大小膨化,即將粒子視為一個質(zhì)點時,粒子只能沿柵格水平或豎直方向移動,即滿足:
式中,i為質(zhì)點當(dāng)前柵格,j為質(zhì)點下一柵格,a為柵格邊長,map(j)為非障礙柵格,dij為柵格i和j間距離。
棋局柵格化后,經(jīng)蟻群算法得出的轉(zhuǎn)移概率為相鄰柵格中心節(jié)點間的選擇概率[12],在t時刻,螞蟻k從xi轉(zhuǎn)移至xj的概率公式如下:
式中,α為信息素濃度相對重要程度,τij(t)為信息素濃度,β為啟發(fā)性因子相對重要程度ηij(t)為實際距離倒數(shù)。圖7為棋子被吃掉后從當(dāng)前位置移至棋局外指定位置的路徑仿真圖。
圖7 路徑圖
將博弈算法所得走法起止點換算成柵格號,賦給蟻群算法后得到一條由起止柵格編號及無障礙柵格編號結(jié)合的路徑,可用一維數(shù)組表示,并保存在文本中,以備坐標(biāo)轉(zhuǎn)換。
柵格坐標(biāo)系中坐標(biāo),并不能直接作為機械臂起落棋子的定位坐標(biāo),須將其從柵格坐標(biāo)系{B}轉(zhuǎn)換到機械臂基底坐標(biāo)系{A}下表示。
如圖8所示,{B}為柵格坐標(biāo)系,{A}為基坐標(biāo)系。xB、yB表示棋子在柵格坐標(biāo)系OB下的位置,xA、yA表示棋子在基坐標(biāo)系OA下的位置。
圖8 坐標(biāo)系
棋子位置及移動路徑皆對應(yīng)一個小柵格編號,每個小柵格號都可換算成直角坐標(biāo)下小柵格中心位置[13],換算公式如下:
式中,a為小柵格邊長,i為柵格編號,為每行柵格個數(shù),mod()為取余,ceil()為正方向舍入,(ix,iy)為柵格中心直角坐標(biāo)。
根據(jù)式(8)可得到棋子在柵格坐標(biāo)系中位置,但要作為機械臂末端最終用來抓取的定位坐標(biāo),還需要將其轉(zhuǎn)換至基坐標(biāo)系{A}下表示。對本系統(tǒng)三自由度機械臂而言,末端執(zhí)行器只需要描述其位置,通過式(9)進(jìn)行旋轉(zhuǎn)變換和平移變換二者的相加,可得點p相對于基坐標(biāo){A}的最終定位坐標(biāo)Ap。
將蟻群算法得到的路徑柵格號代入式(8)、式(9)可得棋子在基坐標(biāo){A}下的最終定位坐標(biāo)。將其橫縱坐標(biāo)值分別放入px,py向量中,機械臂在抓取棋子時,需確定棋子在三維空間下的坐標(biāo)[14],故令設(shè)一組定值向量pz,表示棋子在空間中的高度。
三自由度機械臂結(jié)構(gòu),如圖9所示,腰部作水平方向旋轉(zhuǎn)運動,大臂和小臂作垂直于基座水平旋轉(zhuǎn)平面的俯仰運動。小臂尾部裝配一個電磁鐵,通過控制其電磁得失來控制對棋子的取置。圖10為本系統(tǒng)實物圖。
圖9 機械臂結(jié)構(gòu)圖
圖10 系統(tǒng)實物圖
要想使機械臂末端準(zhǔn)確的運動到棋子上方,需要控制好每個機械臂關(guān)節(jié)轉(zhuǎn)動的角度。為此,系統(tǒng)需要通過已解算得的定位坐標(biāo)代入機械臂逆運算,求取每個機械連桿的轉(zhuǎn)動角度。對本系統(tǒng)的機械臂建立如圖11所示的連桿坐標(biāo)系,然后結(jié)合表2中連桿參數(shù),通過D-H法[15]建立三軸機械臂運動學(xué)模型。
圖11 機械臂連桿坐標(biāo)系
根據(jù)表2和式(10)所示的相鄰兩連桿坐標(biāo)系間變換法則求取機械臂正解,可到機械臂末端與基坐標(biāo)系{A}之間的變換矩陣,如式(11)所示。
表2 各關(guān)節(jié)D-H參數(shù)表
式中,nx、ny、nz,ox、oy、oz,ax、ay、az分別為機械臂末端坐標(biāo)系x、y、z軸在A坐標(biāo)系中的方向矢量,px、py、pz表示機械臂末端位置在基坐標(biāo)系中的坐標(biāo)。
然后求取機械臂逆解,用未知的連桿逆變換同時左乘式(11)兩端,把關(guān)節(jié)變量分離[16]出來,從而得到即:
令方程兩邊元素(4)、(5)、(6)分別對應(yīng)相等得:
此時,只需要知道機械臂末端即將運行到目標(biāo)位置的情況[17],即知道工件的定位坐標(biāo)px、py、pz,便可得到每個機械連桿的轉(zhuǎn)動角度。
本系統(tǒng)機械臂核心處理器采用Arduino控制板及Arduino IDE編程環(huán)境,機械臂為三自由度機械臂,控制機械臂運動的步進(jìn)電機通過A4988驅(qū)動模塊控制,Arduino與A4988之間為脈沖寬度調(diào)制。為保證精度選用1/16步進(jìn)模式,搭配自身10:1減速比,步進(jìn)電機轉(zhuǎn)動一圈需32000個步進(jìn)脈沖,即每個脈沖驅(qū)動電機轉(zhuǎn)動0.01125°。攝像頭捕捉棋盤圖像后,經(jīng)計算機處理得到棋子及路徑坐標(biāo)值,將其代入運動學(xué)逆解[14]得出轉(zhuǎn)動角度,根據(jù)公式steps=θ/0.01125得到每個機械臂轉(zhuǎn)動步進(jìn)值,之后將步進(jìn)值經(jīng)串口通信發(fā)送給下位單片機,下位單片機得到上位機的控制命令后,通過控制每個機械臂的步進(jìn)電機實現(xiàn)機械臂平面運動。
最后對系統(tǒng)進(jìn)行整體測試。馬的實驗測試數(shù)據(jù)如表3所示,圖11為對弈中馬的執(zhí)行過程。
圖11 對弈棋子執(zhí)行過程
表3 實驗測試數(shù)據(jù)
本文設(shè)計基于機器視覺的人機象棋平面控制系統(tǒng),棋子正確識別率約為98%,得出棋子當(dāng)前走法并規(guī)劃走法間路徑后,對棋子和路徑所在坐標(biāo)的定位誤差約3.5mm,方向誤差小于3°。系統(tǒng)各模塊聯(lián)機后進(jìn)行人機博弈,各模塊間穩(wěn)定配合,能對棋盤上棋子在平面移動中實現(xiàn)良好的人機對弈,提高了棋子識別率,減小機械臂作業(yè)空間,基本達(dá)到其設(shè)計要求。