Question

Dans la valeur de la matrice de rotation obtenue, il contient public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)Ici, comment puis-je calculer le float[] gravity?J'ai trouvé un exemple de code où il calcule le orientation en utilisant les deux Accelerometer et 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));
}

Mes questions sont :

  • La valeur d'orientation est-elle la valeur de la matrice de rotation ?
  • Si non, comment puis-je implémenter ce code pour obtenir la valeur de la matrice de rotation en utilisant le magnétique ?champ?

Pour obtenir la matrice de rotation, j'utilise ce code

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

Mais le problème est le suivant getRotationMatrixFromVector est dit non défini pour le capteur. Une idée ?

Était-ce utile?

La solution

L'orientation n'est pas une matrice de rotation car elle ne vous fournit que les angles liés au Nord magnétique.Vous pouvez obtenir le matrice de rotation (Direction Cosine Matrix) qui vous aidera à transformer les coordonnées du cadre de votre appareil vers le cadre terrestre de cette façon :

DCM from Wikipedia

avec

azimuth = azimut (radians)

pitch= pas (radians)

roll= rouleau (radians)

Autres conseils

Je sais que c'est un vieux fil de discussion, mais au cas où cela aiderait, pour Android, je pense que la matrice de rotation 3x3 est en fait donnée par une variante de la réponse approuvée.Pour être précis, sous Android, la matrice de rotation est

     (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

ce qui correspond à la matrice de rotation Android 3x3 R[0] à R[8] (matriceR dans la question) via

    R[0] R[1] R[2]
    R[3] R[4] R[5]
    R[6] R[7] R[8]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top