2012-06-17 6 views
16

Mam zamiar opracować aplikację Android, która musi odczytać współrzędne x, y, z telefonu na przestrzeni 3D.Przeczytaj współrzędne x y z telefonu z systemem Android za pomocą akcelerometru

chciałbym napisać prosty kod i przetestować na urządzeniu ..

Używam piernik zarówno urządzenia oraz emulatora.

+0

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. –

Odpowiedz

16

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.

+1

Nie tylko hałas z czujników generuje dryf. Głównym ograniczeniem tego podejścia jest to, że zasadniczo niemożliwe jest wykrycie stałej prędkości za pomocą przyspieszeniomierza.Integracja może wydawać się rozsądna, gdy po prostu potrząśniesz telefonem, ale w przypadku innych rodzajów ruchu, na przykład podczas jazdy lub jazdy na rowerze, dryf będzie ogromny. – Junuxx

+0

Masz absolutną rację. Używam przyspieszeniomierza do śledzenia samochodu i do tego zaimplementowałem filtr Kalmana, aby jeszcze bardziej zmniejszyć dryft. Obliczam również dokładność akcelerometru, mierząc hałas, gdy jest nieruchomy, następnie używa się go do ważenia danych w filtrze. Na razie osiągam dość dobre wyniki. – spontus

+0

Tutaj również dostaniesz dużo "dryfu", jak go nazywasz, ponieważ obliczysz to wszystko za pomocą fizyki newtonowskiej, co jest niedokładne. Czy Runge-kutta lub inny dokładniejszy sposób obliczania pozycji, aby uzyskać lepsze wyniki. – Automatico

7

Przeczytaj this tutorial.

krótkie podsumowanie powyższym danym ćwiczeniu ::

najpierw uzyskać instancję SensorManager i Sensor.
Wewnątrz onCreate() ::

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 

po tym, zastępują onSensorChanged(SensorEvent event) i używać event.values[] uzyskać współrzędne.

@Override 
public void onSensorChanged(SensorEvent event) { 
    float x = event.values[0]; 
    float y = event.values[1]; 
    float z = event.values[2]; 
} 
Powiązane problemy