旋转设备时磁场测量的奇怪行为

Posted

技术标签:

【中文标题】旋转设备时磁场测量的奇怪行为【英文标题】:Weird behaviour of the magnetic field measurements while rotating the device 【发布时间】:2013-03-31 16:48:26 【问题描述】:

情况:

我正在尝试通过指纹识别利用建筑物内的磁场变化来创建一个室内定位系统。作为传感器,我使用我的手机 Galaxy Nexus。

基本上,获取我的指纹的想法是分别测量 x、y 和 z 方向的磁场,并通过移动设备的方向旋转矢量以将矢量带入世界坐标系。为了定位某人,他还测量了磁场、旋转矢量并将其发送到服务器,我将在服务器上运行我的定位算法。

我的问题:

当我在不同方向测量同一点的磁场时,旋转矢量后得到的结果不同。连场强都不一样。

为了展示这一点,我在同一位置进行了四次测量,并将手机绕着他的 z 轴 (standard android specification) 分别逆时针旋转了 90、180 和 270 度。 结果可以在该“表”和下面的 Matlab 图(点击链接)上看到(如果您想要其他视图,请告诉我)

编辑: 更准确地说:我真正做的是定义了我自己的坐标系,称为房间坐标系。我拿了房间的一面墙,把它定义为北。当它平放在桌子上时,我的手机外星人与那面墙(在第一个位置)的 y 轴。因此,正 z 轴指向天空,x 轴定义为 90 度角的墙壁。 以“Raw”命名的向量是手机的原始值,因此它们位于手机的坐标系中。以“Rotated”命名的向量被旋转到该“房间坐标系”中。在图中,虚线向量是原始向量,实线向量是旋转向量。

╔═════════════╦════════╦════════╦════════╦══════════╗
║ Vector      ║    X   ║   Y    ║    Z   ║ Strength ║
╠═════════════╬════════╬════════╬════════╬══════════╣
║ 0°Raw       ║  17.55 ║   8.21 ║ -36.83 ║  41.62   ║
║ 0°Rotated   ║  17.55 ║   8.21 ║ -36.83 ║  41.62   ║
║ 90°Raw      ║  15.74 ║ -11.36 ║ -36.86 ║  41.66   ║
║ 90°Rotated  ║  11.36 ║  15.74 ║ -36.86 ║  41.66   ║
║ 180°Raw     ║ -65.06 ║ -16.18 ║ -44.79 ║  80.63   ║
║ 180°Rotated ║  65.06 ║  16.18 ║ -44.79 ║  80.63   ║
║ 270°Raw     ║   6.38 ║  61.95 ║ -46.37 ║  77.64   ║
║ 270°Rotated ║  61.95 ║  -6.38 ║ -46.37 ║  77.64   ║
╚═════════════╩════════╩════════╩════════╩══════════╝

您可以看到,即使在旋转它们之后,它们也并不真正匹配。你知道为什么会这样吗?有什么我可能还没有考虑到的吗? 提前非常感谢!

编辑2

第二次实验

我做了另一个实验,结果更好,但仍然没有我预期的那么好。这一次,方向并不像应有的那样恒定。 这次我在户外进行了测量。我将 y 轴疏远到真北并将其平放在地面上。我将它逆时针旋转了大约 3 次 90 度。我用另一台相机拍摄了手机​​位置的照片,并用 Photoshop 测量了实际旋转。您可以在表格和下面的图表中看到结果:

╔═════════════╦════════╦════════╦════════╦══════════╗
║ Vector      ║    X   ║   Y    ║    Z   ║ Strength ║
╠═════════════╬════════╬════════╬════════╬══════════╣
║ 0°Raw       ║   1.22 ║  20.31 ║ -57.53 ║  61.02   ║
║ 0°Rotated   ║   1.22 ║  20.31 ║ -57.53 ║  61.02   ║
║ 104°Raw     ║  25.92 ║   5.66 ║ -57.53 ║  63.35   ║
║ 104°Rotated ║ -11.93 ║  23.70 ║ -57.53 ║  63.35   ║
║ 204°Raw     ║   5.42 ║ -16.86 ║ -59.67 ║  62.24   ║
║ 204°Rotated ║ -11.90 ║  13.12 ║ -59.67 ║  62.24   ║
║ 290°Raw     ║ -12.18 ║   0.73 ║ -57.85 ║  59.12   ║
║ 290°Rotated ║  -3.64 ║  11.64 ║ -57.85 ║  59.12   ║
╚═════════════╩════════╩════════╩════════╩══════════╝

