基于Android移动设备传感器的体感应用

嵌入式设计应用

127人已加入

描述

为了利用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、动作数据量化

用户需要实现对屏幕的双击、长按及画弧(如图2左边所示的圆圈样式)操作,这些用户操作必须量化为数字信号方能处理.手柄的按钮有按下和弹起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,完成了手机在智能空间的普适访问和软件控制.今后拟实现多点设备之间的远程互操作,系统将采用浏览器/服务器架构,争取在该架构下能兼容更多的移动嵌入式设备.

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分