es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo convertir un vector de velocidad angular durante un período de tiempo a un cuaternión?

Estoy confundido acerca de cómo convertir ángulos de ejes a cuaterniones. En mi caso, quiero convertir un vector de velocidad angular a un cuaternión.

¿Cómo puedo convertir un vector de velocidad angular sobre un periodo de tiempo a un cuaternión utilizando Eigen?

¿Por qué obtengo resultados diferentes con diferentes métodos? ¡No lo entiendo! 🙂

Editar: Obviamente, algo no me cuadra aquí, ¿no es un vector de velocidad angular multiplicado por un tiempo un vector de ángulo que puede transformarse en un cuaternión?

Utilizando los ángulos xyz = [1 2 3] como entrada, obtengo diferentes resultados.

Matlab:

q = angle2quat(1,2,3, ‘XYZ’)
resultado (wxyz): -0.3689 0.7549 -0.2061 0.5015

Eigen:

auto q = AngleAxisd(1.0, Vector3d::UnitX())
* AngleAxisd(2.0, Vector3d::UnitY())
* AngleAxisd(3.0, Vector3d::UnitZ());

resultado (wxyz): -0.368871 0.754934 -0.206149 0.501509

Enfoque en línea https://math.stackexchange.com/questions/39553/how-do-i-apply-an-angular-velocity-vector3-to-a-unit-quaternion-orientation:

auto delta = 1.0;
auto VectorType angularVelocity(1,2,3);
auto norm = angularVelocity.norm();
auto normt = norm * delta / 2.0;
auto w = cos(normt);
auto v = angularVelocity / norm * sin(normt);
return QuaternionType(w, v.x(), v.y(), v.z());

resultado (wxyz): -0.295551 0.255322 0.510644 0.765966

Conversor en línea https://www.andre-gaschler.com/rotationconverter/ “Eje con magnitud de ángulo (radianes)”:

resultado (wxyz): -0.2955511, 0.2553219, 0.5106437, 0.7659656

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para convertir un vector de velocidad angular a un cuaternión utilizando Eigen, puede utilizar la fórmula q = exp(0.5 * w * dt) donde w es el vector de velocidad angular, dt es la duración del tiempo y exp es la exponencial matricial. Esto se puede implementar en Eigen de la siguiente manera:

    Eigen::Vector3d w(1, 2, 3); // vector de velocidad angular
    double dt = 1.0; // duración del tiempo
    Eigen::Quaterniond q;
    q.vec() = 0.5 * w * dt;
    q.w() = std::sqrt(1.0 - q.vec().squaredNorm());
    q.normalize();
    

    Tenga en cuenta que este método asume que la orientación inicial está alineada con el sistema de coordenadas mundial. Si la orientación inicial es diferente, primero es necesario rotar el vector de velocidad angular al sistema de coordenadas mundial.

    En cuanto a los diferentes resultados obtenidos con diferentes métodos, puede haber varias razones para esto. Una posibilidad es que los métodos utilicen diferentes convenciones para especificar la rotación (por ejemplo XYZ vs ZYX). Otra posibilidad es que puede haber errores en la implementación o los valores de entrada utilizados. Es importante verificar cuidadosamente la documentación y el código para asegurar la consistencia y la precisión.

Comments are closed.