Utilizzo i sensori di gravità e di campo magnetico di Android per calcolare l'orientamento tramite SensorManager.getRotationMatrix e SensorManager.getOrientation. Questo mi dà i numeri di azimuth, pitch e orientation. I risultati sembrano sensati quando il dispositivo è appoggiato su un tavolo.Come devo calcolare azimuth, pitch, orientation quando il mio dispositivo Android non è piatto?
Tuttavia, ho disabilitato le interruzioni tra verticale e orizzontale nel manifest, in modo che getWindowManager(). GetDefaultDisplay(). GetRotation() sia sempre zero. Quando ruoto il dispositivo di 90 gradi in modo che sia in verticale, corro nei guai. A volte i numeri sembrano sbagliati, e ho capito che questo si riferisce a Gimbal lock. Tuttavia, altre app non sembrano avere questo problema. Ad esempio, ho confrontato la mia app con due app di test del sensore gratuite (Sensor Tester (Dicotomica) e Sensor Monitoring (R's Software)). La mia app è d'accordo con queste app quando il dispositivo è piatto, ma quando ruoto il dispositivo in posizione verticale possono esserci differenze significative. Le due app sembrano concordare l'una con l'altra, quindi come fanno a risolvere questo problema?
Sfortunatamente questo non funziona per la matrice di rotazione che ho ricevuto da 'SensorManager.getRotationMatrixFromVector' (usando il sensore' TYPE_ROTATION_VECTOR'). Quando calcolo 'double a = Math.toDegrees (Math.atan ((r [1] - r [3])/(r [0] + r [4])));' (dove r è la matrice di rotazione) Finisco sempre con angoli di -90 <= 'a' <= 90 – Zardoz