2 Stimmen

Werte aus Sensor.TYPE_ORIENTATION in Euler-Winkel umrechnen?

Ich muss eine Kompass-App für Android schreiben. Das einzige, was der Benutzer auf dem Bildschirm sieht, ist ein Würfel mit einer roten Wand, die nach Norden zeigen muss. Das ist nicht wichtig. Wichtig ist, dass ich diesen Würfel entsprechend der Drehung des Geräts selbst drehen muss, damit die rote Wand weiterhin nach Norden zeigt, egal wie das Telefon gehalten wird. Mein Code ist einfach und überschaubar:

@Override
public void onSensorChanged(SensorEvent event) {
    synchronized (this) {
        switch (event.sensor.getType()){
        case Sensor.TYPE_ACCELEROMETER:
            direction = event.values[2];
            break;
        case Sensor.TYPE_ORIENTATION:
            if (direction < 0) {
                angleX = event.values[1];
                angleY = -event.values[2];
                angleZ = event.values[0];
            } else {
                angleX = -event.values[1];
                angleY = -event.values[2];
                angleZ = event.values[0];   
            }
            break;
        }
    }
}

Ich habe diese zusätzliche Richtungsvariable hinzugefügt, die einfach speichert, ob das Display des Telefons nach unten oder nach oben gerichtet ist. Ich weiß nicht, ob ich das brauche, aber es scheint einige Fehler zu beheben. Ich verwende die SensorSimulator für Android, aber immer wenn mein Pitch-Slider in den Bereich [-90, 90] geht, geraten die anderen Variablen durcheinander. Es ist, als ob sie einen Versatz von 180 bekommen. Aber ich kann nicht erkennen, wenn ich in diesem Intervall bin, weil der Bereich der Tonhöhe von -90 bis 90 ist, so kann ich den Schieberegler von links nach rechts bewegen und ich werde immer in diesem Intervall sein.

Das war alles nur, um Ihnen zu zeigen, wie weit mein Code fortgeschritten ist. Ich sage nicht, wie das Problem zu lösen ist, weil ich mich damit wahrscheinlich nur in eine Sackgasse manövrieren würde. Sehen Sie, ich versuche jetzt schon seit 3 Tagen, diese Anwendung zu schreiben, und Sie können sich vorstellen, wie sauer mein Chef ist. Ich habe alle möglichen Anleitungen gelesen und jede Formel ausprobiert, die ich finden oder mir ausdenken konnte. Also helfen Sie mir bitte. Alles, was ich tun muss, ist zu wissen, wie ich meinen Würfel drehen kann, dessen Drehwinkel EULER-WINKEL in Grad sind.

3voto

Micah Hainline Punkte 14229

Hier ist ein Code, den ich geschrieben habe, um etwas ziemlich Ähnliches zu machen, wobei ich mich nur um die Drehung des Geräts in der Rollrichtung kümmere. Hoffentlich hilft es! Es verwendet nur die Beschleunigungsmesserwerte, um die Neigung zu bestimmen, keine Notwendigkeit, die Orientierung der Ansicht zu erhalten.

public void onSensorChanged(SensorEvent event) {
    float x = -1 * event.values[0] / SensorManager.GRAVITY_EARTH;
    float y = -1 * event.values[1] / SensorManager.GRAVITY_EARTH;
    float z = -1 * event.values[2] / SensorManager.GRAVITY_EARTH;

    float signedRawRoll = (float) (Math.atan2(x, y) * 180 / Math.PI);
    float unsignedRawRoll = Math.abs(signedRawRoll);
    float rollSign = signedRawRoll / unsignedRawRoll;
    float rawPitch = Math.abs(z * 180);

    // Use a basic low-pass filter to only keep the gravity in the accelerometer values for the X and Y axes
    // adjust the filter weight based on pitch, as roll is harder to define as pitch approaches 180.
    float filterWeight = rawPitch > 165 ? 0.85f : 0.7f;
    float newUnsignedRoll = filterWeight * Math.abs(this.roll) + (1 - filterWeight) * unsignedRawRoll;
    this.roll = rollSign * newUnsignedRoll;
    if (Float.isInfinite(this.roll) || Float.isNaN(this.roll)) {
        this.roll = 0;
    }
    this.pitch = filterWeight * this.pitch + (1 - filterWeight) * rawPitch;
    for (IAngleListener listener : listeners) {
        listener.deviceRollAndPitch(this.roll, this.pitch);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X