Domanda

Ho un CMRotationMatrix *rot e vorrei ottenere il beccheggio, l'imbardata e il rollio dalla matrice.Qualche idea su come potrei farlo?

Grazie

È stato utile?

Soluzione

È meglio usare il quaternione che gli angoli di Eulero....I valori di rollio, beccheggio e imbardata possono essere derivati ​​dal quaternione utilizzando queste formule:

roll  = atan2(2*y*w - 2*x*z, 1 - 2*y*y - 2*z*z)
pitch = atan2(2*x*w - 2*y*z, 1 - 2*x*x - 2*z*z)
yaw   =  asin(2*x*y + 2*z*w)

Può essere implementato come:

CMQuaternion quat = self.motionManager.deviceMotion.attitude.quaternion;
myRoll = radiansToDegrees(atan2(2*(quat.y*quat.w - quat.x*quat.z), 1 - 2*quat.y*quat.y - 2*quat.z*quat.z)) ;
myPitch = radiansToDegrees(atan2(2*(quat.x*quat.w + quat.y*quat.z), 1 - 2*quat.x*quat.x - 2*quat.z*quat.z));
myYaw = radiansToDegrees(asin(2*quat.x*quat.y + 2*quat.w*quat.z));

dove radianstoDegrees è una direttiva del preprocessore implementata come:

#define radiansToDegrees(x) (180/M_PI)*x

Questo viene fatto per convertire i valori in radianti forniti dalle formule in gradi.

Maggiori informazioni sulla conversione possono essere trovate qui:tinkerforge e qui:Conversione tra quaternioni e angoli di Eulero.

Altri suggerimenti

pitch, imbardata, rotolare dalla matrice. Qualche idea su come potrei farlo?

In quale ordine? Il pitch, imbardata e rollio, comunemente chiamati angoli di Eulero, non rappresentano le rotazioni in modo inequivocabile. A seconda dell'ordine in cui esegui le singole sotto-rotazioni, finisci con matrici di rotazione completamente diverse.

La mia raccomandazione personale: non usare affatto gli angoli di Euler, richiedono solo problemi (numerici). Usa una matrice (lo fai già) o un quaternione.

Ho scoperto me stesso:

CMAttitude *currentAttitude = motionManager.deviceMotion.attitude;    

        if (currentAttitude == nil)
        {
            NSLog(@"Could not get device orientation.");
            return;
        }
        else {
            float PI = 3.14159265;
            float yaw = currentAttitude.yaw * 180/PI;
            float pitch = currentAttitude.pitch * 180/PI;
            float roll = currentAttitude.roll * 180/PI;

        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top