android - tutorial - Necesidad de calcular el vector de rotación a partir de los datos de Sensor.TYPE_ORIENTATION
sensor type android (2)
Esto debería funcionar (usando las entradas Sensor.TYPE_MAGNETIC_FIELD y Sensor.TYPE_ACCELEROMETER)
switch (event.sensor.getType()) {
case Sensor.TYPE_MAGNETIC_FIELD:
magnitude_values = event.values.clone();
sensorReady = true;
break;
case Sensor.TYPE_ACCELEROMETER:
accelerometer_values = event.values.clone();
}
if (magnitude_values != null && accelerometer_values != null && sensorReady) {
sensorReady = false;
float[] R = new float[16];
float[] I = new float[16];
SensorManager.getRotationMatrix(R, I, this.accelerometer_values, this.magnitude_values);
float[] actual_orientation = new float[3];
SensorManager.getOrientation(R, actual_orientation);
}
Pon este conde en tu onSensorChanged. En real_orientation tendrás el vector que apunta hacia el norte con respecto a tu posición real.
si desea detectar el norte desde el punto de vista de la cámara, debe cambiar la última línea de código como esta
float[] outR = new float[16];
SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR);
SensorManager.getOrientation(outR, actual_vals);
Necesito calcular un vector de rotación de los datos que obtengo de Sensor.TYPE_ORIENTATION.
Los datos del sensor se definen así:
- los valores deben volver a calcularse para convertirse en una posición 3d correcta: valores [0]: Azimut, ángulo entre la dirección del norte magnético y el eje Y, alrededor del eje Z (0 a 359). 0 = Norte, 90 = Este, 180 = Sur, 270 = Oeste
- valores 1 : Paso, rotación alrededor del eje X (-180 a 180), con valores positivos cuando el eje z se mueve hacia el eje y.
- valores [2]: Rodamiento, rotación alrededor del eje Y (-90 a 90), con valores positivos cuando el eje x se aleja del eje z
Necesito los tres valores, como el valor del eje Z (de 0 a 360 grados). Intenté mucho pero no puedo entender cómo hacerlo: /
(editar: para ver la idea detrás del código de trabajo, eche un vistazo a la clase ActionWithSensorProcessing del framework DroidAR donde puede ver cómo se pueden procesar los diferentes tipos de eventos).
También traté de usar Sensor.TYPE_ACCELEROMETER y Sensor.TYPE_MAGNETIC_FIELD para calcular este vector 3d por mi cuenta. aquí está el código:
final float[] inR = new float[16];
// load inR matrix from current sensor data:
SensorManager.getRotationMatrix(inR, null, gravityValues, geomagneticValues);
float[] orientation = new float[3];
SensorManager.getOrientation(inR, orientation);
mapMagAndAcclDataToVector(orientation); //here i do some *360 stuff
orientetionChanged(orientation); //then the correct values are passed (in theorie)
Pero esto no funcionó y creo que es muy complicado. Así que apuesto a que hay una solución simple para recalcular los valores de ensor.TYPE_ORIENTATION para hacerlos un vector de rotación 3D, pero simplemente no sé cómo hacerlo. Si conoce la respuesta, por favor dígame.
EDITAR: debería agregar que quiero pasar los valores a OpenGL para alinearlo al eje de esta manera:
gl.glRotatef(values[1], 1, 0, 0);
gl.glRotatef(values[2], 0, 1, 0);
gl.glRotatef(values[0], 0, 0, 1);
pero debido a los rangos de valores extraños, obviamente no puedo hacer esto. el mismo problema con los valores de SensorManager.getOrientation porque se vuelven demasiado cuando pasas la línea del horizonte ...
otra solución sería calcular los ángulos usando la matriz inR, pero creo que debe haber una solución más fácil (?)
ok ahora tengo una solución, tienes que hacer la rotación openGl en este orden:
gl.glRotatef(values[2], 0, 1, 0);
gl.glRotatef(values[1], 1, 0, 0);
gl.glRotatef(values[0], 0, 0, 1);
utilízalo en combinación con SensorManager.getOrientation y funcionará. si alguien sabe cómo hacer esto con los datos de Sensor.TYPE_ORIENTATION, hágamelo saber.