謝作如
用手勢控制小車,大家往往喜歡用加速度傳感器來實(shí)現(xiàn)。最簡單的做法莫過于在手機(jī)上裝一個App。這個App能檢測手機(jī)的運(yùn)動方向,然后轉(zhuǎn)化為控制信息發(fā)給小車。
而我總是希望用一種更加有趣、更加自然的方式去控制小車。微軟的Kinect出來后,就有專家寫了一本書——《用最自然的方式與機(jī)器對話》。的確,在Kinect的支持下,手勢控制變得非常簡單,其互動游戲很受人歡迎(如圖1)。但對于手勢識別來說,Kinect并不是唯一的選擇,用普通攝像頭我們也能夠?qū)崿F(xiàn)。
原理分析
在上一期文章中,我們已經(jīng)大致體驗(yàn)了Processing的功能。作為一款以互動為特色的開源編程語言,Processing擁有大量的擴(kuò)展庫,并且提供了各種具體的應(yīng)用范例。其中視頻庫支持外部攝像頭,可以實(shí)時獲取視頻畫面中的每一個像素點(diǎn),并進(jìn)行分析。在有效的算法支持下,我們也可以做到圖像分割、物體識別、人臉識別、動作識別、運(yùn)動跟蹤等。同時,Processing支持串口編程,可以通過串口和外部設(shè)備(如Arduino)通訊。這些類似的應(yīng)用,在Processing范例庫中都能夠找到,技術(shù)門檻并不高。用手勢控制小車這件作品的運(yùn)行原理如圖2所示。
但由于我們使用的是普通攝像頭,當(dāng)然實(shí)現(xiàn)不了如Kinect的動作識別效果。雖然從理論上說,Processing也能實(shí)時識別出人的手勢,但是算法非常復(fù)雜,不是中小學(xué)的學(xué)生能夠理解的。所以,我試著用另一種簡單的方式去實(shí)現(xiàn),即讓小車的操控者帶上一只特殊顏色的手套或者手上拿一個特定顏色的LED燈,Processing對視頻畫面的像素點(diǎn)進(jìn)行遍歷,找到這一顏色后,根據(jù)座標(biāo)對小車發(fā)出控制信息。簡單地說,就是實(shí)現(xiàn)一個能夠捕捉視頻中特定顏色的程序。
視頻中特定顏色和控制信息的關(guān)系具體顯示為:圖3為小車前進(jìn),圖4為小車后退,圖5為小車左轉(zhuǎn),圖6為小車右轉(zhuǎn),畫面中小矩形標(biāo)志的表示識別出來的顏色。
按照這樣的方式定義“上、下、左、右”的控制信息比較容易,也比較好理解。但是,如果坐標(biāo)在左上角該怎么處理?如圖7所示。
如果給小車裝上指南針,應(yīng)該可以實(shí)現(xiàn)非??岬墓δ堋N覀兛梢韵胂?,特定顏色的坐標(biāo)在畫面的不同方位,就代表控制小車往哪個方向前進(jìn)。試想一下“走你”的姿勢吧,手一揮,小車如離弦的箭一樣沖向目標(biāo),這種操控的樂趣怎一個“酷”字了得。而且,編程也不會太復(fù)雜,Processing只要將這個坐標(biāo)相對于畫面中心點(diǎn)的角度發(fā)給小車即可。問題是我在寫這個范例時,手頭并沒有指南針(電子羅盤)模塊,只好放棄這一想法。對這種情況,我就當(dāng)作左轉(zhuǎn)來處理。同時,我把畫面上的區(qū)域做了規(guī)劃,設(shè)定中間的區(qū)域?yàn)椤巴V埂保ㄈ鐖D8)。
制作一輛藍(lán)牙小車
我的手頭有好多DFrobot公司的MiniQ小車底盤,來自我的課程“Arduino創(chuàng)意機(jī)器人”中使用的機(jī)器人套件?!癆rduino創(chuàng)意機(jī)器人”課程已經(jīng)全部開源,關(guān)于小車的搭建步驟詳見我們的課程資源。當(dāng)然,只要加上一塊藍(lán)牙模塊,任何一輛Arduino小車都可以。圖9為帶藍(lán)牙的MiniQ小車。
一般而言,藍(lán)牙模塊有4條線需要和Arduino連接,分別為5V、GND、TX和RX。5V和GND要和Arduino上的5V和GND一一對應(yīng),但是RX接在Arduino的TX上,TX要接在Arduino的RX上。因?yàn)槲疫x擇的藍(lán)牙模塊也是DFrobot公司的,小車使用的控制板為RoMeo V1,上面已經(jīng)集成了藍(lán)牙模塊接口,插上就可以直接使用,不用另外接線。
對于小車的編程,我使用Mixly。Mixly(中文名為米思齊)是北師大創(chuàng)客教育實(shí)驗(yàn)室推出的一款新的Arduino圖形化編程軟件,基于Blockly開發(fā),界面友好,功能比ArduBlock更加強(qiáng)大。Mixly軟件的界面如圖10所示。
Mixly使用Java開發(fā),需要先安裝Java環(huán)境,建議安裝Java8.0。Mixly為綠色軟件,解壓后運(yùn)行Mixly.jar文件即可。Mixly的下載地址:http://maker.bnu.edu.cn/,最新版本為0.94。Java的下載地址:http://www.java.com/zh_CN/download/。
Mixly的代碼如圖11所示。我用1、2、3、4鍵來表示“上、下、左、右”。下載代碼后,建議大家先用手機(jī)測試控制是否正常。當(dāng)然,你的手機(jī)要裝有藍(lán)牙串口助手之類的App。
Processing編程
Processing編程是這件作品的重點(diǎn)所在,在“原理分析”部分我已經(jīng)具體介紹了這個程序的核心功能,即獲取攝像頭畫面中某個色彩,然后分析該色彩的坐標(biāo),根據(jù)所在區(qū)域,通過串口發(fā)送控制信息給小車。
代碼中的frameRate(8)指畫面的幀數(shù),太小了有延時,太大了又會占用太多的CPU資源。我用cnt變量來控制每秒鐘發(fā)送的控制信息,這需要在實(shí)踐中不斷地調(diào)試(如圖12)。
結(jié)語
在實(shí)際測試中,我發(fā)現(xiàn)自己對小車的控制不是很流暢,還需要進(jìn)一步優(yōu)化。但從用手機(jī)控制小車的角度來看,我還是達(dá)到了預(yù)設(shè)的目標(biāo)。當(dāng)然,如果你對視覺識別感興趣,最好還是研究OpenCV,這也是一個著名的開源跨平臺計算機(jī)視覺庫,能實(shí)現(xiàn)更多的功能。