中心論題:
- 手勢識別的控制原理
- 系統描述
- 硬件描述
- 軟件描述
- 單片機硬件初始化、數據采集、動(dòng)作檢測
- 演示終端
解決方案:
- 利用三軸加速度的值來(lái)判定對物體運動(dòng)預定義的六種姿勢
- 系統由CT-298單片機、 MM-2860加速度傳感器、演示終端三個(gè)部分組成
引言
手機、MP3播放器、硬盤(pán)播放器、數碼相機、PDA等設備都是通過(guò)導航鍵對其進(jìn)行控制的。目前比較流行的導航鍵控制方式有四維鍵、搖桿,這是最常見(jiàn)的兩種導航鍵,此外還有一些手機上有很新穎的導航鍵設計,例如:LG-KG70的滾軸鍵、LG-KE608的轉盤(pán)設計、索愛(ài)W830的觸摸式、多普達D802的飛梭滾輪等等。這里,我們用加速度傳感器設計一種看不見(jiàn)的導航鍵來(lái)代替四維鍵的功能,這種方案更能滿(mǎn)足消費者的好奇心,滿(mǎn)足消費者追逐時(shí)尚的需求。
手勢識別的控制原理
本系統利用三軸加速度的值來(lái)判定對物體運動(dòng)預定義的六種姿勢。首先,分別對三個(gè)軸采樣,每個(gè)軸各獲得50個(gè)數據;然后,分別對每個(gè)軸上的數據進(jìn)行處理來(lái)判定是否發(fā)生了預定義的動(dòng)作。動(dòng)作定義在下面的部分說(shuō)明,這里僅用Y軸來(lái)說(shuō)明判定的原理。
獲得Y軸上的50個(gè)數據存放到數組y_data[N]中,將這50個(gè)數求和取平均值。若y_data[N]中數據最大值與最小值之差在一個(gè)設定的閾值之內,則認為物體在Y軸向上是沒(méi)有動(dòng)作的、靜止的,此時(shí)更新y_init值為y_data[N]求得的平均值;否則,y_data[N]中數據最大值與最小值之差超出一個(gè)設定的閾值,則認為物體是運動(dòng)的,y_init值不變,仍然為上一次靜止狀態(tài)時(shí)的值。
圖1和圖2是Y軸分別向左、向右搖動(dòng)時(shí)采樣得到的加速度抽樣值y_data[N]。圖中紅線(xiàn)代表上一次靜止時(shí)的采樣值,藍線(xiàn)代表運動(dòng)時(shí)的采樣值。圖1為向左搖動(dòng)時(shí)的值,可以明顯看出加速度的值較靜止時(shí)有明顯的變化,向著(zhù)增大的方向變。
從圖1和圖2中可以看出,兩條黑線(xiàn)之間的數據很難斷定是哪個(gè)動(dòng)作產(chǎn)生的,因為兩個(gè)動(dòng)作都可能產(chǎn)生這樣的值。所以,利用黑線(xiàn)之外的數據來(lái)判定是向右還是向左搖。因為對于這兩個(gè)動(dòng)作,黑線(xiàn)之外的數據有明顯的差異,數據相差很多。對于圖1這些數據大于150,圖2中這些數據小于90。因此這些數據至少相差60,可以很容易地將向左、向右的兩個(gè)動(dòng)作區分開(kāi)。
本系統就是根據這樣的原理來(lái)實(shí)現的,首先分別設定向左、向右搖時(shí)的閾值和兩個(gè)計數器;然后,將新采樣得到的50個(gè)值存放在y_data[N]中,將每個(gè)值與靜止時(shí)的值y_init比較,如果數據超出某個(gè)閾值,則在相應的計數器上累加,直到所有50個(gè)數全部比較完畢;最后,根據計數器值的大小來(lái)判定執行了某個(gè)動(dòng)作。
同理,利用Z軸的采樣值來(lái)判定向上、向下?lián)u,利用X、Y兩個(gè)軸來(lái)判定執行圖片向左翻轉還是向右翻轉,這里略去。
系統描述
a.系統組成及功能
系統由三個(gè)部分組成:CT-298單片機控制部分、 MM-2860加速度傳感器部分、演示終端,系統框圖如圖3所示。
CT-298單片機控制部分主要負責傳感器數據的A/D變換、動(dòng)作檢測、與演示終端進(jìn)行數據通信。MM-2860加速度傳感器部分負責加速度值的測量并將其轉換為電壓值。演示終端負責處理從單片機傳來(lái)的動(dòng)作類(lèi)型并執行相應的動(dòng)作,同時(shí)向單片機返回進(jìn)出二級菜單的指令。對于CT-298單片機系統更詳細的設計將在下面的部分介紹,這里首先介紹一下本系統設計的動(dòng)作姿勢及代碼,以及與演示系統交互的指令。
b.預定義的動(dòng)作
系統設計了六種動(dòng)作,他們分別是左搖、右搖、下?lián)u、上搖、圖片左轉、圖片右轉。圖4中的圖形象地說(shuō)明了其中的兩個(gè)動(dòng)作,其它的動(dòng)作與此類(lèi)似。
系統還為每個(gè)動(dòng)作定義了相應的動(dòng)作代碼,見(jiàn)表1。
當單片機檢測到某個(gè)動(dòng)作時(shí)會(huì )將相應的值賦給變量type_action,之后通過(guò)SCI將type_action的值發(fā)送到演示終端。如果用戶(hù)執行的動(dòng)作不在這六個(gè)動(dòng)作之中,則將NO_ACTION賦給type_action,表示演示終端不執行任何動(dòng)作。
系統還定義了單片機與演示終端交互的指令,用于系統在主菜單和二級菜單之間的界面切換,指令從演示系統通過(guò)SCI傳給單片機,單片機接收到之后進(jìn)入或退出二級菜單,見(jiàn)表2。
這里僅定義了一個(gè)二級菜單,即圖片菜單,系統還可以定義更多的二級菜單和三級菜單。此外,需要說(shuō)明動(dòng)作MOVE_TURN_LEFT、MOVE_TURN_RIGHT用于圖片翻轉,僅在圖片菜單中可用,在主菜單不可用。動(dòng)作下?lián)u執行的是換下一幅圖片,動(dòng)作上搖執行的是退出圖片菜單。
c.演示終端
本系統目標定位在便攜式消費類(lèi)電子產(chǎn)品上,因此在軟件應用程序上必須選擇具有廣泛基礎的應用平臺。由于近年來(lái)J2ME在便攜式終端中的應用非常廣泛,因此本系統也采用了J2ME平臺進(jìn)行開(kāi)發(fā)。通過(guò)比較,選擇了J2ME的WTK開(kāi)發(fā)包,它是專(zhuān)門(mén)針對移動(dòng)無(wú)線(xiàn)設備而設計的開(kāi)發(fā)包,并提供了一個(gè)統一的平臺。在WTK的框架下開(kāi)發(fā)出來(lái)的java程序可以被眾多的移動(dòng)設備所支持,所以能夠有效解決兼容性的問(wèn)題。
在WTK下我們利用默認的一個(gè)手機樣機的仿真器DefaultColorPhone進(jìn)行開(kāi)發(fā),DefaultColorPhone的樣子如圖6。
仿真器的外觀(guān)和操作類(lèi)似一部移動(dòng)電話(huà),但是并不代表某個(gè)特定的設備,而是提供對其所支持的API 的正確實(shí)現,每個(gè)命令按鈕對應著(zhù)相應的API函數。從圖6中可以看到手機的導航鍵,我們更改了導航鍵的API函數,使其從鼠標單擊觸發(fā)的方式轉換為串口動(dòng)作代碼控制。首先,我們編寫(xiě)了J2ME的串口接收程序,用于接收從單片機傳來(lái)的單字節的type_action值;然后將type_action以參數的形式傳給API,手機根據不同的type_action值執行不同的動(dòng)作,包括菜單上下翻、進(jìn)出二級子菜單、圖片翻轉等。手機動(dòng)作與type_action的對應關(guān)系如表3。
根據type_action的值,在手機界面上產(chǎn)生相應的動(dòng)作,手機界面發(fā)送不同的變化。演示終端的具體實(shí)現在下面的內容詳細介紹。
硬件描述
系統硬件分為兩個(gè)部分:CT-298和MM-2860。
CT-298是由MC9S08QG單片機構成、由USB總線(xiàn)電源供電的小型評估板。CT-298上安裝有按鈕開(kāi)關(guān)、LED燈、蜂鳴器等作為開(kāi)發(fā)的輸入輸出器件。同時(shí),USB-COM轉換電路采用了FTDI公司制造的FT232R,容許單片機與電腦之間通過(guò)USB接口進(jìn)行串行通信。BDM用于代碼的燒寫(xiě)及系統的調試。
MM-2860是含有Freescale公司制造的MMA7260Q型三軸小量程加速度傳感器的模塊,它可以直接安裝在CT-298為其設計的插口上。MM-2860的電源是由CT-298上的MC9S08QG8單片機的PTB5端口來(lái)控制的,當PTB5端口為L(cháng)時(shí)電源接通。此外,g-SELECT開(kāi)關(guān)是選擇傳感器靈敏度的開(kāi)關(guān),使用時(shí)將MM-2860插入到CT-298的接口中即可。本系統采用加速度傳感器的靈敏度選擇為800 mV/g。
軟件描述
單片機主程序的流程如圖7所示。
系統上電后,首先要對單片機的硬件系統進(jìn)行初始化、配置寄存器等操作,之后才可以進(jìn)行數據采集,將加速度的值進(jìn)行A/D轉換,得到量化的值。圖片菜單是二級菜單,如果沒(méi)有接到演示系統傳給單片機進(jìn)入二級菜單的指令,則單片機一直在主程序運行,不斷地采集A/D值、進(jìn)行動(dòng)作判定,并向演示系統發(fā)送type_action的指令。演示系統可根據接收到的type_action的類(lèi)型采取相應的動(dòng)作。如果單片機接收到進(jìn)入二級菜單的命令,則進(jìn)入圖片菜單,同時(shí)也執行類(lèi)似于主程序的動(dòng)作判定程序,并不斷更新A/D采樣值,發(fā)送type_action,直到接收到退出二級菜單指令才退出。下面詳細介紹一下各個(gè)功能模塊的具體設置。
單片機硬件初始化
單片機系統主要的工作有:將加速度傳感器的模擬數據進(jìn)行A/D轉換、向演示系統發(fā)送type_action的動(dòng)作類(lèi)型、接收演示系統發(fā)來(lái)的進(jìn)出二級菜單的指令、設置采樣值,除此之外還需要對系統時(shí)鐘、外部設備(燈,buzzer)進(jìn)行配置。根據單片機的主要工作內容選擇單片機內部的功能設備,包括A/D轉換器、模定時(shí)器、串行通信模塊(SCI)、內部時(shí)鐘源模塊。
數據采集
系統設置的采樣頻率為200Hz,每秒鐘分別對X、Y、Z 三軸采樣200個(gè)數據,因此定義了三個(gè)大小為N的數組對數據進(jìn)行緩存,他們是:
char x_data[N];
char y_data[N];
char z_data[N];
這里N取50,每0.25s存取一次,1s鐘可以存取4次,保證采樣率為200。函數void acce_meas(void) 負責將采樣的數據分別放到這三個(gè)數組中,下面是程序的具體實(shí)現:
for(j=0;j<N;j++) //采集N個(gè)數據
{
for(i=0;i<3;i++)
{
if(i==0)
{
adc_go(0); //選擇A/D信道0
x_data[j]= ADC_val_L; //X軸
}
else if(i==1 )
{
adc_go(6); //選擇A/D信道6
y_data[j]= ADC_val_L; //Y軸
}
else
{
adc_go(7); //選擇A/D信道7
z_data[j]= ADC_val_L; //Z軸
}
}
delay(); //延時(shí)函數,用來(lái)設定采樣率
}
動(dòng)作檢測
動(dòng)作檢測主要是用獲得的三組數據值x_data[N]、y_data[N]、z_data[N]來(lái)判定當前動(dòng)作是系統設定動(dòng)作中的哪一個(gè),如果符合,則發(fā)送這個(gè)動(dòng)作對應的預定義值給演示終端,否則發(fā)送NO_ACTION。type_dectction()用來(lái)實(shí)現動(dòng)作檢測,其中type_move為函數內部變量,用于記錄動(dòng)作代碼。type_dectction()進(jìn)行動(dòng)作檢測的流程如圖8所示。
演示終端
a.J2ME平臺開(kāi)發(fā)環(huán)境配置
進(jìn)行J2ME的開(kāi)發(fā)需要從網(wǎng)絡(luò )上下載免費的開(kāi)發(fā)環(huán)境。運行Eclipse后進(jìn)行最后的配置:Window->preferences->J2ME->Platform Component然后右鍵選擇 Wireless Toolkil,再選擇彈出菜單中的 Add Wireless Toolkil,選擇剛剛安裝的J2ME Toolkit的安裝路徑: C:\WTK22,這樣基本配置就完成了。
J2ME的WTK開(kāi)發(fā)包是專(zhuān)門(mén)針對移動(dòng)無(wú)線(xiàn)設備而設計的開(kāi)發(fā)包,并提供了一個(gè)統一的平臺。在WTK的框架下開(kāi)發(fā)出來(lái)的java程序可以被眾多的移動(dòng)設備所支持,能夠有效解決兼容性的問(wèn)題。
b.軟件應用程序
程序分為主進(jìn)程、串口監視模塊和定制化用戶(hù)界面三大部分,分別基于J2ME不同的類(lèi)庫派生而成,三部分之間通過(guò)消息機制相互聯(lián)系,共同構成整個(gè)程序的運行周期。具體每個(gè)模塊所實(shí)現的功能參考下節內容。
c.軟件應用程序的組織結構
本軟件應用程序在WTK的手機仿真器下進(jìn)行設計,分為Base和display兩個(gè)package。在Base Package中包含MainRoutine.java和RS232Port.java兩個(gè)java文件;在display Package中的文件較多,主要實(shí)現了UI和基本的key響應。下面介紹軟件部分的實(shí)現方法:
MainRoutine類(lèi):MainRoutine為程序的入口類(lèi),它整合了程序中的所有的對象。MainRoutine派生于MIDlet類(lèi),重載實(shí)現了MIDlet中的startApp、pauseApp、destroyApp等方法,并且在constructor中加入了exitCommand命令,從而實(shí)現了手機的關(guān)機功能。
可以看出MainRoutine實(shí)現了程序的入口和退出,并同時(shí)標志了程序的基本框架,給具體的功能應用打下了堅實(shí)的基礎。
vCanvas類(lèi):vCanvas繼承了Canvas類(lèi),并增加了externalMsg方法。之所以在其中增加externalMsg方法,是因為其超類(lèi)Canvas不能動(dòng)態(tài)地響應key,而我們對Canvas的要求是能夠通過(guò)對串口導入的數據(或按鍵)得到的keyCode做出相應的動(dòng)作,比如圖片的翻轉、文本的滾動(dòng)等等。于是,我們可以通過(guò)vCanvas派生出一系列的子類(lèi),實(shí)現我們的具體要求,為將來(lái)的開(kāi)發(fā)提供了方便。
DisplayItem類(lèi):DisplayItem是基礎類(lèi),提供了通用的string數據組合。該類(lèi)的構造方法中需要輸入shortText、longText和extra三個(gè)string參數,這樣就保證了每個(gè)DisplayItem都可以返回三個(gè)不同長(cháng)度的文本信息,在不同的場(chǎng)合使用。其中shortText用于UI中的標題顯示,longText為Item的主體內容,extra為Item的附加信息。 DisplayItem類(lèi)在本系統中會(huì )被例化來(lái)描述菜單和子功能的內容,是應用廣泛的一個(gè)基礎類(lèi)。
ImageCanvas類(lèi):ImageCanvas同樣繼承于基礎類(lèi)vCanvas,它的主要功能是實(shí)現了對圖片的瀏覽及旋轉、鏡像等基本操作。
考慮到目前使用手機瀏覽圖片、拍攝圖片的多方向性,如果能夠通過(guò)加速度傳感器自動(dòng)校正圖片的方向,使它自動(dòng)滿(mǎn)足我們想要的方向,那么我們就免除了很多不必要的麻煩。于是我們對圖片的瀏覽功能模塊增加了向左或者向右旋轉90°的功能。這樣用戶(hù)就會(huì )驚喜地發(fā)現無(wú)論他的手機怎樣擺放,顯示的圖片將永遠保持與地面垂直。
ListCanvas類(lèi):ListCanvas提供了主畫(huà)面的顯示能力,并將用戶(hù)操作派生到內部聚合成員上面去。具體功能的Item將包含在ListCanvas之中,每一個(gè)Item擁有顯示在屏幕上的ShortItem,顯示在detail screen中的LongText,還有不被顯示的ExtraText,當然其信息我們也是可以得到的。在ListCanvas中,我們可以用“右鍵”顯示Item的詳細信息,也可以用SELECT鍵來(lái)標記每個(gè)Item。
ItemListCanvas類(lèi):ItemListCanvas同樣繼承了vCanvas類(lèi),實(shí)現了多條目文本瀏覽的功能,構造方法的輸入依次為Display、Displayable、Font、Title和ItemVector。將多條String構造為一個(gè)Vector傳遞給ItemListCanvas后,該類(lèi)能夠提供一個(gè)多條目文本實(shí)現的用戶(hù)界面。本系統的“關(guān)于本系統”子功能就是通過(guò)實(shí)例化該類(lèi)得到的。
結論
本系統采用Freescale的單片機MC9S08QG和加速度傳感器MMA7260Q實(shí)現了便攜式手持設備的手勢控制,并采用了開(kāi)放的J2ME平臺實(shí)現了終端應用程序。系統完整,實(shí)用性強,成本低廉,在滿(mǎn)足用戶(hù)基本操作需要的同時(shí),增加了移動(dòng)設備操作的趣味性和靈活性。同時(shí),加速度傳感器MMA7260Q較小的體積和獨特的節電模式更使其在移動(dòng)設備的應用中有著(zhù)極大的優(yōu)勢??梢灶A見(jiàn),在未來(lái)的手持設備系統中會(huì )大量采用類(lèi)似的手勢識別功能,因此具有廣闊的市場(chǎng)應用前景。