Ich habe folgendes Szenario: Ein iPhone ist mit einer vertikalen Schiene verbunden (seine Bewegung ist auf die Y-Achse beschränkt). Durch mechanische Mittel wird das Telefon nach oben gedrückt und kann dann wieder zur Ruhe kommen. Der Abstand variiert (zwischen 6" und 24"). Die für die vollständige Fahrt erforderliche Gesamtzeit beträgt ungefähr 1 - 2 Sekunden. Das Ziel ist es, die Entfernung zu schätzen, die das Gerät zurücklegt.
Ich habe mir beides durchgelesen:
Berechnung der Entfernung aus gemessener Beschleunigung vs. Zeit
Abrufen der Position von einem Beschleunigungsmesser auf einem Android-Telefon
(obwohl ich zugeben muss, dass ich mich seit Jahren nicht mehr direkt mit diesen Themen auseinandersetzen musste)
Derzeit sammle ich Beschleunigungsdaten (entlang der Y-Achse) und verwende Folgendes, um das Integral von Beschleunigung und Geschwindigkeit abzuschätzen (über Excel):
1 Time [A] Acceleration [B] Velocity [C] Distance [D]
2 0 a(z) 0 0
3 1 a(z) =C2+(A3-A2)*(B2+B3)/2 =D2+(A3-A2)*(C2+C3)/2
4 2 a(z) =C3+(A4-A3)*(B3+B4)/2 =D3+(A4-A3)*(C3+C4)/2
5 3 a(z) =C4+(A5-A4)*(B4+B5)/2 =D4+(A5-A4)*(C4+C5)/2
6 4 a(z) =C5+(A6-A5)*(B5+B6)/2 =D5+(A6-A5)*(C5+C6)/2
7 5 a(z) =C6+(A7-A6)*(B6+B7)/2 =D6+(A7-A6)*(C6+C7)/2
8 6 a(z) =C7+(A8-A7)*(B7+B8)/2 =D7+(A8-A7)*(C7+C8)/2
9 7 a(z) =C8+(A9-A8)*(B8+B9)/2 =D8+(A9-A8)*(C8+C9)/2
10 8 a(z) =C9+(A10-A9)*(B9+B10)/2 =D9+(A10-A9)*(C9+C10)/2
11 9 a(z) =C10+(A11-A10)*(B10+B11)/2 =D10+(A11-A100)*(C10+C11)/2
12 10 a(z) =C11+(A12-A11)*(B11+B12)/2 =D11+(A12-A11)*(C11+C12)/2
... ... ... ...
Hier ist ein Beispiel meiner Daten: test_data_1.csv
Wenn die Einheiten der Beschleunigung in G (9,8 m/s^2) gemessen werden, was sind die resultierenden Einheiten für Geschwindigkeit und Entfernung?
So sieht ein Diagramm meiner Daten aus - es ergibt für mich wirklich keinen Sinn (was nicht verwunderlich ist, da ich in diesen Bereichen nicht viel Erfahrung habe). Auch hier besteht das Ziel darin, eine Entfernungsschätzung zu erhalten (sie muss nicht perfekt sein).
Irgendwelche Hinweise/Erklärungen wären sehr willkommen.
Der Beschleunigungsmesser misst das Negativ der Schwerkraft plus jede Aufwärtsbeschleunigung, siehe ANMERKUNG 1
und integrieren möchten Geschwindigkeit zu bekommen und Stellung . So sollten Ihre Ausdrücke sein
Sie wissen auch, dass die Endposition gleich der Anfangsposition sein sollte und die Endgeschwindigkeit im Ruhezustand sein sollte. Dazu müssen Sie die Integrationsergebnisse optimieren, um das gewünschte Ergebnis zu erhalten. Dies kann begründet werden, da Sie diskrete Beschleunigungswerte haben. Hier kalibrieren Sie das Modell mit den Messdaten.
Hier sind also die Schritte, die Sie unternehmen müssen
ANMERKUNG 1: Um die Gleichung des Beschleunigungsmessers zu erhalten, müssen Sie ein Freikörperdiagramm auf dem Beschleunigungsmesser selbst erstellen, da er am Telefon befestigt ist und der Bewegung des Telefons folgt. Die Verbindungskraft verwendeten piezoelektrischen Materialien derart abgetastet wird . Die gemeldete Beschleunigung ist kalibriert
ANMERKUNG 2: Sie können das überprüfen
d²x/dt²
ist die Trennung so nützlich, dass es eine iPhone-API gibt, die die Schritte 1 bis 6 für Sie erledigt: siehe CMDeviceMotion#userAccelerationWie Ross sagte, müssen Sie versuchen, den insgesamt konstanten Teil Ihrer Beschleunigungsdaten zu entfernen. Die meisten Beschleuniger melden ständig die Schwerkraft. Selbst wenn Ihr Telefon still auf einem Schreibtisch läge, würde es eine Beschleunigung von -9,8 m/s^2 "nach unten" melden, jedoch nach unten ausgerichtet mit den Achsen Ihres Telefons.
Wenn Sie sich Ihre Daten ein wenig ansehen, ist die Beschleunigung für das erste Drittel Ihres Intervalls weitgehend konstant um -0,977. Ich gehe davon aus, dass sich Ihr Messgerät für diesen Teil der Daten nicht wirklich bewegt hat, also kann ich es als Basis nehmen und es entfernen. Wenn ich das entferne und dann die trapezförmige Integration durchführe, erhalten wir so etwas wie:
Sieht das so aus, wie Sie es erwartet haben?
Außerdem haben Sie in Ihrer Beschreibung der trapezförmigen Integration Fehler gemacht. In beiden Fällen, wenn wir integrieren
zu bekommen
und wenn wir integrieren
zu bekommen
, möchten wir diese Integration im Laufe der Zeit durchführen. Also in deiner Kolumne D
statt so etwas wie D3=D2+(B3-B2)*(C2+C3)/2
es sein sollteD3=D2+(A3-A2)*(C2+C3)/2
Wenn deine Beschleunigungen drin sind , sollten Sie den zweiten Term in Spalte C mit multiplizieren . Die Geschwindigkeiten sind dann in m/s und Ihre Integration zu D wird in Metern sein. Sie können dann alle Einschränkungen anwenden, die Sie kennen. Wenn Sie wissen, dass die Geschwindigkeit bei Null beginnt und endet, möchten Sie möglicherweise eine konstante Beschleunigung zu den Daten hinzufügen oder davon abziehen, damit dies so herauskommt. Wenn Sie wissen, dass das Telefon zu seiner Ausgangsposition zurückkehrt, können Sie eine weitere Korrektur anwenden (lineare Änderung der Beschleunigung gegenüber der Zeit?), damit dies herauskommt. Diese können die Genauigkeit verbessern.
John Alexiou
Leonid Schewzow
CMAccelerometerData#acceleration
oderCMDeviceMotion#userAcceleration
um den Beschleunigungswert zu erhalten? Denn ersteres ist die Eigenbeschleunigung , eine Vektorsumme aus G und der bekanntendv/dt
Beschleunigung.Robert Josef
CMAccelerometerData#acceleration
- ist es das, was Sie vorschlagen?Leonid Schewzow
startDeviceMotionUpdates
, und verwendenCMDeviceMotion#userAcceleration
- siehe Übersicht auf dieser Seite . Grundsätzlich filtert die API die Schwerkraft heraus und stelltdv/dt
für Sie bereit.