謝俊松 陳浩強(qiáng) 孫澤宇
摘要:目前運(yùn)動強(qiáng)度大多數(shù)都是以心率為評級標(biāo)準(zhǔn),對于普通運(yùn)動愛好者來說操作復(fù)雜、設(shè)備成本高。針對上述問題,該文設(shè)計一種基于Android內(nèi)置G-senor和步頻的運(yùn)動強(qiáng)度分析系統(tǒng),系統(tǒng)采用步頻作為運(yùn)動強(qiáng)度評級標(biāo)準(zhǔn),而步頻可以根據(jù)采集到的G-senor三軸加速度通過計步算法得到。該系統(tǒng)具有操作簡單、成本低等特點(diǎn),可以讓普通運(yùn)動愛好者能夠直接通過手機(jī)App實(shí)時查看自己的運(yùn)動強(qiáng)度,指導(dǎo)科學(xué)健身。
關(guān)鍵詞:G-senor; Android;步頻;運(yùn)動強(qiáng)度;計步
中圖分類號:TP311.5? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2020)23-0012-04
Abstract: At present, most of the exercise intensity is based on heart rate, which is a complex operation and high equipment cost for ordinary sports enthusiasts. To solve the above problems, a motion intensity analysis system based on Android built-in G-sensor and step frequency is designed. The system uses step frequency as the exercise intensity rating standard, and the step frequency can be obtained through the step algorithm according to the collected G-sensor triaxial acceleration. The system has the characteristics of simple operation and low cost, which enables ordinary sports fans to view their exercise intensity directly through mobile app in real time and guide scientific fitness.
Key words: G-senor; android; step frequency; exercise intensity; step counting
1 背景
近年來,隨著生活條件的日益改善,人們越來越注重健康,運(yùn)動作為保持健康身體有效方式之一也受到很多人的青睞[1]。文獻(xiàn)[2]調(diào)查了體育運(yùn)動對慢性病的影響,最后得出科學(xué)的運(yùn)動習(xí)慣和健康的生活方式對慢性病的影響不容忽視的結(jié)論。而過度的運(yùn)動對身體則是有害的,文獻(xiàn)[3]指出跑步愛好者超過50%的人下肢發(fā)生過損傷,多數(shù)是由于高強(qiáng)度、長時間運(yùn)動,沒有科學(xué)健身。
隨著移動互聯(lián)網(wǎng)的發(fā)展,市場上出現(xiàn)了越來越多的運(yùn)動類軟件和硬件產(chǎn)品,如keep、咕咚、微信運(yùn)動、小米手環(huán)和華為手表等。這些產(chǎn)品要么沒有給出運(yùn)動強(qiáng)度實(shí)時提醒,要么產(chǎn)品價格昂貴,需要購買另外的硬件設(shè)備,對普通運(yùn)動愛好者來說難以承受。比如微信運(yùn)動只能看到步數(shù),看不到步頻,更沒有運(yùn)動強(qiáng)度提醒。針對上述問題,本文基于Android內(nèi)置的G-senor(重力加速度傳感器),采集x、y和z軸三個方向的加速度,通過計步算法得到步頻,依據(jù)步頻對運(yùn)動強(qiáng)度劃分5個等級,監(jiān)測分析用戶運(yùn)動過程中的運(yùn)動強(qiáng)度,當(dāng)其超過某個設(shè)定的等級后提醒用戶,及時調(diào)整運(yùn)動。
2 運(yùn)動強(qiáng)度分析系統(tǒng)設(shè)計
2.1 總體設(shè)計
該系統(tǒng)設(shè)計的目的是讓用戶看到自己的實(shí)時運(yùn)動強(qiáng)度,如果強(qiáng)度過大則需要提醒用戶。每次運(yùn)動過后還需要保存記錄,方便用戶后續(xù)查看。還需要一些自定義設(shè)置選項(xiàng),比如運(yùn)動強(qiáng)度等級,可能不同的人對應(yīng)的強(qiáng)度是不同的,因此需要讓其可以自定義一些參數(shù)。
通過上述分析,App總體設(shè)計如圖1所示,主要包括三大模塊,首頁、歷史記錄和設(shè)置。其中首頁涉及的功能模塊最多,需要處理三軸加速度數(shù)據(jù)、顯示運(yùn)動強(qiáng)度圖、統(tǒng)計步數(shù)步頻等。
2.2 運(yùn)動強(qiáng)度等級設(shè)計
傳統(tǒng)方式評價運(yùn)動強(qiáng)度多數(shù)是以心率為參考標(biāo)準(zhǔn),操作復(fù)雜、設(shè)備成本高。本系統(tǒng)使用步頻來評價運(yùn)動強(qiáng)度,簡單實(shí)用、設(shè)備成本低。首先需要依據(jù)步頻來劃分運(yùn)動強(qiáng)度,確定相關(guān)標(biāo)準(zhǔn),如表1所示為運(yùn)動強(qiáng)度等級劃分標(biāo)準(zhǔn)。
2.3 計步算法設(shè)計
根據(jù)上節(jié)運(yùn)動強(qiáng)度等級設(shè)計可知,首先需要實(shí)現(xiàn)計步,然后才能計算出步頻,進(jìn)而得出運(yùn)動強(qiáng)度。目前主流的記錄步數(shù)工具是手環(huán),如小米手環(huán)和華為手表等[4]。Android內(nèi)置G-sensor可以檢測x、y和z軸3個方向的加速度(單位m/s2),不同的運(yùn)動狀態(tài)和強(qiáng)度會產(chǎn)生相應(yīng)方向不同的加速度。根據(jù)文獻(xiàn)[5]和[6]可知,不管如何佩戴手機(jī),總有至少一個軸具有相對較大的周期性加速度變化,稱為活躍軸。將三軸的加速度值合成一個加速度矢量|V|,計算式子為
本系統(tǒng)具體使用的計步算法思想如下。
1)均值濾波:通過均值濾波器實(shí)現(xiàn)對采集的x、y和z三軸數(shù)據(jù)的平滑處理,并將結(jié)果作為輸出。
2)動態(tài)閾值:每采集60次更新一次三軸加速度的最大值(Max)和最小值(Min),平均值(Max + Min)/2定義為“動態(tài)閾值”,它是動態(tài)變化的。通過最大和最小值可以判斷出最活躍軸,因?yàn)槲覀冏詈笈袛嗖椒ィ彩歉鶕?jù)哪個軸加速度變化最大認(rèn)為哪個是活躍軸。
3)動態(tài)精度(DYNAMIC_PRECISION):用來去除高頻噪聲。移位寄存器中有兩個樣本oldData和newData,以x軸為例,采集到一個新樣本curData后,令oldData.x=newData.x,如果curData.x-newData.x的絕對值大于設(shè)定的DYNAMIC_PRECISION值,則更新newData.x的值為curData.x,否則不更新。
4)步伐判斷:判斷為一步的條件是,最活躍軸的oldData大于動態(tài)閾值,newData小于動態(tài)閾值。滿足上述條件,認(rèn)為走了一步。在本文的算法實(shí)現(xiàn)過程中為了減少一些錯誤步數(shù),認(rèn)為連續(xù)運(yùn)動大于5步才算有效步。
找到有效步后,除以時間間隔即可得到步頻,再對照表1計算出實(shí)時運(yùn)動強(qiáng)度。根據(jù)步頻還可以區(qū)分不同的運(yùn)動狀態(tài),如走和跑,本系統(tǒng)設(shè)計時以步頻120(步/分鐘)為界限,以下為正常走路,以上為跑狀態(tài)。
3 App模塊設(shè)計
3.1 首頁模塊
該模塊需要顯示用戶運(yùn)動狀態(tài)和運(yùn)動強(qiáng)度等信息,當(dāng)檢測到運(yùn)動強(qiáng)度高于用戶設(shè)定的值時,給出語音提示和手機(jī)振動。語音提示功能集成了訊飛離線語音合成 Android SDK,可以將一段文字轉(zhuǎn)換成語音播放給用戶,這樣不需要停下來看手機(jī)即可聽到App的提醒,及時調(diào)整運(yùn)動強(qiáng)度,避免不必要的身體損傷。
自定義StepService繼承自Service用來實(shí)現(xiàn)后臺計步并計算步頻,首先獲得加速度傳感器Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),然后注冊registerListener(SensorEventListener listener, Sensor sensor, int rate)監(jiān)聽,其中采樣頻率rate使用的是SensorManager.SENSOR_DEPLAY_UI,它還有其他另外三種頻率可以設(shè)置,分別為SensorManager.SENSOR_DEPLAY_FASTEST、SensorManager.SENSOR_DEPLAY_GAME和SensorManager.SENSOR_DEPLAY_NORMAL,但對應(yīng)的采樣頻率都太快,本系統(tǒng)使用UI級別的采樣即可滿足計步要求[7]。
運(yùn)動強(qiáng)度圖的繪制也是該模塊的一個重點(diǎn),由于Android沒有直接提供此類控件,需要自定義實(shí)現(xiàn)[8]。自定義SportChartView類繼承自View類,實(shí)現(xiàn)其onDraw()方法,此方法只有在第一次創(chuàng)建控件和調(diào)用invalidate()方法才會觸發(fā)。使用一個list來維護(hù)需要繪制的運(yùn)動強(qiáng)度數(shù)據(jù),為了降低CPU負(fù)荷同時及時處理運(yùn)動數(shù)據(jù),設(shè)計每300ms向前(從屏幕右端往左端)移動40個像素,每移動一次需要判斷是否需要繪制下一個運(yùn)動狀態(tài)和強(qiáng)度,保證運(yùn)動強(qiáng)度圖總是鋪滿屏幕的,同時當(dāng)一個運(yùn)動從最右端完全移出屏幕后,需要在list中刪除相應(yīng)數(shù)據(jù)。首頁設(shè)計如圖3所示,運(yùn)動強(qiáng)度越高,狀態(tài)圖高度也就越高。
3.2 運(yùn)動記錄模塊
需要記錄用戶每次的運(yùn)動詳細(xì)數(shù)據(jù),因此需要使用SQLlite數(shù)據(jù)庫,數(shù)據(jù)庫表設(shè)計如表2所示。
用戶記錄模塊首先要展示記錄列表,這里使用Android自帶的控件RecycleView來實(shí)現(xiàn),然后再為該控件設(shè)置adapter(適配器)。進(jìn)入該頁面后首先從數(shù)據(jù)庫中讀取運(yùn)動強(qiáng)度表,如果數(shù)據(jù)不為空則展示列表并按運(yùn)動開始時間降序排列,為空給出“快去運(yùn)動吧!”的提示。列表中展示運(yùn)動的開始時間、結(jié)束時間和總時長等信息。列表頁面提供長按刪除功能,用戶對某條記錄可以進(jìn)行刪除,具體實(shí)現(xiàn)上通過sql語句按關(guān)鍵字Id進(jìn)行查找刪除。列表頁設(shè)計如圖4所示。
從用戶記錄列表進(jìn)入運(yùn)動詳情頁面,該頁面需要展示用戶的詳細(xì)運(yùn)動信息,同時分別計算低運(yùn)動強(qiáng)度和中低運(yùn)動強(qiáng)度時間占比1,中高運(yùn)動強(qiáng)度和高運(yùn)動強(qiáng)度時間占比2。如果占比1超過50%則提示用戶適當(dāng)增加運(yùn)動強(qiáng)度,占比2超過50%提示用戶運(yùn)動強(qiáng)度較大,建議用戶適當(dāng)運(yùn)動。運(yùn)動詳情頁設(shè)計如圖5所示。
3.3 設(shè)置模塊
該模塊主要提供一些用戶需要自定義設(shè)置的功能。
3.3.1 運(yùn)動強(qiáng)度等級標(biāo)準(zhǔn)
系統(tǒng)已經(jīng)默認(rèn)按表1所示設(shè)定了運(yùn)動強(qiáng)度等級標(biāo)準(zhǔn),用戶也可以按自己的實(shí)際情況自定義標(biāo)準(zhǔn),使得強(qiáng)度檢測更符合個人特點(diǎn)。實(shí)現(xiàn)過程中使用了SharedPreferences類來存儲配置信息[9],它是一個輕量級的存儲類,特別適合用于保存軟件配置等參數(shù)。它底層實(shí)現(xiàn)是用xml文件存放數(shù)據(jù),文件存放在/data/data/
3.3.2 高強(qiáng)度提醒
用戶可以設(shè)置步頻達(dá)到多少時,自動語音提醒。滿足了不同用戶的個性化定制需求。數(shù)據(jù)同樣使用SharedPreferences來存儲。
3.3.3 提醒時間間隔
為了避免頻繁提醒,用戶可以自己設(shè)置高強(qiáng)度運(yùn)動提醒的時間間隔,單位為分鐘,比如設(shè)置5分鐘,表示的是每次提醒的時間間隔在5分鐘以上。
4 系統(tǒng)測試
4.1 計步測試
為了測試計步算法的有效性,測試者將手機(jī)分別放置在身體不同部位,然后進(jìn)行行走、跑步同時記錄步數(shù),和軟件最后的運(yùn)動詳情界面記錄的步數(shù)相比較,結(jié)果如表3所示,三個不同位置和實(shí)際偏差都在5%以內(nèi),同時運(yùn)動狀態(tài)的變化顯示在App上延遲大約在2秒左右,滿足系統(tǒng)需求。
4.2 功能測試
打開App點(diǎn)擊開始計時,然后進(jìn)行高強(qiáng)度的跑步,測試軟件是否能做到實(shí)際步頻超過設(shè)定的步頻的情況能否及時提醒用戶,保持合適運(yùn)動強(qiáng)度,健康健身。通過測試成功語音播報了提醒。最后點(diǎn)擊停止計時,頁面切換到運(yùn)動歷史界面,列表新增了一條新的記錄,點(diǎn)擊打開運(yùn)動詳情界面,長按點(diǎn)擊測試刪除功能。以上功能均通過了測試。
5 結(jié)束語
本文首先對目前存在的運(yùn)動類產(chǎn)品進(jìn)行了研究,然后提出了針對普通運(yùn)動愛好者的一款依據(jù)步頻來分析運(yùn)動強(qiáng)度的方案,隨后從系統(tǒng)總體設(shè)計、計步算法實(shí)現(xiàn)和App模塊設(shè)計等方面進(jìn)行了詳細(xì)討論。通過測試,系統(tǒng)達(dá)到了預(yù)期的功能,能夠及時提醒用戶調(diào)整自己的運(yùn)動強(qiáng)度,達(dá)到科學(xué)健身的目的。該系統(tǒng)非常適合普通運(yùn)動愛好者。
參考文獻(xiàn):
[1] 方旭東. 全民健身 凝聚向上向善的力量[N]. 中國體育報, 2020-05-28.
[2] 周秋菊, 王保淵, 何偉. 近年來體育運(yùn)動對慢病影響的國內(nèi)研究進(jìn)展[J]. 四川體育科學(xué), 2020, 39(3): 40-43.
[3] 王嘉瑛, 李令嶺, 馬梁, 等. 跑步愛好者運(yùn)動損傷的調(diào)查與分析[J]. 昆明醫(yī)科大學(xué)學(xué)報, 2020, 41(1): 151-157.
[4] 苗子蕊, 吉麗娜. 健身計步器研究綜述[J]. 電腦知識與技術(shù), 2018, 14(11): 263-264, 266.
[5] 楊潤澤. 一種節(jié)能的智能手機(jī)計步算法的研究與應(yīng)用[D]. 呼和浩特: 內(nèi)蒙古大學(xué), 2019.
[6] Neil Zhao. Full-Featured Pedometer Design? Realized with 3-Axis Digital Accelerometer[EB/OL]. (2010-06-06)[2019-12-20]. https://www.analog.com/en/analog-dialogue/articles/pedometer-design-3-axis-digital-acceler.html.
[7] 丁忠成. 基于智能手機(jī)傳感器的人體行為識別技術(shù)研究[D]. 長沙: 湖南大學(xué), 2018.
[8] 許艦. Android自定義繪圖組件的設(shè)計與實(shí)現(xiàn)[J]. 電腦知識與技術(shù), 2018, 14(10): 95-98.
[9] 楊亮, 袁嵩, 蔣鵬, 等. 基于Android平臺的數(shù)據(jù)存儲機(jī)制應(yīng)用研究[J]. 電腦知識與技術(shù), 2014, 10(11): 2481-2484.
【通聯(lián)編輯:謝媛媛】