如何在安卓设备中使用加速度计计步?

27

我需要计算行走的步数,因此我正在使用加速度计。在以上代码中,我获得了加速度传感器的x、y、z值。这是我目前为止所做的。我的问题是,如何通过x、y、z来计算行走的步数? 我从上面的链接获取以下代码:

http://pedometer.googlecode.com/svn/trunk/src/name/bagi/levente/pedometer/Pedometer.java

我的代码:

 import android.app.Activity;
 import android.content.Context;
 import android.os.Bundle;
 import android.widget.TextView;
 import android.widget.Toast;

 public class Accelerometer extends Activity implements AccelerometerListener {

private static Context CONTEXT;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    CONTEXT = this;
}

protected void onResume() {
    super.onResume();
    if (AccelerometerManager.isSupported()) {
        AccelerometerManager.startListening(this);
    }
}

protected void onDestroy() {
    super.onDestroy();
    if (AccelerometerManager.isListening()) {
        AccelerometerManager.stopListening();
    }

}

public static Context getContext() {
    return CONTEXT;
}

/**
 * onShake callback
 */
public void onShake(float force) {
    Toast.makeText(this, "Phone shaked : " + force, 1000).show();
}

/**
 * onAccelerationChanged callback
 */
public void onAccelerationChanged(float x, float y, float z) {
    ((TextView) findViewById(R.id.x)).setText(String.valueOf(x));
    ((TextView) findViewById(R.id.y)).setText(String.valueOf(y));
    ((TextView) findViewById(R.id.z)).setText(String.valueOf(z));
}

 }

请帮帮我。


2
好的,你可能需要先进行一些测试,看看当有人迈步时数据是什么样子,然后你就应该知道如何确定何时迈出一步,并相应地计数。也许有更简单的方法,但这是我最好的猜测... - user457812
1
@nil 这正是我的第一个想法,但是看了一些分析之后,我并不认为问题那么简单... - Aleadam
@KushalShah 你完成了这个任务吗?在所有列出的答案中,哪一个是最佳选项? - Jeegar Patel
1
Android 4.4(KitKat)有一个新的API用于计步。以下是一个快速教程: http://blog.bawa.com/2013/11/create-your-own-simple-pedometer.html - Skylar Ittner
1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。 - Sufian
显示剩余9条评论
3个回答

15

这里没有简单的代码只能用于计步(这个问题实在太复杂了)。但是如果你感兴趣,有一些相关信息:


8

使用x、y、z值可以估计手机上的重力力量...

float g = (x * x + y * y + z * z) / (SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH);

......1的值=正常(1g是正常的)

一个简单的计步器可以很容易地建造出来,只需计算在给定样本时间(例如6秒)内高于特定g值的峰值数量(并乘以10得到每分钟步数)

例如,记录g值>2被记录的ms时间...然后峰值将继续上升...并回到<2..可能到0.5或其他什么东西...然后它再次上升>2...此时停止计时

...然后您就有了完整的周期时间!

为了稳定结果,最好计数几个周期。


4
我使用从加速度计平滑信号中应用导数来进行步骤检测。当导数大于阈值时,我可以推断这是一步。也许这不是最佳实践,但对我有效 :) 在该应用程序https://play.google.com/store/apps/details?id=com.tartakynov.robotnoise中使用了以下代码。
    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER){
            return;
        }
        final float z = smooth(event.values[2]); // scalar kalman filter                               
        if (Math.abs(z - mLastZ) > LEG_THRSHOLD_AMPLITUDE)
        {
            mInactivityCount = 0;
            int currentActivity = (z > mLastZ) ? LEG_MOVEMENT_FORWARD : LEG_MOVEMENT_BACKWARD;                  
            if (currentActivity != mLastActivity){
                mLastActivity = currentActivity;
                notifyListeners(currentActivity);
            }                   
        } else {
            if (mInactivityCount > LEG_THRSHOLD_INACTIVITY) {
                if (mLastActivity != LEG_MOVEMENT_NONE){
                    mLastActivity = LEG_MOVEMENT_NONE;
                    notifyListeners(LEG_MOVEMENT_NONE);                                 
                }
            } else {
                mInactivityCount++;
            }
        }
        mLastZ = z;
    }

你能分享一下 smooth(...) 函数正在发生什么吗? - TayTay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接