如何表示二维四元数旋转?

问题描述 投票:0回答:1

我正在 Android Studio Java 中使用两个提供四元数的蓝牙 IMU 进行开发。传感器按以下方式启动:

在所示图像中,这被认为是“零”位置。 注意:XYZ 显示在传感器上。 该位置应在手机屏幕上表示如下:

绿色圆圈代表两个传感器之间的角度差。该圆圈根据传感器的方向移动。橙色圆圈是目标,因此两个圆圈之间的距离就是零位置所示的直线距离。

对于这些传感器,我只关心每个传感器的两次旋转。红色传感器绕 Y 和 Z 旋转,而蓝色传感器绕 X 和 Y 旋转。这两个传感器都可以绕第三轴旋转,但我并不真正关心它。如果绝对必要,这些旋转可以用上图中所示的黑色凹口表示。

我的问题是如何获取传感器给出的四元数并以二维表示它们?例如,旋转如下:

Same as image 1 with the red sensor rotated about Z and Y

将代表:

Phone screen display for a rotation on Z and Y

我尝试过的:在ChatGPT的帮助下(因为我对四元数还有些陌生),我得到了这个方法,它将蓝色圆圈移到橙色上方,使其为零。我不太确定 CGPT 从哪里获得这些转换,但这是我到目前为止所拥有的。

private PointF quaternionTo2D(Quaternion q) { 
   float angleX = (float) Math.atan2(2.0f * (q.w() * q.x() + q.y() * q.z()), 1.0f - 2.0f * (q.x() * q.x() + q.y() * q.y())); 
   float angleY = (float) Math.asin(2.0f * (q.w() * q.y() - q.z() * q.x())); // Mapping angles to screen coordinates 
   float x = (float) Math.sin(angleX); float y = (float) Math.sin(angleY); 
   Log.i("QuaternionTo2D", "Quaternion: " + q + " -> PointF: x=" + x + ", y=" + y); 
   return new PointF(x, y); 
}

我向该方法提供相对旋转四元数,该相对旋转四元数是通过将红色传感器四元数的共轭乘以蓝色传感器四元数计算得出的。

如有任何建议/提示,我们将不胜感激!我还可以澄清任何进一步的细节。

java algorithm math rotation quaternions
1个回答
0
投票

我们需要更多地了解四元数的坐标系。但假设典型的

i
是 x 轴,
j
是 y 轴,
k
是 z 轴,您可以根据右手定则找出每个轴代表的旋转。即
i
是 y-z 旋转,
j
是 z-x 旋转,
k
是 x-y 旋转。

根据您所说的,您需要蓝色传感器的

k
坐标和红色传感器的
i
坐标。这将为您提供两个数字,然后由您决定是否在 UI 中显示它们。

© www.soinside.com 2019 - 2024. All rights reserved.