手机的计步器软件原理是什么?

时间:2021-01-06 21:57 作者: admin 浏览量:
0
Android_根据G-Sensor的记步算法

一、写在共享以前

  学习培训Android也是有接近一年的時间了,一直在看大神们共享的专业知识,今日也想共享自身以前的一点科学研究,有关计步器算法的。现阶段在记步行业较为领跑的有乐动力及其细雨计步器,在做算法的主要参数调节的情况下也是一直拿这两个运用做比照。乐动力实至名归领域第一,无论是运用的感受還是精确度全是非常棒,细雨计步器的闪光点是轻量,应用及其页面实际操作都非常简单。以前由于一些要求,必须做一个计步器,因此 就逐渐自身科学研究算法了,各种各样情景(行走拿在手上,放到袋子,慢跑),算法的精确度大约能够 做到95.7%,综合性起來感觉是比细雨略好,可是赢不上乐动力(能够 做到97.7%)在感受和全局观念为王的网络时代,我认为技术性上的差别会愈来愈小,关键的是感受也有针对商品的精准定位,因此 决策将算法与大伙儿共享,第一是期待能够 帮到进家,第二也是期待大伙儿提一些建议,让这一算法能够 获得改善。


  计步器apk下载

  apk反汇编免费下载




二、计步器算法的整体构思及其輔助调节的专用工具

  人到行走时大概分成下边几类情景:

  1、一切正常行走,手机上拿在手上(边走边看、甩手、不甩手)

  2、慢步走,手机上拿在手上(边走边看、甩手、不甩手)

  3、慢跑,手机上拿在手上(甩手、不甩手、走的迅速一般不容易看手机吧)

  4、手机上放到裤袋里(步行、快步走、一切正常走)

  5、手机上放到上衣外套袋子里(步行、快步走、一切正常走)

  6、左右室内楼梯(上边五中情景能够 在这个情景中再度可用一遍)

  之上,无论出自于哪一种情景(实际上相匹配手机上不一样的运动规律),g-sensor的三轴数据信息全是有规律性能够 找寻的。

  每一步都是有特点点,寻找这一特点点,便是鉴别出去一步。

  下边强烈推荐一个专用工具,叫gsensor-debug,能够 观查三轴的曲线图,下边是手机上左右晃动的曲线图


  它是很规律性曲线图要是检验波峰就可以了,具体的行走曲线图会出现许多杂讯,算法的功效便是滤掉这种杂讯(行走的波型可以用专用工具自己看,能够 储存为文档,用excel开启有数据信息,将数据交换为波型就可以自己看)


