2016-04-09 13 views
0

Я делаю проект о стабилизации видео. Теперь я пытаюсь получить точную ориентацию в первую очередь. Я уже читал о событии датчиков. Я знаю, что я могу не только использовать SensorManager.getOrientation(), чтобы получить точную ориентацию. Кроме того, я знаю, что использование акселерометра и интеграция гироскопа могут получить правильный шаг и бросок.Чтобы получить точный Orientaion на телефоне Android

Теперь, я хочу знать, как я могу получить правильный рывок?

Благодарим вас за внимание!

ответ

0

С помощью этого кода вы получаете точную ориентацию с помощью акселерометра и датчика магнитного поля. (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])); 
     } 
    } 
} 

При этом вы получаете mOrientation, который содержит азимут, тангаж и крен.

Как объясняется здесь, https://math.stackexchange.com/questions/296799/azimuth-vs-yaw рыскание - это изменение азимута.

+0

Благодарим за помощь! Я нашел сообщение о проблеме использования акселерометра и магнитометра. https://stackoverflow.com/questions/24242972/how-can-i-get-device-tilt Он упоминает, что «пока вы используете акселерометр и магнитометр, но не гироскопы, ваш метод не срабатывает, если устройство проходит быстрое ускорение/замедление ». Это означает, что внезапное движение сделает датчик неточным? Я так смущаюсь с этим датчиком T.T Спасибо за ваше время! – wwwgoodhh

+0

Кроме того, я хочу знать, почему люди, разговаривающие с акселерометром и гироскопом, будут дополнять фильтр. В чем преимущества и недостатки акселерометра и гироскопа стихи акселерометра и магнитометра. – wwwgoodhh

+0

Thats интересно, для моих дел это работало отлично. Но мне не нужно быстрое ускорение/торможение. Для чего вам нужны быстрые вещи? Я хотел бы взглянуть на него позже. – Alex