Matrice di rotazione del calcolo utilizzando il campo magnetico
-
12-12-2019 - |
Domanda
In Ottieni il valore della matrice di rotazione contiene public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)
Qui come posso calcolare il float[] gravity
?
Ho trovato un campione di codice in cui calcola il orientation
utilizzando sia Accelerometer
e 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));
}
.
Le mie domande sono:
- .
- Il valore di orientamento è il valore della matrice di rotazione?
- Se no, come posso implementare questo codice per ottenere il valore della matrice di rotazione usando magnetico?campo?
Per ottenere la matrice di rotazione uso questo codice
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);
}
.
Ma il problema è che questo getRotationMatrixFromVector
è affermato undefine per il sensore. L'idea?
Soluzione
L'orientamento non è una matrice di rotazione in quanto fornisce solo gli angoli relativi a Magnetic North.È possibile ottenere la matrice di rotazione (direzione Coseno Matrix) che ti aiuterà a trasformare le coordinate dal telaio del dispositivo alla telaio della Terra in questo modo:
con
= Azimuth (Radians)
= Pitch (Radians)
= rotolo (radiani)
Altri suggerimenti
So che questo è un vecchio filo ma nel caso in cui ti aiuti, per Android ritengo che la matrice di rotazione 3x3 sia effettivamente data da una variazione della risposta approvata.Per essere specifici, in Android la matrice di rotazione è
(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θ.
dove
φ = azimuth θ = pitch ψ = roll.
che corrisponde alla matrice di rotazione Android 3x3 R [0] a R [8] (matrixr nella domanda) tramite
R[0] R[1] R[2] R[3] R[4] R[5] R[6] R[7] R[8].