文章目錄
Sensor就是傳感器,提供高精度的原始數據,比如操作系統,手勢,傾斜等動作就是利用重力傳感器的數據來判斷;磁力傳感器和加速度傳感器可以計算出方位。
本篇文章側重於學習基本的知識,包括sensor的功能,使用場景,工作原理,輸出數據含義。
Sensor分類
- Motion Sensors:測量三軸的加速度和旋轉
- accelerometers
- gravity(g-sensor)
- gyroscopes(陀螺儀)
- ratational vector
- Environment Sensors:測量環境參數
- temperature
- pressure
- light
- humidity(溼度)
- Position Sensors:測量物理位置
- proximity(距離)
- orientation(方向)
- magnetometers(磁力)
Sensor axes
Mobile device axes
Automative axes
Motion Sensor
Motion Sensor是判斷物體姿態和物體移動的傳感器,其應用也很廣泛:
- 車輛姿態
- 無人機
- 穿戴設備
- 手機重力感應
accelerometers/gravity
如下圖是Android對傳感器數值的定義,其單位是m/s2。這裏要注意accelerometer的值是包含了gravity的值,比如手機水平向上放置,其z軸的數值就是gravity的值(約等於9.81m/s2)
線性加速度可以表示除掉gravity影響的accelerometer。
For example:
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];
}
accelerometer和gravity芯片內部的工作原理可以看:MEMS加速度計陀螺儀磁力計的工作原理
如下圖所示:
-
紅色的部分是可移動的。
-
有加速度的時候的,放大如圖2,C1和C2兩側的電壓會產生微小的變化,電壓值可以反應加速度。
加速度計會輸出三個軸的加速度,測量的加速度包括物理加速度(速度變化)和重力加速度。所有值均採用國際單位制單位 (m/s^2),測量結果爲設備加速度減去沿 3 個傳感器座標軸的重力加速度。 -
自由落體時,(x, y, z) 的範數應接近於 0。
-
當設備平放在桌子上並從其左側向右推動時,x 軸加速度值爲正。
-
當設備平放在桌子上時,z 軸上的加速度值爲 +9.81,相當於設備的加速度 (0 m/s^2) 減去重力加速度 (-9.81 m/s^2)。
-
當設備平放在桌子上並向上擡起時,加速度值大於 +9.81,相當於設備的加速度 (+A m/s^2) 減去重力加速度 (-9.81 m/s^2)。
重力加速度和加速度計的聯繫與區別:
- 座標系相同
- 設備水平靜止的時候,數值相同
- 加速度主要測試運動方向上速度的變化,重力傳感器主要測試設備和地球水平面的差異
gyroscope
gyroscope的單位是rad/s,繞軸順時針旋轉的方向是正值,逆時針旋轉的方向是負值。
For example:下面的代碼表示通過陀螺儀的值,計算物體旋轉角度。
private static final float NS2S = 1.0f / 1000000000.0f;
private float timestamp;
public void onSensorChanged(SensorEvent event)
{
if (timestamp != 0)
{
// event.timesamp表示當前的時間,單位是納秒(1百萬分之一毫秒)
final float dT = (event.timestamp - timestamp) * NS2S;
angle[0] += event.values[0] * dT;
angle[1] += event.values[1] * dT;
angle[2] += event.values[2] * dT;
}
timestamp = event.timestamp;
}
工作原理是利用了科里奧利力:
- 假設圓盤不動,從A往B點方向扔一個小球,會落在B點,其軌跡也是一條直線
- 假設圓盤逆時針旋轉,角速度爲w,從A往B方向扔一個小球,從A的角度來看,還是落在B(實際是B’),但實際的B點已經偏移,而且A的運動軌跡是一條曲線AB’
從B的角度來看,A是受到了側向的力,這個力就是科里奧利力。
根據這個力,我們可以得到角速度。rad/s。
芯片內部工作原理: - 如左圖,沒有旋轉的時候,諧振器是水平方向高速振動。
- 如右圖,有旋轉的時候,垂直方向會檢測到科里奧利力加速度。
Position Sensor
magnetometers
磁力傳感器應用也很廣泛:
- 汽車ABS
- 里程錶
- 指南針
- 金屬探測
磁力傳感器是利用霍爾效應去測試磁場強度的。當電流通過一個位於磁場中的導體的時候,磁場會對導體中的電子產生一個垂直於電子運動方向上的作用力(洛倫茲力),從而在垂直於導體和磁感線的方向上產生電勢差。
磁場也是輸出3個方向的數值,單位是微特斯拉(uT)
proximity
距離傳感器,透過紅外線LED燈發射紅外線,被物體反射後由紅外線探測器接受,藉此判斷接收到紅外線的強度來判斷距離,有效距離大約在10米左右。它可感知手機是否被貼在耳朵上講電話,若是則會關閉屏幕來省電;距離傳感器也可以運用在部分手機支持的手套模式中,用來解鎖或鎖定手機。
Environment Sensor
環境傳感器主要是檢測環境的傳感器,Android支持包括溫度(環境溫度,設備溫度)光,壓力,溼度等傳感器。
light
- 功能:控制屏幕亮度
- 原理:光敏三極管,接收外界光線時,會產生強弱不等的電流,從而感知環境光亮度。
- 單位:環境光的單位是lx
barometer/pressure
- 功能:測量壓力
- 原理:薄膜與變阻器或電容連接起來,氣壓變化導致電阻或電容的數值發生變化,從而獲得氣壓值。
- 單位:hPa
temperature
- 功能:測量溫度
- 原理:熱敏電阻
- 單位:攝氏度
- TYPE_AMBIENT_TEMPERATURE:表示環境溫度
- TYPE_TEMPERATURE:表示設備溼度