情况:
我正在尝试通过指纹识别利用建筑物内部的磁场变化来创建室内定位系统。作为传感器,我使用我的手机 Galaxy Nexus。
基本上,获取指纹的想法是分别测量 x、y 和 z 方向的磁场,然后根据移动设备的方向旋转矢量,将矢量带入世界坐标系。为了定位某人,他还测量了磁场、旋转矢量并将其发送到服务器,我将在服务器上运行我的定位算法。
我的问题:
当我在不同方向测量同一点的磁场时,旋转矢量后我没有得到相同的结果。甚至场强也不一样。
为了证明这一点,我在同一位置进行了四次测量,并将手机绕其 z 轴 ( standard Android specification) 分别逆时针旋转 90、180 和 270 度。 结果可以在那个“表格”和下面的 Matlab 图(点击链接)上看到(如果你想要其他 View ,请告诉我)
编辑: 更准确地说:我真正做的是我定义了我自己的坐标系,让我们说房间坐标系。我拿了房间的一面墙并将其定义为北面。我的电话外星人的 y 轴与那堵墙(在第一个位置)平放在 table 上。因此,正 z 轴指向天空,x 轴定义为 90 度角的墙壁。 以“Raw”命名的向量是手机的原始值,因此它们位于手机的坐标系中。以“旋转”命名的向量被旋转到那个“房间坐标系”中。在图中,虚线向量是原始向量,实线向量是旋转后的向量。
╔═════════════╦════════╦════════╦════════╦══════════╗
║ 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 函数,因为它使用磁场来计算方向,这没有意义,因为我想找到磁场的变化。对于上面的示例,我手动创建了旋转四元数。
最佳答案
确保您正在通过 onAccuracyChanged(Sensor sensor, int accuracy) 方法监控传感器的准确性。我发现使用 Nexus 10 平板电脑时,准确度会定期变化,当准确度较低或不可靠时,我得到的结果与您的相似。
关于android - 旋转设备时磁场测量的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15731877/
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度; 在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。
假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实
Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation