2

在獲得旋轉矩陣值時,它包含public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic) 這裏我怎樣才能計算出float[] gravity? 我發現同時使用AccelerometerMagnetic field使用磁場計算旋轉矩陣

boolean success = SensorManager.getRotationMatrix(
    matrixR, 
    matrixI, 
    valuesAccelerometer, 
    valuesMagneticField); 

if(success){ 
SensorManager.getOrientation(matrixR, matrixValues); 

double azimuth = Math.toDegrees(matrixValues[0]); 
double pitch = Math.toDegrees(matrixValues[1]); 
double roll = Math.toDegrees(matrixValues[2]); 

readingAzimuth.setText("Azimuth: " + String.valueOf(azimuth)); 
readingPitch.setText("Pitch: " + String.valueOf(pitch)); 
readingRoll.setText("Roll: "+String.valueOf(roll)); 
} 

我的問題是代碼的樣本在那裏計算orientation

  • 是姿勢值是旋轉矩陣值?
  • 如果沒有,那麼我怎麼能實現這個代碼來獲得旋轉矩陣值使用磁?領域?

要獲得旋轉矩陣我用這個代碼

public void onSensorChanged(SensorEvent sensorEvent) { 
    if (timestamp != 0) { 
     final double dT = (sensorEvent.timestamp - timestamp) * NS2S; 
      double magneticX = sensorEvent.values[0]; 
      double magneticY = sensorEvent.values[1]; 
      double magneticZ = sensorEvent.values[2]; 
         double omegaMagnitude =Math.sqrt(magneticX*magneticX + magneticY*magneticY + magneticZ*magneticZ); 

         if (omegaMagnitude > EPSILON) { 
          magneticX /= omegaMagnitude; 
          magneticY /= omegaMagnitude; 
          magneticZ /= omegaMagnitude; 
     } 
         double thetaOverTwo = omegaMagnitude * dT/2.0f; 
         double sinThetaOverTwo =Math.sin(thetaOverTwo); 
         double cosThetaOverTwo = Math.cos(thetaOverTwo); 
         deltaRotationVector[0] = (double) (sinThetaOverTwo * magneticX); 
         deltaRotationVector[1] = (double) (sinThetaOverTwo * magneticY); 
         deltaRotationVector[2] = (double) (sinThetaOverTwo * magneticZ); 
         deltaRotationVector[3] = cosThetaOverTwo; 


    } 
    double[] deltaRotationMatrix = new double[9]; 
    SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector); 
} 

但問題是,這是getRotationMatrixFromVector說取消定義爲sensor.Any想法?

回答

3

方位不是一個旋轉矩陣,因爲它只提供了與磁北相關的角度。你可以得到旋轉矩陣(方向餘弦矩陣),將幫助您從您的設備框架這樣的座標轉換爲地球的框架:

DCM from Wikipedia

azimuth =方位角(弧度)

pitch =螺距(弧度)

roll =卷(弧度)

+0

Thanks。查看我的第二個代碼,我試圖獲得旋轉矩陣的9個值,它是獲得這些值的正確方法 – MBMJ

+0

它可能是。我做了很長一段時間,從矢量計算旋轉矩陣並沒有給我很好的結果(儘管我可能做了錯誤的事情)。我所知道的是,我給你的解決方案非常完美(我仍然使用它)並且實施起來很簡單。 – PeterGriffin

+0

我找到旋轉矩陣通過使用這個if(成功){SensorManager.getOrientation(matrixR,matrixValues); //代碼在這裏顯示矩陣值' 其中矩陣R是旋轉矩陣並給我結果。但是我不明白它是用真正的座標系嗎? – MBMJ

1

我知道這是一個古老的線程,但萬一有幫助,爲Android,我認爲3×3的旋轉矩陣實際上是由經批准的答案的變化給出。具體而言,在Android的旋轉矩陣是

 
    (cosφ cosψ - sinφ sinψ sinθ)  sinφ cosθ  (cosφ sinψ + sinφ cosψ sinθ) 
    -(sinφ cosψ + cosφ sinψ sinθ)  cosφ cosθ  (-sinφ sinψ + cosφ cosψ sinθ) 
       -sinψ cosθ     -sinθ     cosφ cosθ 

其中

 
    φ = azimuth 
    θ = pitch 
    ψ = roll 

經由

對應於3×3的Android旋轉矩陣R [0]至R [8](matrixR中的問題) ​​
+0

不起作用。嘗試了它,但不幸的是,如果與(不推薦使用)方向傳感器一起使用,會導致透視失真。 –

+0

@AlexanderPacha我認爲你誤解了一些東西。這些是Android在內部使用的公式,他們正在做的是指定3D旋轉矩陣。唯一的問題是,如果您使用Android(未棄用)函數來計算Android的方位角,俯仰角和滾動角,那麼這些是計算Android旋轉矩陣R [0] ... R [8]的正確公式。透視與此無關。我仍然相信這是正確的公式。 – Stochastically

+0

沒有未棄用的傳感器返回方位角,俯仰角和俯仰角(http://developer.android.com/reference/android/hardware/SensorEvent.html#values)。你使用這些公式的傳感器,你從哪裏得到它們? –