调整IMU方向并获取相对旋转

4
我正在使用两个相同类型的IMUs(BHI160,即方向相对于北方且与北方对齐,IMU的本地y轴指向北方)在两个物体上,假设是笔,增加了一个困难,即如果我将两个物体平行放置,则两个IMU的z轴都指向上方,但是一个IMU相对于另一个绕z轴旋转180度。
现在,如果我正确理解这里的数学,我从IMU接收到的四元数数据是相对于北方方向的半角旋转,因此q * north_dir * q_inv = IMU_y_axis(其中north_dirIMU_y_axis是全局空间中的3D向量,或者为了计算的简便,是纯四元数)。
由于IMUs的旋转,我会认为当两支笔指向同一方向时,我应该能够计算出第二支笔的方向为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从tip 1到tip 2吗?或者在这种情况下,“先前”的绕z轴旋转无关紧要,我只需要像往常一样计算q_r = q_2 * q_1_inv
编辑: 这基本上是这个问题的扩展,但我想知道同样的答案是否也适用于我的情况,或者在我的情况下是否需要包括已知的相对IMU旋转。
1个回答

7
让我们一步一步来。您有一个全局坐标系 G,它与北方方向对齐。它的对齐方式并不重要,或者根本不需要对齐。
然后,我们有两个带有各自坐标系 I1I2 的 IMU。坐标系是从全局系统到本地系统的旋转给出的。在以下内容中,我们将使用符号 R[G->I1] 表示此旋转。这表示从 GI1 的旋转。如果您使用此旋转将 G 中的任何矢量转换为 I1 中的矢量,则会得到以 G 坐标系表示的 I1。用变换 T 变换矢量 v 的变换记为 T ° v。以下图示说明了这一点:

Transform

在这个图中,我添加了一个转换的翻译(四元数当然无法表示)。这只是为了使观点更清晰。所以,我们有一个向量v。同一向量可以位于坐标系GI中。而变换后的向量R[G->I] ° v表示I中的vG的坐标系中。请确保这实际上是从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°)

我明白了。

很可能你想要的略有不同。这就是为什么我详细解释,以便您能够相应地修改计算。


哇,那是一个详尽的回答 - 非常感谢!关于我对90°/180°旋转的困惑:据我的理解,如果你想用四元数将向量v绕特定轴旋转180°,那么四元数需要使用90°作为角度构造,因为q * v * inv(q)实际上将这个角度应用了两次(导致了180°的旋转)。我从来没有真正明白的是,为什么这与直接的四元数乘法有些不一致,因为我认为从技术上讲,乘积q1 * q_rot再次被隐式地用于旋转例如y轴。 - Sty
描述旋转角度为a的四元数确实包含了cos(a/2)sin(a/2)这些术语。然而,它仍然是一个旋转a的四元数(只是以不同的方式编码)。这种编码也是“°”运算符使用两次四元数的原因之一。最终,(单位)四元数描述了某个轴线上的某个角度的旋转。在内部,它被以不同的方式编码。但是,除非您想要进行一些简单库不支持的复杂数学计算,否则这不应该成为问题。 - Nico Schertler
啊,所以我的困惑主要在于术语?也就是说,通过 RotateZ(180°) 你指的是一个四元数,你会从指定一个角度和一个轴来获得它,在这个例子中是180°和z轴,但在内部,这将导致计算具有不同分量的90°角的 cossin 的四元数 - 是这样吗? - Sty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接