Wie kalibriere ich Android Accelerometer & Reduzieren Lärm, Eliminieren Gravity

Also, ich habe seit einiger Zeit mit diesem Problem gekämpft und habe kein Glück gehabt, die Weisheit der Internets und verwandten SO-Beiträge zu diesem Thema zu klopfen.

Ich schreibe eine Android-App, die den allgegenwärtigen Beschleunigungsmesser verwendet, aber ich scheine, eine unglaubliche Menge an "Lärm" zu bekommen, auch wenn ich in Ruhe bin und kann nicht herausfinden, wie man damit umgeht, wie meine Lesungen relativ sein müssen genau. Ich dachte, dass vielleicht mein Handy (HTC Incredible) dysfunktional war, aber der Sensor scheint gut mit anderen Spielen und Apps zu arbeiten, die ich gespielt habe.

Ich habe versucht, verschiedene "Filter" zu benutzen, aber ich kann nicht scheinen, meinen Verstand um sie zu wickeln. Ich verstehe, dass die Schwerkraft in irgendeiner Weise behandelt werden muss, und vielleicht ist das, wo ich falsch gehe. Derzeit habe ich das versucht, von einer SO-Antwort angepasst, die sich auf ein Beispiel aus dem iPhone SDK bezieht:

accel[0] = event.values[0] * kFilteringFactor + accel[0] * (1.0f - kFilteringFactor); accel[1] = event.values[1] * kFilteringFactor + accel[1] * (1.0f - kFilteringFactor); double x = event.values[0] - accel[0]; double y = event.values[1] - accel[1]; 

Das Plakat sagt, dass man mit dem kFilteringFactor-Wert (kFilteringFactor = 0.1f im Beispiel) bis zum " Leider scheine ich immer noch viel Lärm zu bekommen, und das alles scheint zu tun ist, dass die Lesungen als winzige Dezimalstellen kommen, was mir nicht so viel hilft, und es scheint, den Sensor nur weniger empfindlich zu machen. Die mathematischen Zentren meines Gehirns sind auch von Jahren der Vernachlässigung verkümmert, also verstehe ich nicht ganz, wie dieser Filter funktioniert.

Kann mir jemand ausführlich erklären, wie man über eine nützliche Lesung aus dem Beschleunigungsmesser geht? Ein prägnantes Tutorial wäre eine unglaubliche Hilfe, da ich kein wirklich gutes gefunden habe (zumindest auf mein Niveau des Wissens gerichtet). Ich werde frustriert, weil ich mich fühle, wie das alles für mich deutlicher sein sollte. Jede Hilfe oder Richtung würde sehr geschätzt werden, und natürlich kann ich mehr Proben aus meinem Code, wenn nötig.

Ich hoffe, ich bitte nicht, Löffel zu viel zu fressen; Ich würde nicht fragen, wenn ich nicht versucht habe, es für eine Weile zu finden. Es sieht auch so aus, als ob es ein anderes Interesse von anderen SO-Mitgliedern gibt.

3 Solutions collect form web for “Wie kalibriere ich Android Accelerometer & Reduzieren Lärm, Eliminieren Gravity”

Um einen korrekten Messwert vom Beschleunigungsmesser zu erhalten, müssen Sie die Gleichungsgeschwindigkeit = SQRT (x * x + y * y + z * z) verwenden. Mit diesem, wenn das Telefon in Ruhe ist die Geschwindigkeit wird die der Schwerkraft – 9,8m / s. Also, wenn Sie das (SensorManager.GRAVITY_EARTH) subtrahieren, dann, wenn das Telefon in Ruhe ist, haben Sie eine Lesung von 0 m / s. Wie für Lärm, Blrfl könnte direkt über billige Beschleunigungssensoren, auch wenn mein Telefon in Ruhe ist, flackert es kontinuierlich ein paar Bruchteile von einem Meter pro Sekunde. Du könntest einfach eine kleine Schwelle zB 0,4m / s setzen und wenn die Geschwindigkeit nicht darüber geht, dann ist es in Ruhe.

