2012-01-24 61 views
3

我得到我的手机方位的SensorManager.getOrientation给人很不稳定的结果

SensorManager.getOrientation 

帮助,但结果是非常不稳定的,像+ -8度,有FO过滤的结果会好方法?

这是我得到的值:

public void onSensorChanged(SensorEvent event) 
    { 
     switch (event.sensor.getType()){ 
      case Sensor.TYPE_ACCELEROMETER: 
       aValues = event.values.clone(); 
       break; 
      case Sensor.TYPE_MAGNETIC_FIELD: 
       mValues = event.values.clone(); 
       break; 
     } 
     float[] R = new float[16]; 
     float[] orientationValues = new float[3]; 

     if(aValues == null || mValues == null) 
      return; 

     if(!SensorManager.getRotationMatrix (R, null, aValues, mValues)) 
      return; 

     float[] outR = new float[16]; 
     SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_Z, SensorManager.AXIS_MINUS_X, outR); 

     SensorManager.getOrientation (outR, orientationValues); 

     orientationValues[0] = (float)Math.toDegrees (orientationValues[0]); 
     orientationValues[1] = (float)Math.toDegrees (orientationValues[1]); 
     orientationValues[2] = (float)Math.toDegrees (orientationValues[2]); 
    } 
+0

您可以使用System.arraycopy代替event.values.clone()的性能来获取。在这里你总是创建新的对象,这是非常昂贵的。 – Geoffroy

回答

0

通过计算平均只需缓冲区中的值(有很多不同的计算可能性:http://en.wikipedia.org/wiki/Average#Types)。还要考虑到,缓存越多,应用程序将对变化做出反应越慢!

+1

简单avarage不会得到好的结果 - 我试图想一些更复杂的过滤,但也许有人已经有一个很好的方法?我也想不明白,为什么'Sensor.TYPE_ACCELEROMETER'已经过时 - 这是给改变稳定的结果。 – imbryk

+1

如果你愿意,你可以试试我的AR框架和阅读我是如何做到的缓冲(从这里开始:http://code.google.com/p/droidar/source/browse/trunk/droidar/DroidAR/src/actions/ ActionWithSensorProcessing.java这http://code.google.com/p/droidar/source/browse/trunk/droidar/DroidAR/src/actions/ActionRotateCameraBuffered.java)我第一次使用的原料sensordata一些低通滤波器和然后定制缓冲功能(读http://code.google.com/p/droidar/source/browse/trunk/droidar/DroidAR/src/actions/algos/BufferAlgo1.java的Java文档) –