Estoy tratando de rotar un objeto 45 grados usando cuaterniones sobre el Eje-Y.
Después de Especificar el Quaternion estoy tratando de obtener la Matriz de Rotación. Pero los valores que veo es incorrecto

Eigen::Quaterniond q;
q.x() = 0;
q.y() = 1;
q.z() = 0;
q.w() = PI/8;    //Half of the rotation angle must be specified, even IDK why

Eigen::Matrix3d R = q.normalized().toRotationMatrix();
std::cout << "R=" << std::endl << R << std::endl;

De SALIDA :

R=
-0.732    -0   -0.680
     0     1       -0
 0.680     0   -0.732


Desde el OpenGL Matriz de Rotación a lo largo del Eje Y debe ser :

Cuaterniones a la Matriz de Rotación, incorrecta valores Eigen de la Biblioteca

Por lo tanto mi espera la salida debe ser :

R=
 0.707     0    0.707
     0     1        0
-0.707     0    0.707

No sólo son los valores fuera por un pequeño por ciento incorrecto de los signos de los valores están causando algunos inesperados giros. Debido a los signos negativos de mi cubo está haciendo un giro de 180 grados, más el ángulo especificado. He roto mi cabeza esta para todo el día. ¿Alguien decirme qué estoy haciendo mal ?

  • 45 grados es pi / 4
  • No sé nada sobre cuaterniones, pero sí sé que 𝜋/8 corresponde a 22.5°. 45° es 𝜋/4.
  • Aún no sé por qué, pero usted tiene que especificar la mitad del ángulo. Así que Si tengo que rotar por PI/4 tengo que especificar como PI/8
  • Ah, sí, eso es cierto – se olvidó por completo de que no han utilizado quats en como 5 años. De dónde viene tu definición de PI vienen? Cómo es exacto es?
  • Su bastante precisa const double PI = 3.1415926535;
  • Yo implementada en la realidad de mi propia Cuaterniones clase a primera. Pensé que mi aplicación debe ser malo. Pero entonces, incluso el Nombre de la Biblioteca parece dar el mismo resultado.
  • bueno, yo diría que es todavía tendría sentido utilizar una más precisa de <cmath> para evitar cualquier error de acumulación.
  • Oh, espera, la w, x, y, z las coordenadas no están definidos como de inicializar ellos – debe definirse como se muestra aquí – es decir,w = cos(theta/2), x = axis_x * sin(theta / 2), y = axis_y * sin(theta / 2), z = axis_z * sin(theta / 2). O, alternativamente, en nombre, el uso de este constructor Quaternion (const AngleAxisType &aa)

InformationsquelleAutor DollarAkshay | 2016-04-08

1 Comentario

  1. 11

    La forma de inicializar los cuaterniones es incorrecta. Si usted directamente inicializar las coordenadas de los cuaterniones, usted debe tomar el definición en cuenta:

    Cuaterniones a la Matriz de Rotación, incorrecta valores Eigen de la Biblioteca

    Alternativamente, el Quaternion clase en Eigen proporciona un constructor de una eje angular de la representación.

    Este código:

    #include <Eigen/Geometry>
    #include <iostream>
    
    void outputAsMatrix(const Eigen::Quaterniond& q)
    {
        std::cout << "R=" << std::endl << q.normalized().toRotationMatrix() << std::endl;
    }
    
    void main()
    {
        auto angle = M_PI / 4;
        auto sinA = std::sin(angle / 2);
        auto cosA = std::cos(angle / 2);
    
        Eigen::Quaterniond q;
        q.x() = 0 * sinA;
        q.y() = 1 * sinA;
        q.z() = 0 * sinA;
        q.w() = cosA;    
    
        outputAsMatrix(q);
        outputAsMatrix(Eigen::Quaterniond{Eigen::AngleAxisd{angle, Eigen::Vector3d{0, 1, 0}}});
    }

    salidas de lo que usted espera:

    R=
     0.707107         0  0.707107
            0         1         0
    -0.707107         0  0.707107
    R=
     0.707107         0  0.707107
            0         1         0
    -0.707107         0  0.707107

Dejar respuesta

Please enter your comment!
Please enter your name here