如果我有一个简单的网页和脚本,如下所示:
<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} } 我该怎么做呢?
感谢任何人的见解。
答案 0 :(得分:3)
对我来说,所有的方向值都非常嘈杂。摇晃的手,欧拉角,磁干扰,制造虫,......谁知道?
我做了small exponential smoothing。也就是说,我用一个平滑的值替换了波动的 event.alpha ,这个值被方便地称为 alpha :
alpha = event.alpha + s*(alpha - event.alpha), with 0 <= 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