var acc = {
x:0,
y:0,
z:0
};
var count = 0;
if (window.DeviceOrientationEvent) {
window.addEventListener('deviceorientation', getDeviceRotation, false);
}else{
$(".accelerometer").html("NOT SUPPORTED")
}
var x_0 = $V([acc.x, acc.y, acc.z]);
var P_0 = $M([
[1,0,0],
[0,1,0],
[0,0,1]
]);
var F_k = $M([
[1,0,0],
[0,1,0],
[0,0,1]
]);
var Q_k = $M([
[0,0,0],
[0,0,0],
[0,0,0]
]);
var KM = new KalmanModel(x_0,P_0,F_k,Q_k);
var z_k = $V([acc.x, acc.y, acc.z]);
var H_k = $M([
[1,0,0],
[0,1,0],
[0,0,1]
]);
var R_k = $M([
[2,0,0],
[0,2,0],
[0,0,2]
]);
var KO = new KalmanObservation(z_k,H_k,R_k);
var getNewPos = window.setInterval(function(){
KO.z_k = $V([acc.x, acc.y, acc.z]);
KM.update(KO);
$(".kalman-result").html(" x:" +KM.x_k.elements[0]+", y:" +KM.x_k.elements[1]+", z:" +KM.x_k.elements[2]);
$(".difference").html(" x:" +(acc.x-KM.x_k.elements[0])+", y:" +(acc.y-KM.x_k.elements[1])+", z:" +(acc.z-KM.x_k.elements[2]))
}, 100);
function getDeviceRotation(evt){
acc.x = evt.alpha;
acc.y = evt.beta;
acc.z = evt.gamma;
$(".accelerometer").html(" x:" +acc.x+", y:" +acc.y+", z:" +acc.z);
}
这是一个演示页面,展示了我的结果。您可以通过以下链接访问:
http://cardboard-hand.herokuapp.com/kalman.html。
目前,我将传感器噪声设置为2个标量矩阵,以查看卡尔曼滤波器是否正常工作。但我们注意到当手机平放在桌子上时,x轴上的传感器方差更大。我们认为这可能与万向锁定有关。我们尚未进行测试,但设备的方向可能会影响每个轴上的方差变化。