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?

È stato utile?

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:

DCM da Wikipedia

con

azimuth = Azimuth (Radians)

Pitch = Pitch (Radians)

rotolo = 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]
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top