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