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

Android位置傳感器

Android開(kāi)發手冊

Android 平台提供以下(xià)兩種傳感器,以幫助您确定設備的位置:地(dì)磁場傳感器和(hé)加速度計。Android 平台還提供一(yī)種傳感器,可(kě)幫助您确定設備表面與物(wù)體的鄰近程度(名為(wèi)近程傳感器)。地(dì)磁場傳感器和(hé)近程傳感器均基于硬件。大部分手機和(hé)平闆電腦制造商都(dōu)在其設備中內(nèi)置地(dì)磁場傳感器。同樣,手機制造商通(tōng)常還會在其設備中內(nèi)置近程傳感器,以确定手機與用戶臉部的靠近程度(例如(rú),在手機通(tōng)話期間(jiān))。您可(kě)以使用設備加速度計和(hé)地(dì)磁場傳感器的讀數(shù),确定設備的屏幕方向。

注意:Android 2.2(API 級别 8)已棄用方向傳感器,Android 4.4W(API 級别 20)已棄用方向傳感器類型。

位置傳感器對于确定設備在世界參照系中的物(wù)理位置很(hěn)有用。例如(rú),您可(kě)以結合使用地(dì)磁場傳感器和(hé)加速度計來确定設備相對于磁北極點的位置。您還可(kě)以使用這(zhè)兩種傳感器,在應用的參照系中确定設備的屏幕方向。位置傳感器通(tōng)常不會用于監測設備的移動或運動情況,例如(rú)晃動、傾斜,或沖擊(詳情請(qǐng)參閱運動傳感器)。

地(dì)磁場傳感器和(hé)加速度計會為(wèi)每個 SensorEvent 返回傳感器值的多維數(shù)組。例如(rú),地(dì)磁場傳感器提供單個傳感器事件中所有三個坐(zuò)标軸的地(dì)磁場強度值。同樣,加速度計傳感器測量傳感器事件中施加到設備的加速度。如(rú)需了(le)解有關傳感器所用坐(zuò)标系的詳細信息,請(qǐng)參閱傳感器坐(zuò)标系。近程傳感器會為(wèi)每個傳感器事件提供一(yī)個值。表 1 總結了(le) Android 平台支持的位置傳感器。

表 1. Android 平台支持的位置傳感器。

傳感器 傳感器事件數(shù)據 說明(míng) 度量單位
TYPE_GAME_ROTATION_VECTOR SensorEvent.values[0] 沿 x 軸的旋轉矢量分量 (x * sin(θ/2))。 無單位
SensorEvent.values[1] 沿 y 軸的旋轉矢量分量 (y * sin(θ/2))。
SensorEvent.values[2] 沿 z 軸的旋轉矢量分量 (z * sin(θ/2))。
TYPE_GEOMAGNETIC_ROTATION_VECTOR SensorEvent.values[0] 沿 x 軸的旋轉矢量分量 (x * sin(θ/2))。 無單位
SensorEvent.values[1] 沿 y 軸的旋轉矢量分量 (y * sin(θ/2))。
SensorEvent.values[2] 沿 z 軸的旋轉矢量分量 (z * sin(θ/2))。
TYPE_MAGNETIC_FIELD SensorEvent.values[0] 沿 x 軸的地(dì)磁場強度。 微(wēi)特斯拉
SensorEvent.values[1] 沿 y 軸的地(dì)磁場強度。
SensorEvent.values[2] 沿 z 軸的地(dì)磁場強度。
TYPE_MAGNETIC_FIELD_UNCALIBRATED SensorEvent.values[0] 沿 x 軸的地(dì)磁場強度(無硬鐵校準功能(néng))。 微(wēi)特斯拉
SensorEvent.values[1] 沿 y 軸的地(dì)磁場強度(無硬鐵校準功能(néng))。
SensorEvent.values[2] 沿 z 軸的地(dì)磁場強度(無硬鐵校準功能(néng))。
SensorEvent.values[3] 沿 x 軸的鐵偏差估算。
SensorEvent.values[4] 沿 y 軸的鐵偏差估算。
SensorEvent.values[5] 沿 z 軸的鐵偏差估算。
TYPE_ORIENTATION1 SensorEvent.values[0] 方位角(繞 z 軸的角度)。
SensorEvent.values[1] 俯仰角(繞 x 軸的角度)。
SensorEvent.values[2] 傾側角(繞 y 軸的角度)。
TYPE_PROXIMITY SensorEvent.values[0] 與物(wù)體的距離。2 厘米

1Android 2.2(API 級别 8)已棄用此傳感器,Android 4.4W(API 級别 20)已棄用此傳感器類型。傳感器框架提供用于獲取設備屏幕方向的備用方法,計算設備的屏幕方向對此有所闡述。

2 某些近程傳感器隻提供二進制值來表示遠和(hé)近。

使用遊戲旋轉矢量傳感器

除了(le)不使用地(dì)磁場,遊戲旋轉矢量傳感器與旋轉矢量傳感器完全相同。因此,Y 軸不會指向北方,而會指向其他(tā)參照。當陀螺儀繞 Z 軸漂移時(shí),該參照可(kě)以漂移相同的數(shù)量級。

遊戲旋轉矢量傳感器不使用磁場,因此相對旋轉更準确,且不受磁場變化的影響。如(rú)果您不在意北方在哪裏,并且由于依賴磁場,正常旋轉矢量不符合您的需求,則請(qǐng)在遊戲中使用此傳感器。

使用地(dì)磁旋轉矢量傳感器

地(dì)磁旋轉矢量傳感器與旋轉矢量傳感器類似,但(dàn)前者使用磁力計而非陀螺儀。此傳感器的精度比普通(tōng)旋轉矢量傳感器低(dī),但(dàn)能(néng)耗也有所降低(dī)。如(rú)果您希望在不消耗過多電量的情況下(xià)收集後台中的某些旋轉信息,則可(kě)以僅使用此傳感器。與批處理結合使用時(shí),此傳感器最為(wèi)有用。

計算設備的屏幕方向

通(tōng)過計算設備的屏幕方向,您可(kě)以監測設備相對于地(dì)球參照系(具體為(wèi)磁北極)的位置。

系統使用設備的地(dì)磁場傳感器和(hé)加速度計來計算屏幕方向的角度。通(tōng)過使用這(zhè)兩個硬件傳感器,系統可(kě)提供以下(xià)三個屏幕方向角度的數(shù)據:

方位角(繞 z 軸旋轉的角度)。此為(wèi)設備當前指南針方向與磁北向之間(jiān)的角度。如(rú)果設備的上(shàng)邊緣面朝磁北向,則方位角為(wèi) 0 度;如(rú)果上(shàng)邊緣朝南,則方位角為(wèi) 180 度。與之類似,如(rú)果上(shàng)邊緣朝東,則方位角為(wèi) 90 度;如(rú)果上(shàng)邊緣朝西(xī),則方位角為(wèi) 270 度。

俯仰角(繞 x 軸旋轉的角度)。此為(wèi)平行(xíng)于設備屏幕的平面與平行(xíng)于地(dì)面的平面之間(jiān)的角度。如(rú)果将設備與地(dì)面平行(xíng)放置,且其下(xià)邊緣最靠近您,同時(shí)将設備上(shàng)邊緣向地(dì)面傾斜,則俯仰角将變為(wèi)正值。沿相反方向傾斜(将設備上(shàng)邊緣向遠離地(dì)面的方向移動)将使俯仰角變為(wèi)負值。值的範圍為(wèi) -180 度到 180 度。

傾側角(繞 y 軸旋轉的角度)。此為(wèi)垂直于設備屏幕的平面與垂直于地(dì)面的平面之間(jiān)的角度。如(rú)果将設備與地(dì)面平行(xíng)放置,且其下(xià)邊緣最靠近您,同時(shí)将設備左邊緣向地(dì)面傾斜,則側傾角将變為(wèi)正值。沿相反方向傾斜(将設備右邊緣移向地(dì)面)将使側傾角變為(wèi)負值。值的範圍為(wèi) -90 度到 90 度。

注意:傳感器的側傾角定義已更改,目的是反映地(dì)理傳感器生态系統中的絕大部分實現。

請(qǐng)注意,這(zhè)些角度使用的坐(zuò)标系與航空領域所用的坐(zuò)标系(針對偏航、俯仰和(hé)側傾)不同。在航空系統中,x 軸沿飛機的長(cháng)邊,從(cóng)機尾到機頭。

屏幕方向傳感器通(tōng)過處理來自(zì)加速度計和(hé)地(dì)磁場傳感器的原始傳感器數(shù)據來獲取其數(shù)據。由于涉及繁重處理,屏幕方向傳感器的準确度和(hé)精度會降低(dī)。具體而言,此傳感器僅在側傾角為(wèi) 0 時(shí)才可(kě)靠。因此,Android 2.2(API 級别 8)已棄用屏幕方向傳感器,Android 4.4W(API 級别 20)已棄用屏幕方向傳感器類型。我們建議(yì)不要(yào)使用來自(zì)屏幕方向傳感器的原始數(shù)據,而是結合使用 getRotationMatrix() 方法和(hé) getOrientation() 方法來計算屏幕方向值

使用地(dì)磁場傳感器

借助地(dì)磁場傳感器,您可(kě)以監測地(dì)球磁場的變化。

此傳感器提供三個坐(zuò)标軸中每個坐(zuò)标軸的原始場強數(shù)據(以微(wēi)特斯拉為(wèi)單位)。通(tōng)常,您無需直接使用此傳感器。您可(kě)以改用旋轉矢量傳感器來确定原始旋轉運動,或者将加速度計和(hé)地(dì)磁場傳感器與 getRotationMatrix() 方法結合使用,以獲得旋轉矩陣和(hé)傾角矩陣。然後,您可(kě)以将這(zhè)些矩陣與 getOrientation() 和(hé) getInclination() 方法一(yī)起使用,以獲取方位角和(hé)地(dì)磁傾斜度數(shù)據。

注意:在測試您的應用時(shí),您可(kě)以通(tōng)過按數(shù)字 8 的圖案揮動設備來提高傳感器的準确性。

使用未經校準的磁力計

未經校準的磁力計與地(dì)磁場傳感器類似,不同之處在于未對磁場應用硬鐵校準。出廠校準和(hé)溫度補償仍應用于磁場。未經校準的磁力計可(kě)用于處理不良的硬鐵估算。通(tōng)常,geomagneticsensor_event.values[0] 将接近 uncalibrated_magnetometer_event.values[0] - uncalibrated_magnetometer_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)會扭曲結果。

除磁場外(wài),未經校準的磁力計還提供每個軸上(shàng)的估算硬鐵偏差。

使用近程傳感器

近程傳感器可(kě)讓您确定物(wù)體與設備的距離。

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