计步算法个人总结 |
您所在的位置:网站首页 › 如何计步 › 计步算法个人总结 |
在Android4.4 Kitkat 之后,谷歌新增了 Step Counter Sensor 以及 Step Detector Sensor 用于Android 计步。我在网上看了很多大牛的博客,现在计步都分为两个大方向,一是直接就使用上面自带的这个,二是自己造轮子,接下来我就讲讲,如何自己造轮子,也算是对自己近期学习成果的总结。 分析数据源使用加速度传感器获取到手机加速度的变化,然后通过算法来检测步数。仔细想想平时走路的情景,人体重心的加速度由前向和纵向的两个分量合成, 合成之后的加速度波形就很规律了,我们只需要检测波峰/波谷,再过滤掉其他的干扰,就能估算出步数了(绝对的加速度需要算上重力加速度,本文后面所说的都指相对的,人体行走时产生的加速度)。 算法分析 检测波峰既然目标是检测波峰,那就首先要知道,加速度传感器采样的频率比较高,一般大于30Hz,30Hz是什么概念,正常人走一步的时间内,可以采样大概二十次了,意思是,在一个上升波段中,检查到的加速度会连续增大好多次,同样在下降波段中加速度也会连续减小好多次。于是,从波形图看,检测波峰的方法可以概括为四个条件: - 上一次波形上升状态 - 目前为下降状态 - 到波峰为止,连续上升多次 - 波峰/波谷值在一定范围内 翻译成代码便是下面的 boolean DetectorPeak(float newValue, float oldValue) 方法。 检测步数分析数据源的时候就已提到,检测到波峰之后,需再滤掉干扰波,比如细微的震动等等,才能判定为一步。于是这里便生成了三个条件: - DetectorPeak() return true - 符合一定的时间差 - 大于一个动态生成的阈值 翻译成代码便是下面的 void detectorNewStep(float values) 方法。 源代码我就直接上了,也可以在我的 GitHub 获取最新的版本。 /** * 自定义的加速度传感器监听 * 在此处理加速度事件 * 使用方法: * - 外部通过 setOnSensorChangeListener 方法传入回调对象 * - 外部通过复写接口 OnSensorChangeListener 的 onChange() 方法获取步数 * Created by XinZh on 2017/3/1. */ @RequiresApi(api = Build.VERSION_CODES.CUPCAKE) public class MyStepDcretor implements SensorEventListener { private final String TAG = "StepDcretor"; //加速度,用x、y、z轴的三个加速度分量计算出 public static float acceleration = 0; //当前传感器的值 //float gravityNew = 0; //上次的加速度 float lastAcceleration = 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; //初始阈(yu)值 final float initialThreshold = (float |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |