SensorManager.getRotationMatrix()
执行以下操作,这是在我发现这一点之前编写的。 我将保留添加的解释,因为如果您想要校正磁北和真北之间的差异,仍然需要它。
大致算法是获取旋转矩阵,将向量[0,0,-1]
乘以它,然后将其调整为您的坐标系。 为什么? Android文档提供了设备和世界的坐标系统
请注意,在Android设备坐标中,[0,0,-1]
指向屏幕向后垂直。 如果您将旋转矩阵R与此向量相乘,则当设备朝上放置在桌子上时,您将在世界坐标中获得[0,0,-1]
。 当它竖直朝北时,您将获得[0,-1,0]
,这表明您选择了一个坐标系,其中x
和y
与Android系统相对交换,但这只是约定的变化。
请注意,R * [0,0,-1]^T
只是R
的第三列取反。 从这里得到伪代码:
getRotationMatrix(R);
Let v = first three elements of third column of R.
swap v[0] and v[1]
这应该可以得到你想要的东西。
下面是关于
getRotationMatrix()
在做什么的附加信息。
需要加速度计数据来确定方向“向下”,并需要磁力计数据来确定方向“向北”。你必须假设加速度计仅感测到重力(设备静止或以稳定速度移动)。然后,您需要将磁力计向量投影到垂直于重力向量的平面上(因为磁场通常不切于地球表面)。这给您两个轴。第三个轴是正交的,因此可以通过叉积计算。这就为您提供了设备系统中的地球坐标向量。看起来你需要的是反过来的:设备坐标在地球坐标中。对此只需构造方向余弦矩阵并求逆即可。
我要补充说明,以上讨论假定磁力计向量指向北。我认为(从高中科学!)实际上是朝磁南方向,但手头没有设备,所以无法尝试。当然,磁北/磁南与真实方向差别为零至180度,具体取决于您在地球上的位置。您可以检索GPS坐标并计算实际偏移量。
如果您不熟悉执行这些操作所需的数学知识,我可以进一步解释,但需要稍后进行。