学习培训Android也是有接近一年的時间了,一直在看大神们共享的专业知识,今日也想共享自身以前的一点科学研究,有关计步器算法的。现阶段在记步行业较为领跑的有乐动力及其细雨计步器,在做算法的主要参数调节的情况下也是一直拿这两个运用做比照。乐动力实至名归领域第一,无论是运用的感受還是精确度全是非常棒,细雨计步器的闪光点是轻量,应用及其页面实际操作都非常简单。以前由于一些要求,必须做一个计步器,因此 就逐渐自身科学研究算法了,各种各样情景(行走拿在手上,放到袋子,慢跑),算法的精确度大约能够 做到95.7%,综合性起來感觉是比细雨略好,可是赢不上乐动力(能够 做到97.7%)在感受和全局观念为王的网络时代,我认为技术性上的差别会愈来愈小,关键的是感受也有针对商品的精准定位,因此 决策将算法与大伙儿共享,第一是期待能够 帮到进家,第二也是期待大伙儿提一些建议,让这一算法能够 获得改善。
计步器apk下载
apk反汇编免费下载
人到行走时大概分成下边几类情景:
1、一切正常行走,手机上拿在手上(边走边看、甩手、不甩手)
2、慢步走,手机上拿在手上(边走边看、甩手、不甩手)
3、慢跑,手机上拿在手上(甩手、不甩手、走的迅速一般不容易看手机吧)
4、手机上放到裤袋里(步行、快步走、一切正常走)
5、手机上放到上衣外套袋子里(步行、快步走、一切正常走)
6、左右室内楼梯(上边五中情景能够 在这个情景中再度可用一遍)
之上,无论出自于哪一种情景(实际上相匹配手机上不一样的运动规律),g-sensor的三轴数据信息全是有规律性能够 找寻的。
每一步都是有特点点,寻找这一特点点,便是鉴别出去一步。
下边强烈推荐一个专用工具,叫gsensor-debug,能够 观查三轴的曲线图,下边是手机上左右晃动的曲线图
它是很规律性曲线图要是检验波峰就可以了,具体的行走曲线图会出现许多杂讯,算法的功效便是滤掉这种杂讯(行走的波型可以用专用工具自己看,能够 储存为文档,用excel开启有数据信息,将数据交换为波型就可以自己看)
检验步伐便是检验波峰,可是要滤掉失效的波峰,关键选用了以下三种对策
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号