2010-07-31 4 views
14

Kann jemand helfen, den g-Faktor aus den Beschleunigungsmessermesswerten zu entfernen. Ich verwende SensorEventListener mit der Methode onSensorChanged() zum Abrufen von Sensor.TYPE_ACCELEROMETER-Daten. Ich brauche nur reine Beschleunigungswerte in alle Richtungen. Wenn also das Gerät stabil ist (oder in konstanter Geschwindigkeit), sollte es (0,0,0,0,0,0) ungefähr geben. Gegenwärtig gibt es abhängig von der Steigung und der Rolle eine variable Ausgabe, die von den auf jede Achse wirkenden g-Kräften abhängt.So entfernen Sie den Schwerkraftfaktor aus den Beschleunigungsmessermesswerten in Android 3-Achsen-Beschleunigungsmesser

Ich hoffe, es gibt einige Formel, um dies zu entfernen, wie ich auch Orientierungswerte (Pitch und Roll) von Sensor.TYPE_ORIENTATION Listener erhalten. Ich hatte einige benutzt, aber nicht gearbeitet.

Irgendwelche Hilfe bitte?

Antwort

4

Differenzieren in Bezug auf die Zeit befreit eine Funktion der Zeit Sie von den Konstanten.

Also, indem Sie die Ableitung des Beschleunigungsmessersignals nehmen, erhalten Sie den "Ruck", den Sie dann neu integrieren können, um den nicht konstanten Teil der Beschleunigung zu bekommen, die Sie suchen.

In Laymans Worten, nehmen Sie eine Probe aus dem Beschleunigungsmesser alle 1 Sekunde, und subtrahieren Sie es von der vorherigen Probe. Wenn die Antwort (nahe bei) Null ist, beschleunigst du nicht relativ zur Erde. Wenn das Ergebnis nicht Null ist, integriere es (in diesem Fall multipliziert mit einer Sekunde), hast du deine Beschleunigung.

Zwei Dinge jedoch: - Achten Sie auf Rauschen im Signal, runden Sie Ihre Eingabe ab. - Erwarten Sie keine extrem genauen Ergebnisse von Beschleunigungssensoren auf dem Chip. Sie können sie verwenden, um Erschütterungen, Änderungen in der Orientierung zu erkennen, aber nicht wirklich, um zu wissen, wie viele G's Sie bei scharfen Kurven in Ihrem Auto haben.

3

Eine Möglichkeit (nur für Geräte mit Beschleunigungsmesser) besteht darin, den Gravitationsvektor von den Beschleunigungsmesserdaten zu entfernen, indem die Werte subtrahiert werden, die bei gleicher Ausrichtung im statischen Fall auftreten würden. Aber da die Orientierung erneut berechnet wird, indem Beschleunigungswerte genommen werden und nicht unabhängig, ist es nicht sehr genau.

Gyroskop kann in diesem Fall helfen. Aber wenige Androiden haben immer noch ein echtes Gyroskop. Und die Verwendung der Rohwerte ist nicht so einfach.

9

Sie können einen Tiefpassfilter verwenden.

Tun Sie dies für jeden Ihrer Sensorwerte:

g = 0.9 * g + 0.1 * v 

Wo v Ihr aktueller Sensorwert und g ist eine globale Variable anfänglich auf Null gesetzt. Beachten Sie, dass Sie so viele g-Variablen benötigen wie Achsen.

Mit v = v - g können Sie den Schwerkraftfaktor von Ihrem Sensorwert eliminieren.

+0

Beachten Sie, dass dies wie folgt umgeschrieben werden kann: 'g = (1-a) * g + a * v ', wobei' a 'eine Variable zwischen 0 und 1 ist, die den Cutoff des Filters steuert. –

+3

Ich verstehe das nicht. Wie funktioniert das Hinzufügen eines Tiefpassfilters * zum Entfernen * einer konstanten Verzerrung? Möchtest du keinen Hochpass? – matth

+1

Diese Berechnung funktioniert nicht, da angenommen wird, dass sich die Ausrichtung des Geräts im Laufe der Zeit nicht ändert, was äußerst selten ist. – fishinear

3

Einfach g (~ 9,8m/s^2) mal die z-Richtung der Rotationsmatrix subtrahieren. Oder deutlicher darüber, lassen

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

Dann, was Sie wollen, ist

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

Das ist richtig, aber die Berechnung der Rotationsmatrix ist etwas schwierig für eine neue Ecke. Suchen Sie nach Richtung Cosinus Matrix, wenn Sie weitere Informationen wünschen. – xryl669

+1

Ziehst du es nur vom Z ab? Was ist mit X und Y? – rclai

+1

@rclai Solange es mit der Z-Richtung nach unten zeigt, sollte es nur von Z subtrahiert werden. Sobald das Gerät kippt, sind die Daten ausgeschaltet, die Sinusschwere zieht nicht nur für Z. –

7

Verwenden Sensor.TYPE_LINEAR_ACCELERATION statt Sensor.TYPE_ACCELEROMETER

+1

Die einzige richtige Antwort, und die einfachste auch ... – fishinear

+3

Hinweis, nicht alle Geräte haben Sensor.TYPE_LINEAR_ACCELERATION – Lytic

+1

Smartwatches haben TYPE_LINEAR_ACCELERATION im Allgemeinen nicht –

Verwandte Themen