对齐 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_axis
(north_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
,它与北方向对齐。它如何对齐或是否对齐并不重要。
然后我们必须使用各自坐标系 I1
和 I2
的 IMU。坐标系作为从全局系统到局部系统的旋转给出。在下文中,我们将为此使用符号 R[G->I1]
。这表示从 G
到 I1
的轮换。如果你用这个旋转变换 G
中的任何向量,你将得到在 G
坐标系中表示的相同向量 G
。让我们用 T ° v
表示向量 v
的变换 T
。下图说明了这一点:
在这个图中,我在变换中添加了一个平移(四元数当然可以不表示)。这只是为了使这一点更清楚。所以,我们有一个向量 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°)
就是这样。
您很可能想要略有不同的东西。这就是我解释得如此详细的原因,因此您将能够相应地修改计算。
我在两个物体上使用两个相同类型的 IMU(BHI160,即方向是相对于北方并且与北方对齐,IMU 的局部 y 轴指向北方方向),比方说笔,更困难的是,如果我将两个物体平行放置,两个 IMU 的 z 轴都指向上方,但一个 IMU 相对于另一个绕 z 轴旋转 180°。
现在,如果我对这里的数学理解正确,我从 IMU 接收到的四元数数据是相对于北方向的半角旋转,因此 q * north_dir * q_inv = IMU_y_axis
(north_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
,它与北方向对齐。它如何对齐或是否对齐并不重要。
然后我们必须使用各自坐标系 I1
和 I2
的 IMU。坐标系作为从全局系统到局部系统的旋转给出。在下文中,我们将为此使用符号 R[G->I1]
。这表示从 G
到 I1
的轮换。如果你用这个旋转变换 G
中的任何向量,你将得到在 G
坐标系中表示的相同向量 G
。让我们用 T ° v
表示向量 v
的变换 T
。下图说明了这一点:
在这个图中,我在变换中添加了一个平移(四元数当然可以不表示)。这只是为了使这一点更清楚。所以,我们有一个向量 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°)
就是这样。
您很可能想要略有不同的东西。这就是我解释得如此详细的原因,因此您将能够相应地修改计算。