补充说明:

这些值是几秒钟内的平均值。所以这不是噪音的问题。

我知道我不能使用函数getOrientation,因为它使用磁场来计算方向,这没有意义,因为我想找到磁场的变化。对于上面的示例,我手动创建了旋转四元数。

【问题讨论】:

你在哪里测试这个?室内的?户外?您对上面的数字使用什么坐标系?设备坐标系? 已在室内测试。标有“原始”的值是直接来自设备的值,因此在设备的坐标系中。我将第一个向量定义为 0 度(仅偏航),并在该方向上旋转所有其他向量。所以我把它们带入了世界坐标系(标有“旋转”) 前 4 行看起来不错,后 4 行似乎不对,可能是由于磁干扰。您应该先在室外测试,看看是否有任何区别。第 4 行中的值对我来说似乎是正确的。 不应该不管是室内还是室外?我的意思是只要位置相同,无论传感器的方向如何,它都应该是相同的磁场。只有方向应该改变。如果有干扰(可能是因为它在室内),它应该在这个位置保持不变。还是我错了? 我不确定,磁场反向但不应该加倍磁场强度。 【参考方案1】:

确保您通过onAccuracyChanged(Sensor sensor, int accuracy) 方法监控传感器的准确性。我发现使用我的 Nexus 10 平板电脑时,准确度会定期变化,当它过低或不可靠时,我会得到与您相似的结果。

【讨论】:

第一个小测试表明你是对的。它定期变化。所以这可能是问题所在。明天或后天,我将仅使用高精度数据测试所有内容。我会让你知道结果。谢谢! 非常感谢!我认为这是解决方案!我所做的第一次测试表明,如果我只使用精度最高的传感器数据,结果会好得多!但它也表明磁场精度确实经常变化,并且很难获得良好的测量结果。你知道如何提高磁场传感器的精度吗?我的意思是不用将我的设备移动成 8 字形?或者你知道是什么导致了错误的准确性吗? 我实际上正在向谷歌投诉这个问题。我有一个 Nexus 10,我想我已经向他们证明了我退回的设备中的磁传感器不可靠。他们最近的回应说:“潜在的误导性信息是,HAL 正在报告 SENSOR_STATUS_UNRELIABLE,而实际上它可能应该是 SENSOR_STATUS_ACCURACY_LOW。一旦 Nexus 10 移动,精度就会下降到 0(不可靠)。一旦平板电脑停止左右移动,它会回到 3(高)。”这仍在进行中,所以不确定最终结果会是什么! 这听起来很奇怪。对于我的设备(Galaxy Nexus),它有点不同。对我来说,很难在 SENSOR_STATUS_ACCURACY_HIGH 上进行测量。通常我会得到 SENSOR_STATUS_ACCURACY_MEDIUM 或 SENSOR_STATUS_ACCURACY_LOW。即使我将手机移动为 8 字形。如果我得到 SENSOR_STATUS_UNRELIABLE 它通常很快就会变成 M​​ID 或 LOW。您的投诉是否可以公开?例如在论坛里?对我来说可能会很有趣。 这只是通过电子邮件与 googleplay-support@google.com 进行的对话,因为我将设备还给了他们。他们寄给我一个替换设备,但它的行为与我寄回给他们的设备完全一样!无论如何,我会尽量记住在有最终结论时在这里发表评论。

以上是关于旋转设备时磁场测量的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIScrollView 旋转后出现奇怪的行为

奇怪的 UIContainerView 自动布局旋转行为

在 QGraphicsScene 中缩放和旋转的 QGraphicsPixmapItem 的奇怪绘图行为

从横向旋转到纵向 (iPad) 后 UITableView 的奇怪行为

带有 Sensor.TYPE_ROTATION_VECTOR 奇怪行为的 Rajawali 旋转相机

IOS11旋转设备时UIToolbar左右间距