Android加速度传感器数值的过滤
时间:2022-12-03 19:30:00
加速度传感器测量设备的加速度,包括重力加速度。以下代码显示了如何获得缺失的加速度传感器:
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
从概念上讲,加速度传感器测量传感器上施加的力,并根据以下关系检测设备的加速度(Ad)。
Ad=-∑Fs/mass
然而,根据以下关系,重力总是会影响测量精度。
Ad=-g-∑F/mass
因此,如果设备平放在桌子上(没有加速度),加速度计将被读取g=9.81m/s2。同样,设备可以自由落体9.81m/s当2的加速度降到地面时,加速度计将被读取g=0m/s2。因此,为了测量设备的真实加速度,必须消除加速计数据中的重力干扰。可通过高通滤波器实现。反之,低通滤波器则可以用于分离出重力加速度值。下面的例程显示了它们的用法:
publicvoidonSensorChanged(SensorEventevent){//在本例中,alpha由t/(t dT)计算得来,//其中t时间常数为低通滤波器,dT是事件报送的频率finalfloatalpha=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)创建低通滤波器。过滤器的常量是时间常量(t)传感器事件报送频率(dt)推导出来的,t大致等于过滤器触发传感器事件的间隔时间。本例程为演示0.8作为alpha的值。如果你要用这个过滤方法,你可能需选用其它的alpha值。
加速器采用标准传感器坐标系。这意味着当设备平放在桌子上时,会发生以下情况:
若您从左侧平推设备(它向右移动),则x向加速度为正值。
若您从下侧平推设备(向前移动),则y方向加速度为正值。
如果以A m/s如果2的加速度移动到空中,则Z的加速度等于A 9.81,即设备加速度( A m/s减去重力加速度(-9).81m/s2)。
静态设备的加速度值为 9.81即设备加速度(0 m/s减去重力加速度(-9).81m/s2)。
一般来说,加速度计足以应对设备移动的监测。几乎所有的Android该平台的手持式和桌面终端都配备了加速度计,其能耗是其他运动传感器的10倍。但它的一个缺点是,你必须实现低通道和高通道滤波器,以消除重力影响,减少噪声数据。
Android SDK该应用示例显示了加速度传感器的使用方法(Accelerometer Play)。