SensorManager.getRotationMatrix()
做了下面概述的,在我发现之前写的。我会留下附加的解释,因为如果你想纠正磁北和真北之间的差异,你仍然需要它。
粗略的算法是获取旋转矩阵,将向量乘以[0,0,-1]
它,然后将其调整到您的坐标系。为什么?Android 文档给出了设备和世界的坐标系
注意[0,0,-1]
Android 设备坐标点垂直向后远离屏幕。如果您将旋转矩阵 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 坐标并计算实际偏移量。
如果您不熟悉执行这些操作所需的数学,我可以进一步解释,但必须稍后再说。