获得在全球坐标系的磁场值(Getting magnetic field values in glob

2019-07-03 19:21发布

对于Android应用程序,我需要在全球(世界)坐标系的轴获得磁场测量。 下面是我怎么回事(猜测)来实现这一点。 请,如果必要的指正。 此外,请注意,问题是有关任务的算法部分,而不是关于Android的API用于传感器 - 我有后者的经验。

第一步骤是获得TYPE_MAGNETIC_FIELD传感器数据( M )和TYPE_ACCELEROMETER传感器数据( G )。 二是应该根据Android的文档中使用,但我不知道,如果它不应该是TYPE_GRAVITY代替(如再次G ),因为加速度似乎不提供纯净的重力。

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

而现在进入最questionnable部分:为了转换M向量为世界坐标系,我想乘[R * I] * M

我不知道这是一种把磁场读数到另一个基础的正确道路。 另外,我不知道是否remapCoordinateSystem作为补充替代上面的东西被使用。

如果存在一些源代码,已经做这件事情,我会很感激张贴链接,但我不希望使用大一般用途库(例如,用于增强现实的支持)这一特定的任务,因为我想保持尽可能简单。

PS

我来到了主意,一些信息添加到原岗位的清晰度。

让我们假设一个设备放置在桌子上,不断地从它的磁传感器读取数据。 每个测量包含3个值,在轴线X,Y,Z,这是设备的局部坐标系呈递磁场。 我认为,我可以忽略环境领域的波动(由低通滤波器平滑),因此这3个值应保持几乎相同的所有设备保持在原位的时间。 如果我们周围的任何轴旋转装置,值的变化,因为我们改变了局部坐标系。 但该领域本身实际上并没有改变。 所以,我要翻译本地X,Y,Z实地测量到这种X“ Y”,Z”,他们保持各自的价值,无论对设备旋转,只要设备没有从它的位置移动(只旋转)。

我实现了上述算法和价值得到了定期和noticable变化X“ Y”,Z”,通过建议转换获得,这样有什么不对的吧。

PPS

偶尔我发现在这里我的问题完全相同的副本- 我怎样才能得到磁场矢量,独立于设备的旋转? - 但很不幸,答案包含了我的建议,并认为这一问题的任择议定书证实,他们不工作。

Answer 1:

M的相对于世界坐标的坐标就是乘法R *米

旋转矩阵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的顺序。



Answer 2:

装置上的磁力计传感器返回设备坐标3载体。 您可以使用getRotationMatrix()来获取可用于转换为世界坐标是设备坐标向量的矩阵。 你也可以了解四元数和直接使用TYPE_ROTATION_VECTOR。 然而,有一个在Android的没有四元库(据我所知),并已经超出了问题的范围进行了讨论。

然而,由于设备的方向信息的基础上,从磁力计值部分没有这对你有什么好处。 换句话说,该设备会一直告诉你,磁矢量面临的正是北。

现在,你可以做的就是磁倾角。 这是getRotationMatrix()的输出中的一个,但你必须一个矩阵转换成一个角度它是有用的。 这也超出了这个问题的范围。

最后,你最后的选择是建立一个表,该表是水平上它具有指向正北的箭头。 (你必须在夜间或东西星星对齐。)然后,将设备平放在桌子上。带朝北设备的顶部。 在这种情况下,设备坐标将是相同的世界坐标和磁力计传感器会产生你想要的值。

您的评论表明您感兴趣的局部变化。 有根本没有办法让你孤单Android设备正北。 从理论上说,你可以为我描述了建立一个表,然后走走像以前那样拿在严格相同的方向的装置,在桌子上保持眼睛以供参考。 我怀疑,你可以把它关闭,但。

你可以尝试使用陀螺仪在你的应用程序来帮助您在任何时候都面向完全一样的设备,但是在你使用任何Android设备的陀螺仪有可能漂移太多这个工作。

或者我们还是不明白你想要做什么。 底线,不过,是你根本无法获得单独的Android设备在全球坐标系 - 无论你将永远与当地磁场在确切的点对齐。



文章来源: Getting magnetic field values in global coordinates