2016-05-17 17 views
1

Ich habe ein Google Project Tango-Gerät im Querformat auf einem Roboter montiert und möchte die Überschrift vom onPoseAvailable() Ereignis-Listener erhalten. Ich weiß, dass das Framework eine Quaternion zurückgibt, wie in der API beschrieben.Von Drehung als Quaternion zu Grad (0 - 360 °)

Ich habe viel versucht, die Quaternion zu einer Messung nur in Grad zu konvertieren. Die einzige Orientierungsachse, die mich interessiert, ist y (https://developers.google.com/project-tango/overview/coordinate-systems#project_tango_coordinate_systems), die den Kurs meines Roboters bestimmt.

Meine ersten Ansätze waren TYPE_ROTATION_VECTOR, TYPE_GYROSCOPE oder TYPE_ORIENTATION (entzogen). Aber die resultierenden Werte waren unbrauchbar. Später las ich Tango hat große Probleme mit den Magnetsensoren (How to detect an absolute rotation of an android device)

Das war der Grund, zu den Pose-Daten von Tango selbst zu wechseln. Aber das gleiche hier. Entweder ist es ziemlich raketenwissenschaftlich zu den entsprechenden Ergebnissen oder Tango hat auch hier große Probleme. Ich lese alle stackoverflow-Artikel und fast alles, was ich im Internet gefunden habe. Ich habe fast jeden Code, den ich gefunden habe, neu implementiert. Aber für mein derzeitiges Szenario funktionierte kein Stück wie erwartet. Für andere Bewegungen in anderer Achse war es!

Ich habe versucht, aus den folgenden:

Oder ist Gibt es eine andere Möglichkeit, die Rotation für Roboteranwendungen zu bestimmen? (Nur die Überschrift). Das Einzige, was ich erreichen möchte, ist das Drehen um einen vordefinierten Winkel (in Grad). Meistens möchte ich nur nach rechts oder links abbiegen (90 °).

Wenn jemand einen Arbeitscode zur Verfügung stellen kann (Targeting auf das Google Project Tango-Gerät), wäre das sehr hilfreich. Habe schon Tage damit verloren. Für andere Android-Geräte habe ich schnell Lösungen gefunden. Nicht auszuschließen, dass das Gerät andere große Bugs hat.

Antwort

2

Versuchen Sie diesen Code. Beachten Sie, dass die berechnete Ausrichtung relativ zur Geräteausrichtung beim Start des Betriebs ist.

double orientationRoll = Math.toDegrees(Math.atan2(
      2.0 * (rotation[TangoPoseData.INDEX_ROTATION_X] * rotation[TangoPoseData.INDEX_ROTATION_Y] + rotation[TangoPoseData.INDEX_ROTATION_W] * rotation[TangoPoseData.INDEX_ROTATION_Z]), 
      Math.pow(rotation[TangoPoseData.INDEX_ROTATION_W], 2) + Math.pow(rotation[TangoPoseData.INDEX_ROTATION_X], 2) - Math.pow(rotation[TangoPoseData.INDEX_ROTATION_Y], 2) - Math.pow(rotation[TangoPoseData.INDEX_ROTATION_Z], 2) 
    )); 
+0

Vielen Dank ... genau das, was ich gesucht habe. Hatte keine Möglichkeit, diese Formel von mir selbst abzuleiten. – dannyyy