Android开源项目的传感器
Android开源项目(AOSP)提供了三个基于软件的移动传感器:重力传感器、线性加速度传感器和旋转矢量传感器。这三个传感器在Android4.0中被更新,并且都使用陀螺仪(其它传感器除外)来改善稳定性和性能。如果你想尝试这些传感器,可以通过使用getVendor()方法和getVersion()方法来识别它们(供应商是:Google Inc;版本号是:3)。通过供应商和版本号来识别这些传感器是必须的,因为Android系统认为这些传感器是第二传感器。例如,如果设备制造商提供了他们自己的重力传感器,那么AOSP的重力传感器会作为第二重力传感器。这三个传感器都依赖陀螺仪:如果设备上没有陀螺仪,这些传感器不会显示,并不可使用。
使用加速度传感器
加速度传感器测量作用于设备的加速度,包括重力作用。下列代码显示了如何获得默认的加速度传感器的一个实例:
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
从概念上,加速度传感器通过测试作用于传感器本身的作用力(Fs),并使用下列公式来判断作用于设备的(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){
// In this example, alpha is calculated as t / (t + dT),
// where t is the low-pass filter's time-constant and
// dT is the event delivery rate.
final float alpha = 0.8;
// Isolate the force of gravity with the low-pass filter.
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];
// Remove the gravity contribution with the high-pass filter.
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)。为了演示,示例代码使用一个0.8的alpha值。如果你要使用这种滤波方法,你需要根据实际情况选择不同的alpha值。
加速度传感器使用标准的传感器器坐标系统。在实践中,当设备以它自然的方向被平方在桌面时,下列条件是适用的:
1. 如果在左边推动设备(让它向右移动),那么X轴的加速度值就是正值;
2. 如果在底部推动设备(让它向上移动),那么Y轴的加速度值就是正值;
3. 如果向着天空,用A m/s2 的加速度来推动设备,那么Z轴的加速度值就是A+9.81,它对应了设备的加速度(+A m/s2)减去重力作用(-9.81 m/s2)。
4. 静止的设备的有一个+9.81的加速度值,它对应设备的加速度(0 m/s2减去重力作用,也就是-9.81 m/s2)。
通常,加速度传感器是一种用于监视设备移动的比较好的传感器。几乎每种Android手持设备和平板电脑都有加速度传感器,而且它的能耗要比其他的移动传感器要低10倍。唯一的缺点是,你要实现低通和高通滤波来消除重力作用和减少噪音的影响。
Android SDK提供了一个如何使用加速度传感器的示例程序(Accelerometer Play)