计步器原理
一、 主要思路
计步器通过统计步数、距离、速度、时间等数据,测算卡路里或热量消耗,用以掌控运动量,防止运动量不足,或运动过量的一种工具。按功能分又可以分为单功能计步器, 计步器手表, 脂肪测量计步器等等。
本文是以3轴加速度传感器采集数据->滤波->二次波峰监测,波峰数就是步数。另外得有一些防抖动方法:连续监测到3(或其它)个波峰才开始算。
2、设计步骤
一般来说计步器不外乎就是清除(RESET),模式(MODE),设置(SET)三种按键,各个厂家的叫法不一样但万变不离其宗。有的厂家的计步器就加入了背光按键,还有MP3按键等附加功能;但基础按键不外乎这三种。
通常模式键(MODE)是用来切换查看数据,设置键(SET)顾名思义就是调整设置数据。计步器设置数据时,可调整的数据会闪烁,这时候调整数据的方式根据厂家的按键设置叫法不同,设置的操作也不一样。比如国际品牌isport计步器就是按清除键(RESET)调整数据;如果数据不闪的时候长按清除键(RESET)就是清零数据。
∙ 首先,拔除电池绝缘片开机。
∙ ∙ 其次,设置个人信息包括体重和步距。(提示:步距是迈一步,
∙ ∙ 再者,圆形带背扣的2D计步器需垂直地面佩带;方形款3D计步器对佩带方式无要求。
∙ ∙ 最后,正式使用前清零数据。(使用者在正式使用计步器前应对计步界面上的计步数清零,
然而该计步器的原理是3轴加速度传感器采集数据->滤波->二次波峰监测:
代码如下:
1. public void onSensorChanged(SensorEventevent) {
2. // Log.i(Constant.STEP_SERVER, "StepDetector");
3. Sensor sensor = event.sensor;
4. // Log.i(Constant.STEP_DETECTOR,"onSensorChanged");
5. synchronized (this) {
6. if (sensor.getType() ==Sensor.TYPE_ORIENTATION) {
7. } else {
8. int j =(sensor.getType() == Sensor.TYPE_ACCELEROMETER) ? 1 : 0;
9. if (j == 1) {
10. float vSum =0;
11. for (int i =0; i < 3; i++) {
12. finalfloat v = mYOffset + event.values[i] * mScale[j];
13. vSum+= v;
14. }
15. int k = 0;
16. float v =vSum / 3;
17.
18. floatdirection = (v > mLastValues[k] ? 1: (v < mLastValues[k] ? -1 : 0));
19. if (direction== -mLastDirections[k]) {
20. //Direction changed
21. intextType = (direction > 0 ? 0 : 1); // minumum or
22. //maximum?
23. mLastExtremes[extType][k]= mLastValues[k];
24. floatdiff = Math.abs(mLastExtremes[extType][k]- mLastExtremes[1 - extType][k]);
25.
26. if(diff > SENSITIVITY) {
27. booleanisAlmostAsLargeAsPrevious = diff > (mLastDiff[k] * 2 / 3);
28. booleanisPreviousLargeEnough = mLastDiff[k] > (diff / 3);
29. booleanisNotContra = (mLastMatch != 1 - extType);
30.
31. if(isAlmostAsLargeAsPrevious && isPreviousLargeEnough &&isNotContra) {
32. end= System.currentTimeMillis();
33. if(end - start > 500) {// 此时判断为走了一步
34. Log.i("StepDetector","CURRENT_SETP:"
35. +CURRENT_SETP);
36. CURRENT_SETP++;
37. mLastMatch= extType;
38. start= end;
39. }
40. }else {
41. mLastMatch= -1;
42. }
43. }
44. mLastDiff[k]= diff;
45. }
46. mLastDirections[k]= direction;
47. mLastValues[k]= v;
48. }
49. }
50. }
三、代码解释
这个函数是一个传感器的回调函数,在其中可以根据从系统地加速度传感器获取的数值进行胳膊甩动动作的判断。主要从以下几个方面判断:
(1)人如果走起来了,一般会连续多走几步。因此,如果没有连续4-5个波动,那么就极大可能是干扰。
(2)人走动的波动,比坐车产生的波动要大,因此可以看波峰波谷的高度,只检测高于某个高度的波峰波谷。
(3)人的反射神经决定了人快速动的极限,怎么都不可能两步之间小于0.2秒,因此间隔小于0.2秒的波峰波谷直接跳过
4、总结
计步器最早是由意大利的伦纳德·达芬奇酝酿的,但现存的最早的计步器是在达芬奇之后150年,即1667年制作的。
日本最早的计步器是由Gcn.naiHiraga在1755年制作的。在中世纪和近代,计步器并未被广泛使用,因为人们并不清楚它的用途。这说明机器的发明(硬件)不及找到它对人类的用途(软件)重要。
在日本,计步器已经使用了40多年,主要用于体育运动和分析记录行走步调。1965年,计步器正式进入日本商用市场,并被命名为manpo-meter(manpo的日语含义是10000步)。这是的计步器通常利用摆钟原理作为记步技术,利用加重的机械开关检测步伐,并带有一个简单的计数器。如果晃动这些装置,就可以听到有一个金属球来回滑动,或者一个摆钟左右摆动敲响当块。
这种机械式的计步器早已淡出历史,取而代之的是电子式的计步器。
计步器的原理是通过重力加速计感应,重力变化的方向,大小。与正常走路或跑步时的重力变化比对,达到一定相似度时认为是在走路或跑步。实现起来很简单,只要手机有重力感应器就能实现。
本文来源:https://www.2haoxitong.net/k/doc/d32dad49e418964bcf84b9d528ea81c758f52e85.html
文档为doc格式