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)