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