关于Android 传感器坐标与读数的进一步讨论
關(guān)于Android 傳感器坐標(biāo)與讀數(shù)的進(jìn)一步討論
?
之前一些相關(guān)的討論見:
? Android Sensors (3) 傳感器坐標(biāo)系統(tǒng)
? Android Sensors (5) 運(yùn)動傳感器 Motion Sensors?
? Android Sensors (6) 位置傳感器 Position Sensors?
?
傳感器分類
總體來說,傳感器分為運(yùn)動傳感器和位置傳感器兩種。(此處忽略了一些溫度、光照等環(huán)境傳感器)。
運(yùn)動傳感器用來監(jiān)測設(shè)備的運(yùn)動,比如傾斜、震動和搖擺。運(yùn)動傳感器包括:加速度計、陀螺儀、重力感應(yīng)器、線性加速度計、旋轉(zhuǎn)向量傳感器。
位置傳感器用來監(jiān)測設(shè)備的位置,即相對于世界坐標(biāo)系的位置。包括地磁場傳感器、接近傳感器和方向傳感器。
(方向傳感器是基于軟件的,根據(jù)加速度計和地磁場傳感器導(dǎo)出)。
可以看出,手機(jī)的上述傳感器讀數(shù),需要涉及到兩個坐標(biāo)系,一個是相對于手機(jī)自身,一個是相對于世界位置。
上面很多傳感器是測量手機(jī)自身姿態(tài)的,那么它們讀出的數(shù)是相對于手機(jī)坐標(biāo)系的;
另一些傳感器和方法,目的是測量手機(jī)在世界坐標(biāo)系中的位置,那么它們的讀數(shù)就是相對于世界坐標(biāo)系的。
?
手機(jī)的自然坐標(biāo)系
當(dāng)一個設(shè)備被放在其默認(rèn)的方向上時,X軸是水平指向右的,Y軸是垂直向上的,Z軸是指向屏幕正面之外的,即屏幕背面是Z的負(fù)值。
?
當(dāng)設(shè)備運(yùn)動或者旋轉(zhuǎn)的時候,這些坐標(biāo)軸是不會改變的,即它們是跟隨手機(jī)的。
即是說,手機(jī)坐標(biāo)系是跟隨設(shè)備的自然方向的(但是請記住自然方向不一定是豎直,比如平板它的自然方向就很有可能是橫向)。
使用這個坐標(biāo)系的傳感器:
- ?Acceleration sensor
- Gravity sensor
- Gyroscope
- Linear acceleration sensor
- Geomagnetic field sensor
即是說它們的度數(shù)顯示了在手機(jī)的這三個軸上的數(shù)字大小。
?
屏幕旋轉(zhuǎn)
常常要考慮屏幕的旋轉(zhuǎn),即屏幕畫面相對于自然方向的旋轉(zhuǎn)。
于是就需要使用?getRotation()方法來獲取屏幕的旋轉(zhuǎn)值。
這個方法是Display類中的,跟傳感器不相關(guān)。
這個方法的返回值只對應(yīng)0,90,180,270四種旋轉(zhuǎn)情況,它說明屏幕顯示區(qū)域的旋轉(zhuǎn)情況。
?
世界坐標(biāo)系
有一些傳感器和方法使用相對于世界的坐標(biāo)系,因為它們返回的數(shù)據(jù)反映設(shè)備相對于地球及真實環(huán)境的位置信息。
請見getOrientation()?方法,getRotationMatrix()?方法,Orientation Sensor, 和?Rotation Vector Sensor。下面各自介紹。
?
getRotationMatrix()
getRotationMatrix()方法說明中,定義的世界坐標(biāo)系如下:
????
X軸平行于地面,指向東方。
Y軸平行于地面,指向北極方向。
Z軸垂直于地面,指向天空。
?
getOrientation()
getOrientation()?方法中所用的坐標(biāo)系與上面的不同:
????
X軸平行于地面,指向西方;
Y軸平行于地面,指向地磁場北極。
Z軸垂直于地面,指向地心。
getOrientation方法的返回值表示:
values[0]: azimuth, rotation around the Z axis.
values[1]: pitch, rotation around the X axis.
values[2]: roll, rotation around the Y axis.
并且這三個角度值都是以弧度做單位,逆時針方向為正。
?
方向傳感器的返回值說明
?
方向傳感器是利用加速度計和地磁場傳感器得到自己的數(shù)據(jù)。
方向傳感器比較特殊,因為它的數(shù)值是相對于絕對方向的。它得到的是手機(jī)設(shè)備的絕對姿態(tài)值。
一個方向傳感器得到的三維數(shù)據(jù)如下:
(參見http://developer.android.com/guide/topics/sensors/sensors_position.html#sensors-pos-orient)
?
方向傳感器返回的都是角度值,以度數(shù)為單位。
注意下面說的x、y、z軸均是手機(jī)自身的坐標(biāo)軸。
第一個角度:Azimuth (degrees of rotation around the z axis).
表示手機(jī)自身的y軸與地磁場北極方向的角度,即手機(jī)頂部朝向與正北方向的角度。
(This is the angle between magnetic north and the device's y axis. )
當(dāng)手機(jī)繞著自身的z軸旋轉(zhuǎn)時,該角度值將發(fā)生改變。
例如該角度值為0時,表示手機(jī)頂部指向正北;該角度為90度時,代表手機(jī)頂部指向正東;該角度為180度時,代表手機(jī)頂部指向正南;該角度為270度時,代表手機(jī)頂部指向正西。
?
第二個角度:Pitch (degrees of rotation around the x axis).
表示手機(jī)頂部或尾部翹起的角度。
當(dāng)手機(jī)繞著自身的x軸旋轉(zhuǎn),該角度會發(fā)生變化,值的范圍是-180到180度。
當(dāng)z軸正向朝著y軸正向旋轉(zhuǎn)時,該角度是正值;當(dāng)z軸正向朝著y軸負(fù)向旋轉(zhuǎn)時,該角度是負(fù)值。
?
假設(shè)將手機(jī)屏幕朝上水平放在桌子上,如果桌子是完全水平的,該角度應(yīng)該是0。
假如從手機(jī)頂部抬起,直到將手機(jī)沿x軸旋轉(zhuǎn)180度(屏幕向下水平放在桌面上),這個過程中,該角度值會從0變化到-180。
如果從手機(jī)底部開始抬起,直到將手機(jī)沿x軸旋轉(zhuǎn)180度(屏幕向下水平放在桌面上),該角度的值會從0變化到180。
?
第三個角度:Roll (degrees of rotation around the y axis).
表示手機(jī)左側(cè)或右側(cè)翹起的角度。
當(dāng)手機(jī)繞著自身x軸旋轉(zhuǎn)時,該角度值將會發(fā)生變化,取值范圍是-90到90度。
當(dāng)z軸正向朝著x軸正向旋轉(zhuǎn)時,該角度是負(fù)值;
當(dāng)z軸正向朝著x軸負(fù)向旋轉(zhuǎn)時,該角度是正值。
?
(這里跟官方文檔的說法有點(diǎn)不太一致,即第三個角度的正負(fù)號正好相反,我不知道是文檔寫錯了,還是它用了別的什么坐標(biāo)系)。
因為通過真機(jī)測試,結(jié)果如下:
將手機(jī)屏幕朝上水平放在桌子上,如果桌子是完全水平的,該角度應(yīng)該是0。
假如將手機(jī)左側(cè)逐漸抬起,直到將手機(jī)沿Y軸旋轉(zhuǎn)90度(手機(jī)與桌面垂直),在這個旋轉(zhuǎn)過程中,該角度會從0變化到-90。
如果從手機(jī)的右側(cè)開始抬起,直到將手機(jī)沿Y軸旋轉(zhuǎn)90度(手機(jī)與桌面垂直),該角度的值會從0變化到90度。
?
?
?
其他說明:
由于需要計算,所以方向傳感器的準(zhǔn)確度和精度都會受到影響。
官方文檔上說,只有當(dāng)?shù)谌齻€roll的角度值為0的時候得到的值比較可靠。
specifically, this sensor is only reliable when the roll component is 0。
所以從Android 2.2 (API level 8)開始,不建議使用方向傳感器。
建議使用?getRotationMatrix()和getOrientation()?結(jié)合來計算方向值。
也可以利用 remapCoordinateSystem()方法來進(jìn)行一些方向值向其他坐標(biāo)系的轉(zhuǎn)換。
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的关于Android 传感器坐标与读数的进一步讨论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 邮件系统三功能 建金字塔防护体系
- 下一篇: PostgreSQL在何处处理 sql查