Frage

Ich habe seit einiger Zeit versucht, meinen Kopf durch die Android -Orientierungssensoren zu bringen. Ich dachte, ich hätte es verstanden. Dann wurde mir klar, dass ich es nicht getan habe. Jetzt denke ich (Hoffnung) Ich habe ein besseres Gefühl dafür, aber ich bin immer noch nicht 100%. Ich werde versuchen, mein fleckiges Verständnis dafür zu erklären, und hoffentlich können die Leute mich korrigieren, wenn ich mich in Teilen irre oder irgendwelche Lücken ausfüllen.

Ich stelle mir vor, ich stehe bei 0 Grad Längengrad (Prime Meridian) und 0 Grad Breitengrad (Äquator). Dieser Ort befindet sich tatsächlich im Meer vor der Küste Afrikas, aber erträgt mit mir. Ich halte mein Handy vor meinem Gesicht, damit der Boden des Telefons auf meine Füße zeigt. Ich bin nach Norden (nach Greenwich), also ist die rechte Seite des Telefons nach Osten in Richtung Afrikas. In dieser Ausrichtung (unter Bezugnahme auf das folgende Diagramm) habe ich die x-Achse nach Osten, die Z-Achse zeigt nach Süden und y-Achse auf den Himmel.

Mit den Sensoren auf dem Telefon können Sie in dieser Situation die Ausrichtung (nicht die Position des Geräts) ausarbeiten. Dieser Teil hat mich immer verwirrt, wahrscheinlich weil ich verstehen wollte, wie etwas funktioniert hat, bevor ich akzeptierte, dass es gerade funktioniert hat. Es scheint, dass das Telefon seine Orientierung mit einer Kombination aus zwei verschiedenen Techniken herausstellt.

Bevor ich dazu komme, stellen Sie sich vor, Sie stehen wieder auf diesem imaginären Stück Land bei 0 Grad Breitengrad und Längengrad, die in die oben erwähnte Richtung stehen. Stellen Sie sich auch vor, Sie sind mit verbundenen Augen und Ihre Schuhe an einem Spielplatz -Kreisverkehr befestigt. Wenn jemand Sie im Rücken schiebt, werden Sie (in Richtung Norden) nach vorne fallen und beide Hände auslegen, um Ihren Sturz zu brechen. Wenn jemand Ihre linke Schulter schiebt, fallen Sie auf Ihre rechte Hand. Dein inneres Ohr hat "Gravitationssensoren" (YouTube -Clip) Mithilfe dessen können Sie feststellen, ob Sie nach vorne/zurückfallen oder nach links/rechts fallen oder hinunter (oder auf !!). Daher können Menschen Ausrichtung und Drehung um die gleichen x- und z -Achsen wie das Telefon erkennen.

Stellen Sie sich jetzt vor, jemand dreht sich jetzt um 90 Grad auf dem Kreisverkehr, damit Sie jetzt nach Osten stehen. Sie werden um die Y -Achse gedreht. Diese Achse ist anders, weil wir sie nicht biologisch erkennen können. Wir wissen, dass wir von einer bestimmten Menge abgewinkelt sind, aber wir kennen die Richtung in Bezug auf den magnetischen Nordpol des Planeten nicht. Stattdessen müssen wir ein externes Werkzeug verwenden ... einen magnetischen Kompass. Auf diese Weise können wir feststellen, in welcher Richtung wir konfrontiert sind. Gleiches gilt für unser Telefon.

Jetzt hat das Telefon auch einen 3-Achsen-Beschleunigungsmesser. Ich habe NEIN Idee, wie sie tatsächlich funktionieren, aber die Art und Weise, wie ich es visualisiere, soll sich die Schwerkraft als konstant und gleichmäßiger „Regen“ vorstellen, der vom Himmel fällt, und sich die Achsen in der obigen Figur als Röhrchen vorzustellen, die die durch fließende Regenmenge erkennen können. Wenn das Telefon aufrecht gehalten wurde, fließt der gesamte Regen durch das Y 'Tube'. Wenn das Telefon allmählich gedreht wird, so dass sein Bildschirm dem Himmel ausgesetzt ist. Wenn wir jetzt das Telefon auf die Seite geben, sammelt das X -Röhrchen schließlich die maximale Regenmenge. Abhängig von der Ausrichtung des Telefons durch Messung der Regenmenge, die durch die 3 Röhrchen fließt, können Sie die Ausrichtung berechnen.

