2015-07-28 1 views
2

J'essaie de créer un quaternion, de le faire tourner autour d'Euler-Angles et de le transformer en angles d'Euler. J'utilise Eigen. Convertir d'Euler en Quaternion et vice versa fonctionne très bien, mais quand je tourne autour de l'angle d'inclinaison mes valeurs sont environ 20 - 50%. Par exemple quand j'essaye de tourner de 0,0,0 à 90,50,60 j'obtiens x: 75,5 y: 103,13, z: 78,46. Des idées où je prends le mauvais virage? J'utilise la convention 102/YXZ. j'ai essayé de l'implémenter comme décrit ici: Rotate a quaternion by Euler angles input.Faire pivoter un quaternion avec des angles d'Euler en utilisant Eigen

Vector3f retVector; 
    Matrix3f rotFromMat, qautRotMatrix; 

const auto fromPitch = xFrom*M_PI/360; 
const auto fromYaw = zFrom*M_PI/360; 
const auto fromRoll = yFrom*M_PI/360; 



rotFromMat = AngleAxisf(fromRoll, Vector3f::UnitY()) 
    * AngleAxisf(fromPitch, Vector3f::UnitX()) 
    * AngleAxisf(fromYaw, Vector3f::UnitZ()); 
Quaternionf fromQuat(rotFromMat); 

    fromQuat.normalize(); 

    fromQuat = fromQuat * AngleAxisf(yTo, Vector3f::UnitY()); 
    fromQuat = fromQuat * AngleAxisf(xTo, Vector3f::UnitX()); 
    fromQuat = fromQuat * AngleAxisf(zTo, Vector3f::UnitZ()); 


    qautRotMatrix = fromQuat.toRotationMatrix(); 

    retVector = quatRotMatrix.eulerAngles(1, 0, 2); 
    retVector *= 360/M_PI; 

    return retVector; 
+0

Lorsque vous faites pivoter de 90 degrés dans un axe quelconque dans euler-angle, un phénomène appelé «blocage de cardan» apparaît, et cela crée un comportement inattendu. L'avez-vous manipulé? –

+0

Je convertis la matrice de rotation en quaternion avec "Quaternionf fromQuat (rotFromMat);" avant de tourner. La serrure de cardan devrait être aucun problème. –

Répondre

1

Vous n'avez pas donné suffisamment de détails sur la façon de le reproduire.

Mais je peux dire voir deux erreurs: * Le rapport entre les degrés et radian est 180/PI et non 360/PI. * Votre ordre de rotation est erroné! Le côté gauche tourne le côté droit:

fromQuat = AngleAxisf(...) * fromQuat; 

de la date que je peux deviner vous résolvez déjà, je commente ici pour les nouveaux téléspectateurs