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

Math 对齐IMU方向,然后获得相对旋转,math,orientation,sensors,quaternions,Math,Orientation,Sensors,Quaternions,我在两个物体上使用了两个相同类型的IMU(BHI160,即方向相对于北方,与北方对齐,IMU的局部y轴指向北方),比如说笔,如果我将两个物体平行放置,则两个IMU的z轴都向上,但一个IMU相对于另一个IMU绕z轴旋转180° 现在,如果我正确理解了这里的数学,我从IMU接收到的四元数数据是相对于北向的半角旋转,因此q*north\u dir*q\u inv=IMU\u y\u轴(使用north_dir和IMU_y_轴作为全局空间中的三维向量,或者为了进行此计算而使用纯四元数) 由于IMU的旋转,

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

现在,如果我正确理解了这里的数学,我从IMU接收到的四元数数据是相对于北向的半角旋转,因此
q*north\u dir*q\u inv=IMU\u y\u轴
(使用
north_dir
IMU_y_轴
作为全局空间中的三维向量,或者为了进行此计算而使用纯四元数)

由于IMU的旋转,我假设当两支笔指向同一方向时,我应该能够计算出第二支笔的方向为
q_2=q_rot_z*q_1
,其中
q_rot_z
等于绕z轴旋转90°——根据直觉,如果我将两支笔指向北方,我会通过计算
q_rot_z*north_dir*q_rot_z_inv

因此,如果我想知道笔尖的相对旋转(比如,我需要从第一支笔的笔尖到第二支笔的笔尖的旋转),我需要计算
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

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

让我们一步一步地看一下。您有一个全球坐标系
G
,它与北向对齐。它实际上并不匹配ter如何对齐或是否对齐

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

在这幅图中,我在变换中添加了一个平移(四元数当然不能表示)。这只是为了让点更清楚。因此,我们有一个向量
v
。同一个向量可以位于坐标系
G
I
。以及变换后的向量
R[G->I]°v
表示
I
G
坐标系中的
v
。请确保这实际上是从IMU获得的旋转。也有可能得到逆变换(这将是系统变换视图,而我们使用模型变换视图).这在下面的推导中变化不大。因此,我将坚持第一个假设。如果你需要逆,只需相应地调整公式即可

如您所知,可以通过将
v
转换为纯四元数,计算
R*v*共轭(R)
,然后再次将其转换为向量(或在整个过程中使用纯四元数)来完成操作
R°v

现在这些笔开始发挥作用了。这支笔有一个固有的坐标系,你可以任意定义。从你的描述来看,似乎你想定义它,使笔的局部y轴指向笔尖。因此,每支笔都有一个额外的坐标系,具有相应的旋转
R[I1->P1]
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°旋转)我从未真正弄清楚的是,为什么这与直接四元数乘法不一致,因为我认为从技术上讲
R[P1->P2] = conjugate(R[G->I1]) * R[G->I2] * RotateZ(180°)