我正在使用线性加速度计来检测震动,我使用的是这个代码:
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 -为什么会发生这种情况?
发布于 2014-11-01 03:22:41
您使用的线性加速度是一种合成(而不是物理)传感器类型。这意味着它的“读数”来自物理加速度计读数,其中当然包括线性加速度运动和重力分量。基本上,这两个组件是通过使用过滤器来分离的。例如,低通滤波器只允许缓慢变化的信号(如重力),并衰减快速变化的信号(如摇晃运动)。根据过滤器的实际设计,它们通常在响应时间方面存在延迟,这是您所经历的延迟。
如果你想减少延迟,尝试直接使用原始的物理加速度计读数,并实现自己的高通滤波器来消除重力分量。您可以尝试使用高阶过滤器,这可以减少延迟,但代价是引入了工件。我有很好的使用Butterworth filter的经验,如果你想先试试的话。
发布于 2021-07-16 20:45:20
我们在应用程序/驱动程序级别上获得了两种类型的Accel数据:
IIR过滤数据(通常为移动平均或 filter)
Accel的任何突然变化都不会在过滤后的数据上观察到,因为它需要很少的样本或时间才能稳定下来。但你可以用未过滤的数据观察突然的变化。
未过滤的数据将用于自由落体、震动检测等用例。过滤后的数据将用于慢/中运动,如盖子角度检测等。
https://stackoverflow.com/questions/26542192
复制相似问题