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)


From:CSDN

Posted by shadow at 痞客邦 PIXNET 留言(0) 引用(0) 人氣()