2015-01-23 2 views
0

Сначала я использовал TYPE_ORIENTATION, но это было обесценено. Поэтому я изменил код на более позднюю версию и использовал TYPE_ACCELEROMETER и TYPE_MAGNETIC_FIELD, как предложено в this post.Как сделать азимут и степень менее шатким в Android

// Initialize android device sensor capabilities 
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
magnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 

Тогда в onResume(), я использовал:

// For the system's orientation sensor registered listeners 
mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI); 
mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_UI); 

и ниже, я использовал:

@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 
    // not in use 
} 

float[] mGravity; 
float[] mGeomagnetic; 

@Override 
public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
    mGravity = event.values; 
    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) 
    mGeomagnetic = event.values; 
    if (mGravity != null && mGeomagnetic != null) { 
     float R[] = new float[9]; 
     float I[] = new float[9]; 
     boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic); 
     if (success) { 
      float orientation[] = new float[3]; 
      SensorManager.getOrientation(R, orientation); 
      float azimuthInRadians = orientation[0]; 
      float azimuthInDegrees = (float) Math.toDegrees(azimuthInRadians); 
      if (azimuthInDegrees < 0.0f) { 
       azimuthInDegrees += 360f; 
      } 
      float degree = Math.round(azimuthInDegrees); 
      directionHeading.setText("Heading: " + degree + " degrees"); 

      // Create rotation animation 
      RotateAnimation ra = new RotateAnimation(currentDegree, -degree, 
      Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 
      0.5f); 

      // How long the animation will take place 
      ra.setDuration(210); 

      // Set the animation after the end of the reservation status 
      ra.setFillAfter(true); 

      // Start the animation 
      image.startAnimation(ra); 
      currentDegree = -degree; 
     } 
    } 
} 

старый путь был довольно точным и не трясти вообще. Но теперь, с неоценимым способом, он сильно трясется. Почему это и как я могу исправить дрожь?

+0

Смотрите мой ответ на http://stackoverflow.com/questions/17979238/android-getorientation-azimuth-gets-polluted-when-phone-is-tilted/17981374#17981374 –

+0

@ HoanNguyen танков для ответа, я попробую, когда вернусь домой. В комментариях ниже вашего ответа есть несколько вещей, в первую очередь, кто-то говорит: «теперь проблема только в быстрых движениях, которые он прыгает», и вы говорите, что используете «нормальный», а кто-то использует «UI». Я использую это для компаса, и я хочу, чтобы он был как можно более стабильным. Я также не хочу, чтобы он сильно метался, когда двигался быстро. Итак, что я должен использовать, нормальный, пользовательский интерфейс, и он прыгает, если двигаться быстро? – MOTIVECODEX

+0

@HoanNguyen Я попробовал, но mFacing - NaN. Почему это? – MOTIVECODEX

ответ

1

Решение должно применять фильтр низких частот (LPF). Теперь он плавный и отлично работает. Я нашел решение здесь: Low Pass Filter

Смежные вопросы