【问题标题】:Individual components of a quaternion?四元数的各个组成部分?
【发布时间】:2016-07-27 16:02:42
【问题描述】:

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

如何将这个四元数分成三个独立的四元数,一个代表滚动,另一个代表俯仰,第三个代表偏航旋转?

谢谢。

【问题讨论】:

  • 这听起来像是一个比编程问题网站更适合math.stackexchange.com 的问题。
  • 既然都是栈交换网站,那么有没有办法转移Q?
  • 只需将其转换为欧拉天使表示
  • 我觉得应该有一个我可以对四元数本身执行的操作以使其组件围绕某个轴?
  • “围绕某个轴的四元数分量”在没有固定应用旋转顺序的情况下没有多大意义,因为 R3 中的旋转不是可交换的(四元数乘法也是如此)。所以我想你想把你的quat分解成q1*q2*q3,其中q1、q2、q3代表围绕你的固定轴的旋转。从你的 quat 中找到欧拉角是一个实用的解决方案。

标签: quaternions


【解决方案1】:

听起来你应该提取欧拉角,然后创建 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)));

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多