سؤال

في الحصول على قيمة مصفوفة التناوب أنه يحتوي على 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 هو يقول غير محدد لجهاز الاستشعار.أي فكرة?

هل كانت مفيدة؟

المحلول

الاتجاه ليس مصفوفة دوران لأنه يوفر لك فقط الزوايا المتعلقة بالشمال المغناطيسي.يمكنك الحصول على مصفوفة الدوران (مصفوفة اتجاه جيب التمام) التي ستساعدك على تحويل الإحداثيات من إطار جهازك إلى إطار الأرض بهذه الطريقة :

DCM from Wikipedia

مع

azimuth = السمت (راديان)

pitch = الملعب (راديان)

roll = لفة (راديان)

نصائح أخرى

وأنا أعلم أن هذا هو موضوع قديم ولكن في حال كان يساعد ، لالروبوت أعتقد أن مصفوفة دوران 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θ

أين

    φ = azimuth
    θ = pitch
    ψ = roll

الذي يتوافق مع مصفوفة دوران أندرويد 3/3 ص [0] إلى ص [8] (ماتريكسر في السؤال) عبر

    R[0] R[1] R[2]
    R[3] R[4] R[5]
    R[6] R[7] R[8]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top