2013-03-27 78 views
11

我使用Android重力和磁場傳感器通過SensorManager.getRotationMatrix和SensorManager.getOrientation來計算方向。這給了我方位角,音高和方位號碼。當設備平放在桌子上時,結果看起來很明智。當我的Android設備不平坦時,我應該如何計算方位角,俯仰角,方向?

不過,我有縱向和橫向之間切換禁用清單中,讓getWindowManager()。getDefaultDisplay()。getRotation()始終爲零。當我將設備旋轉90度以使其垂直時,我遇到了麻煩。有時候這些數字看起來相當不對,我意識到這與Gimbal lock有關。但是,其他應用程序似乎沒有這個問題。例如,我將我的應用與兩個免費的傳感器測試應用(Sensor Tester (Dicotomica)Sensor Monitoring (R's Software))進行了比較。我的應用在設備平坦時與這些應用一致,但是當我將設備旋轉到垂直位置時,可能會有顯着差異。這兩個應用似乎彼此都認同,那麼他們如何解決這個問題呢?

回答

7

我認爲當設備不平時定義方位角度的最好方法是使用一個更合適的角座標系統,即從SensorManager.getOrientation(...)得到的標準歐拉角。我建議我描述一個here on math.stackexchange.com。我也已經把一些代碼實現在an answer here中。除了方位角的良好定義之外,它還具有俯仰角的定義,其正好是在此處的另一個答案中提到的Math.acos(rotationMatrix[8])給出的角度。

你可以從我在第一段已經給這兩個環節的全部細節。但是,總之,您的旋轉矩陣R來自SensorManager.getRotationMatrix(...)是

equation with definition of R matrix

其中(E X,E ÿ,E Ž),(N X,N ÿ,N Ž)和(G X,G y,G z)是指向正東,北和向重力方向的矢量。然後你想要的方位角是由

equation defining the azimuth angle

+0

不幸的是,這對我從'SensorManager.getRotationMatrixFromVector'獲得的旋轉矩陣(使用傳感器'TYPE_ROTATION_VECTOR')不起作用。當我計算'double a = Math.toDegrees(Math.atan((r [1] - r [3])/(r [0] + r [4])));'(其中r是旋轉矩陣)我總是以-90 <='a' <= 90的角度結束 – Zardoz 2016-07-19 11:01:12

9

當設備是不平坦的,你必須調用getOrientation之前調用remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR);

azimuth返回通過getOrientation由設備單元Y axis正交伸入世界East-North plane,然後計算所得到的投影矢量和北軸之間的角度獲得。

現在我們通常認爲的方向,其中後置攝像頭指向的方向。這是-Z的方向,其中Z是指出屏幕的設備軸。當設備平坦時,我們不會考慮方向並接受曾經給過的東西。但是當它不是平坦的,我們預計它是-Z的方向。但getOrientation計算Y axis的方向,因此,我們需要在調用getOrientation之前互換Y and Z axes。這正是remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR)所做的,它保持完整的X axis和地圖Z to Y

現在,那麼你如何知道什麼時候remap與否。你可以通過檢查來做到這一點

float inclination = (float) Math.acos(rotationMatrix[8]); 
if (result.inclination < TWENTY_FIVE_DEGREE_IN_RADIAN 
      || result.inclination > ONE_FIFTY_FIVE_DEGREE_IN_RADIAN) 
{ 
    // device is flat just call getOrientation 
} 
else 
{ 
    // call remap 
} 

上面的傾角是設備屏幕和世界東北飛機之間的角度。它顯示了設備傾斜的程度。

+0

感謝您的答覆。然而,這不是這兩個免費的傳感器應用程序所做的,因爲當傾角超過25度(或155度)時,根據您的建議,由於軸的切換,俯仰和滾動數字會跳躍。免費傳感器應用程序的俯仰和滾動數字不會跳躍。另外,軸向AXIS_X和AXIS_Z的切換僅適用於一個方向上的傾斜,而在其他方向上的傾斜會導致不正確的方位角跳動(儘管通過調整正在切換的軸可能是正確的)。 – gisking 2013-04-07 11:23:01

+0

表示您不調用重映射的俯仰和滾轉值,僅用於方位角。我不明白你的意思是在另一個方向上傾斜嗎?如果你的意思是屏幕沒有面對你,那麼當然屏幕朝向你的方向是相反的。 – 2013-04-07 19:03:12

+0

Thsnks您的想法,但其他答案似乎提供了一個更一致的spproach。 – gisking 2013-05-06 11:58:13

相關問題