对于 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 上找到与我的问题完全相同的副本 -如何获得磁场矢量,与设备旋转无关?- 但不幸的是,答案包含我的建议,并且该问题的 OP 确认它们不起作用。