usar - Lee las coordenadas xyz del teléfono android usando acelerómetro
practica sensores android (2)
Lee este tutorial .
Breve resumen del tutorial dado anteriormente:
Primero obtén una instancia de SensorManager y Sensor .
Dentro de onCreate()
::
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
después de esto, anule onSensorChanged(SensorEvent event)
y use event.values[]
para obtener las coordenadas.
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
}
Voy a desarrollar una aplicación para Android que necesita leer las coordenadas x, y, z del teléfono en el espacio 3D .
Me gustaría escribir un código simple y probar en el dispositivo.
Estoy usando pan de jengibre tanto en el dispositivo como en el emulador.
Para obtener la posición de la aceleración es necesario integrarla dos veces.
La aceleración de integración le da velocidad y la integración de velocidad le da la posición.
Tenga en cuenta que la integración del ruido crea deriva y la integración crea MUCHA deriva, los sensores de Android tienden a generar bastante ruido.
En mi Galaxy S3 he podido obtener la deriva en la posición hasta 0.02 m en 5 segundos utilizando el sensor compuesto de acelerómetro lineal de Google.
No estoy seguro de poder usar el sensor del acelerómetro lineal en pan de jengibre. Si no puedes, tendrás que eliminar la gravedad antes de integrarte.
Si aún no lo has hecho, lee todo aquí http://developer.android.com/guide/topics/sensors/sensors_motion.html
Una gran charla sobre los sensores de movimiento en Android
http://www.youtube.com/watch?v=C7JQ7Rpwn2k
Código:
static final float NS2S = 1.0f / 1000000000.0f;
float[] last_values = null;
float[] velocity = null;
float[] position = null;
long last_timestamp = 0;
@Override
public void onSensorChanged(SensorEvent event) {
if(last_values != null){
float dt = (event.timestamp - last_timestamp) * NS2S;
for(int index = 0; index < 3;++index){
velocity[index] += (event.values[index] + last_values[index])/2 * dt;
position[index] += velocity[index] * dt;
}
}
else{
last_values = new float[3];
velocity = new float[3];
position = new float[3];
velocity[0] = velocity[1] = velocity[2] = 0f;
position[0] = position[1] = position[2] = 0f;
}
System.arraycopy(event.values, 0, last_values, 0, 3);
last_timestamp = event.timestamp;
}
Ahora que tiene la posición en el espacio 3d, tenga en cuenta que se supone que el teléfono está parado cuando comienza a muestrear.
Si no eliminas la gravedad, pronto estará muy lejos.
Esto no filtra los datos en absoluto y generará mucha deriva.