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