Подтвердить что ты не робот

Как считать шаг с помощью акселерометра в 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));
}

 }

пожалуйста, помогите мне.

4b9b3361

Ответ 1

Вы не найдете здесь простой код, чтобы просто подсчитать шаги (это слишком сложно). Но там информация, если вам интересно:

Ответ 2

Вы можете оценить силу силы тяжести на телефоне, используя значения x, y, z...

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

... здесь значение 1 = нормальное (1g является нормальным)

Грубый шагомер можно построить достаточно легко, просто подсчитав, сколько пиков превышает заданное значение g за определенный период выборки (например, 6 секунд и несколько на 10 для шагов в минуту)

Скажем, например, запишите время в секундах, в котором записано ag of > 2... тогда пик продолжит расти.... и вернется вниз ниже 2.. возможно, до 0,5 или что-то... тогда это ' ll go up again > 2... в этот момент остановите часы.

... тогда у вас есть полный цикл приурочен!

Чтобы стабилизировать результат, лучше посчитать несколько циклов.

Ответ 3

Для определения шага я использую производную, применяемую к сглаженному сигналу с акселерометра. Когда производная больше порогового значения, я могу предположить, что это был шаг. Может быть, это не лучшая практика, но она работает для меня:)

В этом приложении был использован следующий код 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;
    }