為了利用Android移動設(shè)備成熟的傳感器技術(shù)來實現(xiàn)體感操作,文中設(shè)計了基于Android移動設(shè)備傳感器的體感應(yīng)用系統(tǒng).該系統(tǒng)的架構(gòu)具有通用性特點,并非只局限于能控制PC中固定的程序.該系統(tǒng)包含了一個移動端(Android)程序與一個Windows平臺下的中間件平臺,它以Android平臺的設(shè)備為輸入設(shè)備,利用各種傳感器采集數(shù)據(jù),經(jīng)WIFI發(fā)送到PC端的中間件平臺,接收后可自定義轉(zhuǎn)換為相應(yīng)的操作指令,以控制電腦中不同的應(yīng)用軟件或者游戲.
1、系統(tǒng)總體設(shè)計
本系統(tǒng)采用客戶/服務(wù)器(C/S)架構(gòu),將PC或運行能力較強的計算設(shè)備作為服務(wù)器,負責(zé)與Android手機進行通信和發(fā)出指令操作.Android手機作為客戶端,通過友好的用戶界面,引導(dǎo)用戶選擇相應(yīng)的傳感器種類(目前智能手機中同時包含多種傳感器),如設(shè)定用戶操作的種類屬于動感式(加速度應(yīng)用)還是競技式(支持力的應(yīng)用)。
1.1、服務(wù)器和Android手機的通信
服務(wù)器和Android手機之間的通信需要解決的主要問題有:數(shù)據(jù)傳輸中穩(wěn)定性和高效性的把握、用戶操作模式的識別方法及用戶的動作量化方法.
1.1.1、數(shù)據(jù)傳輸
系統(tǒng)中服務(wù)器與客戶端利用Socket通過用戶數(shù)據(jù)報(UDP)協(xié)議進行通信,傳輸速度快,無延遲.雖然UDP協(xié)議有數(shù)據(jù)報容易丟失、不能保證每個數(shù)據(jù)報準確無誤地傳到等問題,但對于運動體感的操作,用戶的動作產(chǎn)生的數(shù)據(jù)是連續(xù)的,即使丟掉部分的數(shù)據(jù)報對用戶體驗也無大礙.例如控制賽車向左轉(zhuǎn)彎,用戶動作一定有一個幅度,在這個幅度當(dāng)中,其實已經(jīng)發(fā)送了很多個向左的數(shù)據(jù)報,丟失一兩個數(shù)據(jù)報對用戶體驗的影響不大.
在Java中有兩個數(shù)據(jù)報類:DatagramSocket(進行端到端通信的類)和DatagramPacket(表示通信數(shù)據(jù)的數(shù)據(jù)報類),程序中的客戶端A和B可通過調(diào)用DatagramSocket收發(fā)DatagramPacket,如圖1所示.
圖1 ?UDP通信模式
1.1.2、用戶操作模式識別
在確定移動通信傳輸協(xié)議的基礎(chǔ)上,需要將移動設(shè)備的多點觸摸功能和傳感器功能融入到服務(wù)器強大的計算功能中,即實現(xiàn)信息空間和物理空間的融合,因此需要將移動設(shè)備發(fā)出的指令變成服務(wù)器能夠識別的操作.
識別的前提是需要引導(dǎo)用戶選擇操作的模式,如使用觸摸屏還是傳感器,而Android傳感器包含了光照、溫度、加速度、壓力、重力、地磁等多種傳感器,所以Android移動體感選取的狀態(tài)模式改變時,應(yīng)該通知PC客戶端進行識別,這樣才能進行正確的操作映射.
系統(tǒng)中通知狀態(tài)改變發(fā)送的消息格式是:state+n.其中,state是固定的字符串,n是約定意義的數(shù)字.狀態(tài)改變類StateChangedInformer繼承基類Transmission,發(fā)送狀態(tài)消息給PC端.
常用的用戶操作屬于不同模式的應(yīng)用,如手柄模式屬于多點觸摸屏模式的應(yīng)用,而幻燈片(PPT)、賽車等操控屬于傳感器模式的應(yīng)用.
1.1.3、動作數(shù)據(jù)量化
用戶需要實現(xiàn)對屏幕的雙擊、長按及畫弧(如圖2左邊所示的圓圈樣式)操作,這些用戶操作必須量化為數(shù)字信號方能處理.手柄的按鈕有按下和彈起2種狀態(tài),定義好編號和鍵盤的對應(yīng)按鍵,封裝其發(fā)送方法,在已有的數(shù)據(jù)傳輸?shù)幕A(chǔ)上便能實現(xiàn)遠程控制的功能.
?
圖2 用戶操作界面
1.2、傳感器模式
遙控賽車游戲和PPT翻頁是比較典型的傳感器應(yīng)用,但它們的原理不太一樣,遙控PPT翻頁靠用戶動作的加速度,通過一直甩動移動設(shè)備來實現(xiàn)加速;而遙控賽車游戲是通過重力和桌面對手機支持力的變化來使汽車加速,當(dāng)設(shè)備處于某個角度時可以使汽車持續(xù)加速.
Android中的Sensor代表了所有傳感器,它通過SensorManager的getDefaultSensor(inttype)方法來實現(xiàn)實例化,其中參數(shù)type用于標識不同的傳感器,如表1所示,參數(shù)數(shù)值都封裝在Sensor類中.
表1Sensor類
傳感器開發(fā)需要完成以下的功能:注冊事件機制、從加速度傳感器中獲取數(shù)據(jù)、處理數(shù)據(jù)和同步生命周期.因為數(shù)據(jù)是由客戶端傳輸?shù)椒?wù)器端,能夠正確地識別用戶的動作操作還遠遠不夠,還需要將用戶操作轉(zhuǎn)換為有意義的命令,所以需要利用SensorManager對傳感器進行初始化、啟動和關(guān)閉,以及利用SensorEventListener配合SensorEvent來獲取傳感器收集的數(shù)據(jù),通過使用加速度傳感器來了解Android傳感器開發(fā)的流程.
1.2.1、注冊事件機制
Android傳感器的工作機制屬于事件機制,但跟普通Java中的事件機制(如顯示組件Button等)有所區(qū)別:
(1)顯示組件可以自己注冊監(jiān)聽器,而傳感器與監(jiān)聽器之間必須通過SensorManager來注冊;
(2)當(dāng)程序不可見時,顯示組件自然失效,但傳感器會繼續(xù)工作,直到手工關(guān)閉傳感器.傳感器的設(shè)計流程必須滿足Android生命周期的特點,如圖3所示.
圖3 傳感器設(shè)計流程
在Android中,事件源(Source)對應(yīng)的類是Sensor,事件(Event)對應(yīng)的類是SensorEvent,監(jiān)聽器(Listener)對應(yīng)的類是SensorEventListener.
Activity的getSystemService(SENSOR_SERVICE)返回一個SensorManager對象,而SensorManager對象的getDefaultSensor(Sensor.TYPE_ACCELEROMETER)可以獲取加速度傳感器的實例,其中參數(shù)Sensor.TYPE_ACCELEROMETER表示加速度傳感器.利用此方法還可以返回其它傳感器(見表1)的實例.同時需要利用SensorManager的registerListener()方法來使傳感器開始工作,用unregisterListener()方法來注銷傳感器.
1.2.2、獲取加速度
所有傳感器的數(shù)值保存在SensorEvent.values[]中,values的長度和意義取決于當(dāng)前的傳感器類型.獲取數(shù)據(jù)時,利用SensorManager定義的下標常量可以提高程序的可讀性.
Listener=newSensorEventListener(){
PublicvoidonSensorChanged(SensorEvente){
Intx=(int)e.values[SensorManager.DATA_X];
Inty=(int)e.values[SensorManager.DATA_Y];
Intz=(int)e.values[SensorManager.DATA_Z];}}
1.2.3、處理數(shù)據(jù)
通過體感控制PPT的操作包括3個過程:收集數(shù)據(jù)、判斷操作、發(fā)送通知.加速度數(shù)據(jù)從SensorEvent的values變量獲得,接著判斷這些數(shù)據(jù)是否構(gòu)成一次遙控操作.如果構(gòu)成操作,則發(fā)送通知給PC端完成一次控制操作.控制PPT操作的代碼如下:
Floatx=event.values[SensorManager.DATA_X];
Floatz=event.values[SensorManager.DATA_Z];
if(x>15x<-15){
if(z>0)nextPage();
elselastPage();
MakeSensorDelay();}
首先獲取x軸和y軸的加速度值.if(x>15x<-15)、if(z>0)是判斷條件,nextPage()、lastPage()、MakeSensorDelay()是向PC端發(fā)送通知的自定義方法.一次揮動手機可能產(chǎn)生數(shù)十個加速度數(shù)據(jù),MakeSensorDelay()的作用是提高用戶體驗,制造延遲,只判斷為一次操作.
1.2.4、同步生命周期
傳感器的啟動和關(guān)閉是由程序的SensorManager管理的,利用Activity生命周期中的onResume()方法來啟動傳感器,利用onPause()方法來關(guān)閉傳感器.這樣,傳感器的工作時間就與Activity同步了,即傳感器在進入Activity時開啟,離開Activity時關(guān)閉.
從表1可知,Android還包含了其它傳感器,如控制賽車游戲操作的支持力(重力)傳感器,其原理是:當(dāng)手機靜止時,通過手動傾斜手機來改變重力傳感器的向量值.其開發(fā)過程和加速度傳感器類似.
2、提高用戶體驗
通過上面的操作,客戶端程序已經(jīng)可以與服務(wù)器通信,識別發(fā)送觸屏命令,捕獲傳感器的變化,但還需要提高用戶體驗,即讓用戶控制更為精準,最大程度地節(jié)省移動設(shè)備的耗電量.
2.1、制造延遲
制造控制延遲有2種方法:(1)不理會一次揮動中多余的數(shù)據(jù),忽略若干個數(shù)據(jù)之后重新監(jiān)聽,但每次揮動的手勢、路徑、手機朝向都不一樣,產(chǎn)生的數(shù)據(jù)個數(shù)也不確定,因此這種方法可行性不高;(2)從數(shù)據(jù)的源頭抓起,傳感器事件監(jiān)聽器SensorEventListener一旦出現(xiàn)了滿足條件的數(shù)據(jù)時,馬上注銷傳感器,調(diào)用handler的sendMessageDelayed()方法來停止獲取數(shù)據(jù).在設(shè)定的時間之后等待下一次操作,如1s后重新注冊傳感監(jiān)聽器.
2.2、節(jié)約能耗
通過始終甩動來控制PPT等動作敏感度高的程序,用戶會感到疲倦.而如果移動設(shè)備的資源有限,應(yīng)用程序的耗電量大,那么該移動設(shè)備也難以受到用戶的青睞.因此,在設(shè)計Android移動體感的過程中,需要考慮節(jié)約能耗,使軟件更加人性化.能耗的節(jié)約需要考慮3個問題:(1)節(jié)能操作必須適合大部分機型;(2)不影響已有的操作習(xí)慣和用戶體驗;(3)操作必須簡便.
3、實現(xiàn)結(jié)果
3.1、通信效率分析
在本項目開發(fā)之初,曾使用可靠的傳輸控制協(xié)議(TCP)作為通信協(xié)議,但實驗測試結(jié)果表明:使用TCP協(xié)議來傳輸時延遲非常大.這是因為TCP協(xié)議采用了3次握手,對每個數(shù)據(jù)報都要求驗證其正確性,并且為了保證不丟失每個數(shù)據(jù)報,還采用了停止等待協(xié)議,因而項目的測試效果不太理想.例如,控制汽車向左轉(zhuǎn)彎,如果前面向右轉(zhuǎn)彎的數(shù)據(jù)包還沒有傳完,這個向左轉(zhuǎn)彎的數(shù)據(jù)包就必須等待,因而造成延遲,影響用戶體驗.表2給出了使用TCP和UDP協(xié)議時服務(wù)器和客戶端之間的通信效率分析結(jié)果.
表2使用不同協(xié)議時的通信效率分析結(jié)果
雖然UDP協(xié)議有數(shù)據(jù)報容易丟失、不能保證每個報文準確無誤地傳到等問題,但運動體感操作對數(shù)據(jù)延遲性非常敏感,而對數(shù)據(jù)完整性沒有嚴格的要求,故文中采用UDP協(xié)議.它明顯地提高了數(shù)據(jù)的傳輸效率。
3.2、應(yīng)用場景
移動設(shè)備和服務(wù)器(C/S結(jié)構(gòu))通過友好的用戶界面進行匹配,只有配對成功方可控制,因此具有很高的可靠性,如圖4所示.
圖4 Android手機端程序初始化
整個項目主要的應(yīng)用場景可分為操控式、動感式和競技式3種.操控式和動感式主要是利用手機的加速度傳感器進行開發(fā),而競技式主要是通過多點觸摸達到模擬游戲手柄的控制效果.
3.2.1、操控式
操控式最具代表性的應(yīng)用是利用手機在物理空間內(nèi)擺放狀態(tài)的改變來控制極品飛車等賽車類游戲.其原理是:當(dāng)手機靜止時,通過手動傾斜手機來改變支持力對傳感器的向量值,以此來控制賽車或者飛機的前進后退、左右傾斜,如圖5所示.
?
圖5 ?Android移動體感遙控《極品飛車14》示意圖
3.2.2、動感式
加速度傳感器可以捕獲x、y、z方向的加速度,通過每次揮動產(chǎn)生的數(shù)據(jù)結(jié)合項目中的模式識別算法來實現(xiàn)相應(yīng)的操作控制,圖6所示為通過揮動手機實現(xiàn)遙制PPT翻頁的示意圖.除此之外,還可以利用手機揮動實現(xiàn)對播放音樂的切換和“貪食魚”等對動作敏感度要求高的游戲.
?
圖6 Android移動體感遙控PPT和游戲示意圖
3.2.3、競技式
通過移動設(shè)備的觸摸屏實現(xiàn)對應(yīng)的命令映射,可以實現(xiàn)競技類游戲的控制,如圖7所示.本系統(tǒng)除了可以兼容各種手柄類游戲之外,還可以實現(xiàn)類似遠程鼠標的控制效果.
?
圖7 ?Android移動體感遙控FIFA足球示意圖
4、結(jié)語
隨著Android設(shè)備的日益普及和移動體感的廣泛應(yīng)用,利用Android平臺開發(fā)用戶體驗好的移動體感應(yīng)用顯得炙手可熱,文中利用Android移動設(shè)備的傳感器技術(shù)實現(xiàn)了移動體感應(yīng)用系統(tǒng),它具有較好的用戶體驗.在HTCG11和SunsangI9100上的反復(fù)測試,以及在Android市場和國內(nèi)億歐、Wooboo市場的用戶測試表明,手機連接服務(wù)器的時間幾乎可以忽略不計,Android客戶端設(shè)備對服務(wù)器端的控制響應(yīng)時間小于1s,完成了手機在智能空間的普適訪問和軟件控制.今后擬實現(xiàn)多點設(shè)備之間的遠程互操作,系統(tǒng)將采用瀏覽器/服務(wù)器架構(gòu),爭取在該架構(gòu)下能兼容更多的移動嵌入式設(shè)備.
評論
查看更多