Teilweise Antwort:

Genauigkeit. Wenn Sie nach hoher Genauigkeit suchen, werden die preiswerten Beschleunigungssensoren, die Sie in Handsets finden, den Senf nicht schneiden. Zum Vergleich, ein Drei-Achsen-Sensor geeignet für industrielle oder wissenschaftliche Nutzung läuft nördlich von $ 1.500 für nur den Sensor; Das Hinzufügen der Hardware, um es zu versorgen und seine Lesungen in etwas zu verwandeln, das ein Computer doppelt den Preis verwenden kann. Der Sensor in einem Mobilteil läuft deutlich unter $ 5 in Menge.

Lärm. Günstige Sensoren sind ungenau und Ungenauigkeit bedeutet Lärm. Ein ungenauer Sensor, der sich nicht bewegt, wird nicht immer Nullen zeigen, er zeigt Werte auf beiden Seiten in einem gewissen Bereich. Über das Beste, was Sie tun können, ist, den Sensor zu charakterisieren, während bewegungslos, um eine Idee zu bekommen, wie laut es ist und verwenden Sie diese, um Ihre Messungen auf eine weniger genaue Skala basierend auf erwarteten Fehler zu runden. (Mit anderen Worten, wenn es innerhalb von ± x m / s ^ 2 von Null ist, ist es sicher zu sagen, dass der Sensor sich nicht bewegt, aber man kann nicht genau sicher sein, weil es sich sehr langsam bewegen könnte.) Du musst es tun Dies auf jedem Gerät, weil sie nicht alle den gleichen Beschleunigungsmesser verwenden und sie alle verhalten sich anders. Ich denke, das ist ein Vorteil, das das iPhone hat: die Hardware ist ziemlich homogen.

Schwerkraft. Es gibt einige Diskussionen in der SensorEvent Dokumentation über Factoring Gravity aus dem, was der Beschleunigungsmesser sagt. Sie werden feststellen, dass es eine Menge Ähnlichkeit mit dem Code, den Sie gepostet haben, außer dass es klarer ist, was es tut. 🙂

HTH.

Wie gehst du mit Jitteriness um? Du gibst die Daten. Anstatt die Reihenfolge der Werte aus dem Sensor als Ihre Werte zu betrachten, beurteilen Sie sie auf einer laufenden Basis, und die neue Sequenz wird zu den Werten, die Sie verwenden. Dies verschiebt jeden Jittery-Wert näher an den gleitenden Durchschnitt. Die Mittelung wird zwangsläufig von schnellen Variationen in den angrenzenden Werten befreit und weshalb die Menschen die Terminologie verwenden. Niedrige (Frequenz-) Passfilterung, da Daten, die ursprünglich viel pro Probe (oder Zeiteinheit) variiert haben, sich jetzt langsamer ändern können.

ZB, anstatt Werte zu verwenden 10 6 7 11 7 10, können Sie diese in vielerlei Hinsicht beurteilen. Zum Beispiel können wir den nächsten Wert aus dem gleichen Gewicht des laufenden Durchschnitts (dh des letzten verarbeiteten Datenpunktes) mit dem nächsten Rohdatenpunkt berechnen. Mit einem 50-50 Mix für die oben genannten Zahlen, würden wir 10, 8, 7.5, 9.25, 8.125, 9.0675 erhalten. Diese neue Sequenz, unsere verarbeiteten Daten, würde anstelle der verrauschten Daten verwendet werden. Und wir könnten eine andere Mischung als 50-50 natürlich verwenden.

