2010-11-13 71 views
14

有兩種獲取3個旋轉值(方位角,俯仰角,滾轉角)的方法。傳感器之間的不同值TYPE_ACCELEROMETER/TYPE_MAGNETIC_FIELD和TYPE_ORIENTATION

一種是註冊TYPE_ORIENTATION類型的偵聽器。這是最簡單的方法,我也得到一個正確的範圍內從每一個旋轉值作爲文檔說: 方位角:0,359] 間距:[-180,180] 卷:[-90,90]

另一個,第一次看到它時最明確和最複雜的瞭解。 Android推薦它,所以我想使用它,但我得到不同的值。

方位角:[-180,180]。 -180/180是S,0 i N,90 E和-90 W.
pitch:[-90,90]。 90是90,-90是-90,0是0但是-180/180(與屏幕向下)是0.
roll:[-180,180]。

我應該得到相同的值,但有小數,對不對?

我有以下代碼:

aValues = new float[3]; 
mValues = new float[3]; 

sensorListener = new SensorEventListener(){ 
    public void onSensorChanged (SensorEvent event){ 
     switch (event.sensor.getType()){ 
      case Sensor.TYPE_ACCELEROMETER: 
       aValues = event.values.clone(); 
       break; 
      case Sensor.TYPE_MAGNETIC_FIELD: 
       mValues = event.values.clone(); 
       break; 
     } 

     float[] R = new float[16]; 
     float[] orientationValues = new float[3]; 

     SensorManager.getRotationMatrix (R, null, aValues, mValues); 
     SensorManager.getOrientation (R, orientationValues); 

     orientationValues[0] = (float)Math.toDegrees (orientationValues[0]); 
     orientationValues[1] = (float)Math.toDegrees (orientationValues[1]); 
     orientationValues[2] = (float)Math.toDegrees (orientationValues[2]); 

     azimuthText.setText ("azimuth: " + orientationValues[0]); 
     pitchText.setText ("pitch: " + orientationValues[1]); 
     rollText.setText ("roll: " + orientationValues[2]); 
    } 

    public void onAccuracyChanged (Sensor sensor, int accuracy){} 
}; 

請幫助。這非常令人沮喪。

我是否必須對待這些值或者我做錯了什麼?

謝謝。

+1

我一直在爲此工作約2周。你的代碼看起來應該是這樣的(根據我已經能夠找到的文檔),但是正如你注意到它與TYPE_ORIENTATION傳感器結果不匹配。檢查orientationValues [0]爲負值並添加它似乎是一件簡單的事情。但這並不完全。您不顯示傳感器更新的頻率。我發現即使TYPE_ORIENTATION結果看起來相當穩定,更快的更新也會產生更好的結果。如果你想一起工作,請聯繫[email protected] – 2010-11-14 00:41:10

+0

所有傳感器的速度都是GAME,但我認爲問題與速度無關。這很奇怪,因爲所有博客和論壇(以及我正在閱讀的這本書!)都以相同的方式實施傳感器。 – 2010-11-14 08:21:19

+2

好吧,大家都說如何使用加速度計和磁場,但沒有人說TYPE_ORIENTATION的返回值是不同的,甚至是官方文檔。幹得好的人。等待一個答案... – 2010-11-14 19:42:25

回答

1

您在計算中缺少一個關鍵計算。
remapCoordinateSystem給你做一個getRotationMatrix

添加到您的代碼,一切都會好起來的。
你可以閱讀更多關於它here

6

我可能會在黑暗中拍攝,但如果我正確理解你的問題,你想知道爲什麼你得到[-179..179]而不是[0..360]

請注意,-180+180相同,並且與180 + N*360相同,其中N是整數(整數)。

換句話說,如果你想獲得相同的數字與方向感應器,你可以這樣做:

// x = orientationValues[0]; 
// y = orientationValues[1]; 
// z = orientationValues[2]; 
x = (x + 360.0) % 360.0; 
y = (y + 360.0) % 360.0; 
z = (z + 360.0) % 360.0; 

這會給你的價值觀在[0..360]範圍爲你想。

+0

