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

时间:2013-03-31 16:48:27

标签: android orientation android-sensors magnetometer indoor-positioning-system

情况:

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

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

我的问题:

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

为了表明这一点,我在同一位置进行了四次测量,并将手机围绕其z轴(standard Android specification)逆时针旋转90度,180度和270度。 结果可以在下面的“表格”和Matlab图表(点击链接)上看到(如果您想要其他观点让我知道)

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

╔═════════════╦════════╦════════╦════════╦══════════╗
║ 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   ║
╚═════════════╩════════╩════════╩════════╩══════════╝

enter image description here enter image description here

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

EDIT2

第二次实验

我做了另一个实验,结果更好,但仍然不如我预期的那么好。这次方向并不像应该的那样恒定。 这次我在室外进行测量。我将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   ║
╚═════════════╩════════╩════════╩════════╩══════════╝

enter image description here enter image description here

附加说明:

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

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

1 个答案:

答案 0 :(得分:2)

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