在全局坐标中获取磁场值

时间:2012-11-13 12:45:27

标签: android coordinates sensor magnetometer

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

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

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

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

我不确定这是将磁场读数转换为另一种基础的正确方法。此外,我不知道remapCoordinateSystem是否应该添加作为替代用于上述内容。

如果存在已经执行此操作的某些源代码,我会很感激发布链接,但我不想为这个特定任务使用大型通用库(例如,增强现实支持),因为我想尽量保持简单。

P.S。

为了清楚起见,我想到了为原帖添加一些信息的想法。

让我们假设一个设备放在桌子上并连续从其磁传感器读取数据。每次测量包含3个值,在X,Y,Z轴上显示磁场,这是设备的局部坐标系。我认为我可以忽略环境场波动(通过低通滤波器平滑),所以这3个值应该在设备保持原位时保持几乎相同。如果我们围绕任何轴旋转设备,则值会发生变化,因为我们会更改局部坐标系。但该领域本身并未实际改变。所以我想将局部X,Y,Z场测量值转换为X',Y',Z',它们保持各自的值,而不管设备是否旋转,只要设备不从其位置移动(仅旋转)。 / p>

我已经实现了上述算法,并通过建议的转换获得了值X',Y',Z'的定期和显着的变化,因此存在错误。

P.P.S。

偶尔我在SO上发现了我的问题的完全重复 - How can I get the magnetic field vector, independent of the device rotation? - 但遗憾的是,答案中包含了我的建议,该问题的OP确认它们不起作用。

2 个答案:

答案 0 :(得分:1)

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

旋转矩阵R在数学上是基础矩阵从设备坐标到字坐标的变化。 设 X Y Z 为设备坐标, W_1 W_2 W_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)转置。

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

答案 1 :(得分:0)

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

但是,这些都不会对您有任何好处,因为设备方向信息部分取决于磁力计的值。换句话说,设备将始终告诉您磁矢量正好朝向北方。

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

最后,你的最后一个选择是建立一个水平的表,其上有一个箭头指向真北。 (你必须在晚上用星星对齐它们。)然后,将设备平放在桌子上,设备顶部朝北。在这种情况下,设备坐标将与世界坐标相同,磁力计传感器将生成您想要的值。

您的评论表明您对本地变体感兴趣。单凭Android设备就无法真正实现北方。从理论上讲,你可以像我描述的那样建造一个桌子,然后四处走动,将设备保持在与以前完全相同的方向,同时注意桌面以供参考。我怀疑你可以把它拉下来。

您可以尝试在应用程序中使用陀螺仪来帮助您始终以完全相同的方式保持设备的方向,但您使用的任何Android设备中的陀螺仪都可能会因此而过度漂移。

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