四元数的各个组成部分?

时间:2016-07-27 16:02:43

标签: quaternions

我的系统由坐标系组成,此系统中的四元数表示四个值(qx,qy,qz,qw)形式的滚动(约x),俯仰(约y)和偏航(约z) 。

如何将此四元数分成三个独立的四元数,使得一个代表滚动,另一个代表音高,第三个代表偏航旋转?

谢谢。

1 个答案:

答案 0 :(得分:0)

听起来你应该提取欧拉角,然后创建3个新的四元数,然后按正确的顺序重新组合它们,再次到达原始的四元数。

This PDF has formulas用于手动转换Euler和Quaternion。公式以YPR格式工作,而不是您的RPY。你能用它们吗?

这里用C:

实现
/* euler_2_quaternion_ZYX */

quat->w = cos(az / 2.0f) * cos(ay / 2.0f) * cos(ax / 2.0f) + sin(az / 2.0f) * sin(ay / 2.0f) * sin(ax / 2.0f);
quat->x = cos(az / 2.0f) * cos(ay / 2.0f) * sin(ax / 2.0f) - sin(az / 2.0f) * sin(ay / 2.0f) * cos(ax / 2.0f);
quat->y = cos(az / 2.0f) * sin(ay / 2.0f) * cos(ax / 2.0f) + sin(az / 2.0f) * cos(ay / 2.0f) * sin(ax / 2.0f);
quat->z = sin(az / 2.0f) * cos(ay / 2.0f) * cos(ax / 2.0f) - cos(az / 2.0f) * sin(ay / 2.0f) * sin(ax / 2.0f);



/* quaternion_2_euler_ZYX */

float qx, qy, qz, qw;

qw = quat->w;
qx = quat->x;
qy = quat->y;
qz = quat->z;

*az = atan2(qy * qz + qw * qx, 0.5f - ((qx * qx) + (qy * qy)));
*ay = asin(-2.0f * ((qx * qz) - (qw * qy)));
*ax = atan2(((qx * qy) + (qw * qz)), 0.5f - ((qy * qy) + (qz * qz)));