劉小安+彭濤+賈杉杉
摘要:隨著Android手機(jī)的普及和研究者對其在日常生活中功能的拓展挖掘,Android手機(jī)的功能已經(jīng)不再是單純用于通話,而漸漸滲透到人們?nèi)粘I畹母鱾€方面。該文以運(yùn)動監(jiān)測作為切入點(diǎn),利用Android平臺提供的傳感器接口,設(shè)計了一款基于Android平臺傳感器技術(shù)的運(yùn)動監(jiān)測應(yīng)用,從而實(shí)現(xiàn)計步,俯臥撐計數(shù)等運(yùn)動數(shù)據(jù)記錄功能。
關(guān)鍵詞:Android;傳感器技術(shù);運(yùn)動監(jiān)測
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2017)01-0063-04
1 背景
隨著基于Android平臺的手機(jī)的普及和研究者對其在日常生活中功能的拓展挖掘,以及基于Android平臺的手機(jī)所配備的硬件(如:光線傳感器、壓力傳感器)日益豐富,Android手機(jī)的功能已經(jīng)不再是單純用于通話,而漸漸滲透到人們?nèi)粘I畹母鱾€方面,例如:家居控制、運(yùn)動監(jiān)測。在運(yùn)動監(jiān)測功能中,需要充分利用Android平臺給開發(fā)者提供的接口以及手機(jī)本身所配備的豐富的硬件,獲取用戶的運(yùn)動基礎(chǔ)數(shù)據(jù),并通過相關(guān)算法進(jìn)行加工和處理,從而實(shí)現(xiàn)通過手機(jī)對用戶運(yùn)動進(jìn)行監(jiān)測和數(shù)據(jù)記錄。
本文將簡要介紹Android平臺為開發(fā)者所提供的傳感器接口以及簡單的調(diào)用方法,并在此基礎(chǔ)上設(shè)計一款運(yùn)動監(jiān)測應(yīng)用,實(shí)現(xiàn)對用戶計步、俯臥撐計數(shù)等運(yùn)動記錄功能。
2 Android平臺傳感器
在Android2.3 gingerbread系統(tǒng)中,Google公司提供了11種傳感器供應(yīng)用層使用。分別是:
#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 //光線感應(yīng)傳感器
#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//旋轉(zhuǎn)矢量傳感器
2.1 傳感器分類
以上11種傳感器可分為3類:
1)位移傳感器,這些傳感器測量沿三個軸線測量加速度和旋轉(zhuǎn)。(包含加速度、線性加速度、重力、陀螺儀和旋轉(zhuǎn)矢量傳感器)
2)環(huán)境傳感器 ,這些傳感器測量各種環(huán)境參數(shù),例如周圍的空氣溫度和壓力,光線,和濕度。(包含壓力,光線和溫度傳感器)
3)位置傳感器,這些傳感器測量設(shè)備的物理位置。(包含距離、方向和磁力傳感器)
2.2 傳感器使用
以上11種傳感器使用方法類似,本文僅以加速度傳感器為例。
1)Android所有的傳感器都?xì)w傳感器管理器 SensorManager 管理,首先獲取傳感器管理器
SensorManager SensorManager = (SensorManager)getSystemService(Context,SENSOR_SERVICE);
2)從傳感器管理器中獲取需要的傳感器
Sensor Speed = SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
3)實(shí)現(xiàn)傳感器監(jiān)聽方法
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)注銷傳感器監(jiān)聽
SensorManager.unregisterListener(speedListener);
3 運(yùn)動監(jiān)測應(yīng)用設(shè)計
應(yīng)用的整體架構(gòu)如圖1所示:
3.1 客戶端
采用Fragment+Viewpager作為基本UI框架,通過異步任務(wù)和多線程技術(shù)來實(shí)現(xiàn)訪問服務(wù)器;通過Handler、BroadcastReceiver動態(tài)更新UI;通過Content Provider來實(shí)現(xiàn)不同Activity以及線程中數(shù)據(jù)的共享;通過Service來定時更新用戶的位置信息。在運(yùn)動監(jiān)測的過程中,根據(jù)不同運(yùn)動的特點(diǎn),運(yùn)用不同的傳感器接口來實(shí)現(xiàn)運(yùn)動監(jiān)測。
3.2 服務(wù)端
采用Servlet+MySQL的基本框架,使用阿里云服務(wù)器作為應(yīng)用的服務(wù)器,來實(shí)現(xiàn)與客戶端的交互、數(shù)據(jù)訪問以及操作處理。數(shù)據(jù)存儲采用MySQL開源數(shù)據(jù)庫,通過JDBC來實(shí)現(xiàn)Servlet與MySQL數(shù)據(jù)庫之間的數(shù)據(jù)傳輸。
服務(wù)端和客戶端的數(shù)據(jù)交互通過JSON來進(jìn)行封裝,從而便于解析處理。
3.3 運(yùn)動檢測算法設(shè)計
1)計步監(jiān)測
考慮到用戶在運(yùn)動過程中運(yùn)動速度相對規(guī)律,本文采用加速度傳感器來實(shí)現(xiàn)計步功能。首先通過Android加速度傳感器接口獲取到運(yùn)動過程中所產(chǎn)生的基礎(chǔ)數(shù)據(jù);然后對基礎(chǔ)數(shù)據(jù)進(jìn)行其可視化,繪制x-y-z加速度與時間的圖像,如圖2、圖3所示:
由于篇幅限制,上兩張圖展示的是運(yùn)動過程中較為典型的兩張圖像,其中圖2和圖3的最大差別在于圖2中X軸的曲線特征較為清晰的表現(xiàn)出了跑步的特征,而在圖3中y軸的特征較為清晰的表現(xiàn)了運(yùn)動的特征。而造成這一差別的原因在于用戶在跑步過程中,手機(jī)所放置的位置。
經(jīng)過一系列不同速度、不同手機(jī)放置位置的測試和圖像對比后,發(fā)現(xiàn)不管用戶的手機(jī)如何放置,在運(yùn)動過程中,X\Y\Z軸的圖像總有至少一個是表現(xiàn)為近似周期性震蕩曲線,并且曲線的峰值基本和用戶跑步的步數(shù)是一致的。但是在用戶以不同速度跑步時,這個峰值的大小是有區(qū)別的。
因此,為了實(shí)現(xiàn)計步監(jiān)測功能,筆者需要找到一個閾值,用于過濾出反應(yīng)運(yùn)動步數(shù)特征的有效值。為此筆者進(jìn)行了一些測試,選取了展現(xiàn)相對靜止時x-y-z加速度與時間的典型圖像,如圖4、圖5所示:
通過對基礎(chǔ)數(shù)據(jù)進(jìn)行對比分析,筆者最終選定閥值如表1所示:
算法實(shí)現(xiàn):
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++;
//一段計錄結(jié)束后
stepCount = stepCount/2;
2)俯臥撐監(jiān)測
通過對俯臥撐運(yùn)動特點(diǎn)的分析,筆者發(fā)現(xiàn),在做俯臥撐的過程中,胸部位置所對應(yīng)的地面位置光線強(qiáng)度變化明顯,因此選擇采用光線傳感器來實(shí)現(xiàn)俯臥撐計數(shù)。示意圖如圖6、7所示:
確定放置位置之后,筆者采集了做俯臥撐過程中光線傳感器的基礎(chǔ)數(shù)據(jù)值,并繪制了光線強(qiáng)度與時間的圖像,如圖8所示:
通過光線強(qiáng)度與時間的圖像可以看出,俯臥撐運(yùn)動過程中,光線傳感器的變化是非常規(guī)律的并且能夠很清晰的反應(yīng)光線俯臥撐的個數(shù),即在停止過程中光線強(qiáng)度不變;在俯臥撐下降過程中,光線強(qiáng)度逐漸減小到特定值;在俯臥撐上升過程中逐漸增加到特定值。這種清晰的曲線特點(diǎn)使得俯臥撐計數(shù)變得相對簡單。
通過對圖像的分析,發(fā)現(xiàn)和計步監(jiān)測類似的,也需要從數(shù)據(jù)中找到一個閥值,用于區(qū)分是否觸發(fā)記錄一個俯臥撐。經(jīng)過一系列的實(shí)驗,綜合考慮了外界光照環(huán)境及人體區(qū)別,本文最終選定閥值為5。
算法實(shí)現(xiàn):
//整型處理
light= (int) event.values[0];
if(light<5){
pushUpCount++;
}
//記錄結(jié)束后,Count除2
pushUpCount = pushUpCount/2;
3.4 界面設(shè)計
為了給用戶以更好的體驗,本運(yùn)動監(jiān)測應(yīng)用采用簡潔清晰的界面設(shè)計風(fēng)格,突出主體,簡單易用。圖9、圖10為應(yīng)用部分效果圖。
4 安裝及測試
本運(yùn)動監(jiān)測應(yīng)用是基于Android 2.1及以上版本平臺的手機(jī)應(yīng)用軟件。本文將該應(yīng)用安裝在了Nexus5、三星s5等型號的手機(jī)上,并進(jìn)行了測試。經(jīng)過測試,俯臥撐數(shù)量監(jiān)測誤差在正負(fù)兩個以內(nèi);步數(shù)監(jiān)測效果穩(wěn)定性一般,在慢跑狀態(tài)下誤差較小,在步行條件下誤差不穩(wěn)定。
5 結(jié)束語
本應(yīng)用基于Android平臺所提供的傳感器API以及Android手機(jī)上常用的加速度傳感器和光線傳感器,通過對傳感器數(shù)據(jù)進(jìn)行分析,實(shí)現(xiàn)了記步監(jiān)測以及俯臥撐監(jiān)測。隨著手機(jī)傳感器的日益豐富,可以用于監(jiān)測用戶行為的傳感器將日益增加,因此傳感器選擇以及算法都可以進(jìn)一步改進(jìn),使得監(jiān)測結(jié)果更加準(zhǔn)確。
參考文獻(xiàn):
[1] 陳曦, 梁曄. 基于Android的“樂動我心”手機(jī)應(yīng)用軟件設(shè)計與實(shí)現(xiàn)[J]. 科技廣場, 2013(10): 239-243.
[2] 馬小軍, 王滿. 基于Android平臺的手機(jī)學(xué)吉他軟件的開發(fā)[J]. 北京聯(lián)合大學(xué)學(xué)報: 自然科學(xué)版, 2012, 26(1): 28-32.
[3] 孫富宗, 梁曄. 基于Android平臺的人性化超市輔助系統(tǒng)設(shè)計與實(shí)現(xiàn)[J]. 科技廣場, 2013(9): 234-238.
[4] 丁玨. 基于Android微心理App系統(tǒng)設(shè)計與實(shí)現(xiàn)[J]. 電腦知識與技術(shù), 2016, 12(8): 56-57.