情况:
我正在尝试通过指纹识别利用建筑物内的磁场变化来创建一个室内定位系统。作为传感器,我使用我的手机 Galaxy Nexus。
基本上,获取我的指纹的想法是分别测量 x、y 和 z 方向的磁场,并通过移动设备的方向旋转矢量以将矢量带入世界坐标系。为了定位某人,他还测量了磁场,旋转矢量并将其发送到服务器,我将在服务器上运行我的定位算法。
我的问题:
当我在不同方向测量同一点的磁场时,旋转矢量后不会得到相同的结果。甚至场强也不一样。
为了证明这一点,我在同一位置进行了四次测量,并将手机绕着他的 z 轴(标准 Android 规范)分别逆时针旋转了 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
,因为它使用磁场来计算方向,这没有意义,因为我想找到磁场的变化。对于上面的示例,我手动创建了旋转四元数。