2016-04-09 36 views
0

Video sabitleme hakkında bir proje yapıyorum. Şimdi, önce doğru Oryantasyonu elde etmeye çalışıyorum. Sensörler olayı hakkında çoktan okudum. Doğru yönlendirmeyi elde etmek için sadece SensorManager.getOrientation() yöntemini kullanamayacağımı biliyorum. Ayrıca, ivmeölçer kullanarak biliyorum ve jiroskop entegre doğru pitch ve rulo alabilirsiniz.Android telefonda doğru Orientaion almak için

Şimdi, doğru sapmayı da nasıl kurabilirim bilmek istiyorum.

Zaman ayırdığınız için teşekkür ederiz!

cevap

0

Bu kod ile, ivmeölçer ve manyetik alan algılayıcısını kullanarak doğru bir yönelim elde edersiniz. Bununla (What is the alternative to android orientation sensor?)

public class OrientationTestActivity extends Activity implements SensorEventListener 
{ 
    private SensorManager mSensorManager; 
    private Sensor mAccelerometer; 
    private Sensor mMagnetometer; 

    private float[] mLastAccelerometer = new float[3]; 
    private float[] mLastMagnetometer = new float[3]; 
    private boolean mLastAccelerometerSet = false; 
    private boolean mLastMagnetometerSet = false; 

    private float[] mR = new float[9]; 
    private float[] mOrientation = new float[3]; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
     mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
    } 

    protected void onResume() { 
     super.onResume(); 
     mLastAccelerometerSet = false; 
     mLastMagnetometerSet = false; 
     mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
     mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    protected void onPause() { 
     super.onPause(); 
     mSensorManager.unregisterListener(this); 
    } 

    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
    } 

    public void onSensorChanged(SensorEvent event) { 
     if (event.sensor == mAccelerometer) { 
      System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length); 
      mLastAccelerometerSet = true; 
     } else if (event.sensor == mMagnetometer) { 
      System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length); 
      mLastMagnetometerSet = true; 
     } 
     if (mLastAccelerometerSet && mLastMagnetometerSet) { 
      SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer); 
      SensorManager.getOrientation(mR, mOrientation); 
      Log.i("OrientationTestActivity", String.format("Orientation: %f, %f, %f", 
                  mOrientation[0], mOrientation[1], mOrientation[2])); 
     } 
    } 
} 

sen azimut, pitch ve roll içeren mOrientation olsun.

Burada açıklandığı gibi https://math.stackexchange.com/questions/296799/azimuth-vs-yaw yaw azimuttaki değişimdir.

+0

Yardımlarınız için teşekkür ederiz! İvmeölçer ve manyetometre kullanma probleminden bahseden bir yazı buldum. https://stackoverflow.com/questions/24242972/how-can-i-get-device-tilt "İvme ölçer ve manyetometreyi kullandığınız sürece, ancak jiroskopları kullanmadığınız sürece, yönteminiz başarısız olur. cihaz hızlı hızlanma/yavaşlamadan geçer. " Bu, ani hareketlerin sensörü yanlış yapması anlamına mı geliyor? Bu sensörle çok kafa karıştırıcıyım T.T Tekrar tekrar teşekkürler! – wwwgoodhh

+0

Ayrıca, insanlar neden ivmeölçer ve jiroskop konuşma tamamlayıcı filtre olacak bilmek istiyorum. İvmeölçer ve jiroskopun ivmeölçer ve manyetometre artıları ve eksileri nelerdir. – wwwgoodhh

+0

Bu ilginç, benim durumum için iyi çalıştı. Ama hızlı ivme/deklerasyona ihtiyacım yoktu. Hızlı şeyler için neye ihtiyacın var? Daha sonra bir göz atmak isterim. – Alex

İlgili konular