2

В качестве значения матрицы вращения оно содержит public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic) Здесь, как я могу рассчитать float[] gravity? Я нашел пример кода, где это вычислить orientation с использованием как Accelerometer и Magnetic 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)); 
} 

Мои вопросы:

значение
  • ли ориентация значение матрицы поворота?
  • Если нет, то как я могу реализовать этот код, чтобы получить значение матрицы вращения с использованием магнитного? поле?

Чтобы получить матрицу поворота я использовать этот код

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 это говорит Undefine для sensor.Any идеи?

ответ

3

Ориентация не является матрицей вращения, так как она дает вам только углы, связанные с магнитным севером. Вы можете получить матрицу в вращения (направление косинус Matrix), который поможет вам преобразовать координаты из фоторамке устройства к раме Земли таким образом:

DCM from Wikipedia

с

azimuth = азимут (радианы)

pitch = высота (радианы)

roll = рулет (радиан)

+0

Спасибо. Посмотрите на мой второй код, где я пытаюсь получить 9 значений матрицы вращения. Правильно ли это получить эти значения. – MBMJ

+0

Возможно. Я сделал это долгое время, вычислив матрицу вращения из вектора, не дал мне хороших результатов (хотя я, возможно, сделал что-то не так). Все, что я знаю, это то, что решение, которое я дал вам, прекрасно работает (я все еще использую его) и прост в реализации. – PeterGriffin

+0

Я нашел матрицу поворота, используя этот 'if (success) { SensorManager.getOrientation (matrixR, matrixValues); // код здесь, чтобы отобразить значение матрицы , где matrixR является матрицей вращения и дает мне результат. Но i не понимаете, использует ли он реальную систему координат? – MBMJ

1

Я знаю, что это старый поток, но в случае, если это помогает, для Android, я думаю, что матрица поворота 3x3 фактически определяется изменением утвержденного ответа. Более конкретно, в 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 

, который соответствует матрице 3x3 для Android вращения R [0] для R [8] (matrixR в вопросе) с помощью

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

Не работает. Пробовал, но, к сожалению, вызывает искажения перспективы, если используется с (устаревшим) датчиком ориентации. –

+0

@AlexanderPacha Я думаю, вы что-то поняли. Это формула, которую Android использует внутренне, и все, что они делают, это определение матрицы вращения 3D. Единственный вопрос: если вы используете функции Android (non-debrecated) для вычисления версии азимута, высоты тона и ролика для Android, это правильная формула для вычисления матрицы вращения Android R [0] ... R [8]. Перспектива не имеет ничего общего с этим. Я все еще верю, что это правильная формула. – Stochastically

+0

Не существует устаревшего датчика, который возвращает азимут, шаг и рулон (http://developer.android.com/reference/android/hardware/SensorEvent.html#values). Для какого датчика вы использовали эти формулы и откуда у вас их? –