Aby uzyskać pozycję od przyspieszenia, należy ją zintegrować dwukrotnie.
Łączące przyspieszenie daje prędkość, a całkowanie prędkości daje pozycję.
Należy pamiętać, że integracja hałasu tworzy dryf i zintegrowanie dryfu tworzy DUŻO dryfu, czujniki androidowe generują dość dużo hałasu.
Na moim Galaxy S3 udało mi się uzyskać dryft w pozycji do 0,02 mw 5 sekund za pomocą wygodnego czujnika liniowego przyspieszeniomierza Google.
Nie jestem pewien, czy można użyć czujnika liniowego przyspieszenia na pierniku. Jeśli nie możesz, musisz usunąć grawitację przed integracją.
Jeśli nie masz już przeczytać wszystko tutaj http://developer.android.com/guide/topics/sensors/sensors_motion.html
Wielki Dyskusja na temat czujników ruchu w android
http://www.youtube.com/watch?v=C7JQ7Rpwn2k
Kod:
static final float NS2S = 1.0f/1000000000.0f;
float[] last_values = null;
float[] velocity = null;
float[] position = null;
long last_timestamp = 0;
@Override
public void onSensorChanged(SensorEvent event) {
if(last_values != null){
float dt = (event.timestamp - last_timestamp) * NS2S;
for(int index = 0; index < 3;++index){
velocity[index] += (event.values[index] + last_values[index])/2 * dt;
position[index] += velocity[index] * dt;
}
}
else{
last_values = new float[3];
velocity = new float[3];
position = new float[3];
velocity[0] = velocity[1] = velocity[2] = 0f;
position[0] = position[1] = position[2] = 0f;
}
System.arraycopy(event.values, 0, last_values, 0, 3);
last_timestamp = event.timestamp;
}
Teraz masz pozycja w przestrzeni 3d, pamiętaj, że zakłada, że telefon jest nieruchomy, gdy jest ustawiony Próbkowanie rt.
Jeśli nie usuniesz grawitacji, wkrótce będzie bardzo daleko.
To nie powoduje filtrowania danych i generuje dużo dryfowania.
Możliwy duplikat [Używanie przyspieszeniomierza, żyroskopu i kompasu do obliczania ruchu urządzenia w świecie 3D] (http://stackoverflow.com/questions/8264518/using-accelerometer-gyroscope-and-compass-toculcalate-devices- move-in-3d) nadzbiór, który również prosi o stan rotacji. –