javascript'deviceorientation'事件 - 它测量的传感器是什么?

时间:2012-06-16 04:38:53

标签: javascript android accelerometer sensor gyroscope

如果我有一个简单的网页和脚本,如下所示:

<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”值,还是从陀螺仪得到另外两个?

另一个问题是当我改变音高时,由于某种原因,标题也会改变,即使我实际上没有改变标题。我只是好奇这是为什么以及如何纠正它?

另外,由于陀螺仪测量角速度,我认为这个事件监听器是自动积分的 - 积分算法是否与任何一个一样好?它是否使用加速度计来校正漂移?

在这个谷歌技术讲座视频中,从15:00到19:00,演讲者讨论通过使用加速器来校正陀螺仪固有的漂移,以及校准相对于重力的方向:{{3} } 我该怎么做呢?

感谢任何人的见解。

3 个答案:

答案 0 :(得分:3)

对我来说,所有的方向值都非常嘈杂。摇晃的手,欧拉角,磁干扰,制造虫,......谁知道?

我做了small exponential smoothing。也就是说,我用一个平滑的值替换了波动的 event.alpha ,这个值被方便地称为 alpha

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

换句话说,每次收到新的观测值时,平滑后的值都会以与误差成比例的校正进行更新。

  • 如果 s = 0,则平滑后的值与观测值完全相同,并且没有平滑。
  • 如果 s = 1,则alpha保持不变,这确实太平滑了。
  • 否则alpha位于观察值和平滑值之间。事实上,它是最后一次观察和历史之间的(加权)平均值。因此,它遵循具有一定阻尼效应的值的变化。
  • 如果 s 很小,则该过程接近最后一次观察并快速适应最近的变化(以及随机波动)。阻尼很小。
  • 如果 s 接近1,则该过程更加粘性。它懒惰地对随机波动作出反应(并且也改变了集中趋势)。阻尼很大。
  • 不要在0..1范围之外尝试 s ,因为这会导致负反馈循环,并且alpha很快就会随着越来越大的波动而发散。

    < / LI>
  • 我使用 s = 0.25,经过测试, s 在0.1和0.3之间没有显着差异。

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

var alpha = guestimate (= here 0);

请注意,这种简单的自适应平滑在许多其他情况下都有效,而且编程非常简单。

答案 1 :(得分:2)

通过传感器融合获得器件方向。严格来说,传感器都没有测量它。方向是以智能方式合并加速度计,陀螺仪和磁力计数据的结果。

  

我注意到“alpha”的值非常嘈杂 - 它们会反弹   即使手机在我的桌子上休息也不停,而另外两个   保持稳定。

这是common problem with the Euler angles,如果可以,请尽量避免使用它们。

顺便说一下,您链接到的Android设备上的传感器融合:动作处理革命视频在38:25解释了它。

  

另外,由于陀螺仪测量角速度,我推测这一点   事件监听器自动集成它 - 是集成   算法和任何一样好?它是否使用加速度计来纠正   漂移

是的,借助加速度计(和磁力计,如果有的话)读数校正陀螺仪漂移。这称为传感器融合。

  

在这个谷歌科技谈话视频中,从15:00到19:00,演讲者会谈   关于用陀螺仪校正陀螺仪固有的漂移   加速器,以及相对于校准方向   引力:http://www.youtube.com/watch?v=C7JQ7Rpwn2k我该怎么办?   关于这样做?

如果你有方向,那么有人已经为你做了这一切。你不需要做任何事情。

答案 2 :(得分:0)

使用定向余弦矩阵或卡尔曼滤波器。您可以使用加速度计绘制它或陀螺仪或两者的组合。可以通过一些机器学习来计算漂移。我认为运动融合是德州仪器校准包的一部分。我错了。但它不难检查。乘以3个旋转矩阵,为宏。http://www.itu.dk/stud/speciale/segmentering/Matlab6p5/help/toolbox/aeroblks/euleranglestodirectioncosinematrix.html