梅妍玭,傅 榮
(1.揚(yáng)州市職業(yè)大學(xué) 電子工程學(xué)院,江蘇 揚(yáng)州 225009;2.中國(guó)船舶重工集團(tuán)公司第七二三研究所,江蘇 揚(yáng)州 225001)
Python是一款比較容易上手的腳本語(yǔ)言,而且有強(qiáng)大的社區(qū)支持,一些非計(jì)算機(jī)專業(yè)領(lǐng)域的人都選擇它作為入門語(yǔ)言。遺憾的是,它不能實(shí)現(xiàn)一些非常底層的操控,所以在硬件領(lǐng)域并不起眼。Micro Python是一個(gè)Python 3的精簡(jiǎn)和高效的實(shí)現(xiàn)編程語(yǔ)言,它包含了Python標(biāo)準(zhǔn)庫(kù)的一個(gè)小子集,同時(shí)優(yōu)化了在微控制器和受限環(huán)境中的運(yùn)行。借助Micro Python,用戶完全可以通過(guò)Python腳本語(yǔ)言實(shí)現(xiàn)硬件底層的訪問(wèn)和控制,如控制LED燈泡、LCD顯示器、讀取電壓、控制電動(dòng)機(jī)和訪問(wèn)SD卡等。
OpenMV是一個(gè)基于STM32F765VI ARM Cortex M7處理器的單片機(jī)和OV2640圖像傳感器的開(kāi)源型微型機(jī)器視覺(jué)模塊。OpenMV模塊上搭載了一個(gè)Micro Python解釋器,使用Python腳本語(yǔ)言編程來(lái)實(shí)現(xiàn)一系列功能,包括IO端口的控制、讀取文件系統(tǒng)等基礎(chǔ)功能,也可以實(shí)現(xiàn)人臉檢測(cè)及跟蹤、關(guān)鍵點(diǎn)提取和顏色跟蹤等功能[1]。
AprilTag是一個(gè)視覺(jué)基準(zhǔn)系統(tǒng),可用于各種任務(wù),包括AR、機(jī)器人和相機(jī)校準(zhǔn)。Tag圖表可以直接用打印機(jī)打印出來(lái),而AprilTag檢測(cè)程序可以計(jì)算相對(duì)于相機(jī)的精確3D位置、方向和ID。Tag標(biāo)記如圖1所示,從左到右分別是Tag36h11、Tag25h9和Tag16h5[2]。簡(jiǎn)單來(lái)說(shuō),只要把這個(gè)Tag標(biāo)記貼到目標(biāo)上,就可以在OpenMV模塊上識(shí)別出該標(biāo)簽的3D位置和ID。
圖1 Tag標(biāo)記
AprilTag的種類叫家族(family),包括如下幾種:Tag16H5中的0~29號(hào)、Tag25H7中的0~241號(hào)、Tag25H9中的0~34號(hào)、Tag36H10中的0~2319號(hào)、Tag36h11中的0~586號(hào)和 ARTOOLKIT中的0~511號(hào)。每個(gè)家族的標(biāo)記都有對(duì)應(yīng)的ID,如TAG16H5家族有30個(gè)標(biāo)記,每一個(gè)都有對(duì)應(yīng)的ID,從0~29號(hào)。而不同家族之間的區(qū)別,如TAG16H5的有效區(qū)域是4×4個(gè)方塊,它比TAG36H11(有效區(qū)域?yàn)?×6個(gè)方塊)看得更遠(yuǎn);但是TAG16H5的錯(cuò)誤率比TAG36H11高很多,因?yàn)門AG36H11的校驗(yàn)信息多。通常情況下,我們一般使用TAG36H11。
AprilTag標(biāo)記具有3D定位功能,通過(guò)攝像頭讀取AprilTag標(biāo)記可以得知,Tag的空間位置一共有6個(gè)自由度,包括3個(gè)位置和3個(gè)角度。在串口輸出為6個(gè)變量,Tx、Ty、Tz為空間的3個(gè)位置量,Rx、Ry、Rz為3個(gè)旋轉(zhuǎn)量,如圖2所示[3]。
圖2 AprilTag標(biāo)記得到的3D數(shù)值
AprilTag標(biāo)記可以在網(wǎng)絡(luò)上下載,也可以直接從OpenMV模塊的IDE里生成(見(jiàn)圖3)。具體步驟如下: 首先,在菜單的“工具→Machine Vision→AprilTag Generate”中選擇family,推薦使用TAG36H11;然后,填寫(xiě)需要生成的個(gè)數(shù),比如需要10個(gè),就生成ID為0~9的圖片(見(jiàn)圖4);再選擇圖片存放的文件夾,就會(huì)在該文件夾中生成AprilTag標(biāo)記圖片;最后,把這個(gè)圖片用打印機(jī)打印出來(lái),若直接使用屏幕,則會(huì)反光影響判斷的準(zhǔn)確度。
圖3 AprilTag標(biāo)記的制作
圖4 生成AprilTag標(biāo)記
Python語(yǔ)言編寫(xiě)的軟件程序流程圖如圖5所示,首先初始化攝像頭的感光元件,設(shè)置從攝像頭獲取的圖片格式為RGB565(彩色圖像,每個(gè)像素16 bit),設(shè)置圖像的大小為QQVGA格式(160×120),跳過(guò)10張圖像,等待感光元件變穩(wěn)定,讀取圖像中的AprilTag標(biāo)記,得到X、Y、Z軸的距離以及與X、Y、Z軸的夾角[5]。
圖5 程序流程圖
這里輸出的姿態(tài)的單位是弧度,可以轉(zhuǎn)換成角度,但是位置的單位是和圖片的大小有關(guān),需要等比例換算,讀到的X軸距離f_x 是X軸的像素為單位的焦距。對(duì)于標(biāo)準(zhǔn)的OpenMV,應(yīng)該等于2.8/3.984×656,這個(gè)值是用毫米為單位的焦距除以X方向的感光元件的長(zhǎng)度,乘以X方向的感光元件的像素(以O(shè)V7725為例)。讀到的Y軸距離f_y 是Y軸的像素為單位的焦距。對(duì)于標(biāo)準(zhǔn)的OpenMV,應(yīng)該等于2.8/2.952×488,這個(gè)值是用毫米為單位的焦距除以Y方向的感光元件的長(zhǎng)度,乘以Y方向的感光元件的像素(以O(shè)V7725為例)。
攝像頭檢測(cè)到AprilTag標(biāo)記如圖6所示,檢測(cè)到的數(shù)據(jù)結(jié)果如圖7所示。由圖7可以看到,能夠識(shí)別出ID(25),位置Tx、Ty、Tz,旋轉(zhuǎn)的角度Rx、Ry、Rz。
圖6 攝像頭檢測(cè)到AprilTag標(biāo)記
圖7 3D數(shù)據(jù)
用一個(gè)2 cm×2 cm的AprilTag標(biāo)記檢測(cè),Tz軸得到的數(shù)據(jù)見(jiàn)表1。
表1 2 cm×2 cm AprilTag標(biāo)記試驗(yàn)檢測(cè)數(shù)據(jù)
2 cm×2 cm的AprilTag標(biāo)記測(cè)距在7.5~10 cm處檢測(cè)最為精確,精確度極高,只是受攝像頭像素限制,需要整個(gè)標(biāo)記進(jìn)入攝像頭的鏡頭方能正確識(shí)別,在不同的機(jī)器視覺(jué)測(cè)距場(chǎng)合需要選擇合適的AprilTag標(biāo)記尺寸。
[1] 潘麗靜, 張虹波, 周婷婷. 全自動(dòng)模擬目標(biāo)搜救系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦知識(shí)與技術(shù), 2016, 12(28):178-180.
[2] 段建民, 石慧, 戰(zhàn)宇辰. 基于機(jī)器視覺(jué)篩選GPS衛(wèi)星信號(hào)的無(wú)人駕駛汽車組合導(dǎo)航方法[J]. 電子技術(shù)應(yīng)用, 2016, 42(1):111-114.
[3] 周艷聰, 董永峰, 王安娜,等. 新的室內(nèi)移動(dòng)機(jī)器人自定位方法[J]. 計(jì)算機(jī)應(yīng)用, 2015, 35(2):585-589.
[4] Magnus Lie Hetland, Python基礎(chǔ)教程[M]. 2版. 司維,曾軍崴,譚穎華,譯.北京:人民郵電出版社,2014.
[5] Wei W, Li Y, Wang M, et al. Research on number-plate recognition based on neural networks[C]// Proceedings of Neural Networks for Signal Processing XI,2001. Piscataway:IEEE Press, 2001.