Frage

Ich habe auf dem iPhone 4 mit dem Kompass und Gyroskop experimentiert und würde etwas Hilfe mit einem Thema wie das ich habe. Ich mag für die Langsamkeit des Kompasses zu kompensieren, indem Daten aus dem Gyroskop verwendet wird.

Mit CMMotionManager und seinem CMDeviceMotion Objekt (motionManager.deviceMotion), erhalte ich das CMAttitude Objekt. Korrigieren Sie mich, wenn ich falsch bin (bitte), aber hier ist das, was ich aus dem CMAttitude Objekt yaw Eigenschaft abgeleitet habe (ich weiß nicht pitch noch roll für meine Zwecke benötigen):

  • yaw reicht von 0 bis PI wenn das Telefon nach unten zeigt (wie durch deviceMotion.gravity.z angegeben) und gegen den Uhrzeigersinn und schwingend 0 zu -PI wenn im Uhrzeigersinn geschwenkt
  • , wenn das Gerät nach oben zeigt, yaw reicht von -PI zu 0 und PI zu 0 bzw.
  • und von der Kompassdaten (ich verwende locationManager.heading.magneticHeading), ich sehe, dass die Kompasswerte von 0 zu 360 gibt, wobei der Wert erhöht wird, wenn geschwungen im Uhrzeigersinn

In Ordnung, so all diesen Informationen mit Hilfe zusammen, ich bin in der Lage einen Wert I Anruf horizontal zu bekommen, dass, unabhängig davon, ob das Gerät zeigt nach oben oder unten, werden Werte von 0 zu 360 geben und zu erhöhen, wenn das Gerät im Uhrzeigersinn geschwenkt ist (obwohl ich habe immer noch Schwierigkeiten, wenn deviceManager.gravity.z um 0 ist - der yaw Wert Freaks aus an diesem gravity.z Wert)

.

Es scheint mir, dass ich kann „Synchronize“ die horizontal und magneticHeading Werte, einen berechneten horizontal Wert mit, dass die Karten zu magneticHeading und „Synchronisieren“ der horizontal Wert magneticHeading wenn ich das Gefühl des Kompass „gefangen.“ Hat

Also meine Fragen:

  • Bin ich auf dem richtigen Weg mit diesem?
  • Bin ich mit den Kreiseldaten aus CMDeviceMotion richtig und die Annahmen aufgeführt ich oben richtig?
  • Warum könnte ausflippen yaw wenn gravity.z ist um 0?

Vielen Dank. Ich freue mich auf Ihre Antworten zu hören!

War es hilfreich?

Lösung

versuche nur, um die Antwort ... korrigieren Sie mich, wenn ich falsch bin ..

1.Ja Sie auf dem richtigen Weg sind

2.gravity in CM bereits „isoliert“ von Benutzerschwerkraft, das ist (Schwerewert durch Benutzer Beschleunigung verursacht wird), warum es zwei Schwerkraft ist, die „Schwerkraft“ und „userAcceleration“ sein auf Apfel CM Dokumentation // Hinweis: nicht ganz isoliert //

3. wenn Sie eine Schwerkraft 0 es haben bedeutet, dass die coresponding Achse senkrecht mit der Schwerkraft. gravity.z ist die, das ist iPhone-Bildschirm, warum es -9.82m / s2, wenn Sie mit Bildschirm aufrecht auf den Tisch zu legen, actualy schwer es 0 oder Maximalwert der Schwerkraft auf das Sensorrauschen aufgrund zu bekommen (es ist normal, alle Sensor eine hat Lärm expecially billiger Sensor).

, was ich auf meinen apps tun ist, ich auf andere Achse meine Referenzachse schaltet (in Ihrem Fall kann x oder y sein) für bestimmte Grenzen, wie die Strategie von dem Zweck abhängen wird oder welche Seite ist Ihre Referenz.

die andere Sache ist, Kreisel ist schnell, aber es ist nicht stabil, müssen Sie Neukalibrierung den Wert für mehrere Intervall. In meinem Fall alle 5 Sekunden. Ich habe Experiment mit Gyro für Winkel zwischen zwei Ebenen zu berechnen, versuche ich mit exacly 90-Grad-Lineal und es wird jeder zweiter Versuch einen Fehler etwa 0,5 Grad geben und die Erhöhung zu halten, aber das ist mein ist, vielleicht andere, eine bessere Methode für vermeiden haben die Error.

unten ist meine Schritte „

  1. Init
  2. Lesen Sie die Schwerkraft XYZ -> Xg Yg Zg
  3. Überprüfen Sie, ob Xg <0,25 Wenn TRUE try Yg dann Zg // Anmerkung 1 = 1 g = 9,82 m / s ^ 2
  4. Lesen Sie den Kompass und Gyro
  5. Konfigurieren und Kalibrieren des Kreiselkompasses mit dem Kompass und calulate basierend auf welche Achse I 3 in Punkt verwenden.
  6. Wenn 5 Sekunden ist passieren dann neu kalibriert werden, lesen Sie den Kompass
  7. Wenn der die Differenz mit Gyro-Lese> 5 Grad überspringen recalibartion der Kreisel.
  8. Wenn der die Differenz mit Gyro-Lese <5 Grad Kalibrieren des Kreiselkompasswert mit

Hinweis: für Nummer. 7: ist zu überprüfen, ob das Telefon mit Magnetfeld beeinflusst oder in der Nähe von großem Stahl, oder elektrische Hochspannungsleitung oder in einem lauten und schwerer Ausrüstung in Fabrikanlage

Das ist alles ... Hoffe, das könnte Ihnen helfen ... Und sorry für mein Englisch ..

Andere Tipps

Hier ist ein Beispiel für ein iPhone-App, wo der Kompass mit dem Kreisel ausgeglichen bekommen. Code und Projekt sind hier zu sehen: http://www.sundh.com/blog/2011/09 / stabalize-Kompass-of-iphone-mit-Gyroskop /

Die Richtung des Gierachsenvektor ist nicht definiert, wenn sie in Schwerelosigkeit (oder freien Fall oder nahe genug).

Um die Synchronisation zu tun, während in Bewegung, benötigen Sie einen Filter für Ihren „horizontal“, Wert zu schaffen, die die gleichen Verzögerung / Delay Antworteigenschaften als Magnetkompass hat. Entweder das, oder warten, bis keine Bewegung mehr lang genug für beide Werte zu regeln, bevor neu berechnet den Offset.

Antwort auf Frage 1 ist Ja, Frage 2 Sie auf dem richtigen Weg ist, aber man könnte einen Variablennamen verwenden, die nicht ‚horizontale‘ ist, Frage 3 wird von hotpaw2 beantwortet und auch eine Gier in einem Chopper oder Hubschraubern in der Nähe von Null Höhe würde den Piloten mit einem Alarm alarmieren. Es gibt eine Zeitverzögerung, weil ein Teil der Software lokal ist, während es andere Faktoren gibt, die es nach unten einschließlich des Zugangs zu einem Sensor zur Erfassung magnetischer Wellen verlangsamen kann, die Vorrichtungsposition und -richtung, die graphische Ausgabe für die Kompassanzeige vorbereitet, Rechen- und Ausgabe Daten aus dem Kreisel und Sensoren durch eine relativ langsame Schnittstelle, ein Allzweck-Handheld-Gerät nicht kundenspezifisch für die Art der Aufgabe gebeten, es zu benutzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top