基于G-senor和步频的运动强度分析系统设计
2020-09-27谢俊松陈浩强孙泽宇
谢俊松 陈浩强 孙泽宇
摘要:目前运动强度大多数都是以心率为评级标准,对于普通运动爱好者来说操作复杂、设备成本高。针对上述问题,该文设计一种基于Android内置G-senor和步频的运动强度分析系统,系统采用步频作为运动强度评级标准,而步频可以根据采集到的G-senor三轴加速度通过计步算法得到。该系统具有操作简单、成本低等特点,可以让普通运动爱好者能够直接通过手机App实时查看自己的运动强度,指导科学健身。
关键词:G-senor; Android;步频;运动强度;计步
中图分类号:TP311.5 文献标识码: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 背景
近年來,随着生活条件的日益改善,人们越来越注重健康,运动作为保持健康身体有效方式之一也受到很多人的青睐[1]。文献[2]调查了体育运动对慢性病的影响,最后得出科学的运动习惯和健康的生活方式对慢性病的影响不容忽视的结论。而过度的运动对身体则是有害的,文献[3]指出跑步爱好者超过50%的人下肢发生过损伤,多数是由于高强度、长时间运动,没有科学健身。
随着移动互联网的发展,市场上出现了越来越多的运动类软件和硬件产品,如keep、咕咚、微信运动、小米手环和华为手表等。这些产品要么没有给出运动强度实时提醒,要么产品价格昂贵,需要购买另外的硬件设备,对普通运动爱好者来说难以承受。比如微信运动只能看到步数,看不到步频,更没有运动强度提醒。针对上述问题,本文基于Android内置的G-senor(重力加速度传感器),采集x、y和z轴三个方向的加速度,通过计步算法得到步频,依据步频对运动强度划分5个等级,监测分析用户运动过程中的运动强度,当其超过某个设定的等级后提醒用户,及时调整运动。
2 运动强度分析系统设计
2.1 总体设计
该系统设计的目的是让用户看到自己的实时运动强度,如果强度过大则需要提醒用户。每次运动过后还需要保存记录,方便用户后续查看。还需要一些自定义设置选项,比如运动强度等级,可能不同的人对应的强度是不同的,因此需要让其可以自定义一些参数。
通过上述分析,App总体设计如图1所示,主要包括三大模块,首页、历史记录和设置。其中首页涉及的功能模块最多,需要处理三轴加速度数据、显示运动强度图、统计步数步频等。
2.2 运动强度等级设计
传统方式评价运动强度多数是以心率为参考标准,操作复杂、设备成本高。本系统使用步频来评价运动强度,简单实用、设备成本低。首先需要依据步频来划分运动强度,确定相关标准,如表1所示为运动强度等级划分标准。
2.3 计步算法设计
根据上节运动强度等级设计可知,首先需要实现计步,然后才能计算出步频,进而得出运动强度。目前主流的记录步数工具是手环,如小米手环和华为手表等[4]。Android内置G-sensor可以检测x、y和z轴3个方向的加速度(单位m/s2),不同的运动状态和强度会产生相应方向不同的加速度。根据文献[5]和[6]可知,不管如何佩戴手机,总有至少一个轴具有相对较大的周期性加速度变化,称为活跃轴。将三轴的加速度值合成一个加速度矢量|V|,计算式子为
本系统具体使用的计步算法思想如下。
1)均值滤波:通过均值滤波器实现对采集的x、y和z三轴数据的平滑处理,并将结果作为输出。
2)动态阈值:每采集60次更新一次三轴加速度的最大值(Max)和最小值(Min),平均值(Max + Min)/2定义为“动态阈值”,它是动态变化的。通过最大和最小值可以判断出最活跃轴,因为我们最后判断步伐,也是根据哪个轴加速度变化最大认为哪个是活跃轴。
3)动态精度(DYNAMIC_PRECISION):用来去除高频噪声。移位寄存器中有两个样本oldData和newData,以x轴为例,采集到一个新样本curData后,令oldData.x=newData.x,如果curData.x-newData.x的绝对值大于设定的DYNAMIC_PRECISION值,则更新newData.x的值为curData.x,否则不更新。
4)步伐判断:判断为一步的条件是,最活跃轴的oldData大于动态阈值,newData小于动态阈值。满足上述条件,认为走了一步。在本文的算法实现过程中为了减少一些错误步数,认为连续运动大于5步才算有效步。
找到有效步后,除以时间间隔即可得到步频,再对照表1计算出实时运动强度。根据步频还可以区分不同的运动状态,如走和跑,本系统设计时以步频120(步/分钟)为界限,以下为正常走路,以上为跑状态。
3 App模块设计
3.1 首页模块
该模块需要显示用户运动状态和运动强度等信息,当检测到运动强度高于用户设定的值时,给出语音提示和手机振动。语音提示功能集成了讯飞离线语音合成 Android SDK,可以将一段文字转换成语音播放给用户,这样不需要停下来看手机即可听到App的提醒,及时调整运动强度,避免不必要的身体损伤。
自定义StepService继承自Service用来实现后台计步并计算步频,首先获得加速度传感器Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),然后注册registerListener(SensorEventListener listener, Sensor sensor, int rate)监听,其中采样频率rate使用的是SensorManager.SENSOR_DEPLAY_UI,它还有其他另外三种频率可以设置,分别为SensorManager.SENSOR_DEPLAY_FASTEST、SensorManager.SENSOR_DEPLAY_GAME和SensorManager.SENSOR_DEPLAY_NORMAL,但对应的采样频率都太快,本系统使用UI级别的采样即可满足计步要求[7]。
运动强度图的绘制也是该模块的一个重点,由于Android没有直接提供此类控件,需要自定义实现[8]。自定义SportChartView类继承自View类,实现其onDraw()方法,此方法只有在第一次创建控件和调用invalidate()方法才会触发。使用一个list来维护需要绘制的运动强度数据,为了降低CPU负荷同时及时处理运动数据,设计每300ms向前(从屏幕右端往左端)移动40个像素,每移动一次需要判断是否需要绘制下一个运动状态和强度,保证运动强度图总是铺满屏幕的,同时当一个运动从最右端完全移出屏幕后,需要在list中删除相应数据。首页设计如图3所示,运动强度越高,状态图高度也就越高。
3.2 运动记录模块
需要记录用户每次的运动详细数据,因此需要使用SQLlite数据库,数据库表设计如表2所示。
用户记录模块首先要展示记录列表,这里使用Android自带的控件RecycleView来实现,然后再为该控件设置adapter(适配器)。进入该页面后首先从数据库中读取运动强度表,如果数据不为空则展示列表并按运动开始时间降序排列,为空给出“快去运动吧!”的提示。列表中展示运动的开始时间、结束时间和总时长等信息。列表页面提供长按删除功能,用户对某条记录可以进行删除,具体实现上通过sql语句按关键字Id进行查找删除。列表页设计如图4所示。
从用户记录列表进入运动详情页面,该页面需要展示用户的详细运动信息,同时分别计算低运动强度和中低运动强度时间占比1,中高运动强度和高运动强度时间占比2。如果占比1超过50%则提示用户适当增加运动强度,占比2超过50%提示用户运动强度较大,建議用户适当运动。运动详情页设计如图5所示。
3.3 设置模块
该模块主要提供一些用户需要自定义设置的功能。
3.3.1 运动强度等级标准
系统已经默认按表1所示设定了运动强度等级标准,用户也可以按自己的实际情况自定义标准,使得强度检测更符合个人特点。实现过程中使用了SharedPreferences类来存储配置信息[9],它是一个轻量级的存储类,特别适合用于保存软件配置等参数。它底层实现是用xml文件存放数据,文件存放在/data/data/
3.3.2 高强度提醒
用户可以设置步频达到多少时,自动语音提醒。满足了不同用户的个性化定制需求。数据同样使用SharedPreferences来存储。
3.3.3 提醒时间间隔
为了避免频繁提醒,用户可以自己设置高强度运动提醒的时间间隔,单位为分钟,比如设置5分钟,表示的是每次提醒的时间间隔在5分钟以上。
4 系统测试
4.1 计步测试
为了测试计步算法的有效性,测试者将手机分别放置在身体不同部位,然后进行行走、跑步同时记录步数,和软件最后的运动详情界面记录的步数相比较,结果如表3所示,三个不同位置和实际偏差都在5%以内,同时运动状态的变化显示在App上延迟大约在2秒左右,满足系统需求。
4.2 功能测试
打开App点击开始计时,然后进行高强度的跑步,测试软件是否能做到实际步频超过设定的步频的情况能否及时提醒用户,保持合适运动强度,健康健身。通过测试成功语音播报了提醒。最后点击停止计时,页面切换到运动历史界面,列表新增了一条新的记录,点击打开运动详情界面,长按点击测试删除功能。以上功能均通过了测试。
5 结束语
本文首先对目前存在的运动类产品进行了研究,然后提出了针对普通运动爱好者的一款依据步频来分析运动强度的方案,随后从系统总体设计、计步算法实现和App模块设计等方面进行了详细讨论。通过测试,系统达到了预期的功能,能够及时提醒用户调整自己的运动强度,达到科学健身的目的。该系统非常适合普通运动爱好者。
参考文献:
[1] 方旭东. 全民健身 凝聚向上向善的力量[N]. 中国体育报, 2020-05-28.
[2] 周秋菊, 王保渊, 何伟. 近年来体育运动对慢病影响的国内研究进展[J]. 四川体育科学, 2020, 39(3): 40-43.
[3] 王嘉瑛, 李令岭, 马梁, 等. 跑步爱好者运动损伤的调查与分析[J]. 昆明医科大学学报, 2020, 41(1): 151-157.
[4] 苗子蕊, 吉丽娜. 健身计步器研究综述[J]. 电脑知识与技术, 2018, 14(11): 263-264, 266.
[5] 杨润泽. 一种节能的智能手机计步算法的研究与应用[D]. 呼和浩特: 內蒙古大学, 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] 丁忠成. 基于智能手机传感器的人体行为识别技术研究[D]. 长沙: 湖南大学, 2018.
[8] 许舰. Android自定义绘图组件的设计与实现[J]. 电脑知识与技术, 2018, 14(10): 95-98.
[9] 杨亮, 袁嵩, 蒋鹏, 等. 基于Android平台的数据存储机制应用研究[J]. 电脑知识与技术, 2014, 10(11): 2481-2484.
【通联编辑:谢媛媛】