2011-05-25 65 views
25

我需要在步行時計數步數。以便我使用加速度計。在上面的編碼中,我得到了加速計傳感器的x,y,z值。這是我迄今爲止所做的。我的問題是由x,y,z如何計算步行時的步數? 我從鏈接如何在android中使用加速度計步數

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

使用下面的代碼有啥這裏的問題是什麼?什麼不工作? – corroded 2011-05-26 04:20:44

+0

我不知道如何計算加速度計的x,y,z值的步數。那是我的問題。 – 2011-05-26 04:23:31

+0

@腐蝕:請幫助我。 – 2011-05-26 04:39:20

回答

16

你不會在這裏找到一個簡單的代碼來計算步驟(它太複雜了)。但是如果你有興趣,那裏有信息:

+1

查看本教程http://www.gadgetsaint.com/android/create-pedometer-step -counter-android /#。WNwdmxJ97fY – ASP 2017-03-29 20:52:09

8

您可以用X,Y,Z值估計在手機上的重力...

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

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

一個簡單的計步器可以很容易地建立,只需計算一個指定的g值超過給定的採樣週期(例如6秒並且以每分鐘步進數乘以10)

例如記錄以秒爲單位記錄ag> 2的時間...然後峯值將繼續上升....並且回到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; 
    } 
+0

你能分享'smooth(...)'發生了什麼嗎? – Tgsmith61591 2017-04-24 14:57:13