Berechnung der Geschwindigkeit aus Beschleunigung (Accelerometer)

Ich verwende den Beschleunigungsmesser in einem Android-Gerät, um bestimmte Bewegungen zu verfolgen und zu erkennen, wobei ich nur eine Achse verwende, da die Bewegungen entlang dieser Achse linear sind.

Ich verwende einen einfachen Filter, um das Rauschen aus den Beschleunigungsmesserdaten zu entfernen:

ouput = ouput + alpha * (input - output)

Das Ergebnis sieht so aus, wie ich es erwarten würde und scheint für meine Zwecke brauchbar zu sein:

Beschleunigung X-Achse

Ich möchte die Geschwindigkeit aus den Beschleunigungsmesserdaten berechnen, die ich bekomme, aber hier stoße ich auf Probleme, wie hier zu sehen ist:

Berechnete Geschwindigkeit X-Achse

Wie bei der Beschleunigung sieht auch der Geschwindigkeitsverlauf plausibel aus, geht aber nicht nach jeder Wiederholung auf Null zurück und fällt in negative Werte ab.

Im Moment schreibe ich nur die Rohdaten des Beschleunigungsmessers in eine Datei und modifiziere und analysiere sie später mithilfe von Tabellenkalkulationen, sodass diese Berechnungen alle von Hand durchgeführt werden.

  • Es handelt sich um Rohdaten und beinhaltet somit die Wirkung der Schwerkraft, die ich einfach abziehe (ich verwende den Durchschnitt der Werte des kurzen Zeitraums am Anfang, in dem keine Bewegung stattfindet, in diesem Fall waren es 9,55).
  • Ich habe den Zeitstempel jedes Datenpunkts, also kenne ich das Intervall zwischen den Messwerten
  • Ich verwende die einfache Formel V = V0 + A * dt, um die Geschwindigkeit zu berechnen.
    • V0ist anfangs Null, dann wird es auf den vorherigen Wert gesetzt
    • Aist die angepasste Beschleunigung (dh accel - grav)
    • dtist das Intervall, die Differenz zwischen dem aktuellen und dem vorherigen Zeitstempel

Ich dachte, dass das Problem vielleicht darin besteht, dass die Beschleunigung auch nicht auf Null zurückkehrt und stattdessen leicht unter Null bleibt (wie im ersten Bild oben zu sehen ist), was zu viele negative Werte hinzufügt, die sich in der Berechnung ausbreiten. Also habe ich graveine kleinere Nummer eingestellt, und es scheint einen Sweet Spot zu geben. In diesem Beispiel führen große Werte für gravdazu, dass die Geschwindigkeit ins Negative abfällt, kleine Werte kehren den Effekt um, wobei die Geschwindigkeitskurve zu höheren positiven Werten hin ansteigt. Ungefähr grav = 9.3(9,32 in diesem Bild) scheint die Grafik am plausibelsten zu sein. Dieses Intervall ist sehr klein, 9,28 und 9,35 zeigen bereits eine deutliche Tendenz nach oben bzw. unten.

Berechnete Geschwindigkeit X-Achse mit grav=9,32

Was könnte der Grund dafür sein? Woher kommt die ~9,32? Warum ist es nicht die ~9,55, die ich während der anfänglichen bewegungslosen Phase beobachte? Gibt es eine Möglichkeit, die Berechnungen zu ändern, um konsistentere Werte zu erhalten? Beispielsweise sollte zwischen jeder Wiederholung eine kurze Pause liegen V = 0.

Es ist ziemlich schwierig, solche Dinge zu debuggen ... Sie sollten einfach versuchen, herumzuspielen, indem Sie Ihren Beschleunigungsmesser unter einigen einfachen Bedingungen testen, bei denen Sie eine sehr einfache Wellenform erwarten würden. Aus dem Kopf heraus gibt es mehrere Dinge, die möglicherweise Fehlerquellen sind: Vielleicht Ihre Abtastrate ( D T ) ist zu groß und die Fehler setzen sich fort und vergrößern sich. Vielleicht vergessen Sie, einige Variablen in Ihrem Code zurückzusetzen, bevor Sie zukünftige Werte berechnen. Vielleicht gibt es einige Kräfte, die Sie vernachlässigen. Es kann keine Physik sein: Es könnte nur der Code oder ein fehlerhafter Beschleunigungsmesser sein.
Ich bin mir ziemlich sicher, dass es kein Problem mit meinem Code ist, ich nehme wirklich nur den Wert, den mir die Android-API gibt, und schreibe sie in eine Datei. Wahrscheinlich ist nur der Sensor nicht sehr genau. Das ist eigentlich der Zweck davon, herauszufinden, welche verwertbaren Daten ich von einem "billigen" Smartwatch-Beschleunigungsmesser sammeln kann. Ich suche keine genauen Werte, ich interessiere mich mehr für relative Veränderungen. Ich war mir nicht sicher, ob dies das richtige SE ist, aber da es in meinem Code nicht wirklich viel gibt, was dies beeinflussen könnte, dachte ich, dass es nicht gut auf Stackoverflow passt. Danke für den Einblick.

