我正在使用线性加速度计来检测抖动,我正在使用此代码:
float x = event.values[0] ;
float y = event.values[1] ;
float z = event.values[2] ;
float acceleration = (float) Math.sqrt(x * x + y * y + z * z);
if(acceleration > 5)
{
Toast.makeText(this,"shaking",Toast.Length_long).show();
}
问题是当我摇动设备时,加速度变为10,但是当我停止摇动设备时,加速度不会立即返回到零,这需要几秒钟!
- shaking the device - no shaking -
acceleration = 20 19 22 23 24 20 24 25 30 - 19 18 17 15 13 0000000000 -
为什么会这样?
答案 0 :(得分:0)
您使用的线性加速度是合成(与物理相反)传感器类型。这意味着它的“读数”来自物理加速度计读数,当然包含线性加速度运动和重力分量。基本上这两个组件通过使用过滤器分开。例如,低通滤波器仅允许缓慢变化的信号(如重力)并衰减快速变化的信号(如摇动)。根据过滤器的实际设计,它们通常在响应时间方面存在延迟,这是您遇到的延迟。
如果您想减少延迟,请尝试直接使用原始物理加速度计读数并实施您自己的高通滤波器以消除重力分量。您可以尝试使用更高阶的过滤器,这样可以减少延迟,但代价是引入工件。我有使用Butterworth filter的好经验,如果你想先尝试一下。
答案 1 :(得分:0)
我们在应用程序/驱动程序级别获得两种类型的 Accel 数据:
在过滤后的数据上不会观察到 Accel 的任何突然变化,因为它需要很少的样本或时间来稳定。 但是您可以通过未过滤的数据观察到突然的变化。
未过滤的数据将用于自由落体、抖动检测等用例。 过滤后的数据将用于慢/中度运动(如盖子角度检测等)。