我在两个对象上使用了两个相同类型的IMU (BHI160,即方向相对于北方并与北方对齐,IMU的局部y轴指向北方方向),比方说笔,更困难的是,如果我将两个对象平行放置,两个IMU的z轴都指向上方,但一个IMU相对于另一个绕z轴旋转180°。
现在,如果我正确理解了这里的数学,我从IMU收到的四元数数据是相对于北方向的半角度旋转,所以q * north_dir * q_inv = IMU_y_axis ( north_dir和IMU_y_axis是全局空间中的3D矢量,或者为了计算的目的,是纯四元数)。
由于IMU的旋转,我假设当两支笔指向相同的方向时,我应该能够计算出第二支笔的方向为q_2 = q_rot_z * q_1,其中q_rot_z等于绕z轴旋转90°--遵循这样的直觉,如果我将两支笔都指向北方,我将通过计算q_rot_z * north_dir * q_rot_z_inv获得笔2的y轴的全局方向(即笔1的y轴绕z轴旋转180°)
因此,如果我想知道笔尖的相对旋转(例如,从第一个笔尖到第二个笔尖的旋转),我需要计算q_r = q_2 * q_rot_z_inv * q_1_inv,以便通过计算q_r * q_1从笔尖1到笔尖2,这是正确的吗?或者,在这种情况下,围绕z轴的“先前”旋转并不重要,我只需要像往常一样计算q_r = q_2 * q_1_inv?
编辑:这基本上是this question的一个扩展,但我想知道同样的答案是否也适用于我的情况,或者在我的情况下是否需要包括已知的相对IMU旋转
发布于 2017-08-29 02:08:06
让我们一步一步地来了解一下。您有一个全球坐标系G,它与北向对齐。它如何对齐或是否对齐都无关紧要。
然后,我们必须使用它们各自的坐标系I1和I2进行IMU。坐标系是从全局坐标系到局部坐标系的旋转。在下面的代码中,我们将使用符号R[G->I1]。这表示从G到I1的旋转。如果使用此旋转变换G中的任何向量,则将获得以坐标系G表示的I1中的相同向量。让我们用T ° v来表示具有transform T的向量v的变换。下图说明了这一点:

在这个图中,我向变换中添加了一个平移(四元数当然不能表示)。这只是为了让这一点更清晰。所以,我们有一个矢量v。相同的向量可以位于G或I坐标系中。变换后的向量R[G->I] ° v表示I在G坐标系中的v。请确保这实际上是你从IMU得到的旋转。您也可以得到反向转换(这将是系统转换视图,而我们使用的是模型转换视图)。这在以下派生中几乎没有变化。因此,我将坚持第一个假设。如果需要反转,只需相应地调整公式即可。
正如您已经知道的,操作R ° v可以通过将v转换为纯四元数,计算R * v * conjugate(R),然后再次将其转换为向量(或者在整个过程中使用纯四元数)来完成。
现在,钢笔开始发挥作用了。钢笔有一个内部坐标系,您可以任意定义它。从您的描述中,您似乎希望定义它,使钢笔的局部y轴指向笔尖。因此,我们每支笔都有一个额外的坐标系和相应的旋转R[I1->P1]和R[I2->P2]。我们可以连接旋转以找到全局方向(*是四元数乘法):
R[G->P1] = R[G->I1] * R[I1->P1]
R[G->P2] = R[G->I2] * R[I2->P2]按照您定义画笔的局部坐标系的方式,我们知道R[I1->P1]是身份(局部坐标系与IMU对齐),R[I2->P2]是绕z轴旋转180°。因此,这可以简化为:
R[G->P1] = R[G->I1]
R[G->P2] = R[G->I2] * RotateZ(180°)请注意,z旋转是在IMU的本地坐标系中执行的(它在右侧相乘)。我不知道你为什么认为它应该是90°。它实际上是180°的旋转。
如果要查找两个尖端之间的相对旋转,首先需要定义应在哪个坐标系中表示旋转。假设我们想要在P1的坐标系中表示旋转。然后,您要查找的是一个旋转R[P1->P2],这样
R[G->P1] * R[P1->P2] = R[G->P2]这就解决了
R[P1->P2] = conjugate(R[G->P1]) * R[G->P2]如果你插入上面的定义,你会得到:
R[P1->P2] = conjugate(R[G->I1]) * R[G->I2] * RotateZ(180°)就是这样。
很可能你想要一些稍微不同的东西。这就是我如此详细地解释它的原因,因此您将能够相应地修改计算。
https://stackoverflow.com/questions/45917547
复制相似问题