Android Гироскоп стих Акселерометр

Я создаю игру для Android и хочу выяснить, наклоняет ли пользователь устройство влево или вправо (аналогично тому, как работает Temple Run, когда вы перемещаете человека из стороны в сторону).

Я прочитал много руководств и примеров и сделал примеры приложений, но количество данных, которые я получаю от гироскопа и акселерометра, огромно. Нужны ли мне оба набора оборудования, чтобы определить, наклоняет ли пользователь устройство и в каком направлении?

Мое текущее приложение обнаруживает каждое незначительное движение, и это, очевидно, неправильно.

public class Main extends Activity {

  private SensorManager mSensorManager;
  private float mAccel; // acceleration apart from gravity
  private float mAccelCurrent; // current acceleration including gravity
  private float mAccelLast; // last acceleration including gravity
  private RelativeLayout background;
  private Boolean isleft = true;
/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    this.background = (RelativeLayout) findViewById(R.id.RelativeLayout1);
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
    mAccel = 0.00f;
    mAccelCurrent = SensorManager.GRAVITY_EARTH;
    mAccelLast = SensorManager.GRAVITY_EARTH;

   /* float x1, x2, y1, y2;
    String direction;
    switch(event.getAction()) {
            case(MotionEvent.ACTION_DOWN):
                x1 = event.getX();
                y1 = event.getY();
                break;
            case(MotionEvent.ACTION_UP) {
                x2 = event.getX();
                y2 = event.getY();
                float dx = x2-x1;
                float dy = y2-y1;

                    // Use dx and dy to determine the direction
                if(Math.abs(dx) > Math.abs(dy)) {
                    if(dx>0) directiion = "right";
                    else direction = "left";
                } else {
                    if(dy>0) direction = "down";
                    else direction = "up";
                }
            }
            }*/
}

private final SensorEventListener mSensorListener = new SensorEventListener() {

    public void onSensorChanged(SensorEvent se) {

      float x = se.values[0];
      float y = se.values[1];
      float z = se.values[2];

      if((mAccelLast<mAccelCurrent)&&(isleft == true)){
          background.setBackgroundResource(R.drawable.bg_right);
          isleft = false;
      }
      if((mAccelLast>mAccelCurrent)&&(isleft == false)){
          background.setBackgroundResource(R.drawable.bg_left);
          isleft = true;
      } 
      mAccelLast = mAccelCurrent;
      mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z));
      float delta = mAccelCurrent - mAccelLast;
      Log.d("FB", "delta : "+delta);
      mAccel = mAccel * 0.9f + delta; // perform low-cut filter
     // Log.d("FB", "mAccel : "+mAccel);

    }

Будет ли мне лучше использовать только акселерометр, только гироскоп или мне понадобятся оба?


person Ushal Naidoo    schedule 27.08.2012    source источник


Ответы (2)


Этот пост ссылается на различия между ними: акселерометр и гироскоп Android

http://diydrones.com/profiles/blogs/faq-whats-the-difference

http://answers.oreilly.com/topic/1751-mobile-accelerometers-and-gyroscopes-explained/

Документация также поможет: http://developer.android.com/guide/topics/sensors/sensors_motion.html

Исходя из моего ОЧЕНЬ ограниченного опыта, гироскоп постоянно измеряет вращение по осям x, y, z и постоянно обновляет данные. Полезно для управления автомобилем/самолетом/персонажем в игре. Акселерометр немного больше похож на wii-mote, для раскачивания или улавливания жеста встряхивания.

person RossC    schedule 27.08.2012
comment
Спасибо RossC, я уверен, что это поможет - person Ushal Naidoo; 27.08.2012

Исходя из моего опыта работы с акселерометром с использованием гравитационного метода, вы можете использовать его для вращения по осям x, y и z. Просто наберите в гугле "акселерометр векторного метода". Я использовал этот метод с компасом для исправления координат из-за наклона.

person Paul    schedule 06.11.2012
comment
Как насчет того, чтобы получить меру в градусах о вращении устройства по трем осям? - person Raju yourPepe; 29.05.2014