Das Telefon verfügt auch über einen elektronischen Kompass, der sich wie ein normaler Kompass verhält - seine "virtuelle Nadel" zeigt auf Magnetic North. Android verschmilzt die Informationen von diesen beiden Sensoren so, wann immer a SensorEvent von TYPE_ORIENTATION wird erzeugt values[3] Array hat
Werte [0]: Azimut - (der Kompass mit östlich von Magnetic North)
Werte [1]: Tonhöhe, Drehung um die x-Achse (ist das Telefon, das sich nach vorne oder hinten lehnt)
Werte [2].

Ich denke, (dh ich kenne nicht) der Grund, warum Android dem Azimut (Kompasslager) und nicht die Lektüre des dritten Beschleunigungsmessers gibt, ist, dass das Kompasslager nur nützlicher ist. Ich bin mir nicht sicher, warum sie diese Art von Sensor veraltet haben, da Sie jetzt einen Hörer beim System für registrieren müssen SensorEvents vom Typ TYPE_MAGNETIC_FIELD. Die Ereignisse value[] Array muss sich in die Start haben SensorManger.getRotationMatrix(..) Methode, um eine Rotationsmatrix zu erhalten (siehe unten), die dann in die übergeben wird SensorManager.getOrientation(..) Methode. Weiß jemand, warum das Android -Team veraltet ist Sensor.TYPE_ORIENTATION? Ist es eine Effizienzsache? Das ist es, was in einem der Kommentare zu einem ähnlichen Angaben impliziert wird Frage Sie müssen jedoch immer noch einen anderen Hörertyp in der registrieren Entwicklung/Proben/Compass/src/com/Beispiel/Android/Compass/CompassActivity.java Beispiel.

Ich möchte jetzt über die Rotationsmatrix sprechen. (Hier bin ich am unsicher.) Also haben wir die drei Zahlen aus der Android -Dokumentation. Wir nennen sie A, B und C

A = sensorManger.getRotationMatrix (..) Methodenbildung und repräsentiert das Koordinatensystem der Welt

B = Koordinatensystem, das von der Sensorvent -API verwendet wird.

C = SensorManager.Getorientation (..) Methode -Figur

Mein Verständnis ist also, dass A das "weltweit Koordinatensystem" darstellt, von dem ich vermute, dass es sich auf die Art und Weise bezieht, wie Standorte auf dem Planeten als (Breite, Längengrad) mit einer optionalen (Höhe) angegeben werden. X ist das "Ost" koordiniert, y ist das "Nording" Koordinate. Z zeigt auf den Himmel und repräsentiert die Höhe.

Das Koordinatensystem der Telefone ist in Abbildung B dargestellt. Die Y -Achse weist immer auf die Spitze hin. Die Rotationsmatrix wird ständig vom Telefon berechnet und ermöglicht die Zuordnung zwischen beiden. Ich denke also Recht, dass die Rotationsmatrix das Koordinatensystem von B in C verwandelt? Also, wenn Sie anrufen SensorManager.getOrientation(..) Methode Sie verwenden die values[] Array mit Werten, die Abbildung C entsprechen. Wenn das Telefon auf den Himmel gerichtet ist, ist die Rotationsmatrix Identitätsmatrix (das mathematische Matrixäquivalent von 1), was bedeutet, dass keine Zuordnung erforderlich ist, da das Gerät auf das Koordinatensystem der Welt ausgerichtet ist.

OK. Ich denke, ich höre jetzt besser auf. Wie ich schon sagte, bevor ich hoffe, werden mir die Leute sagen, wo ich es vermasselt habe oder Menschen geholfen habe (oder Menschen noch weiter verwirrt!)