三、算法的详细介绍(贴出关键编码)1、变量的定义//储放三轴数据信息 float[] oriValues = new float[3]; final int valueNum = 4; //用以储放测算阈值的波峰波谷误差 float[] tempValue = new float[valueNum]; int tempCount = 0; //是不是升高的标志位 boolean isDirectionUp = false; //持续增长频次 int continueUpCount = 0; //上一点的持续增长的频次,为了更好地纪录波峰的升高频次 int continueUpFormerCount = 0; //上一点的情况,升高還是降低 boolean lastStatus = false; //波峰值 float peakOfWave = 0; //波谷值 float valleyOfWave = 0; //本次波峰的時间 long timeOfThisPeak = 0; //之前波峰的時间 long timeOfLastPeak = 0; //当今的時间 long timeOfNow = 0; //当今感应器的值 float gravityNew = 0; //之前感应器的值 float gravityOld = 0; //动态性阈值必须动态性的数据信息,这一值用以这种可视化数据的阈值 final float initialValue = (float) 1.3; //原始阈值 float ThreadValue = (float) 2.0; private StepListener mStepListeners;</span>
2. 编码,融合注解看

  检验步伐便是检验波峰,可是要滤掉失效的波峰,关键选用了以下三种对策

  a、要求曲线图持续升高的频次

  b、波峰波谷的误差必须超过阈值

  c、阈值是动态性更改的

  另一个是一些主要参数的初值,例如initialValue 及其ThreadValue 的初值,及其averageValue函数的梯度方向化范畴值

  必须融合各种各样情景的波形图来统计分析,也有几十具体的检测来调节主要参数,这种主要参数大约前后左右调了2个礼拜,实际上整体构思不繁杂。

  下边贴出关键编码及其一些注解:

  (由于一些缘故,全部工程项目我不传了,后边有时间我能将app传上来)

   /*

   * 申请注册了G-Sensor后一只会启用这一涵数

   * 对三轴数据信息开展平方和开根号的解决

   * 启用DetectorNewStep检验步伐

   * */

   @Override

   public void onSensorChanged(SensorEvent event) {

   for (int i = 0; i < 3; i ) {

   oriValues[i] = event.values[i];

   }

   gravityNew = (float) Math.sqrt(oriValues[0] * oriValues[0]

   oriValues[1] * oriValues[1] oriValues[2] * oriValues[2]);

   DetectorNewStep(gravityNew);

   }

   /*

   * 检验步伐,并逐渐记步

   * 1.传到sersor中的数据信息

   * 2.假如检验到波峰,而且合乎时差及其阈值的标准,则判断为1步

   * 3.合乎时差标准,波峰波谷误差超过initialValue,则将该误差列入阈值的测算中

   * */

   public void DetectorNewStep(float values) {

   if (gravityOld == 0) {

   gravityOld = values;

   } else {

   if (DetectorPeak(values, gravityOld)) {

   timeOfLastPeak = timeOfThisPeak;

   timeOfNow = System.currentTimeMillis();

   if (timeOfNow - timeOfLastPeak >= 250

   && (peakOfWave - valleyOfWave >= ThreadValue)) {

   timeOfThisPeak = timeOfNow;

   /*

   * 升级页面的解决,不牵涉到算法

   * 一般在通告升级页面以前,提升下边解决,为了更好地解决失效健身运动:

   * 1.持续纪录10才逐渐记步

   * 2.比如纪录的9步客户停下来超出3秒,则前边的纪录无效,下一次重新开始

   * 3.持续纪录了9步客户仍在健身运动,以前的数据信息才合理

   * */

   mStepListeners.onStep();

   }

   if (timeOfNow - timeOfLastPeak >= 250

   && (peakOfWave - valleyOfWave >= initialValue)) {

   timeOfThisPeak = timeOfNow;

   ThreadValue = Peak_Valley_Thread(peakOfWave - valleyOfWave);

   }

   }

   }

   gravityOld = values;

   }

   /*

   * 检验波峰

   * 下列四个标准分辨为波峰:

   * 1.现阶段点为降低的发展趋势:isDirectionUp为false

   * 2.以前的点为升高的发展趋势:lastStatus为true

   * 3.到波峰已经,持续增长高于或等于2次

   * 4.波峰值超过20

   * 纪录波谷值 * 1.观查波形图,能够 发觉在出現步伐的地区,波谷的下一个便是波峰,有较为显著的特点及其误差 * 2.因此 要纪录每一次的波谷值,为了更好地和下一次的波峰做比照

   * */ public boolean DetectorPeak(float newValue, float oldValue) {

   lastStatus = isDirectionUp;

   if (newValue >= oldValue) { isDirectionUp = true;

   continueUpCount ;

   } else {

   continueUpFormerCount = continueUpCount;

   continueUpCount = 0;

   isDirectionUp = false;

   }

   if (!isDirectionUp && lastStatus

   && (continueUpFormerCount >= 2 || oldValue >= 20)) {

   peakOfWave = oldValue;

   return true;

   } else if (!lastStatus && isDirectionUp) {

   valleyOfWave = oldValue;

   return false;

   } else { return false;

   }

   }

   /*

   * 阈值的测算

   * 1.根据波峰波谷的误差测算阈值

   * 2.纪录4个值,存进tempValue[]数组中

   * 3.在将数组传到涵数averageValue中测算阈值

   * */

   public float Peak_Valley_Thread(float value) {

   float tempThread = ThreadValue;

   if (tempCount < valueNum) {

   tempValue[tempCount] = value;

   tempCount ;

   } else {

   tempThread = averageValue(tempValue, valueNum);

   for (int i = 1; i < valueNum; i++) {
tempValue[i - 1] = tempValue[i];

   }

   tempValue[valueNum - 1] = value;

   }

   return tempThread;

   }

   /*

   * 梯度化阈值

   * 1.计算数组的均值

   * 2.通过均值将阈值梯度化在一个范围里

   * */

   public float averageValue(float value[], int n) {

   float ave = 0;

   for (int i = 0; i < n; i++) {

   ave += value[i];

   }

   ave = ave / valueNum;

   if (ave >= 8)

   ave = (float) 4.3;

   else if (ave >= 7 && ave < 8)

   ave = (float) 3.3;

   else if (ave >= 4 && ave < 7)

   ave = (float) 2.3;

   else if (ave >= 3 && ave < 4)

   ave = (float) 2.0;

   else {

   ave = (float) 1.3;

   }

   return ave;

  }

今日推荐

Copyright (c) 轻松手赚网 版权所有 豫ICP备20013842号-1

豫公网安备 41018402000481号