JavaScript的“deviceorientation”事件 - 它测量哪些传感器?

11
如果我有一个简单的网页和脚本,看起来像这样:
<body>
    <div id="alpha">a</div>
    <div id="beta">b</div>
    <div id="gamma">g</div>
</body>

<script>
window.addEventListener('deviceorientation', function(event) {
    var alpha = event.alpha;
    var beta = event.beta;
    var gamma = event.gamma;

    document.getElementById("alpha").innerHTML = alpha;
    document.getElementById("beta").innerHTML = beta;
    document.getElementById("gamma").innerHTML = gamma;

}, false);
</script>

我可以在移动版的Android Firefox中打开它,它会输出3个数字,看起来像下面这样:
89.256125
3.109375
0.28125

当我旋转设备时,数字会根据旋转轴改变。我注意到“alpha”的值非常嘈杂——即使手机静止放在桌子上,它们也会不停地反弹,而其他两个则保持稳定。我明白“alpha”是我的航向。那么我很好奇,它是从指南针(有噪音问题)获取“alpha”值,而另外两个则来自陀螺仪吗?
另一个问题是,当我改变俯仰角时,由于某种原因航向也会改变,即使我实际上并没有改变航向。我只是好奇这是为什么,以及如何进行更正?
此外,由于陀螺仪测量的是角速度,所以我假设此事件侦听器会自动进行积分——积分算法是否和其他任何算法一样好?它是否使用加速度计来纠正漂移?
在这个Google技术讲座视频中,从15:00到19:00,演讲者谈到了通过使用加速度计来纠正陀螺仪固有漂移以及校准与重力相关的方向:http://www.youtube.com/watch?v=C7JQ7Rpwn2k 我该怎么做呢?
感谢任何人可能提供的见解。

3
你读过 http://dev.w3.org/geo/api/spec-source-orientation.html 吗? - mplungjan
它是如何得出这些数字的:就是这样(警告,前方有可怕的数学)。 - Derek 朕會功夫
那个W3规范确实很有帮助。我想我应该知道它的存在。我理解其中的数学,之前学过线性代数。 - Joey
我尽力回答了你的问题。有一件事我没有明白。你能否详细说明一下:“当我改变音高时,不知何故航向也会改变,即使我实际上并没有改变航向。我只是好奇这是为什么,以及如何纠正它?” - Ali
3个回答

3

对我来说,所有方向值也非常嘈杂。手抖、欧拉角、磁干扰、制造缺陷...谁知道呢?

我进行了小指数平滑。也就是说,我用一个平滑的值替换了波动的event.alpha,这个平滑的值方便地被称为alpha

alpha = event.alpha + s*(alpha - event.alpha), with 0 <= s <= 1;

换句话说,每次收到新的观测值时,平滑值会根据误差进行比例修正。

  • 如果s=0,则平滑值与观测值完全相同,没有平滑。
  • 如果s=1,则alpha保持不变,这确实是一种过于高效的平滑方法。
  • 否则,alpha在观测值和平滑值之间。事实上,它是最后一个观测值和历史值之间的(加权)平均值。因此,它具有一定的阻尼效应来跟随数值的变化。
  • 如果s很小,则该过程接近于最后一个观测值,并快速适应最近的变化(以及随机波动)。阻尼很小。
  • 如果s接近1,则该过程更加粘稠。它对随机波动(以及中心趋势的变化)反应迟钝。阻尼很大。
  • 不要尝试使用s超出0..1范围,因为这会导致负反馈循环,alpha很快就会随着越来越大的波动而发散。

  • 我使用了s=0.25,在测试了0.1和0.3之间的s没有显着差异后。

重要提示:使用此方法时,不要忘记在addEventListener函数之外初始化alpha:

var alpha = guestimate (= here 0);

请注意,这种简单的自适应平滑方法在许多其他情况下也适用,并且编程非常简单。


平滑超过两个样本会有帮助吗? - ErikE
指数平滑的问题在于,您正在对已平滑的值+新样本进行平滑处理,因此从实际上讲,您正在对许多样本进行平滑处理。 - Ted Brownlow
是的,这就是指数平滑的确切原理。你可以展示它是一种加权平均,其中权重w_t = s^t(因此得名指数)。它是整个历史的平均值,其值随着时间的推移而逐渐减少。 - AlainD

2
设备方向是通过传感器融合获取的。严格来说,没有任何一个传感器测量它。方向是以智能的方式合并加速度计、陀螺仪和磁力计数据得出的结果。
“alpha”值非常嘈杂是一个欧拉角的常见问题,如果可以的话,请尽量避免使用它们。
顺便说一句,你提供的《Android设备上的传感器融合:运动处理中的革命》视频在38:25讲解了这个问题。
是的,通过加速度计(和磁力计,如果有的话)读数来校正陀螺仪漂移。这被称为传感器融合。
在这个谷歌技术演讲视频中,从15:00到19:00,演讲者讲述了如何通过使用加速度计纠正陀螺仪固有的漂移,并根据重力校准方向。链接为:http://www.youtube.com/watch?v=C7JQ7Rpwn2k。我应该如何操作?
如果你已经有了定位,则已经有人替你完成了所有这些工作,你不需要做任何事情。

谢谢解释。我真的很欣慰,因为我不必重新发明传感器融合。唯一让我仍然无法理解的是它如何指向真北而不是磁北?它并不知道我的纬度或经度。 - Joey
好问题,我只能猜测。你是对的,它只能测量磁北。然而,重力和磁北之间的角度可以用来估计纬度。此外,GPS或服务提供商可以告诉设备其(相当准确的)地理位置。所以,我不知道。你为什么认为它知道真正的北方?在你所在的地方,真北和磁北有多大差异? - Ali
它给我一个北向读数(α=0或360),比我的指南针应用程序告诉我的北向顺时针方向多几度。我住在西雅图附近,磁北和真北之间的差异很大,因为磁北在阿拉斯加上方。 - Joey
有趣。正如我之前所说,我只能猜测,但原则上设备可以从服务提供商那里知道它的地理位置。这种技术在10年前就已经很普遍了。现在,我们也有GPS。我的叔叔住在西雅图,我在1990年去拜访过他 :) - Ali

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接