对齐 IMU 方向,然后获得相对旋转

Align IMU orientations and then get relative rotations

我在两个物体上使用两个相同类型的 IMU(BHI160,即方向是相对于北方并且与北方对齐,IMU 的局部 y 轴指向北方方向),比方说笔,更困难的是,如果我将两个物体平行放置,两个 IMU 的 z 轴都指向上方,但一个 IMU 相对于另一个绕 z 轴旋转 180°。

现在,如果我对这里的数学理解正确,我从 IMU 接收到的四元数数据是相对于北方向的半角旋转,因此 q * north_dir * q_inv = IMU_y_axisnorth_dir并且 IMU_y_axis 是全局 space 中的 3D 向量,或者为了进行此计算而使用纯四元数)。

由于 IMU 的旋转,我假设当两支笔都指向同一方向时,我应该能够将第二支笔的方向计算为 q_2 = q_rot_z * q_1,其中 q_rot_z等于绕 z 轴旋转 90°——根据直觉,如果我将两支笔都指向北方,我将获得笔 2 的 y 轴的全局方向(即笔 1 的 y 轴绕 z 轴旋转180°) 通过计算 q_rot_z * north_dir * q_rot_z_inv

如果我想知道笔尖的相对旋转(比如,我需要从第一支笔尖到第二支笔尖的旋转),我需要计算

=16=] 以便通过计算 q_r * q_1 从技巧 1 到技巧 2?或者在这种情况下绕 z 轴的 "prior" 旋转无关紧要,我只需要像往常一样计算 q_r = q_2 * q_1_inv

编辑: 这基本上是 this question 的扩展,但我想知道相同的答案是否也适用于我的情况,或者在我的情况下是否也需要包括已知的相对 IMU 旋转

让我们一步一步来。您有一个全球坐标系 G,它与北方向对齐。它如何对齐或是否对齐并不重要。

然后我们必须使用各自坐标系 I1I2 的 IMU。坐标系作为从全局系统到局部系统的旋转给出。在下文中,我们将为此使用符号 R[G->I1]。这表示从 GI1 的轮换。如果你用这个旋转变换 G 中的任何向量,你将得到在 G 坐标系中表示的相同向量 G。让我们用 T ° v 表示向量 v 的变换 T。下图说明了这一点:

在这个图中,我在变换中添加了一个平移(四元数当然可以不表示)。这只是为了使这一点更清楚。所以,我们有一个向量 v。同一个向量可以位于坐标系 GI 中。而变换后的向量R[G->I] ° v表示IG坐标系中的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°)

就是这样。

您很可能想要略有不同的东西。这就是我解释得如此详细的原因,因此您将能够相应地修改计算。