Wie Entfernung berechnen, basierend auf Telefon-Beschleunigung
Will ich bauen so etwas aber mit einem android-Handy: http://www.youtube.com/watch?v=WOt9mb5QqRs
Ich habe bereits eine app erstellt haben, sendet der sensor Daten via socket (noch auf der Suche nach einem guten websocket-Implementierung für android). Ich beabsichtige, diese Informationen zu nutzen, um die Interaktion mit einer web-app, also zum Beispiel ich wäre in der Lage, ein Bild auf der Grundlage der Telefon-Bewegung.
Das problem ist, dass ich versuchte zu Entfernung berechnen, basierend auf den Beschleunigungsmesser-Daten, aber die Ergebnisse sind wirklich schlecht. Ich Frage mich, wenn jemand könnte mir helfen mit die richtige Gleichung, aber zuerst von allen, ist es möglich, dies zu tun?
Bis jetzt bin ich mit den folgenden Gleichungen:
velocity = acceleration * time;
distance = velocity * time + (acceleration * time^2) /2;
dann übersetze ich Abstand von Meter pro Sekunde auf Pixel basiert auf der Bildschirm-Auflösung.
berechnet mit javascript im browser jedes mal, wenn ich das empfangen der Sensordaten, das ist jedes ~80ms.
InformationsquelleAutor Demian | 2010-12-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Grundlagen, ist einfach. In der analogen Welt, die Sie verwenden kontinuierliche Mathematik, das ist:
und in der digitalen Welt ist es noch einfacher, Sie verwenden diskrete Mathematik, wo der integration wird Summierung:
Nur halten Sie das hinzufügen, bis alle Werte der Beschleunigung, die Sie gelesen und Sie irgendwann Abstand.
Das große problem mit diesem ist, dass auf dem Planeten Erde gibt es eine Konstante Beschleunigung nach unten von etwa 10 m/s/s aufgrund der Schwerkraft. Herauszufinden, welcher Teil Ihres Vektors der Schwerkraft, ist der schwierige Teil.
BTW, die Schwerkraft ist wie Beschleunigungssensoren erkennen kann kippen. Also, wie Sie es tun, es sei denn, Sie können die Berechnung der Neigung unabhängig von den Beschleunigungssensoren (zum Beispiel mit Hilfe von gyros) Ihr code wird meist Messen die Neigung, anstatt von der Entfernung.
HA! Ich habe gerade gemerkt, meine Letzte Aussage, dass viele iPhone-apps funktionieren nicht im Raum 😛
Zusätzliche Antwort:
Basiert auf einem "Kommentar" geschrieben von der OP (als Antwort entweder unten oder oben in dieser Antwort) es sieht aus wie ich brauche, um weitere Erläuterung. Die Umsetzung ist wirklich, wirklich einfach, dass die Menschen nicht vertraut mit der Mathematik zu denken, es muss komplizierter sein als das. Der pseudocode ist wie folgt:
Entfernung wird immer gemessen von wo aus Sie die software das erste mal startet, es sei denn, Sie setzen den Abstand variable auf null. Der Beschleunigungssensor muss ständig gelesen werden (vorzugsweise in Höhe der Beschleunigungssensor selbst misst Kräfte), und die Werte von Geschwindigkeit und Abstand entsprechend aktualisiert. Wenn Sie möchten, um zu wissen, die Entfernung vom Startpunkt Lesen Sie einfach die Entfernung variable.
Mehrere Dinge: alle Höhe, der Neigung, egal wie geringfügig, fügt drift. D.h. es wird immer eine kleine Menge der Konstanten Beschleunigung in die eine oder in die andere Richtung, es sei denn, der Winkel der Neigung, sich selbst ständig verfolgt. Sogar Atom-U-Boote, ausgerüstet mit hochpräzisen Beschleunigungssensoren und gyros, denn GPS funktioniert unter Wasser nicht, müssen in regelmäßigen Abständen Oberfläche und sync, mit GPS, um dies zu korrigieren drift.
Zweiten, der Beschleunigungsmesser misst die Kraft, keine Bewegung. Jede Art von Gewalt gemessen wird. Ich erwähnte Schwerkraft, sondern auch Maßnahmen, die Beulen verursacht durch Reibung mit einem Tisch, Ihr Puls wie Ihren Herzschlag und Atmung verursachen, Ihre hand zu schütteln, etwas, nichts. Die gute Nachricht ist, dass auf lange Sicht alle diese Kräfte werden durchschnittlich aus und die Formel noch korrekt. Aber in der kurzen Frist bedeutet dies, dass Ihre Lektüre wird zu laut sein. Es gibt eine Menge tricks, die Menschen haben sich mit, minimieren sich diese Geräusche mit Dingen wie Weiner und Kalman-Filter.
Dritten, wie Sie vielleicht bemerkt haben, Beschleunigungssensor Lesen ist nicht konstant. Ich nicht einfach bedeuten, dass die Werte unterschiedlich sind jedes mal, wenn Sie Sie Lesen, das ist offensichtlich, aber es ändert sich auch die Werte, die in-zwischen den Lesungen. Jeder Wert, den wir vermissen, wirkt sich auf unsere Genauigkeit, so ist es wichtig zu Lesen, dass die Werte so oft wie möglich. Nun, die gute Nachricht ist, dass auf lange Sicht alle diese Fehler, verursacht durch fehlende Werte sollte den Durchschnitt aus, als Sie sind Häufig verursacht durch ruckartige Bewegungen oder Vibrationen und unsere Formel ist wieder noch korrigieren. Aber es bedeutet wieder, dass in der kurzen Ausführung dieses fügt ein Rauschen zu unserem system. Wenn Sie einen guten perdictive filter wie ein Kalman-filter, dann sollte es in der Lage sein, um dies zu berücksichtigen, aber schwächer Filter können etwas Hilfe benötigen. Ein Weg dies zu tun besteht durchschnittlich aus jeder Beschleunigung Lesung mit der vorherigen Lesung. Beachten Sie, dass es muss, werden die bisherigen "real" zu Lesen, nicht den vorherigen gemittelten Lesen.
Mehr Genauigkeit als dies geht in den Bereich der Inertial Measurement Units (IMU) und inertiales und eine Menge ziemlich haarig Vektor-und matrix-Mathematik. Es gibt open-source-Projekte tun dies aber nicht (weniger als 10 Jahren dieses Zeug war streng militärisch, da Sie wissen, U-Booten und cruise-missiles verwenden).
Diese Sparkfun Artikel haben einige nette links unten und einige Referenz-code:
http://www.sparkfun.com/products/9268
http://www.sparkfun.com/products/8454
Hoffe das hilft. Und wenn sonst noch jemand links zu jedem Artikel was helfen kann, bitte kommentieren.
Beispiel
Natürlich, wenn Sie wollen echte Einheiten, die Sie benötigen, um Maßstab für die sample-rate. Zum Beispiel bei einer Beschleunigung von 9m/s für 80ms bedeutet, dass Ihre Geschwindigkeit ist
(9m/s/s * 0.08s) = 0.72m/s
. Die obigen pseudocode wird vereinfacht vorausgesetzt, Sie kümmern sich nicht um Einheiten. Die endgültigen Werte werden noch stellen Distanz als Zahl, es ist nur so, dass die Anzahl hat wenig Bezug zu realen Einheit der Messung. Wenden Sie einfach eine scaling-Funktion am Ende kalibriert, um Ihr pixel-Werte. Wie auch immer, hier ein Beispiel mit real-world-Einheiten, um zu klären, was passiert:Nun, wenn man die abgeleiteten Entfernungen und führen Sie einen reverse-Berechnung wie gewohnt (
v = (s2-s1)/t
unda = (v2-v1)/t
), solltest du die Beschleunigung Messen zurück.Das ist nur, wie die Physik funktioniert. Vielleicht haben Sie vergessen, die Geschwindigkeit ist einfach das integral der Beschleunigung. Wenn es Zeit wird zu diskreten, integration wird Summierung.
Summieren der Werte, die Zeit und Wert diskret ist nicht das gleiche wie integration. Sie haben zu berücksichtigen, die Zeit - /Intervall zwischen den Beschleunigungswerten.
Ich würde stark vorschlagen, versucht meine Methode als test, um zu sehen, wenn die Berechnung eine Einigung auf die Reale Länge. Dann vergleichen Sie es mit Ihrem code. Das heißt, entfernen Sie die 0,5-bilden Sie Ihren code und versuchen Sie es erneut.
Diese Formel ist in der Tat zu einfach und naiv zu arbeiten. Er hat im Grunde zu viel Annahmen, macht es nicht praktischer.
InformationsquelleAutor slebetman
Max Geschwindigkeit = Zeit * Beschleunigung.
Durchschnittliche Geschwindigkeit = Max Geschwindigkeit /2.
Zurückgelegte Strecke = Geschwindigkeit * Zeit.
Zurückgelegte Strecke = Zeit * Zeit * Beschleunigung /2.
Ich weiß, das ist wirklich alt, aber er ist tatsächlich rechts! Look-up-Riemann-Summen. Die Antwort oben ist falsch, denn es beschäftigt sich mit dem Fall der kontinuierlichen Beschleunigung und nicht diskret gemessenen Abständen wie ist der Fall mit dem Telefon. Cheers.
InformationsquelleAutor kek