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

标签 javascript android accelerometer sensors 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”的值真的很吵——即使手机静止在我的 table 上,它们也会不停地反弹,而其他两个保持稳定。我知道 alpha 是我的航向。那么我很好奇,它是否从罗盘(存在噪音问题)和另外两个从陀螺仪获取“alpha”值?

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

此外,由于陀螺仪测量 Angular 速度,我推测此事件监听器会自动对其进行积分 - 积分算法是否与任何算法一样好?它是否使用加速度计来校正漂移?

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

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

最佳答案

所有方向值对我来说也很嘈杂。颤抖的手、欧拉 Angular 、磁干扰、制造错误……谁知道呢?

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

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

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

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

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

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

var alpha = guestimate (= here 0);

请注意,这种简单的自适应平滑适用于许多其他情况,而且编程非常简单。

关于javascript 'deviceorientation' 事件 - 它测量什么传感器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11060869/

相关文章:

javascript - 为原型(prototype)分配对象文字与函数之间的区别

影响 $.each 循环的 Javascript 动态数组

android - 解析facebook登录空指针异常

android - 通过 NativeActivity NDK 访问(更快的轮询)加速度计

iphone - 如何使用加速度计检测 iPhone 在太空中的运动?

android - 如何使用加速度计了解我的 Android 设备的移动速度?

javascript - Jquery .on() 要么不工作要么触发两次

javascript - 服务器有异步工作时具有返回值的 Meteor.call()

java - 未找到 Android Google Play 服务视觉条码扫描器库

java - 如何从 ScheduledExecutorService 中删除任务?