如何在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)); } } 

请帮帮我。

Solutions Collecting From Web of "如何在Android中使用加速度计数步骤"

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

  • 这里有很好的图表和步骤分析(pdf) 。

  • 你可以在这里find更正式的出版物: http : //portal.acm.org/citation.cfm?id=1554235

  • 如果你想创build一个敏感的计步器(老人提议),我build议你从这篇文章开始: http : //ieeexplore.ieee.org/xpl/freeabs_all.jsp?number=4575030

您可以使用x,y,z值来估计手机上的重力…

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

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

粗计步器可以很容易地build立,只要计算一个给定的采样周期内指定的g值以上的峰值数量(例如,每分钟步进6秒和10乘以10)

例如,logging以毫秒为单位logging的时间,logging> 2的ag,然后峰值将继续上升….并且回到2以下..可能为0.5或者其他值,然后它会上升再次> 2 …在这一点上停止时钟。

那么你有一个完整的周期时间!

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

对于步进检测,我使用应用于来自加速计的平滑信号的导数。 当导数大于阈值时,我可以build议这是一个步骤。 可能是不是最好的做法,但它对我的作品:)

以下代码已在此应用中使用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; }