2016-02-03 1 views
0

J'essaie de comprendre la fonction "eulerAngles" de la bibliothèque Eigen, et j'ai un code de test qui n'a pas de sens. Mon test consiste à déterminer si l'appel de la fonction Euler "eulerAngles (0, 1, 2)" correspond à une séquence Euler "XYZ" de la trame statique. Pour la multiplication matricielle majeure de la colonne d'Eigen, elle devrait correspondre à "Z * Y * X". Je l'ai confirmé avec quelques tests simples, mais pour les angles négatifs autour de l'axe X, je ne comprends pas les résultats. Au lieu d'utiliser un constructeur Angle Euler 3, j'utilise la fonction « AngleAxisd »:Eigen Library Euler Ordre séquençage

rot3x3 = AngleAxisd(-M_PI, Vector3d::UnitX()); 
Vector3d vec = rot3x3.eulerAngles(0, 1, 2); 

Pour des angles positifs autour de l'axe X, il fonctionne de la façon dont je pense. Pour l'angle -M_PI (équivalent à 180 degrés), je vois les suivantes:

Euler angles: -0, 3.14159, -3.14159 

Je pense que le premier élément du tableau à proximité -π, et les deux autres à être proche de zéro. Je m'attends à ce que la plage du premier et du dernier angles soit ± π et l'angle médian à ± π/2. L'angle médian est hors de portée. Le programme est ci-dessous:

#include "stdafx.h" 
#include <iostream> 
#include "<Eigen\Dense" 
#include "<unsupported\Eigen\MatrixFunctions" 

using namespace std; 
using namespace Eigen; 

int main(int argc, char* argv[]) 
{ 
    Matrix3d rot3x3; 

    rot3x3 = AngleAxisd(-M_PI, Vector3d::UnitX()); 
    cout << "Here is rot3x3:" << endl << rot3x3 << endl << endl; 

    Vector3d vec = rot3x3.eulerAngles(0, 1, 2); // => 1-2-3 => XYZ => Z*Y*X 
    cout << "Euler angles: " << vec.x() << ", " 
          << vec.y() << ", " 
          << vec.z() << endl << endl; 
    system("pause"); 
    return 0; 
} 

la sortie est:

Here is rot3x3: 
     1    0    0 
     0   -1 1.22465e-016 
     0 -1.22465e-016   -1 

Euler angles: -0, 3.14159, -3.14159 

Ce résultat est équivalent à un -π autour de l'axe X (et il est identique à une rotation π positive autour de X axe aussi bien). L'angle médian ne devrait-il pas être dans la plage équivalente à ± 90 degrés?

Répondre

0

Les angles d'Euler ne sont pas définis de manière unique. En cas d'ambiguïté, eulerAngles choisit toujours la solution qui minimise les premiers angles. Voir également les entrées de bogue suivantes pour les discussions connexes: 609, 801, 947.