如何使用android中的加速度计计算精确的步数?

use*_*585 42 algorithm android accelerometer

我正在使用算法开发一些应用程序,如Runtastic计步器,但我没有得到结果之间的任何相似性.

我的代码如下:

public void onSensorChanged(SensorEvent event) 
{
        Sensor sensor = event.sensor; 
        synchronized (this)
 {
            if (sensor.getType() == Sensor.TYPE_ORIENTATION) {}
            else {
            int j = (sensor.getType() == Sensor.TYPE_ACCELEROMETER) ? 1 : 0;
                if (j == 1) {
                    float vSum = 0;
                    for (int i=0 ; i<3 ; i++) {
                        final float v = mYOffset + event.values[i] * mScale[j];
                        vSum += v;

                    }
                    int k = 0;
                    float v = vSum / 3;
                    //Log.e("data", "data"+v);

                    float direction = (v > mLastValues[k] ? 1 : (v < mLastValues[k] ? -1 : 0));
                    if (direction == - mLastDirections[k]) {
                        // Direction changed
                        int extType = (direction > 0 ? 0 : 1); // minumum or maximum?
                        mLastExtremes[extType][k] = mLastValues[k];
                        float diff = Math.abs(mLastExtremes[extType][k] - mLastExtremes[1 - extType][k]);

                        if (diff > mLimit) {

                            boolean isAlmostAsLargeAsPrevious = diff > (mLastDiff[k]*2/3);
                            boolean isPreviousLargeEnough = mLastDiff[k] > (diff/3);
                            boolean isNotContra = (mLastMatch != 1 - extType);

                            if (isAlmostAsLargeAsPrevious && isPreviousLargeEnough && isNotContra) {

                                for (StepListener stepListener : mStepListeners) {
                                    stepListener.onStep();
                                }
                                mLastMatch = extType;
                            }
                            else {
                                Log.i(TAG, "no step");
                                mLastMatch = -1;
                            }
                        }
                        mLastDiff[k] = diff;
                    }
                    mLastDirections[k] = direction;
                    mLastValues[k] = v;
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

用于注册传感器:

mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mSensor = mSensorManager.getDefaultSensor(
                Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(mStepDetector,mSensor,SensorManager.SENSOR_DELAY_NORMAL);
Run Code Online (Sandbox Code Playgroud)

在算法中,我有不同的敏感度作为公共空白

setSensitivity(float sensitivity) {
        mLimit = sensitivity; // 1.97  2.96  4.44  6.66  10.00  15.00  22.50  33.75  50.62
    }
Run Code Online (Sandbox Code Playgroud)

在各种敏感度级别上,我的结果是:

sensitivity   rantastic pedometer  my app
10.00           3870                 5500
11.00           3000                 4000
11.15           3765                 4576
13.00           2000                 890
11.30           754                  986
Run Code Online (Sandbox Code Playgroud)

我没有得到任何符合要求的正确模式.根据我的分析,这个应用程序Sensor.TYPE_MAGNETIC_FIELD用于步骤计算,请让我知道一些算法,以便我可以满足要求.

Ras*_*sob 19

您需要做的第一件事是决定算法.据我所知,大致上有三种方法可以使用文献中描述的加速度计来检测步骤:

  1. 使用毕达哥拉斯定理来计算加速度计中每个样本的加速度矢量的大小.低通滤波幅度信号以消除高频噪声,然后在滤波后的信号中寻找峰值和谷值.您可能需要添加其他要求以消除误报.这是迄今为止检测步骤的最简单方法,也是大多数(如果不是所有)普通计步器的方式,您可以从体育用品商店购买.

  2. 像(1)中那样使用Pythagoras,然后通过FFT运行信号,并将FFT的输出与已知的步行输出进行比较.这要求您可以访问相当大量的培训数据.

  3. 将加速度计数据馈送到使用一些合适的机器学习技术的算法中,例如神经网络或数字小波变换.当然,您可以在此方法中包含其他传感器.这还要求您可以访问相当大量的培训数据.

一旦你决定使用算法,你可能会想要使用像Matlab或SciPy这样的东西来测试你的计算机上的算法,使用你在Android手机上制作的录音.将加速度计数据转储到手机上的cvs文件,记录文件所代表的步数,将文件复制到计算机并对数据运行算法以查看它是否正确计数.这样您就可以检测算法的问题并进行纠正.

如果这听起来很难,那么获得良好步进检测的最佳方法可能是等到更多手机配备KitKat启用的内置步进计数器.


小智 18

https://github.com/bagilevi/android-pedometer

我希望这可能会有所帮助

  • 解释一些内容会有所帮助,因为链接可能会在将来的某个时候被破坏。 (3认同)

Mic*_*ski 5

我在走路仪器中使用步进检测. 我得到了很好的步检测结果. 我用achartengine绘制加速度计数据.看看这里.我所做的:

  1. 加速度传感器幅值矢量分析.
  2. 设置可更改的阈值级别.当来自加速度计的信号高于它时,我将其视为一个步骤.
  3. 首次越过阈值后设置非活动状态的时间(用于步骤检测).

第3点计算:

  • 任意设定我们行走最大速度(例如120bpm)
  • 如果60bpm - 每步1000msec,那么120bpm -每步500msec
  • 加速计传递具有特定所需频率的数据(SENSOR_DELAY_NORMAL,SENSOR_DELAY_GAME等).当DELAY_GAME:T~ = 20ms时(这包含在Android文档中)
  • n - 省略的样本(通过阈值后)
  • n = 500毫秒/吨
  • n = 500/20 = 25(很多.你可以调整这个值).
  • 之后,阈值变为活动状态.

看看这张图: 我的应用程序

  • 您提供的链接已损坏。你能检查一下吗 (2认同)

Jef*_*die 2

我发现您的实现与 grepcode 项目中的代码之间的一个主要区别是注册侦听器的方式。

你的代码:

mSensorManager.registerListener(mStepDetector,
                                mSensor,
                                SensorManager.SENSOR_DELAY_NORMAL);
Run Code Online (Sandbox Code Playgroud)

他们的代码:

mSensorManager.registerListener(mStepDetector,
                                mSensor,
                                SensorManager.SENSOR_DELAY_FASTEST);
Run Code Online (Sandbox Code Playgroud)

这是一个很大的区别。SENSOR_DELAY_NORMAL用于方向改变,因此不是那么快(有没有注意到旋转设备和设备实际旋转之间需要一些时间?那是因为这是一些不需要超快的功能(这可能会甚至非常烦人)。您获得更新的速度并不是那么高)。

另一方面,SENSOR_DELAY_FASTEST适用于计步器之类的东西:您希望传感器数据尽可能快且尽可能频繁,因此您的步数计算将尽可能准确。

尝试切换到SENSOR_DELAY_FASTEST速率,然后再次测试!这应该会产生很大的影响。