youtubers tesis sobre sirve que para libros investigaciones investigacion historia caracteristicas android sensor

tesis - ¿Cómo obtener orientación del teléfono Android que coincida con la orientación humana?



tesis sobre youtube pdf (4)

¿Llamaste a remapCoordinateSystem? De lo contrario, solo obtienes el valor correcto cuando el teléfono se mantiene en posición vertical. En el caso de que el teléfono se sostenga de manera que la pantalla esté nivelada con el horizonte, no hay forma de que el usuario pueda ver. Porque para obtener la orientación debe proyectar el valor z de la lectura del sensor en el plano xy en la coordenada mundial y es cero cuando el dispositivo se sostiene horizontalmente.

Para ser más precisos, si desea que el teléfono esté orientado, el teléfono debe inclinarse al menos unos 25 grados respecto a la horizontal y debe llamar a remapCoordinateSystem. El siguiente código le dará lo que desea para las últimas 2 imágenes de arriba.
Código

float[] rotationMatrix = new float[9]; if(SensorManager.getRotationMatrix(rotationMatrix, null, lastAcceleration, lastMagneticField)){ float[] orientMatrix = new float[3]; float remapMatrix = new float[9]; SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, remapMatrix); SensorManager.getOrientation(remapMatrix, orientMatrix); orientation = orientMat[0]*180/(float)Math.PI; }

El getOrientation le da los valores correctos asumiendo que el teléfono está en posición horizontal. Por lo tanto, si el teléfono se sostiene verticalmente, entonces debe reasignar las coordenadas para obtener la posición plana. Geométricamente, proyecta el eje del teléfono -z hacia el plano xy del mundo y luego calcula el ángulo entre este vector de proyección y el eje y del mundo.

Estoy creando una aplicación de mapas, que incluye la flecha de ubicación que te muestra hacia dónde te enfrentas, así:

Obtengo la orientación directamente de SensorManager.getOrientation() , utilizando el primer valor devuelto: azimut. Cuando el teléfono se mantiene presionado para que la pantalla apunte sobre el horizonte y en vertical, la flecha funciona bien. Sin embargo:

  • Cuando se sostiene el teléfono para que la pantalla apunte por debajo del horizonte, la flecha apunta 180 grados desde la dirección hacia la que está mirando el usuario.
  • Cuando se sostiene el teléfono para que la pantalla esté nivelada con el horizonte, la flecha no tiene idea de cómo está apuntando. Azimut no devuelve resultados significativos en absoluto.
  • Cuando el teléfono se inclina hacia la izquierda o hacia la derecha (o se mantiene en modo horizontal), la flecha se inclina hacia la izquierda o hacia la derecha.

La imagen cuidadosamente construida y científica que se muestra a continuación muestra lo que quiero decir (donde azul es la cara del usuario, la flecha es la dirección de la flecha, la pantalla se enfrenta aproximadamente a la cara del usuario y Google Maps hace exactamente lo que quiero):

(Tenga en cuenta que, con Google Maps, no realiza correctamente las dos últimas acciones de la lista si la rotación automática está desactivada. Pero aún no estoy en esa etapa. Una cosa a la vez).

Parece como si simplemente estuviera utilizando la dirección de puntería del eje Y como se muestra aquí: http://developer.android.com/reference/android/hardware/SensorEvent.html , cuando quiero que use la dirección inversa de la dirección de puntería del eje Z , la mayoría de las veces, y la Y cuando el teléfono es plano. Sin embargo, dados los valores que getOrientation() , tendría que escribir casos complejos para solucionar algunos de los problemas, y el caso de uso del teléfono que mira hacia el horizonte no tiene solución. Estoy seguro de que hay una manera más fácil.

Aquí está mi código (donde lastAcceleration y lastMagneticField provienen del sensor interno):

float[] rotationMatrix = new float[9]; if(SensorManager.getRotationMatrix(rotationMatrix, null, lastAcceleration, lastMagneticField)){ float[] orientMatrix = new float[3]; SensorManager.getOrientation(rotationMatrix, orientMatrix); orientation = orientMat[0]*180/(float)Math.PI; }

¿Qué estoy haciendo mal? ¿Hay alguna forma más fácil de hacer esto?

Edición: Solo para aclarar, supongo que el usuario sostiene el dispositivo frente a ellos y la pantalla apunta hacia ellos. Más allá de eso, obviamente no puedo decir si solo uno de ellos gira. Además, estoy usando el movimiento del usuario cuando se están moviendo, pero esto es para cuando están estacionados.


Debes tomar el tono y determinar si el usuario está cerca de sostener el teléfono verticalmente hacia arriba.

Elegí que, después de 45 grados de inclinación hacia arriba o hacia abajo desde el plano sobre la mesa, el sistema de coordenadas debería ser reasignado.

if (Math.round(Math.toDegrees(-orientation[1])) < 45 && Math.round(Math.toDegrees(-orientation[1])) > -45) { //do something while the phone is horizontal }else{ //R below is the original rotation matrix float remapOut[] = new float[9]; SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, SensorManager.AXIS_Z, remapOut); //get the orientation with remapOut float remapOrientation[] = new float[3]; SensorManager.getOrientation(remapOut, remapOrientation);

Ha funcionado bastante bien. Déjame saber si alguien puede sugerir una mejora en esto. Gracias.


Esto se ve bastante complicado Estoy desarrollando un PNS para Android y me enfrento a un problema similar para el que todavía necesito la luz: ¿Cómo obtener la rotación entre el eje del acelerómetro y el vector de movimiento?

Lo cierto es que me parece absolutamente imposible encontrar la dirección en la que se encuentra el usuario (no el dispositivo) si no se está moviendo. Ese es el ser humano que no tiene sensor en su cuerpo, entonces, ¿qué pasa si el dispositivo se mantuvo en la misma posición absoluta pero el usuario giró 90 °? No veo ninguna forma de encontrar esto.

Lo que puedo sugerir (y que se ajusta realmente a mi problema) es que usted podría (no sé lo que realmente hace en su código) usar el movimiento del usuario para determinar su encabezado. Dejame explicar. Digamos que tienes una primera posición A. El usuario va a B. Luego, puedes construir el vector AB y obtener el encabezado del usuario cuando se detenga en B. Luego, deberías limitar tu código a la dirección en la que se encuentra cuando llegando a destino.

Sé que esto no es tan bueno como lo que obtiene Google Maps, pero ¿sabe qué utiliza Google para esto? ¿Quiero decir que solo usan sensores accelero y mag.field?


Parece que la forma adecuada de obtener el rumbo cuando el usuario sostiene el teléfono verticalmente es usar algo como esto:

// after calling getRotationMatrix pass the rotationMatix below: SensorManager.remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR);

Si desea manejar en ambos sentidos (vertical y plano) probablemente necesitará detectar eso y luego solo realizar esta reasignación cuando sea vertical.

Vea la documentación de la API here .