【发布时间】:2012-11-01 21:32:39
【问题描述】:
对于 Android 应用程序,我需要跨全球(世界)坐标系的轴进行磁场测量。以下是我将如何(猜测)实现这一点。如有必要,请纠正我。另外,请注意,问题是关于任务的算法部分,而不是关于传感器的 Android API - 我对后者有经验。
第一步是获取TYPE_MAGNETIC_FIELD传感器数据(M)和TYPE_ACCELEROMETER传感器数据(G)。第二个应该根据Android的文档使用,但我不确定它是否不应该是TYPE_GRAVITY(同样是G),因为加速度计似乎提供的不是纯粹的重力。
下一步是通过getRotationMatrix(R, I, G, M)得到旋转矩阵,其中R和I分别是旋转和倾角矩阵。
现在是最值得怀疑的部分:为了将M 向量转换为世界坐标系,我想乘以[R * I] * M。
我不确定这是将磁场读数转换为另一个基础的正确方法。另外,我不知道是否应该使用remapCoordinateSystem 另外或作为替代上面的东西。
如果已经存在一些可以执行此操作的源代码,我会很高兴发布一个链接,但我不想为这个特定任务使用大型通用库(例如,用于增强现实支持),因为我想让它尽可能简单。
附言
为了清晰起见,我想在原始帖子中添加一些信息。
让我们假设一个设备放在一张桌子上,并不断地从它的磁传感器中读取数据。每个测量值包含 3 个值,表示 X、Y、Z 轴上的磁场,它们是设备的局部坐标系。我认为我可以忽略环境场波动(通过低通滤波器平滑),所以这 3 个值应该在设备保持在原位的所有时间内保持几乎相同。如果我们围绕任何轴旋转设备,值会改变,因为我们改变了局部坐标系。但是该字段本身实际上并没有改变。所以我想将本地 X、Y、Z 场测量转换为这样的 X'、Y'、Z',只要设备没有从其位置移动(仅旋转),它们就会保持各自的值而不管设备旋转。
我已经实现了上面描述的算法,并且通过建议的转换获得了值 X'、Y'、Z' 的规律和显着变化,所以它有问题。
附言
有时我在 SO - How can I get the magnetic field vector, independent of the device rotation? 上找到了我的问题的完全相同的副本 - 但不幸的是,答案包含我的建议,并且该问题的 OP 确认它们不起作用。
【问题讨论】:
-
我不相信这是可能的。重力只会将设备方向固定在一个轴上,因此您可以了解真实世界,但设备仍可能指向平原内的任何方向...
-
这就是为什么Android使用2个传感器的组合:重力和磁力,所以设备的方向是完全已知的,磁场在设备的坐标系中也是已知的。如果你在一个基础上有一个向量,你绝对可以把它转换成另一个。
-
只有当磁场始终与真北对齐时,它才不是……更不用说局部干扰了。我以为你是在将真实测量的磁场映射到世界坐标之后,这样你就可以测量局部变化了。
-
不幸的是,您似乎没有按照我的任务。我需要测量场的局部属性(在兴趣点),它们必须绑定到全局坐标系。只有作为平均值的附加值,变化才有意义。
-
您可以在 Android 开发者 官方网站上找到答案:SensorEvents Android Official
标签: android coordinates sensors magnetometer