android - 获取全局坐标中的磁场值

标签 android coordinates sensors magnetometer

对于 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 是否应该另外替代上述内容。

如果已经存在一些源代码可以做这件事,我会很感激发布一个链接,但我不想为这个特定任务使用大型通用库(例如,用于增强现实支持),因为我希望它尽可能简单。

附言

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

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

我已经实现了上述算法,并且通过建议的转换获得的值 X'、Y'、Z' 发生了规律且显着的变化,因此其中有问题。

P.P.S.

偶尔我会在 SO - How can I get the magnetic field vector, independent of the device rotation? 上找到与我的问题完全相同的副本- 但不幸的是,答案包含我的建议,并且该问题的 OP 确认它们不起作用。

最佳答案

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

旋转矩阵R在数学上是基础矩阵从设备坐标到字坐标的变化。 设XYZ为设备坐标基准,W_1W_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) 转置。

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

关于android - 获取全局坐标中的磁场值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13361010/

相关文章:

android - 当我的 AAR 已经包含依赖项时,向我的项目添加依赖项

android - 如何找出Android gridview中项目的坐标

android - 我可以将红外传感器连接到我的安卓手机吗?

accelerometer - IMU MPU9250 数据表中的满量程范围表示什么,哪个更好用?

android - 永远不会在 FragmentActivity 中调用 onRequestPermissionsResult()

Android 单元测试数据存储

android - 如何在android中以矩形为基础裁剪图像?

php - 在 Google map 中显示数据库中的坐标

swift - 我在使用 Swift 2.0 接收用户当前位置时遇到困难

c - RTOS 数据记录器示例