2

여기에는 회전 행렬 값이 포함되어 있습니다. public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic) 여기에 float[] gravity을 어떻게 계산합니까?자기장을 사용하여 회전 행렬을 계산하십시오.

  • 인가 방향 값이 회전 행렬 값은 다음과 같습니다 둘 다 Accelerometer

    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)); 
    } 
    

    내 질문 Magnetic field은을 사용하여이 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 아이디어에 대한 UNDEFINE을 말한다입니까?

답변

3

오리엔테이션은 자성 노스와 관련된 각도 만 제공하므로 회전 매트릭스가 아닙니다. 당신은 지구의 프레임에 장치 프레임에서 이런 식으로 좌표를 변환하는 데 도움이 될 것입니다 회전 행렬 (방향 코사인 행렬)을 얻을 수 있습니다

DCM from Wikipedia

azimuth = 방위각 (라디안)

pitch = 피치 (라디안)

roll = 롤 (라디안)

+0

감사합니다. 내 2 번째 코드에서 회전 매트릭스의 9 개 값을 가져 오려고하는데, 그 값을 얻는 올바른 방법입니까? – MBMJ

+0

수도 있습니다. 나는 그로부터 오랜 시간이 걸렸습니다. 벡터에서 회전 행렬을 계산해도 좋은 결과를 얻지 못했습니다 (비록 내가 뭔가 잘못했을지라도). 내가 아는 전부는 내가 당신에게 준 해결책이 완벽하게 작동한다는 것이다 (나는 여전히 그것을 사용한다). 그리고 구현이 간단하다. – PeterGriffin

+0

이 경우 {(성공) { SensorManager.getOrientation (matrixR, matrixValues);} 여기에 행렬 값을 표시하는 코드 을 사용하여 회전 행렬을 찾습니다. 여기서 matrixR은 회전 행렬이고 나에게 결과를 제공합니다.하지만 i 실제 좌표계를 사용하고 있는지 이해할 수 없습니까? – MBMJ

1

나는이 오래된 스레드 것을 알고 있지만, 경우에 안드로이드에 대한 I는 3 × 3 회전 행렬 실제로 승인 응답의 변화에 ​​의해 주어진다 생각하는 데 도움이됩니다. 즉, 안드로이드 회전 행렬

 
    (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θ 

이다

통해 [0]에 대한 R [8] (matrixR 질문에) 3 × 안드로이드 회전 행렬 R에 대응
 
    φ = azimuth 
    θ = pitch 
    ψ = roll 

 
    R[0] R[1] R[2] 
    R[3] R[4] R[5] 
    R[6] R[7] R[8] 
+0

작동하지 않습니다. 시도했지만 불행히도 (권장하지 않는) 오리엔테이션 센서와 함께 사용하면 원근 왜곡이 발생합니다. –

+0

@AlexanderPacha 나는 당신이 뭔가를 잘못 이해했다고 생각한다. 이것들은 안드로이드가 내부적으로 사용하는 공식이며, 3D 회전 행렬을 지정하는 것뿐입니다. 유일한 질문은 안드로이드의 (방영되지 않는) 함수를 사용하여 Android의 방위각, 피치 및 롤 버전을 계산하는 경우 Android 회전 행렬 R [0] ... R [8]을 계산하는 올바른 수식입니다. 관점은 이와 관련이 없습니다. 나는 여전히 이것이 올바른 공식이라고 믿는다. – Stochastically

+0

방위각, 피치 및 롤 (http://developer.android.com/reference/android/hardware/SensorEvent.html#values)을 반환하는 권장되지 않는 센서가 없습니다. 어떤 센서에 대해이 공식을 사용 했습니까? 어디에서 가져 왔습니까? –

관련 문제