加速度計を使用して道路上の欠陥を検出する Android phonegap アプリケーションを作成しています。ただし、生の加速度計の値 (x、y、および z) を使用している場合、それらは試行ごとに大きく異なります。同じデバイス、同じ車両、同じ位置を使用して同じ不完全さを取得しようとしましたが、加速度計によって得られる値はまったく異なります。加速度計の値を 0.25 秒ごとに取得しているので、毎秒 x、y、z の 4 つの値を取得します。
よりスムーズで信頼性の高い値を取得するために値を平滑化する方法を誰か教えてもらえますか? これらの値を使用してさらに処理を行う必要があるため、x、y、および z の値の精度は非常に重要です。よりスムーズな出力を得るために値に適用できる数式はありますか?
更新: 私のコードのスニペットを追加:
function acc() {
var accOpt = { frequency: 1000 };
previousReading = {
x : null,
y : null,
z : null,
lr : null,
fb : null
};
watchID = navigator.accelerometer.watchAcceleration(win, fail, accOpt);
}
function win (acceleration) {
var tiltLR = 0;
var tiltFB = 0;
var facingUp = -1;
if (acceleration.z > 0) {
facingUp = +1;
}
tiltLR = Math.round(((acceleration.x) / 9.81) * -90);
tiltFB = Math.round(((acceleration.y + 9.81) / 9.81) * 90 * facingUp);
var changes = {};
if (previousReading.x !== null) {
changes.x = Math.abs(previousReading.x-acceleration.x);
changes.y = Math.abs(previousReading.y-acceleration.y);
changes.z = Math.abs(previousReading.z-acceleration.z);
changes.lr = Math.abs(previousReading.lr-tiltLR);
changes.fb = Math.abs(previousReading.fb-tiltFB);
}
previousReading = {
x: acceleration.x,
y: acceleration.y,
z: acceleration.z,
lr: tiltLR,
fb: tiltFB
};
console.log('previousReading x: ' + previousReading.x + ' previousReading y: ' + previousReading.y + ' previousReading z: ' + previousReading.z+ ' previousReading lr: ' + tiltLR + ' previousReading fb: ' + tiltFB);
console.log('changes x: ' + changes.x + ' changes y: ' + changes.y + ' changes z: ' + changes.z + ' changes lr: ' + changes.lr + ' changes fb: ' + changes.fb);
console.log(acceleration.x + ' ' + acceleration.y + ' ' + acceleration.z);
}
フィルター: x、y、z の値を少し滑らかにするために、このコードを見つけました。これを現在の x、y、z 値に適用し、それらを以前の値 (これも除外されます) と比較すると、私の場合はうまくいきますか?
#define kFilteringFactor 0.1
// Use a basic low-pass filter to keep only the gravity component of each axis.
grav_accelX = (acceleration.x * kFilteringFactor) + ( grav_accelX * (1.0 - kFilteringFactor));
grav_accelY = (acceleration.y * kFilteringFactor) + ( grav_accelY * (1.0 - kFilteringFactor));
grav_accelZ = (acceleration.z * kFilteringFactor) + ( grav_accelZ * (1.0 - kFilteringFactor));
// Subtract the low-pass value from the current value to get a simplified high-pass filter
instant_accelX = acceleration.x - ( (acceleration.x * kFilteringFactor) + (instant_accelX * (1.0 - kFilteringFactor)) );
instant_accelY = acceleration.y - ( (acceleration.y * kFilteringFactor) + (instant_accelY * (1.0 - kFilteringFactor)) );
instant_accelZ = acceleration.z - ( (acceleration.z * kFilteringFactor) + (instant_accelZ * (1.0 - kFilteringFactor)) );