移動平均を取ってみる
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;