Question

J'ai une cmrotationMatrix * pourriture et je voudrais obtenir le terrain, lacet, rouler de la matrice. Des idées comment je pourrais faire cela?

merci

Était-ce utile?

La solution

Il est préférable d'utiliser le quaternion que les angles d'Euler .... Les valeurs de rouleau, de pitch et de lacet peuvent être dérivées du quaternion en utilisant ces formules:

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)

Il peut être mis en œuvre comme:

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));

où le radianstodegrees est une directive de préprocesseur implémentée comme suit:

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

Ceci est fait pour convertir les valeurs radianiques données par les formules, en degrés.

Plus d'informations sur la conversion peut être trouvée ici: Tinkerforge et ici: Conversion entre quaternions et angles d'Euler .

Autres conseils

hauteur, yaw, rouleau de la matrice.Des idées comment je pourrais faire cela?

dans quel ordre?Pitch, yaw et rouleau, communément appelé angles d'Euler, ne représentent pas les rotations sans ambiguïté.En fonction de la commande, vous effectuez les sous-rotations individuelles, vous vous retrouvez avec des matrices de rotation complètement différentes.

Ma recommandation personnelle: N'utilisez pas du tout des angles d'Euler, ils appellent simplement des problèmes (numériques).Utilisez une matrice (vous le faites déjà) ou un quaternion.

Je l'ai trouvé moi-même:

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;

        }

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top