四元数的各个组成部分?
Individual components of a quaternion?
我的系统由一个坐标系组成,这个系统中的四元数以四个值(qx,qy,qz, qw)。
如何将这个四元数分成三个独立的四元数,一个代表横滚,另一个代表俯仰,第三个代表偏航旋转?
谢谢。
听起来你应该提取欧拉角,然后创建 3 个新的四元数,然后以正确的顺序重新组合它们以再次得到原始的四元数。
This PDF has formulas 用于在欧拉和四元数之间手动转换。这些公式适用于 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)));
我的系统由一个坐标系组成,这个系统中的四元数以四个值(qx,qy,qz, qw)。
如何将这个四元数分成三个独立的四元数,一个代表横滚,另一个代表俯仰,第三个代表偏航旋转?
谢谢。
听起来你应该提取欧拉角,然后创建 3 个新的四元数,然后以正确的顺序重新组合它们以再次得到原始的四元数。
This PDF has formulas 用于在欧拉和四元数之间手动转换。这些公式适用于 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)));