做自(zì)由與創造的先行者

Android運動傳感器

Android開(kāi)發手冊

Android 平台提供多種傳感器,可讓您監視(shì)設備的運動。

傳感器的可能(néng)架構因傳感器類型而異:

重力、線性加速度、旋轉矢量、有效運動、計(jì)步器和(hé)步測器傳感器可能(néng)基于硬件,也(yě)可能(néng)基于軟件。

加速度計(jì)傳感器和(hé)陀螺儀傳感器始終基于硬件。

大(dà)多數 Android 設備都配有加速度計(jì),而現(xiàn)在許多設備都帶有陀螺儀。基于軟件的傳感器的可用(yòng)性更具可變性,因爲其通常依賴一個或多個硬件傳感器來(lái)獲取其數據。根據設備的不同,這(zhè)些(xiē)基于軟件的傳感器可以從(cóng)加速度計(jì)和(hé)磁力計(jì)或陀螺儀中獲取其數據。

運動傳感器在監控設備運動方面(例如傾斜、晃動、旋轉或擺動)非常有用(yòng)。該移動通常是用(yòng)戶直接輸入的反映(例如,用(yòng)戶在遊戲中駕駛汽車,或在遊戲中控制球),但(dàn)也(yě)可能(néng)反映設備所處的物理(lǐ)環境(例如,在開(kāi)車時(shí)與您一起移動)。在第一種情況下(xià),您正在監控相對(duì)于設備參照系或應用(yòng)參照系的運動;在第二種情況下(xià),您正在監控相對(duì)于世界參照系的運動。運動傳感器本身通常不用(yòng)于監視(shì)設備位置,但(dàn)可以與其他(tā)傳感器(例如地磁場傳感器)一起使用(yòng),以确定設備相對(duì)于世界參照系的位置(如需了(le)解詳細信息,請(qǐng)參閱位置傳感器)。

所有運動傳感器都爲每個 SensorEvent 返回傳感器值的多維數組。例如,在單個傳感器事(shì)件期間,加速度計(jì)返回三個坐(zuò)标軸的加速力數據,而陀螺儀返回三個坐(zuò)标軸的旋轉速率數據。這(zhè)些(xiē)數據值與其他(tā) SensorEvent 參數一起在 float 數組中 (values) 返回。表 1 總結了(le)在 Android 平台上(shàng)可用(yòng)的運動傳感器。

表 1. Android 平台支持的運動傳感器。

