Kompass-Richtung ist unterschiedlich je nach Telefon Orientierung
Meine augmented-reality-app muss die Kompassrichtung von der Kamera-Ansicht, und es gibt viele Beispiele, immer die Richtung, aus der sensormanager.
Aber ich finde die daraus resultierenden unterschiedlichen Wert je nach Telefon Orientierung - Querformat gedreht nach rechts ist etwa 10 Grad unterschiedlichen auf Querformat gedreht nach Links (Unterschied zwischen ROTATION_0 und ROTATION_180 ist weniger, aber immer noch anders). Dieser Unterschied ist ausreichend ruinieren jede AR-Effekt.
Ist es etwas zu tun mit der Kalibrierung? (Ich bin nicht überzeugt, ich mache die Abbildung von 8 richtig - ich habe versucht, verschiedene Möglichkeiten, die ich auf youtube gefunden habe).
Irgendwelche Ideen, warum es einen Unterschied? Habe ich versaut bis auf die rotation matrix-Zeug? Ich habe die option, die Einschränkung der Anwendung nur für eine einzige Orientierung, aber es beschäftigt mich immer noch, dass der Kompass immer noch nicht sehr präzise (auch wenn nach dem filtern ist es ziemlich stabil)
public void onSensorChanged(SensorEvent event) {
if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {
return;
}
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) mGravity = event.values;
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mGeomagnetic = event.values;
if (mGravity != null && mGeomagnetic != null) {
float[] rotationMatrixA = mRotationMatrixA;
if (SensorManager.getRotationMatrix(rotationMatrixA, null, mGravity, mGeomagnetic)) {
float[] rotationMatrixB = mRotationMatrixB;
Display display = getWindowManager().getDefaultDisplay();
int deviceRot = display.getRotation();
switch (deviceRot)
{
//portrait - normal
case Surface.ROTATION_0: SensorManager.remapCoordinateSystem(rotationMatrixA,
SensorManager.AXIS_X, SensorManager.AXIS_Z,
rotationMatrixB);
break;
//rotated left (landscape - keys to bottom)
case Surface.ROTATION_90: SensorManager.remapCoordinateSystem(rotationMatrixA,
SensorManager.AXIS_Z, SensorManager.AXIS_MINUS_X,
rotationMatrixB);
break;
//upside down
case Surface.ROTATION_180: SensorManager.remapCoordinateSystem(rotationMatrixA,
SensorManager.AXIS_X, SensorManager.AXIS_Z,
rotationMatrixB);
break;
//rotated right
case Surface.ROTATION_270: SensorManager.remapCoordinateSystem(rotationMatrixA,
SensorManager.AXIS_MINUS_Z, SensorManager.AXIS_X,
rotationMatrixB);
break;
default: break;
}
float[] dv = new float[3];
SensorManager.getOrientation(rotationMatrixB, dv);
//add to smoothing filter
fd.AddLatest((double)dv[0]);
}
mDraw.invalidate();
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, diese
Müssen Sie nicht die switch-Anweisung, es scheint eine Menge Verwirrung über getRotationMatrix, remapCoordinateSystem und getOrientation von stackoverflow Fragen.
Wahrscheinlich werde ich schreiben, eine detaillierte Erklärung dieser in der nahen Zukunft.
SensorManager.remapCoordinateSystem
ist die Lösung. Danke.Hoan-die Antwort ist tatsächlich falsch, weil es nicht berücksichtigt, für die display-rotation. Diese ist die richtige Antwort.