我需要在走路时不计算步数。所以我正在使用加速度计。在上面的编码中,我得到了加速计传感器的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));
}
}
请帮帮我。
答案 0 :(得分:16)
你不会在这里找到一个只计算步骤的简单代码(它太复杂了)。但是如果你有兴趣的话,那里有信息:
有很好的图表和步骤分析here (in pdf)。
您可以在此处找到更正式的出版物:http://portal.acm.org/citation.cfm?id=1554235
如果你想创建一个敏感的计步器(建议老人使用),我建议你从这篇论文开始: http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=4575030
答案 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;
}