Antworten (2)

Kalibrieren und validieren. Dies sind zwei Wörter, die Sie benötigen, wenn Sie Berechnungen physikalischer Parameter aus Messungen durchführen. Sie müssen wissen, wie das Gerät auf bekannte Beschleunigungen reagiert, um festzustellen, ob die Zahlen, die Sie erhalten, auf der Ebene, auf der Sie sie verwenden möchten, aussagekräftig sind. Am einfachsten wäre es, wenn der Hersteller Ihnen solche Angaben machen würde. Leider werden Geräte dieser Art heutzutage oft ohne jegliche Dokumentation geliefert.

Die Tatsache, dass Sie 9,3 bis 9,5 für die Schwerkraft erhalten, ist bezeichnend. Es deutet darauf hin, dass Sie entweder ein Offset- oder ein Skalierungsproblem haben. Eine Möglichkeit, dies zu überprüfen, wäre, die Werte abzulesen, während das Gerät auf einem Tisch liegt, es dann umzudrehen und erneut abzulesen. Ein Offset wird als Differenz von oben nach unten angezeigt. Bei einem Skalierungsproblem werden in beide Richtungen niedrige Werte angezeigt.

Wenn Sie eine Möglichkeit haben, das Gerät in eine Situation mit bekannter Beschleunigung zu versetzen, würde dies ebenfalls helfen. Vielleicht ein Plattenspieler oder so? Einige dieser Geräte könnten jedoch getäuscht werden, indem sie sich in einem zu engen Kreis drehen.

Die stetige Drift deutet darauf hin, dass Sie ein Antwortproblem haben könnten. Es ist möglicherweise nicht linear mit der Beschleunigung. Eine schmale, aber hohe Spitze kann zum Beispiel abgeschnitten werden. Das Testen auf solche wird ziemlich kompliziert. Sie würden bekannte Beschleunigungsprofile benötigen und dann sehen, wie das Gerät reagiert. Die Korrektur dafür fügt noch mehr Komplikationen hinzu.

Danke. Ich werde Ihre Vorschläge ausprobieren, um festzustellen, ob es sich um ein Skalierungs- oder Versatzproblem handelt.
Ich habe gerade einen kurzen Test gemacht, und es scheint einen Versatz zu geben. In der einen Richtung sind es 9,685, in der anderen 9,949. Zusammengenommen liegt es tatsächlich ziemlich nahe an zwei mal 9,81 (9,817).

Dies sollte ein Kommentar sein, aber ich wollte eine Grafik einfügen.

Es wäre hilfreich, Details der Bewegung zu haben, die Sie beobachten.

Haben Sie überprüft, ob die Beschleunigungen entlang der beiden anderen orthogonalen Achsen Null sind?

Die Fläche unter einem Beschleunigungs-Zeit-Diagramm gibt Ihnen die Geschwindigkeitsänderung an.

Geben Sie hier die Bildbeschreibung ein

Der blaue Bereich stellt also die positive Geschwindigkeitsänderung dar und sieht bei Betrachtung kleiner aus als der rote Bereich, der die negative Geschwindigkeitsänderung darstellt.
Die Gesamtgeschwindigkeitsänderung ist also negativ.

Wenn Sie vermuten, dass die Gesamtgeschwindigkeitsänderung Null ist, ist der Nullpunkt der Beschleunigung dann an der falschen Stelle, dh die Beschleunigungsachse ist versetzt?

Ich glaube, ich versuche zu sehr zu vereinfachen. Die Bewegung ist eine einfache Aufwärts-Abwärts-Bewegung im Einklang mit der Achse, aber nicht unter idealen Bedingungen, dh sie ist nicht perfekt gerade, und es kann zu Bewegungen von links nach rechts und von vorne nach hinten kommen. Die anderen beiden Achsen sind also nicht Null, aber ich habe sie ignoriert, da sie unter idealen Bedingungen Null wären. Ich brauche keine genauen Messungen, ich interessiere mich mehr für relative Veränderungen, deshalb versuche ich zu vereinfachen.