Als Analogie stellen Sie sich vor, dass Sie berichten, wo sich eine bestimmte Person mit nur Ihrem Sehvermögen befindet. Sie haben einen guten Blick auf die breitere Landschaft, aber die Person ist in einem Nebel verschlungen. Sie werden sehen, Stücke des Körpers, die Ihre Aufmerksamkeit zu fangen .. eine bewegte linke Hand, einen rechten Fuß, glänzen Brillen, etc, die sind nervös, aber jeder Wert ist ziemlich nah an der wahren Mitte der Masse. Wenn wir irgendeine Art von laufendem Mittelwert durchführen, würden wir Werte erhalten, die sich dem Mittelpunkt der Masse dieses Ziels nähern, während es sich durch den Nebel bewegt und in Wirklichkeit genauer sind als die Werte, die wir (der Sensor) berichtet haben, was durch die Nebel.

Jetzt scheint es, als ob wir potenziell interessante Daten verlieren, um eine langweilige Kurve zu bekommen. Es macht aber Sinn. Wenn wir versuchen, ein genaues Bild von der Person im Nebel neu zu erstellen, ist die erste Aufgabe, eine gute glatte Annäherung des Mittelpunkts der Masse zu erhalten. Dazu können wir dann Daten aus einem komplementären Sensor / Messprozess hinzufügen. Zum Beispiel könnte eine andere Person in der Nähe dieses Ziels sein. Diese Person könnte eine sehr genaue Beschreibung der Körperbewegungen liefern, könnte aber in der Dicke des Nebels sein und nicht wissen, wo das Ziel am Ende ist. Dies ist die komplementäre Position zu dem, was wir zuerst bekommen haben – die zweiten Daten geben Detail genau ohne ein Gefühl der ungefähre Lage. Die beiden Datenstücke würden zusammengenäht Wir haben den ersten Satz (wie dein Problem hier vorgestellt), um einen allgemeinen Standort ungerade zu bekommen. Wir würden den zweiten Satz von Daten übergeben, um das Detail ohne unerwünschte irreführende Beiträge zur allgemeinen Position zu erhalten. Wir verwenden qualitativ hochwertige globale Daten und qualitativ hochwertige lokale Daten, wobei jeder Satz in komplementärer Weise optimiert und von der Korruption des anderen Satzes (durch die 2 Filterungen) gehalten wird.

Speziell mischen wir uns in Gyroskop-Daten – Daten, die in den örtlichen Details der "Bäume" genau sind, aber im Wald verloren gehen (Drifts) – in die hier besprochenen Daten (vom Beschleunigungsmesser), die den Wald gut sehen Nicht die Bäume.

Zusammenfassend lässt sich sagen, dass wir die Daten von Sensoren, die nervös sind, aber in der Nähe des "Massenzentrums" bleiben. Wir kombinieren diese Basis glatten Wert mit Daten, die genau im Detail ist, aber driftet, so dass dieser zweite Satz hochpaßgefiltert ist. Wir bekommen das Beste aus beiden Welten, wie wir jede Gruppe von Daten verarbeiten, um es von falschen Aspekten zu reinigen. Für den Beschleunigungssensor gleiten wir die Daten effektiv, indem wir einige Variationen eines laufenden Durchschnitts auf seine gemessenen Werte laufen lassen. Wenn wir die Gyroskop-Daten behandeln würden, würden wir Mathe machen, die das Detail effektiv hält (akzeptiert Deltas), während wir den akkumulierten Fehler ablehnen, der letztlich wachsen und die Beschleuniger-glatte Kurve korrumpieren würde. Wie? Im Wesentlichen verwenden wir die tatsächlichen Gyro-Werte (nicht Mittelwerte), aber verwenden Sie eine kleine Anzahl von Proben (von Deltas) ein Stück bei der Ableitung unserer gesamten endgültigen sauberen Werte. Die Verwendung einer kleinen Anzahl von Deltas hält die durchschnittliche Gesamtkurve überwiegend entlang der gleichen Mittelwerte, die durch die Tiefpassstufe verfolgt werden (durch die gemittelten Beschleunigungsmesserdaten), die den Großteil jedes endgültigen Datenpunktes bildet.

Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.