[英]Removing gravity effect from accelerometer readings
我正在開發一個應用程序,其中使用了Accelerometer來感測線性加速度 ,但是一段時間后,我知道Accelerometer不會顯示線性加速度( 也對其產生重力影響 )。
因此,為了消除重力,我嘗試了一些方法,並得出結論,必須設計一個過濾器。
為了設計過濾器,我嘗試了以下代碼。
public void onSensorChanged(SensorEvent event)
{
// alpha is calculated as t / (t + dT)
// with t, the low-pass filter's time-constant
// and dT, the event delivery rate
final float alpha = 0.8;
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
}
現在,我在上面的代碼中遇到了一些問題:
這種方法可以“抑制”傳感器值的變化。 這就是所謂的“指數平滑” 。 在快速變化的變量中,您可以通過獲取最新值並將其計算為分數(alpha)來找到平均值的估計值。
該算法使用此過濾器來找到常數,“必須”為重力。 總加速度=重力+瞬時加速度,因此可以通過event.values - gravity
計算瞬時加速度。
除非您不斷加速(火箭發射,在高速公路上加速...),否則此方法有效。 因子α告訴您“平均值”的變化速度,當您想測量變化更快的加速度時,該值需要更大。 這由術語dt
反映:當相對於過濾器時間常數較小(較高的事件發生率)時,alpha會變大。 時間常數告訴您平均而言,紋波效應衰減的速度有多快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.