刘小安+彭涛+贾杉杉
摘要:随着Android手机的普及和研究者对其在日常生活中功能的拓展挖掘,Android手机的功能已经不再是单纯用于通话,而渐渐渗透到人们日常生活的各个方面。该文以运动监测作为切入点,利用Android平台提供的传感器接口,设计了一款基于Android平台传感器技术的运动监测应用,从而实现计步,俯卧撑计数等运动数据记录功能。
关键词:Android;传感器技术;运动监测
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)01-0063-04
1 背景
随着基于Android平台的手机的普及和研究者对其在日常生活中功能的拓展挖掘,以及基于Android平台的手机所配备的硬件(如:光线传感器、压力传感器)日益丰富,Android手机的功能已经不再是单纯用于通话,而渐渐渗透到人们日常生活的各个方面,例如:家居控制、运动监测。在运动监测功能中,需要充分利用Android平台给开发者提供的接口以及手机本身所配备的丰富的硬件,获取用户的运动基础数据,并通过相关算法进行加工和处理,从而实现通过手机对用户运动进行监测和数据记录。
本文将简要介绍Android平台为开发者所提供的传感器接口以及简单的调用方法,并在此基础上设计一款运动监测应用,实现对用户计步、俯卧撑计数等运动记录功能。
2 Android平台传感器
在Android2.3 gingerbread系统中,Google公司提供了11种传感器供应用层使用。分别是:
#define SENSOR_TYPE_ACCELEROMETER 1 //加速度传感器
#define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力傳感器
#define SENSOR_TYPE_ORIENTATION 3 //方向传感器
#define SENSOR_TYPE_GYROSCOPE 4 //陀螺仪传感器
#define SENSOR_TYPE_LIGHT 5 //光线感应传感器
#define SENSOR_TYPE_PRESSURE 6 //压力传感器
#define SENSOR_TYPE_TEMPERATURE 7 //温度传感器
#define SENSOR_TYPE_PROXIMITY 8 //距离传感器
#define SENSOR_TYPE_GRAVITY 9 //重力传感器
#define SENSOR_TYPE_LINEAR_ACCELERATION 10//线性加速度传感器
#define SENSOR_TYPE_ROTATION_VECTOR 11//旋转矢量传感器
2.1 传感器分类
以上11种传感器可分为3类:
1)位移传感器,这些传感器测量沿三个轴线测量加速度和旋转。(包含加速度、线性加速度、重力、陀螺仪和旋转矢量传感器)
2)环境传感器 ,这些传感器测量各种环境参数,例如周围的空气温度和压力,光线,和湿度。(包含压力,光线和温度传感器)
3)位置传感器,这些传感器测量设备的物理位置。(包含距离、方向和磁力传感器)
2.2 传感器使用
以上11种传感器使用方法类似,本文仅以加速度传感器为例。
1)Android所有的传感器都归传感器管理器 SensorManager 管理,首先获取传感器管理器
SensorManager SensorManager = (SensorManager)getSystemService(Context,SENSOR_SERVICE);
2)从传感器管理器中获取需要的传感器
Sensor Speed = SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
3)实现传感器监听方法
private SensorEventListener speedListener = new SensorEventListener(){
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {}
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[SensorManager.DATA_X];
float y = event.values[SensorManager.DATA_Y];
float z = event.values[SensorManager.DATA_Z];
};
4)注册传感器
SensorManager.registerListener(speedListener,Speed,SensorManager.SENSOR_DELAY_NORMAL);
5)注销传感器监听
SensorManager.unregisterListener(speedListener);
3 运动监测应用设计
应用的整体架构如图1所示:
3.1 客户端
采用Fragment+Viewpager作为基本UI框架,通过异步任务和多线程技术来实现访问服务器;通过Handler、BroadcastReceiver动态更新UI;通过Content Provider来实现不同Activity以及线程中数据的共享;通过Service来定时更新用户的位置信息。在运动监测的过程中,根据不同运动的特点,运用不同的传感器接口来实现运动监测。
3.2 服务端
采用Servlet+MySQL的基本框架,使用阿里云服务器作为应用的服务器,来实现与客户端的交互、数据访问以及操作处理。数据存储采用MySQL开源数据库,通过JDBC来实现Servlet与MySQL数据库之间的数据传输。
服务端和客户端的数据交互通过JSON来进行封装,从而便于解析处理。
3.3 运动检测算法设计
1)计步监测
考虑到用户在运动过程中运动速度相对规律,本文采用加速度传感器来实现计步功能。首先通过Android加速度传感器接口获取到运动过程中所产生的基础数据;然后对基础数据进行其可视化,绘制x-y-z加速度与时间的图像,如图2、图3所示:
由于篇幅限制,上两张图展示的是运动过程中较为典型的两张图像,其中图2和图3的最大差别在于图2中X轴的曲线特征较为清晰的表现出了跑步的特征,而在图3中y轴的特征较为清晰的表现了运动的特征。而造成这一差别的原因在于用户在跑步过程中,手机所放置的位置。
经过一系列不同速度、不同手机放置位置的测试和图像对比后,发现不管用户的手机如何放置,在运动过程中,X\Y\Z轴的图像总有至少一个是表现为近似周期性震荡曲线,并且曲线的峰值基本和用户跑步的步数是一致的。但是在用户以不同速度跑步时,这个峰值的大小是有区别的。
因此,为了实现计步监测功能,笔者需要找到一个阈值,用于过滤出反应运动步数特征的有效值。为此笔者进行了一些测试,选取了展现相对静止时x-y-z加速度与时间的典型图像,如图4、图5所示:
通过对基础数据进行对比分析,笔者最终选定阀值如表1所示:
算法实现:
float x = event.values[SensorManager.DATA_X];
float y = event.values[SensorManager.DATA_Y];
float z = event.values[SensorManager.DATA_Z];
if(Math.abs(x)>14.3||Math.abs(x)>14.2
||Math.abs(x)>14.5)
stepCount++;
//一段计录结束后
stepCount = stepCount/2;
2)俯卧撑监测
通过对俯卧撑运动特点的分析,笔者发现,在做俯卧撑的过程中,胸部位置所对应的地面位置光线强度变化明显,因此选择采用光线传感器来实现俯卧撑计数。示意图如图6、7所示:
确定放置位置之后,笔者采集了做俯卧撑过程中光线传感器的基础数据值,并绘制了光线强度与时间的图像,如图8所示:
通过光线强度与时间的图像可以看出,俯卧撑运动过程中,光线传感器的变化是非常规律的并且能够很清晰的反应光线俯卧撑的个数,即在停止过程中光线强度不变;在俯卧撑下降过程中,光线强度逐渐减小到特定值;在俯卧撑上升过程中逐渐增加到特定值。这种清晰的曲线特点使得俯卧撑计数变得相对简单。
通过对图像的分析,发现和计步监测类似的,也需要从数据中找到一个阀值,用于区分是否触发记录一个俯卧撑。经过一系列的实验,综合考虑了外界光照环境及人体区别,本文最终选定阀值为5。
算法实现:
//整型处理
light= (int) event.values[0];
if(light<5){
pushUpCount++;
}
//记录结束后,Count除2
pushUpCount = pushUpCount/2;
3.4 界面设计
为了给用户以更好的体验,本运动监测应用采用简洁清晰的界面设计风格,突出主体,简单易用。图9、图10为应用部分效果图。
4 安装及测试
本运动监测应用是基于Android 2.1及以上版本平台的手机应用软件。本文将该应用安装在了Nexus5、三星s5等型号的手机上,并进行了测试。经过测试,俯卧撑数量监测误差在正负两个以内;步数监测效果稳定性一般,在慢跑状态下误差较小,在步行条件下误差不稳定。
5 结束语
本应用基于Android平台所提供的传感器API以及Android手机上常用的加速度传感器和光线传感器,通过对传感器数据进行分析,实现了记步监测以及俯卧撑监测。随着手机传感器的日益丰富,可以用于监测用户行为的传感器将日益增加,因此传感器选择以及算法都可以进一步改进,使得监测结果更加准确。
参考文献:
[1] 陈曦, 梁晔. 基于Android的“乐动我心”手机应用软件设计与实现[J]. 科技广场, 2013(10): 239-243.
[2] 马小军, 王满. 基于Android平台的手机学吉他软件的开发[J]. 北京联合大学学报: 自然科学版, 2012, 26(1): 28-32.
[3] 孫富宗, 梁晔. 基于Android平台的人性化超市辅助系统设计与实现[J]. 科技广场, 2013(9): 234-238.
[4] 丁珏. 基于Android微心理App系统设计与实现[J]. 电脑知识与技术, 2016, 12(8): 56-57.