如何在android中使用加速度计计算步数

时间:2011-05-25 14:16:15

标签: android

我需要在走路时不计算步数。所以我正在使用加速度计。在上面的编码中,我得到了加速计传感器的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));
}

 }

请帮帮我。

3 个答案:

答案 0 :(得分:16)

你不会在这里找到一个只计算步骤的简单代码(它太复杂了)。但是如果你有兴趣的话,那里有信息:

答案 1 :(得分:8)

您可以使用x,y,z值估算手机上的重力......

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

...这里的值为1 =正常(1g是正常的)

通过计算给定样本周期内指定g值以上的峰值数量(例如,每分钟步数为6秒和10乘以10),可以非常轻松地构建粗略计步器。

比如说以毫秒为单位记录记录> 2的ag记录的时间...然后峰值将继续上升....然后回到2以下..可能是0.5或者什么..然后它再次上升> 2 ......此时停止时钟。

...然后你有一个完整的循环时间!

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

答案 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;
    }