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

DSt*_*ens 3 math quaternions orientation sensors

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

现在,如果我在这里正确理解数学,四元数数据I从IMU接收相对于正北方向半角旋转,以便q * north_dir * q_inv = IMU_y_axis(与north_dirIMU_y_axis是用于起见在全局空间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

因此,如果我想知道笔尖的相对旋转(比如说,我需要从第一支笔的笔尖到第二支笔的笔尖的旋转),我需要计算q_r = q_2 * q_rot_z_inv * q_1_inv以便从笔尖获得,这是否正确1 到小费 2 通过计算q_r * q_1?或者在这种情况下围绕 z 轴的“先前”旋转是否无关紧要,我只需要q_r = q_2 * q_1_inv像往常一样计算?

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

Nic*_*ler 6

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

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

转变

在这个图中,我在变换中添加了一个转换(四元数当然不能代表)。这只是为了更清楚地说明这一点。所以,我们有一个向量v。相同的向量可以位于坐标系G或 中I。和变换向量R[G->I] ° v表示vI的坐标系中G。请确保这实际上是您从 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]
Run Code Online (Sandbox Code Playgroud)

以您定义笔的局部坐标系的方式,我们知道它R[I1->P1]是恒等(局部坐标系与 IMU 对齐),即R[I2->P2]绕 z 轴旋转 180°。所以,这简化为:

R[G->P1] = R[G->I1]
R[G->P2] = R[G->I2] * RotateZ(180°)
Run Code Online (Sandbox Code Playgroud)

请注意,z 旋转是在 IMU 的局部坐标系中执行的(在右侧相乘)。我不知道你为什么认为它应该是 90°。这真的是一个180°的旋转。

如果要找到提示之间的相对旋转,首先需要定义旋转应该在哪个坐标系中表示。假设我们想在 的坐标系中表达旋转P1。然后,你想要找到的是一个旋转R[P1->P2],这样

R[G->P1] * R[P1->P2] = R[G->P2]
Run Code Online (Sandbox Code Playgroud)

这解决了

R[P1->P2] = conjugate(R[G->P1]) * R[G->P2]
Run Code Online (Sandbox Code Playgroud)

如果你插入上面的定义,你会得到:

R[P1->P2] = conjugate(R[G->I1]) * R[G->I2] * RotateZ(180°)
Run Code Online (Sandbox Code Playgroud)

就是这样。

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