War es hilfreich?

Lösung

Vielleicht möchten Sie sich das ansehen Ein Bildschirmumdrehung verdient einen anderen Artikel. Es erklärt, warum Sie die Rotationsmatrix benötigen.

Kurz gesagt, die Sensoren des Telefons verwenden immer das gleiche Koordinatensystem, selbst wenn das Gerät gedreht wird.

In Anwendungen, die nicht auf eine einzige Ausrichtung gesperrt sind, ändert sich das Bildschirmkoordinatensystem, wenn Sie das Gerät drehen. Wenn das Gerät aus seinem Standardansichtsmodus gedreht wird, ist das Sensorkoordinatensystem nicht mehr mit dem Bildschirmkoordinatensystem gleich. Die Rotationsmatrix wird in diesem Fall verwendet, um a in C zu C zu transformieren (B bleibt immer fest).

Hier ist ein Code -Snippet, der Ihnen zeigt, wie es verwendet werden kann.

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);

// Register this class as a listener for the accelerometer sensor
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    SensorManager.SENSOR_DELAY_NORMAL);
// ...and the orientation sensor
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                    SensorManager.SENSOR_DELAY_NORMAL);

//...
// The following code inside a class implementing a SensorEventListener
// ...

float[] inR = new float[16];
float[] I = new float[16];
float[] gravity = new float[3];
float[] geomag = new float[3];
float[] orientVals = new float[3];

double azimuth = 0;
double pitch = 0;
double roll = 0;

public void onSensorChanged(SensorEvent sensorEvent) {
    // If the sensor data is unreliable return
    if (sensorEvent.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
        return;

    // Gets the value of the sensor that has been changed
    switch (sensorEvent.sensor.getType()) {  
        case Sensor.TYPE_ACCELEROMETER:
            gravity = sensorEvent.values.clone();
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            geomag = sensorEvent.values.clone();
            break;
    }

    // If gravity and geomag have values then find rotation matrix
    if (gravity != null && geomag != null) {

        // checks that the rotation matrix is found
        boolean success = SensorManager.getRotationMatrix(inR, I,
                                                          gravity, geomag);
        if (success) {
            SensorManager.getOrientation(inR, orientVals);
            azimuth = Math.toDegrees(orientVals[0]);
            pitch = Math.toDegrees(orientVals[1]);
            roll = Math.toDegrees(orientVals[2]);
        }
    }
}

Andere Tipps

Roll ist eine Funktion der Schwerkraft, eine 90 -Grad -Rolle bringt die gesamte Schwerkraft in das X -Register.

Die Tonhöhe ist gleich. Ein 90 -Grad -Tonhöhe bringt die gesamte Schwerkraft in das Y -Register ein.

Gier / Überschrift / Azimut hat keinen Einfluss auf die Schwerkraft, es ist immer im rechten Winkel bis zur Schwerkraft, egal in welcher Art, wie Sie sich der Schwerkraft gegenübersehen, nachsichtig sein.

Deshalb brauchen Sie einen Kompass, um zu beurteilen. Vielleicht macht das Sinn?

Schau dir das an: Stackoverflow.com: Q.5202147

Sie scheinen meistens richtig zu sein, bis die 3 Diagramme a, b, c. Danach hast du dich verwirrt.

Ich hatte dieses Problem, also habe ich herausgefunden, was in verschiedene Richtungen passiert. Wenn das Gerät in Landschaftsmode montiert ist, scheinen in einem Auto die 'Grad' aus dem Kompass von 0 bis 275 (im Uhrzeigersinn) über 269 (zwischen West und Nord) zu laufen Vorwärts von 0 bis 269. 270 wird -90

Immer noch in der Landschaft, aber mit dem Gerät auf dem Rücken liefert mein Sensor 0-360. Und im Porträtmodus läuft es 0-360, die beide auf dem Rücken liegen und im Porträt stehen.

Hoffe das hilft jemandem

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