1

对于 Android 应用程序,我需要跨全球(世界)坐标系的轴进行磁场测量。以下是我将如何(猜测)实现这一点。如有必要,请纠正我。另外,请注意,问题是关于任务的算法部分,而不是关于传感器的 Android API - 我对后者有经验。

第一步是获取TYPE_MAGNETIC_FIELD传感器数据(M)和TYPE_ACCELEROMETER传感器数据(G)。第二个应该根据 Android 的文档使用,但我不确定它是否不应该TYPE_GRAVITY代替(再次作为G),因为加速度计似乎提供的不是纯重力。

下一步是通过 获得旋转矩阵getRotationMatrix(R, I, G, M),其中RI是相应的旋转和倾斜矩阵。

现在是最值得怀疑的部分:为了将M向量转换为世界坐标系,我想乘以[R * I] * M.

我不确定这是将磁场读数转换为另一个基础的正确方法。另外,我不知道是否remapCoordinateSystem应该补充替代上述内容。

如果已经存在一些可以执行此操作的源代码,我将不胜感激发布链接,但我不想为这个特定任务使用大型通用库(例如,用于增强现实支持),因为我会喜欢让它尽可能简单。

附言

为了清楚起见,我想到在原始帖子中添加一些信息。

让我们假设一个设备放在桌子上并不断地从它的磁传感器中读取数据。每个测量值包含 3 个值,表示 X、Y、Z 轴上的磁场,它们是设备的局部坐标系。我认为我可以忽略环境场波动(通过低通滤波器平滑),因此这 3 个值应该在设备保持在原位时几乎保持不变。如果我们围绕任何轴旋转设备,值会改变,因为我们改变了局部坐标系。但是该字段本身实际上并没有改变。因此,我想将本地 X、Y、Z 场测量值转换为这样的 X'、Y'、Z',只要设备没有从其位置移动(仅旋转),无论设备旋转如何,它们都会保持各自的值。

我已经实现了上面描述的算法,并且通过建议的转换获得了值 X'、Y'、Z' 的规律和显着变化,所以它有问题。

聚苯乙烯

有时我会在 SO 上找到与我的问题完全相同的副本 -如何获得磁场矢量,与设备旋转无关?- 但不幸的是,答案包含我的建议,并且该问题的 OP 确认它们不起作用。

4

2 回答 2

1

M 相对于单词坐标的坐标就是乘法R*M

旋转矩阵 R 在数学上是基矩阵从设备坐标到字坐标的变化。设XYZ为设备坐标基础,W_1W_2W_3为字坐标基础,则
M = m_1 X + m_2 Y + m_3
以及
M = c_1 W_1 + c_2 W_2 + c_3 W_3
其中R * (m_1, m_2, m_3) = (c_1, c_2, c_3) 转置。

低通滤波器仅用于滤除XY方向的加速度。RemapCoordinateSystem用于改变基的顺序,即从W_1、W_2、W_3变为W_1、W_3、W_2。

于 2012-11-14T05:50:14.567 回答
0

设备上的磁力计传感器返回设备坐标中的 3 向量。您可以使用 getRotationMatrix() 获取一个矩阵,该矩阵可用于将该设备坐标向量转换为世界坐标。您还可以了解四元数并直接使用 TYPE_ROTATION_VECTOR。但是,Android 中没有 Quaternion 库(据我所知),这是超出此问题范围的讨论。

但是,这对您没有任何好处,因为设备方向信息部分基于磁力计的值。换句话说,设备总是会告诉你磁矢量正对着北方。

现在,你可以做的是磁倾角。这是 getRotationMatrix() 的输出之一,尽管您必须将矩阵转换为角度才能使用它。这也超出了这个问题的范围。

最后,你的最后一个选择是建立一个水平的桌子,上面有一个指向正北的箭头。(您必须在晚上将其对准星星或其他东西。)然后,将您的设备平放在桌子上,设备顶部朝北。在这种情况下,设备坐标将与世界坐标相同,并且磁力计传感器将产生您想要的值。

您的评论表明您对局部变化感兴趣。仅凭您的 Android 设备根本无法到达真正的北方。从理论上讲,您可以按照我的描述构建一张桌子,然后以与之前完全相同的方向拿着设备四处走动,并留意桌子以供参考。不过,我怀疑你能否成功。

您可以尝试在您的应用程序中使用陀螺仪来帮助您始终以完全相同的方式保持设备的方向,但是您使用的任何 Android 设备中的陀螺仪都可能漂移太多而无法正常工作。

或者也许我们仍然不明白你想要做什么。不过,最重要的是,您根本无法仅使用 Android 设备获得全局坐标系——无论您获得什么,都将始终与该确切位置的局部磁场对齐。

于 2012-11-13T21:53:27.160 回答