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>

我可以在移动 Firefox for Android 中打开它,它会输出 3 个如下所示的数字:

89.256125
3.109375
0.28125

当我旋转设备时,数字会根据旋转轴而变化。我注意到“alpha”的值非常嘈杂——即使手机放在我的桌子上,它们也会不停地反弹,而其他两个保持稳定。我知道阿尔法是我的方向。那我很好奇,它是从指南针(有噪音问题)获得“阿尔法”值,而从陀螺仪获得另外两个?

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

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

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

感谢任何人可能有的任何见解。

4

3 回答 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,则过程更粘稠。它对随机波动(以及集中趋势的变化)反应迟钝。阻尼很大。
  • 不要在 0..1 范围之外尝试s,因为这会导致负反馈循环,并且 alpha 很快就会随着越来越大的波动而开始发散。

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

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

var alpha = guestimate (= here 0);

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

于 2012-12-30T19:20:42.117 回答
2

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

我注意到“alpha”的值非常嘈杂——即使手机放在我的桌子上,它们也会不停地反弹,而其他两个保持稳定。

这是欧拉角的一个常见问题,如果可以的话,尽量避免它们。

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

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

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

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

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

于 2012-06-16T07:23:42.003 回答
0

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

于 2014-06-12T23:40:54.593 回答