Android Gyroscope versículo Acelerómetro
Estoy construyendo un juego para Android y quiero averiguar si el usuario inclina el dispositivo a la izquierda oa la derecha (Similar a cómo funciona Temple Run cuando se mueve al hombre de lado a lado).
He leído muchos tutoriales y ejemplos y he hecho aplicaciones de muestra, pero la cantidad de datos que recibo de ambos el giroscopio y el acelerómetro son abrumadoras. ¿Necesitaría ambos conjuntos de hardware para averiguar si el usuario inclina el dispositivo y en qué dirección?
- Android detecta giroscopio disponible
- Sensor de movimiento vertical
- Combine giroscopio con acelerómetro para obtener el rumbo
- Unity3D Android acelerómetro y giroscopio controles
- Conseguir vector de dirección en Android
Mi aplicación actual es detectar cada movimiento leve y que obviamente no es correcto.
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); }
¿Sería mejor usar el acelerómetro, sólo el giroscopio o necesitaría ambos?
- Cómo obtener tiempo si alguna condición se reunió como giroscopio de lectura
- Dibujo en el aire con el teléfono Android
- ¿Podemos dibujar línea en lienzo android entre dos puntos dados por giroscopio?
- Obtener rotación y mostrar en grados
- ¿Cómo medir la velocidad del coche por teléfono con acelerómetro y giroscopio?
- Android obtiene aceleración normalizada
- Gyro Sensor drift y Estimación de ángulo correcto
- ¿Cómo encontrar la distancia de desplazamiento utilizando sensor acelerómetro en smartphone android?
Este post enlaza con las diferencias entre los dos: Android acelerómetro y giroscopio
http://diydrones.com/profiles/blogs/faq-whats-the-difference
http://answers.oreilly.com/topic/1751-mobile-accelerometers-and-gyroscopes-explained/
La documentación también ayudará: http://developer.android.com/guide/topics/sensors/sensors_motion.html
De mi experiencia MUY limitada, el girocompás mide constantemente la rotación x, y, z y se mantiene actualizando. Útil para dirigir un coche / avión / personaje en un juego. El acelerómetro es un poco más parecido a un wii-mote, para moverse o agitar un gesto.
De mi experiencia con el acelerómetro usando el método de la gravedad, usted puede utilizarlo para la rotación de x, y y z. Sólo tienes que escribir en google "acelerómetro de método vectorial". He utilizado este método con una brújula para corregir las coordenadas debido a la inclinación.