2010-07-31 10 views
14

Czy ktoś może pomóc w usunięciu współczynnika g z odczytów z akcelerometru. Używam SensorEventListener z metodą onSensorChanged() do pobierania danych Sensor.TYPE_ACCELEROMETER. Potrzebuję tylko czystych wartości przyspieszenia we wszystkich kierunkach. Tak więc w każdym stanie, jeśli urządzenie jest stabilne (lub ze stałą prędkością), powinno ono z grubsza dać (0,0,0,0,0,0). Obecnie, w zależności od jego nachylenia i przechylenia, daje mi zmienną wydajność w zależności od sił g działających na każdą z osi.Jak usunąć współczynnik grawitacji z odczytów przyspieszeniomierza w akcelerometrze 3-osiowym z systemem Android

Mam nadzieję, że istnieje pewna formuła, aby to usunąć, ponieważ otrzymuję również wartości orientacji (wysokość i nachylenie) od detektora Sensor.TYPE_ORIENTATION. Użyłem niektórych, ale nie działałem.

Proszę o pomoc?

Odpowiedz

4

Wyróżnianie w odniesieniu do czasu funkcją czasu pozbywa się stałych.

Dzięki uzyskaniu pochodnej sygnału przyspieszeniomierza otrzymasz "Jerk", który możesz następnie ponownie zintegrować, aby uzyskać niestałą część przyspieszenia, którego szukasz.

W kategoriach Laika należy pobrać próbkę z przyspieszeniomierza co 1 sekundę i odjąć ją od poprzedniej próbki. Jeśli odpowiedź jest bliska zeru, nie przyspieszasz w stosunku do ziemi. Jeśli wynik jest niezerowy, zintegruj go (w tym przypadku pomnóż przez jedną sekundę), masz przyspieszenie.

Dwie rzeczy, chociaż: - Odczytaj szum w sygnale, zaokrąglij swoje wejście. -Nie oczekuj hiper-dokładnych wyników z przyspieszeniomierzy on-chip. Możesz ich używać do wykrywania drgań, zmian orientacji, ale nie do rozpoznania liczby G, których doświadczasz podczas wykonywania ostrych zakrętów w samochodzie.

3

Jednym ze sposobów (w przypadku urządzeń tylko z akcelerometrem) jest usunięcie wektora grawitacyjnego z danych przyspieszeniomierza poprzez odjęcie wartości, które miałyby miejsce w przypadku statycznym dla tej samej orientacji. Ale ponieważ orientacja jest ponownie obliczana przez odczyty przyspieszenia i nie jest niezależna, jest niezbyt dokładna.

W tym przypadku może pomóc żyroskop. Ale kilka androidów wciąż ma prawdziwy żyroskop. I używanie surowych odczytów nie jest takie proste.

9

Można użyć filtra dolnoprzepustowego.

Zrób to dla każdej z wartości czujników:

g = 0.9 * g + 0.1 * v 

Gdzie v jest aktualna wartość czujnika i g jest zmienną globalną początkowo ustawiony na zero. Pamiętaj, że będziesz potrzebował tylu zmiennych g, ile masz osi.

Dzięki v = v - g można wyeliminować współczynnik grawitacji z wartości czujnika.

+0

Należy zauważyć, że można to zapisać jako 'g = (1-a) * g + a * v', gdzie' a' jest zmienną między 0 a 1, która kontroluje odcięcie filtra. –

+3

Nie rozumiem tego. W jaki sposób dodanie filtru dolnoprzepustowego * usuwa * stałe odchylenie? Czy nie chcesz high-pass? – matth

+1

To obliczenie nie działa, ponieważ zakłada, że ​​orientacja urządzenia nie zmienia się w czasie, co jest niezwykle rzadkie. – fishinear

3

Po prostu odejmij g (~ 9,8 m/s^2) razy od kierunku z macierzy obrotu. Albo być bardziej wyraźne o tym, niech

a = your accelerometer reading, 
R = your rotation matrix (as a 9-long vector). 

Wtedy to, co chcesz

(a[0]-g*R[6], a[1]-g*R[7], a[2]-g*R[8]). 
+1

Jest to poprawne, ale obliczenie macierzy obrotu jest nieco trudne dla nowego narożnika. Szukaj Cosine Matrix Direction, jeśli chcesz uzyskać więcej szczegółów. – xryl669

+1

Czy odejmuje się ją tylko od Z? A co z X i Y? – rclai

+1

@ rclai tak długo, jak jest skierowany w dół z kierunkiem Z w dół przez cały czas, wystarczy odjąć od Z powinno wystarczyć. Po przechyleniu urządzenia dane zostaną wyłączone, siła przyciągania sinik nie będzie ciągnęła się tylko za Z. –

7

Zastosowanie Sensor.TYPE_LINEAR_ACCELERATION zamiast Sensor.TYPE_ACCELEROMETER

+1

Jedyna poprawna odpowiedź, a także najłatwiejsza ... – fishinear

+3

Uwaga: nie wszystkie urządzenia mają Sensor.TYPE_LINEAR_ACCELERATION – Lytic

+1

Smartwatches nie mają TYPE_LINEAR_ACCELERATION ogólnie –

Powiązane problemy