Nord-Richtung


dsNDesign

Erfahrenes Mitglied
#1
Hei,
ich möchte von der aktuellen Position eines Androiden die Richtung zu einer bestimmten Position anzeigen. Dazu benötige ich ja die Ausrichtung des Geräts.

Dies habe ich bis jetzt mit dem Magnetic und dem Accelerometer versucht. Die Werte, welche ich dabei jedoch für den Azimuth erhalte, schwanken stark. Die Tendenz stimmt zwar, jedoch schwanken diese (selbst wenn das Gerät auf dem Tisch liegt und nicht bewegt wird), in einem Bereich von ca. 5°. Noch schlimmer ist es, wenn ich das Gerät schüttel. Dann springt mein Zeiger in alle möglichen Richtungen.

Hier mein bisheriger Code-Ausschnitt:
Java:
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
Java:
public void onSensorChanged(SensorEvent sensorEvent) {
    switch(sensorEvent.sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
            mGravity = sensorEvent.values.clone();
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            mMagnetic = sensorEvent.values.clone();
            break;
        default:
            return;
    }

    if(mGravity != null && mMagnetic != null) {
        updateDirection();
    }
}
Java:
private void updateDirection() {
    float[] temp = new float[9];
    float[] RR = new float[9];

    SensorManager.getRotationMatrix(temp, null, mGravity, mMagnetic);
    SensorManager.remapCoordinateSystem(temp, SensorManager.AXIS_X, SensorManager.AXIS_Z, RR);

    float[] values = new float[3];
    SensorManager.getOrientation(RR, values);

    for (int i=0; i < values.length; i++) {
        Double degrees = (values[i] * 180) / Math.PI;
        values[i] = degrees.floatValue();
    }

    azimuth = values[0];
}
Hat jemand ein paar Tipps, wie ich dies optimieren könnte?

Gruß
 

dsNDesign

Erfahrenes Mitglied
#3
Ja, das hab ich schon gelesen. In seinem Kompass-Beispiel wird dort TYPE_ORIENTATION für den Sensor verwendet. Dies ist jedoch seit API Level 8 deprecated.
 

saftmeister

Nutze den Saft!
Premium-User
#4
Er verwendet aber einen "Trick" um zu schnelle Bewegungen auszugleichen. Dafür wird die lastUpdate-Variable verwendet. Wäre das nicht eine Möglichkeit?
 

dsNDesign

Erfahrenes Mitglied
#5
Das ändert leider relativ wenig. Die "extremen" Sprünge in den Werten sind ja trotzdem noch da. Gut, ich könnte noch einen Mittelwert aus den letzten x Werten bilden, wodurch es besser werden könnte.
Aber ist es normal, dass die Werte, welche ich über diese Methode erhalte, derart schwanken?

Und das Problem mit den noch extremeren Schwankungen (-+100° oder mehr), wenn ich das Gerät schüttle, würde trotzdem bleiben.


Ich hatte gestern es zuerst mit TYPE_ORIENTATION versucht. Damit hatte ich deutlich ruhigere / konstantere Werte erhalten. Dies ist aber ja leider, wie schon gesagt, seit API Lvl 8 deprecated.