做(zuò)自(zì)由與創造的先行(xíng)者

Android運動傳感器

Android開(kāi)發手冊

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

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

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

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

大多數(shù) Android 設備都(dōu)配有加速度計,而現在許多設備都(dōu)帶有陀螺儀。基于軟件的傳感器的可(kě)用性更具可(kě)變性,因為(wèi)其通(tōng)常依賴一(yī)個或多個硬件傳感器來獲取其數(shù)據。根據設備的不同,這(zhè)些基于軟件的傳感器可(kě)以從(cóng)加速度計和(hé)磁力計或陀螺儀中獲取其數(shù)據。

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

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

表 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 軸測量的加速度,并帶有估算的偏差補償。
SensorEvent.values[4]< 沿 Y 軸測量的加速度,并帶有估算的偏差補償。
SensorEvent.values[5]< 沿 Z 軸測量的加速度,并帶有估算的偏差補償。
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 軸的估算漂移。
SensorEvent.values[4]< 繞 y 軸的估算漂移。
SensorEvent.values[5]< 繞 z 軸的估算漂移。
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< 不适用 不适用 不适用
TYPE_STEP_COUNTER< SensorEvent.values[0]< 已激活傳感器最後一(yī)次重新啓動以來用戶邁出的步數(shù)。 步數(shù)
TYPE_STEP_DETECTOR< 不适用 不适用 不适用

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

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

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

使用重力傳感器

重力傳感器提供指示重力方向和(hé)大小的三維矢量。通(tōng)常,此傳感器用于确定設備在空間(jiān)中的相對屏幕方向。

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

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

使用線性加速度計

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

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

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

使用旋轉矢量傳感器

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

使用計步器傳感器

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

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

使用步測器傳感器

每次用戶邁步時(shí),步測器傳感器都(dōu)會觸發事件。延遲時(shí)間(jiān)預計将低(dī)于 2 秒。

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

使用原始數(shù)據

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

使用加速度計

加速度傳感器測量施加到設備的加速度,包括重力。

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

如(rú)果将設備推向左側(因此向右移動),則 x 加速度值為(wèi)正。

如(rú)果将設備推到底部(因此它向遠離您的方向移動),則 y 加速度值為(wèi)正。

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

固定設備的加速度值為(wèi) +9.81,該值對應設備的加速度(0 m/s2 減去重力 -9.81 m/s2)。

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

使用陀螺儀

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

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

通(tōng)常,陀螺儀的輸出會随時(shí)間(jiān)積分,以計算描述角度随時(shí)間(jiān)步長(cháng)變化的旋轉。

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

使用未經校準的陀螺儀

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

calibrated_x ~= uncalibrated_x - bias_estimate_x

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

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

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