我正在开发一个应用程序,其中我使用 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];
}
现在我在上面的代码中遇到了一些问题:
答案 0 :(得分:0)
此方法“阻尼”传感器值的变化。它被称为"exponential smoothing"。在快速变化的变量中,您可以通过获取最新值来找到平均值的估计值,并将其计算为分数(alpha)。
此算法使用此过滤器来查找常量,“必须”是重力。总加速度=重力+瞬时加速度,因此瞬时加速度可以通过event.values - gravity
计算。
除非您是不断加速(火箭发射,加速在高速公路上......)。因子alpha告诉您“平均”可以变化的速度,并且当您想要测量快速变化的加速度时需要更大。这由术语dt
反映:当相对于滤波器时间常数更小(更高的事件率)时,α变得更大。时间常数告诉您纹波的影响在平均值中衰减的速度有多快。