移動平均を取ってみる
static void imu_task(void*)
{
int tap_size = 9;
int b_ptr = 0;
float z_buf[tap_size] = {0};
float val[3];
float vel = 0;
float sum = 0;
while(true) {
M5.Imu.getAccel(&val[0], &val[1], &val[2]);
val[2] -= 1.0f;
vel = sqrt(val[0] * val[0] + val[1] * val[1] + val[2] * val[2]);
sum -= z_buf[b_ptr];
z_buf[b_ptr] = vel;
sum += z_buf[b_ptr];
b_ptr = (b_ptr + 1) % tap_size;
velocity = sum / tap_size;
delay(10);
}
}
だいたい0.09ぐらいのオフセット値がある様なので差し引いて使う様にする。
float offset = 0.09;
.
.
vel = sqrt(val[0] * val[0] + val[1] * val[1] + val[2] * val[2]) - offset;