2015-06-07 25 views
6

Fotoğraf makinesindeki nesnelerden nesneler göstermeye yönelik program yapıyorum ve bu, dikey yönde (80-110 ve 260-280 derecelerde olduğu gibi) birkaç derece sola ve sağa doğru hemen hemen iyi çalışıyor. Diğer + -320 derecelerde iyi çalışır. TYPE_ROTATION_VECTOR ve ivme ölçer manyetometre ile kullanmayı denedim ve aynı sonuca sahipler. Herhangi bir çözüm bilen var mı? TYPE_ROTATION_VECTOR ileAndroid AR yönlendirme

:

if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) 
     { 
     float[] roationV = new float[16]; 
      SensorManager.getRotationMatrixFromVector(roationV, event.values); 

      float[] orientationValuesV = new float[3]; 
      SensorManager.getOrientation(roationV, orientationValuesV); 

      tvHeading.setText(String.format(
        "Coordinates: lat = %1$.2f, lon = %2$.2f, time = %3$.2f", 
        orientationValuesV[0], orientationValuesV[1], orientationValuesV[2])); 

      float[] rotationMatrix=new float[16]; 
      mSensorManager.getRotationMatrixFromVector(rotationMatrix, event.values); 
      float[] orientationValues = new float[3]; 
      SensorManager.getOrientation(rotationMatrix, orientationValues); 
      double azimuth = Math.toDegrees(orientationValues[0]); 
      double pitch = Math.toDegrees(orientationValues[1]); 
      double roll = Math.toDegrees(orientationValues[2]); 

      tvOrientation.setText(String.format(
        "Coordinates: lat = %1$.2f, lon = %2$.2f, time = %3$.2f", 
        azimuth,pitch,roll)); 


     } 

ivmeölçer + manyetometrelerle

if (event.sensor == mAccelerometer) { 
      System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length); 
      mLastAccelerometer = meanFilterAccelSmoothing 
        .addSamples(mLastAccelerometer); 
      mLastAccelerometer = medianFilterAccelSmoothing 
        .addSamples(mLastAccelerometer); 
      for (int i = 0; i < mLastAccelerometer.length; i++) { 
       mLastAccelerometer[i] = (float) Math.floor(mLastAccelerometer[i] * 1000)/1000; 
      } 
mLastAccelerometerSet = true; 
     } 
     if (event.sensor == mMagnetometer) { 
      System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length); 
      mLastMagnetometer = meanFilterMagneticSmoothing.addSamples(mLastMagnetometer); 
      mLastMagnetometer = medianFilterMagneticSmoothing.addSamples(mLastMagnetometer); 
      for (int i = 0; i < mLastMagnetometer.length; i++) { 
       mLastMagnetometer[i] = (float) Math.floor(mLastMagnetometer[i] * 1000)/1000; 
      } 
      mLastMagnetometerSet = true; 
     } 

if (mLastAccelerometerSet && mLastMagnetometerSet) { 

      SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer); 
      SensorManager.getOrientation(mR, mOrientation); 
      if (angeles.size() > 0) { 
       for (int i = 0; i < mapObjects.size(); i++) { 
        compassFunc(i, mOrientation[0], mOrientation[1], mOrientation[2]); 

       } 
      } 

private void compassFunc(int number, float... values) { 

     double angularXSpeed = Math.floor(values[0] * 180/Math.PI * 100)/100; 
     double angularYSpeed = Math.floor(values[1] * 180/Math.PI * 100)/100; 
     double angularZSpeed = Math.floor(values[2] * 180/Math.PI * 100)/100; 

tvOrientation.setText(String.format(
       "Screen: lt= %1$.2f : %2$.2f,rt= %3$.2f : %4$.2f,lb= %5$.2f : %6$.2f,rb= %7$.2f : %8$.2f", 
       xLeftTop, yLeftTop, xRightTop,yRightTop,xLeftBottom,yLeftBottom,xRightBottom,yRightBottom)); 
} 
+2

Sorunun ne olduğunu bize göstermediniz. Bu çıktı nedir ve beklediğinizden nasıl farklıdır? Çoğunlukla belirli yönelimlerdeki konular [gimbal lock] (http://en.wikipedia.org/wiki/Gimbal_lock) kaynaklıdır, böylece daha fazla ayrıntı verene kadar bu benim kör tahminim olur. – rhashimoto

+0

Sorun şu ki, x ekseninde y-eksenim bu -3-20 derece olduğunda ve iyi çalışıyor ve doğru değişiyor, fakat telefonumu dikey konuma çevirdiğimde, örneğin x -axys 120 ve y-axys yaklaşık 30 derece ang yani y-axys telefonum açmak için 90 x-axys yakın 180 + değişebilir. – tarasmorskyi

cevap

0

Bu Gimbal Lock tipik vaka gibi geliyor. Bir eksen etrafında dönmenin + -90 dereceye ulaştığı zaman nasıl hareket ettiğine ilişkin açıklamanız, bunun gerçekten de geçerli olduğunu gösterir.

Bu, Euler açılarıyla (Yaw/Azimuth, Pitch, Roll) birlikte fundamental problem olan, bu tür hesaplamaların çoğunun döndürme matrisleri veya kuaterniyonlar kullanılarak yapıldığı ve çoğu zaman yalnızca belirli bir yönelim olduğunda Euler açılarının kullanıldığı bir insana gösterilir (insanlar rotasyon matrislerini ve kuaterniyonları yorumlamada genellikle kötüdür).

ROTATION_VECTOR sensör yeniden düzenlenmiş değerleri ile de olsa çıkışları Dördey biçiminde (source) de ise verileri ve getRotationMatrixFromVector() yöntem bir rotasyon matrisi içine bu döner. Dahili hesaplarınız için bu açıklamalardan birini kullanmanızı öneririm.

this similar question yanıtları, sorunun nasıl çözüleceğine dair bazı somut öneriler sunar.