傳感器 傳感器事(shì)件數據 說明(míng) 度量單位
TYPE_ACCELEROMETER< SensorEvent.values[0]< 沿 x 軸的加速力(包括重力)。 米/秒2
SensorEvent.values[1]< 沿 y 軸的加速力(包括重力)。
SensorEvent.values[2]< 沿 z 軸的加速力(包括重力)。
TYPE_ACCELEROMETER_UNCALIBRATED< SensorEvent.values[0]< 沿 X 軸測量的加速度,沒有任何偏差補償。 米/秒2
SensorEvent.values[1]< 沿 Y 軸測量的加速度,沒有任何偏差補償。
SensorEvent.values[2]< 沿 Z 軸測量的加速度,沒有任何偏差補償。
SensorEvent.values[3]< 沿 X 軸測量的加速度,并帶有估算(suàn)的偏差補償。
SensorEvent.values[4]< 沿 Y 軸測量的加速度,并帶有估算(suàn)的偏差補償。
SensorEvent.values[5]< 沿 Z 軸測量的加速度,并帶有估算(suàn)的偏差補償。
TYPE_GRAVITY< SensorEvent.values[0]< 沿 x 軸的重力。 米/秒2
SensorEvent.values[1]< 沿 y 軸的重力。
SensorEvent.values[2]< 沿 z 軸的重力。
TYPE_GYROSCOPE< SensorEvent.values[0]< 繞 x 軸的旋轉速率。 弧度/秒
SensorEvent.values[1]< 繞 y 軸的旋轉速率。
SensorEvent.values[2]< 繞 z 軸的旋轉速率。
TYPE_GYROSCOPE_UNCALIBRATED< SensorEvent.values[0]< 繞 x 軸的旋轉速率(無漂移補償)。 弧度/秒
SensorEvent.values[1]< 繞 y 軸的旋轉速率(無漂移補償)。
SensorEvent.values[2]< 繞 z 軸的旋轉速率(無漂移補償)。
SensorEvent.values[3]< 繞 x 軸的估算(suàn)漂移。
SensorEvent.values[4]< 繞 y 軸的估算(suàn)漂移。
SensorEvent.values[5]< 繞 z 軸的估算(suàn)漂移。
TYPE_LINEAR_ACCELERATION< SensorEvent.values[0]< 沿 x 軸的加速力(不包括重力)。 米/秒2
SensorEvent.values[1]< 沿 y 軸的加速力(不包括重力)。
SensorEvent.values[2]< 沿 z 軸的加速力(不包括重力)。
TYPE_ROTATION_VECTOR< SensorEvent.values[0]< 沿 x 軸的旋轉矢量分量 (x * sin(θ/2))。 無單位
SensorEvent.values[1]< 沿 y 軸的旋轉矢量分量 (y * sin(θ/2))。
SensorEvent.values[2]< 沿 z 軸的旋轉矢量分量 (z * sin(θ/2))。
SensorEvent.values[3]< 旋轉矢量的标量分量 ((cos(θ/2))。1
TYPE_SIGNIFICANT_MOTION< 不适用(yòng) 不适用(yòng) 不适用(yòng)
TYPE_STEP_COUNTER< SensorEvent.values[0]< 已激活傳感器最後一次重新啓動以來(lái)用(yòng)戶邁出的步數。 步數
TYPE_STEP_DETECTOR< 不适用(yòng) 不适用(yòng) 不适用(yòng)

旋轉矢量傳感器和(hé)重力傳感器是運動檢測和(hé)監控的最常用(yòng)傳感器。旋轉矢量傳感器極具通用(yòng)性,可用(yòng)于各種與運動有關的任務,例如檢測手勢,監控角度變化,以及監控相對(duì)屏幕方向變化。例如,旋轉矢量傳感器是您開(kāi)發遊戲、增強現(xiàn)實應用(yòng)、二維或三維指南針,或者相機穩定應用(yòng)的理(lǐ)想選擇。在大(dà)多數情況下(xià),使用(yòng)這(zhè)些(xiē)傳感器比使用(yòng)加速度計(jì)和(hé)地磁場傳感器或方向傳感器更好(hǎo)。

Android 開(kāi)源項目傳感器

Android 開(kāi)源項目 (AOSP) 提供以下(xià)三個基于軟件的運動傳感器:重力傳感器、線性加速傳感器和(hé)旋轉矢量傳感器。這(zhè)些(xiē)傳感器已 Android 4.0 中完成更新,現(xiàn)在使用(yòng)設備的陀螺儀(除其他(tā)傳感器之外(wài))來(lái)提高(gāo)穩定性和(hé)性能(néng)。如果您要試用(yòng)這(zhè)些(xiē)傳感器,則可以使用(yòng) getVendor() 方法和(hé) getVersion() 方法(供應商爲 Google LLC;版本号爲 3)來(lái)識别它們。您必須通過供應商和(hé)版本号來(lái)識别這(zhè)些(xiē)傳感器,因爲 Android 系統将這(zhè)三個傳感器視(shì)爲輔助傳感器。例如,如果設備制造商提供其自(zì)己的重力傳感器,則 AOSP 重力傳感器将顯示爲輔助重力傳感器。所有這(zhè)三個傳感器都依賴陀螺儀:如果設備沒有陀螺儀,這(zhè)些(xiē)傳感器将不會(huì)顯示并且無法使用(yòng)。

使用(yòng)重力傳感器

重力傳感器提供指示重力方向和(hé)大(dà)小(xiǎo)的三維矢量。通常,此傳感器用(yòng)于确定設備在空(kōng)間中的相對(duì)屏幕方向。

單位與加速度傳感器所用(yòng)的單位 (m/s2) 相同,坐(zuò)标系與加速傳感器使用(yòng)的坐(zuò)标系相同。

注意:當設備處于靜止狀态時(shí),重力傳感器的輸出應與加速度計(jì)的輸出相同。

使用(yòng)線性加速度計(jì)

線性加速傳感器爲您提供了(le)一個三維矢量,表示沿着每個設備軸的加速度(不包括重力)。您可以使用(yòng)此值執行手勢檢測。該值還可以用(yòng)作(zuò)慣性導航系統的輸入值,該系統使用(yòng)航位推測法。

當您想獲取加速度數據而不受重力影響時(shí),通常會(huì)使用(yòng)此傳感器。例如,您可以使用(yòng)此傳感器查看(kàn)汽車行駛的速度。線性加速度傳感器始終具有一個偏移量,您需要将其删除。最簡單的方法是在應用(yòng)中構建一個校準步驟。在校準期間,您可以要求用(yòng)戶将設備放(fàng)在桌子上(shàng),然後讀取所有三個軸的偏移量。然後,您可以從(cóng)加速傳感器的直接讀數中減去該偏移量,以獲得實際的線性加速度。

傳感器坐(zuò)标系與加速度傳感器使用(yòng)的坐(zuò)标系相同,計(jì)量單位 (m/s2) 也(yě)相同。

使用(yòng)旋轉矢量傳感器

旋轉矢量将設備的屏幕方向表示爲角度和(hé)軸的組合,其中設備已圍繞軸(x、y 或 z)旋轉了(le) θ 度。

使用(yòng)計(jì)步器傳感器

計(jì)步器傳感器提供自(zì)已激活傳感器後最後一次重啓以來(lái)用(yòng)戶邁出的步數。與步測器傳感器相比,計(jì)步器的延遲時(shí)間更長(最多 10 秒),但(dàn)精确度更高(gāo)。

如要保護運行應用(yòng)的設備上(shàng)的電池,您應使用(yòng) JobScheduler 類,從(cóng)而以特定的時(shí)間間隔從(cóng)計(jì)步器傳感器檢索當前值。盡管不同類型的應用(yòng)需要不同的傳感器讀取間隔,但(dàn)是除非您的應用(yòng)需要來(lái)自(zì)傳感器的實時(shí)數據,否則應盡可能(néng)延長此間隔。

使用(yòng)步測器傳感器

每次用(yòng)戶邁步時(shí),步測器傳感器都會(huì)觸發事(shì)件。延遲時(shí)間預計(jì)将低(dī)于 2 秒。

注意:您必須聲明(míng) ACTIVITY_RECOGNITION 權限,以便您的應用(yòng)在運行 Android 10 (API 級别 29) 或更高(gāo)版本的設備上(shàng)使用(yòng)此傳感器。

使用(yòng)原始數據

以下(xià)傳感器可爲您的應用(yòng)提供有關施加到(dào)設備的線性力和(hé)旋轉力的原始數據。爲了(le)有效使用(yòng)這(zhè)些(xiē)傳感器的值,您需要從(cóng)環境中濾除重力等因素。您可能(néng)還需要對(duì)值趨勢應用(yòng)平滑算(suàn)法以減少噪聲。

使用(yòng)加速度計(jì)

加速度傳感器測量施加到(dào)設備的加速度,包括重力。

加速度計(jì)使用(yòng)标準的傳感器坐(zuò)标系。實際上(shàng),這(zhè)意味着當設備以自(zì)然屏幕方向平放(fàng)在桌子上(shàng)時(shí),以下(xià)條件适用(yòng):

如果将設備推向左側(因此向右移動),則 x 加速度值爲正。

如果将設備推到(dào)底部(因此它向遠離您的方向移動),則 y 加速度值爲正。

如果您以 A m/s2 的加速度将設備推向天空(kōng),則 z 加速度值等于 A + 9.81,該值對(duì)應設備的加速度 (+A m/s2) 減去重力 (-9.81 m/s2)。

固定設備的加速度值爲 +9.81,該值對(duì)應設備的加速度(0 m/s2 減去重力 -9.81 m/s2)。

通常,如果要監控設備的運動,加速度計(jì)是一個很(hěn)好(hǎo)的傳感器。幾乎所有運行 Android 的手機和(hé)平闆電腦(nǎo)都具有加速度計(jì),其功耗比其他(tā)運動傳感器低(dī)約 10 倍。一個缺點是您可能(néng)必須實現(xiàn)低(dī)通和(hé)高(gāo)通濾波器,以消除重力并降低(dī)噪聲。

使用(yòng)陀螺儀

陀螺儀測量圍繞設備的 x、y 和(hé) z 軸的旋轉速率(弧度/秒)。

傳感器的坐(zuò)标系與用(yòng)于加速傳感器的坐(zuò)标系相同。逆時(shí)針方向旋轉爲正;也(yě)就是說,如果觀察者從(cóng) x、y 或 z 軸上(shàng)某個正位置看(kàn)向位于原點的設備,則在該設備看(kàn)起來(lái)是逆時(shí)針旋轉的情況下(xià),該觀察者将報(bào)告正旋轉。這(zhè)是正向旋轉的标準數學定義,與方向傳感器使用(yòng)的側傾定義不同。

通常,陀螺儀的輸出會(huì)随時(shí)間積分,以計(jì)算(suàn)描述角度随時(shí)間步長變化的旋轉。

标準陀螺儀可提供原始旋轉數據,而無需對(duì)噪聲和(hé)漂移(偏差)進行任何過濾或校正。實際上(shàng),陀螺儀的噪聲和(hé)漂移會(huì)引入需要補償的誤差。通常,您可以通過監控其他(tā)傳感器(例如重力傳感器或加速度計(jì))來(lái)确定漂移(偏差)和(hé)噪聲。

使用(yòng)未經校準的陀螺儀

未經校準的陀螺儀與陀螺儀類似,不同之處在于沒有陀螺漂移補償應用(yòng)于旋轉速率。出廠(chǎng)校準和(hé)溫度補償仍應用(yòng)于旋轉速率。未經校準的陀螺儀可用(yòng)于後期處理(lǐ)和(hé)融合屏幕方向數據。通常,gyroscope_event.values[0] 将接近 uncalibrated_gyroscope_event.values[0] - uncalibrated_gyroscope_event.values[3]。即,

calibrated_x ~= uncalibrated_x - bias_estimate_x

注意:未經校準的傳感器可提供更多的原始結果,并且可能(néng)會(huì)包含一定偏差,但(dàn)其測量值包含的從(cóng)應用(yòng)的校正到(dào)校準的跳躍次數更少。某些(xiē)應用(yòng)可能(néng)更喜歡這(zhè)些(xiē)未經校準的結果,因爲它們更平滑、更可靠。例如,如果應用(yòng)嘗試進​​行自(zì)己的傳感器融合,則引入校準實際上(shàng)可能(néng)會(huì)扭曲結果。

除了(le)旋轉速率外(wài),未經校準的陀螺儀還會(huì)提供圍繞每個軸的估算(suàn)漂移。

網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發
下(xià)一篇:Android位置傳感器
上(shàng)一篇:Android傳感器概覽