我不記得我知道我是如何解決問題的xD,但爲你+1! :P – 2012-05-14 17:11:22

21

我知道我在這裏玩線程巫師,但最近我一直在做這件事,所以我想我會扔我的2¢。

該設備不包含指南針或傾角計,因此它不直接測量方位角,俯仰角或滾動角。 (我們稱這些歐拉角,BTW)。相反,它使用加速度計和磁力計,兩者都產生3維空間的XYZ向量。這些用於計算方位角等值。

的載體是在設備座標空間:

Device coordinates

世界座標具有Ÿ朝北,X朝東,和Z朝上:

World coordinates

因此,設備的「中性「方向平放在桌面上,其頂部朝北。

加速度計在「向上」方向上產生矢量。磁力計在「北」方向產生一個矢量。 (注意,在北半球,這趨向於向下指向由於magnetic dip。)

加速度計向量和磁力載體可通過數學SensorManager.getRotationMatrix()返回一個3×3矩陣,其將映射在設備座標向量進行組合到世界座標,反之亦然。對於處於中立位置的設備,此函數將返回單位矩陣。

此矩陣不隨屏幕方向而變化。這意味着您的應用程序需要了解方向並進行相應的補償。

SensorManager.getOrientation()獲取轉換矩陣並計算方位角,俯仰角和橫滾角值。這些是相對於處於中立位置的裝置而取得的。

我不知道調用此函數和僅使用TYPE_ORIENTATION傳感器之間的區別是什麼,除了函數允許您先操縱矩陣。

如果設備向上傾斜90°或靠近它,則歐拉角的使用會分開。數學上這是一個退化的情況。在這個領域,設備應該如何知道你是否在改變方位或滾動?

函數SensorManager.remapCoordinateSystem()可用於操縱變換矩陣以補償您可能瞭解的設備方向。但是,我的實驗表明,這並不包括所有的情況,甚至不包括一些常見的情況。例如,如果你想重新映射爲保持直立的設備(例如拍照),你會希望通過這個矩陣乘以變換矩陣:

1 0 0 
0 0 1 
0 1 0 

調用getOrientation()之前,這不remapCoordinateSystem()支持的方向重新映射之一[有人請糾正我,如果我錯過了這裏]。

好吧,所有這些都是冗長的說法,如果你使用的是方向,無論是來自TYPE_ORIENTATION傳感器還是來自getOrientation(),你都可能做錯了。 實際上只有需要歐拉角度,它是以用戶友好的形式顯示方向信息,註釋照片,驅動飛行儀表顯示,或類似的東西。

如果您想進行與設備方向有關的計算,那麼使用變換矩陣和使用XYZ向量幾乎肯定會更好。

工作的顧問,每當有人來到我這裏有涉及歐拉角的一個問題,我回來了,問他們什麼他們真的試圖做的,然後找到一種方法與載體去做吧。

在你原來的問題,getOrientation()算起來應該(從弧度轉換後)在[-180 180] [-90 90]和[-180 180]返回三個值。在實踐中,我們將方位角視爲[0 360]中的數字,因此您應該簡單地將360添加到您收到的任何負數。你的代碼看起來像寫的那樣正確如果我確切知道你期望得到的結果以及你得到的結果會有所幫助。

編輯補充:一對夫婦更多的心思。 Android的現代版本使用稱爲「傳感器融合」的東西,這基本上意味着所有可用的輸入 - 加速度計,磁力計,陀螺儀 - 在數學黑盒(通常是卡爾曼濾波器,但取決於供應商)中組合在一起。所有不同的傳感器 - 加速度,磁場,陀螺儀,重力,線性加速度和方向 - 均被視爲這個黑匣子的輸出。

只要有可能,你應該使用TYPE_GRAVITY而非TYPE_ACCELEROMETER作爲輸入到getRotationMatrix()。

+0

感謝您的解釋,您能指導我解答這個問題嗎? http://stackoverflow.com/questions/27137239/get-moving-device-direction-without-gps – Arash 2014-11-26 12:12:37

+1

我已經添加了對這個問題的答案。你可能不會喜歡它;這是一個非常非常難以解決的問題。 – 2014-11-26 17:20:49

相關問題