高通 android 传感器支持,Android加速度传感器数值的过滤

加速度传感器测量设备的加速度,包括重力加速度。以下代码展示了如何获取缺省的加速度传感器的一个实例:

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.81 m/s2。同理,设备在自由落体或以 9.81 m/s2的加速度坠向地面时,加速度计会读到 g = 0 m/s2。因此,要测出设备真实的加速度,必须排除加速计数据中的重力干扰。这可以通过高通滤波器来实现。反之,低通滤波器则可以用于分离出重力加速度值。以下例程展示了它们的用法:

public void onSensorChanged(SensorEvent event){  //在本例中,alpha由 t / (t + dT)计算得来,  //其中 t是低通滤波器的时间常数,dT是事件报送频率  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)来创建一个低通滤波器。这个过滤器常量是由时间常量(t)和传感器事件报送频率(dt)推导出来的,t大致等于过滤器触发传感器事件的间隔时间。为了演示,此例程使用0.8作为alpha的值。如果你要用这个过滤方法,你可能需选用其它的alpha值。

加速计使用了标准的传感器坐标系。这意味着,设备以原始方位平放在桌子上时,会发生以下状况:

如果你从左侧平推设备(它向右移),则x方向加速度为正值。

如果你从下侧平推设备(它向前移),则y方向加速度为正值。

如果以A m/s2的加速度向空中移动设备,则z方向加速度等于A +9.81,即设备加速度(+A m/s2)减去重力加速度(-9.81m/s2)。

静止设备的加速度值为+9.81,即设备加速度(0 m/s2)减去重力加速度(-9.81m/s2)。

一般情况下,加速度计已足够应付对设备移动情况的监测。几乎所有Android平台的手持和桌面终端都带有加速度计,它的能耗比其它运动传感器要少10倍。不过它有一个缺点,就是你不得不实现低通和高通滤波器,以消除重力影响并减少噪声数据。

Android SDK给出了一个应用示例,展示了加速度传感器的使用方法(Accelerometer Play)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值