将表示旋转的四元数从一个坐标系转换为另一个坐标系

Posted

技术标签:

【中文标题】将表示旋转的四元数从一个坐标系转换为另一个坐标系【英文标题】:Convert Quaternion representing rotation from one coordinate system to another 【发布时间】:2013-09-20 00:25:28 【问题描述】:

我从坐标系 Y=up、X=right 和 Z=backs 中的传感器数据中得到一个四元数。我的是 X=forward、Y=right、Z=up。

所以 OX=Y、OY=Z 和 OZ=-X。

我有一个可以将四元数转换为 4by4 矩阵的函数,但不知道从哪里开始。任何帮助将不胜感激。

【问题讨论】:

看起来你可以得到轴/角度,根据需要重新排列坐标,并从中构建一个新的四元数。可能比用矩阵放屁更简单。但我的 3D 数学还远不足以肯定地说。 【参考方案1】:

[X, Y, Z, W] 形式的四元数等价于轴角旋转,其中 W 仅取决于旋转角度(而不是轴),X、Y、Z 是旋转乘以 sin(Angle/2)。由于 X、Y、Z 具有此属性,因此您可以像在它们之间转换 3D 坐标一样交换和否定它们。要将传感器的坐标系转换为您的坐标系,您只需执行以下操作:

MyQuat.X = -SensorQuat.Z MyQuat.Y = SensorQuat.X MyQuat.Z = SensorQuat.Y MyQuat.W = SensorQuat.W

【讨论】:

你能链接任何解释这种数学属性的来源吗? 我注意到您正在从右手系统转换为左手系统。在这种情况下,你会想要否定你的 X Y Z 旋转。所以 MyQuat.X = SensorQuat.Z MyQuat.Y = -SensorQuat.X MyQuat.Z = -SensorQuat.Y MyQuat.W = SensorQuat.W 我认为@Roman 在这里是正确的。虽然 mkimball 正确处理坐标转换,但新系统中的左手旋转意味着我们希望在 MyQuat 中使用“0.5(2*pi - theta)”项,而在 SensorQuat 中使用“0.5*theta”项 如果我的 2 个坐标轴不是相隔 90 度,而是相隔一个复旋转怎么办? (所以不像交换和否定那么简单)这种情况下的一般规则是什么?【参考方案2】:

假设您有两个坐标系 F1 和 F2。为简单起见,假设两者具有相同的起源。现在让,

qo_f1 = orientation of frame F1 as seen from frame F2
qo_f2  = orientation of frame F2 is as seen from F1
q_f1 = some quaternion in F1 frame
q_f2 = q_f1 as seen from F2

那么,

q_f2 = qo_f2 * q_f1 * qo_f2.inverse()

说明

要通过四元数 q 旋转任何内容,您只需执行 q*p*q.inverse()。如果 p 是向量,则首先通过将 w=0 和 x,y,z 设置为与向量相同的方式将其转换为“假”四元数。如果 p 是四元数,那么你很高兴。

【讨论】:

这是迄今为止我看到的最好的解释。你能详细说明如何计算qo_f2吗?例如,我有一个与身体不对齐的 IMU。它有自己的参考系(可能基于北方和重力)。我想要一个参考系,其中第三个轴在重力方向(比如我有重力矢量),其他两个方向并不重要。 什么是“从 F1 看到的框架 F2 的方向”?如果我有F1 作为X=Forward, Y=Left, Z=Up,并且F2X=Right, Y=Down, Z=Backward,那么“从 F1 看到的框架 F2 的方向”是什么?【参考方案3】:

您只需将其乘以 q,这是将点从 Coord2 转换为 Coord1 等价物的四元数。 说明:

q2 * point2 * (q2)^(-1) = (q1 * (q^(-1))) * point2 * (q1 * (q^(-1)))^(-1) 
= q1 * (q^(-1)) * point2 * q * (q1^(-1)) = q1 * ((q^(-1)) * point2 * q) * (q1^(-1))
= q1 * point1_equivalent * (q1^(-1))

【讨论】:

以上是关于将表示旋转的四元数从一个坐标系转换为另一个坐标系的主要内容,如果未能解决你的问题,请参考以下文章

3D计算机图形学变换矩阵欧拉角四元数

四元数

四元数(Quaternion)和旋转

从模型矩阵或四元数中找到最终的世界坐标

Unity四元数和旋转

unity3d的四元数 Quaternion