[英]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.