2010-07-04 13 views
16

Estoy escribiendo una aplicación en Google Android 2.1 que necesita saber en qué dirección (n/w/s/e) se encuentra el dispositivo (HTC Hero). El sensor y su oyente están funcionando muy bien, pero los valores que obtengo del sensor son totalmente malos. p.ej. me dice que estaría mirando hacia el norte cuando el dispositivo está orientado al SW o así ...cómo calibrar el sensor de orientación en Android?

Parece que este es un problema conocido con dispositivos Android. Las "soluciones" que encontraron en la mirada web como esta:

  • agitar el dispositivo alrededor
  • mover el dispositivo como un grifo de ocho
  • en los dispositivos de vuelta

Se cree que esto desencadenar la recalibración de los sensores. Y: la cosa con la "mudanza" funciona para mí ... pero eso no es muy profesional, supongo ...

entonces - ¿cómo disparo la recalibración del sensor de orientación desde el SDK? Necesito que el sensor esté calibrado correctamente sin ningún material elegante que haga que los usuarios de esta aplicación parezcan idiotas completos mientras recalibran "manualmente" sus teléfonos ...

¿Hay alguna manera de hacer esto "bien"?

EDIT:

O: ¿hay alguna manera de determinar mediante programación, si el dispositivo está calibrado correctamente o no? Como opción alternativa, por así decirlo, podría advertir al usuario que el dispositivo necesita una recalibración "manual".

+1

una vez que veo una aplicación de brújula en el mercado. esta aplicación da un mensaje si la tracción del campo magnético es mala. No sé cómo funciona esto, así que estoy interesado en esta respuesta, ya sea – Michel

Respuesta

3

No creo que exista una manera de saber de forma programática si el sensor de la brújula está calibrado correctamente a menos que use una fuente de datos secundaria como GPS. Si puede usar el GPS, cuando el usuario se está moviendo puede comparar el movimiento del GPS con el rumbo de la brújula y corregir. Recuerde que los campos magnéticos locales pueden arruinar las lecturas de la brújula y los dispositivos no tienen idea de si se encuentra en medio de un bosque o cerca de un transformador.

Con estos microdispositivos siempre hay un poco de sesgo con el que tendrás que lidiar. Si también verifica los valores del acelerómetro, verá que en reposo no siempre devuelve 9.8 m/s^2 (o al menos consistentemente entre dispositivos).

En su ayuda, puede que necesite decirle al usuario que gire/gire su teléfono en una figura ocho para reiniciar la brújula.

+0

gracias por su respuesta, pero lamentablemente no puedo usar gps en esta aplicación en absoluto. problema es que mi héroe htc me devolvió total nonesense todo el tiempo hasta que lo recalibré a su sensor. realmente necesito saber cómo desencadenar esto por sdk/ndk ... – xenonite

+1

Hay un foro donde han mencionado algunas instrucciones de shell para forzar a los sensores a escribir un nuevo archivo de configuraciones, pero requiere usar el comando su, lo que significa que podría no ser capaz de usarlo en una versión normal de Android ... aparte de eso, podría abrir un shell a través de Java y escribir esos comandos, aunque es necesario reiniciarlo para que surta efecto, suponiendo que funcione de todos modos. Puede consultar el enlace aquí: http://forum.xda-developers.com/showpost.php?p=4081673&postcount=4885 –

+0

Ese método de calibración GPS solo funcionaría si ordena al usuario que apunte el teléfono en la dirección de movimiento, ¿verdad? ¿O me estoy perdiendo algo? – MatrixFrog

-3

Estas son algunas orientaciones manipuladores u puede utilizar

Constantes int ORIENTATION_UNKNOWN devuelto desde onOrientationChanged cuando la orientación del dispositivo no puede ser determinada (típicamente cuando el dispositivo está en un cierre a la posición plana). Public Constructors OrientationEventListener (contexto Contexto) Crea un nuevo OrientationEventListener. OrientationEventListener (Contexto context, int rate) Crea un nuevo OrientationEventListener. Public Methods boolean canDetectOrientation() void disable() Desactiva el OrientationEventListener. void enable() Habilita el OrientationEventListener para que monitorice el sensor y llame aOoEURientationChanged (int) cuando cambie la orientación del dispositivo. abstract void onOrientationChanged (orientación int) Se invoca cuando la orientación del dispositivo ha cambiado. [Expandir] Métodos heredados De la clase java.lang.Object Objeto clon() Crea y devuelve una copia de este objeto. boolean equals (Object o) Compara esta instancia con el objeto especificado e indica si son iguales. void finalizar() Se invoca antes de que la VM recupere la memoria del objeto. final Class getClass() Devuelve la instancia única de Class que representa la clase de este objeto. int hashCode() Devuelve un código hash entero para este objeto. final void notify() Hace que un hilo que está esperando en el monitor de este objeto (llamando a uno de los métodos wait) se despierte. final void notifyAll() Hace que se despierten todos los hilos que están esperando en el monitor de este objeto (llamando a uno de los métodos wait). Cadena toString() Devuelve una cadena que contiene una descripción concisa y legible para el ser humano de este objeto. final void wait (long millis, int nanos) Hace que el subproceso de llamada espere hasta que otro subproceso llame al método notify() o notifyAll() de este objeto o hasta que expire el tiempo de espera especificado. final void wait (long millis) Hace que el subproceso de llamada espere hasta que otro subproceso llame al método notify() o notifyAll() de este objeto o hasta que expire el tiempo de espera especificado. final void wait() Hace que el hilo que llama espere hasta que otro hilo llame al método notify() o notifyAll() de este objeto. Constantes público static final int ORIENTATION_UNKNOWN desde: API Nivel 3

devuelto desde onOrientationChanged cuando la orientación del dispositivo no puede ser determinada (típicamente cuando el dispositivo está en un cierre a la posición plana). Ver también

* onOrientationChanged(int) 

Constante Valor: -1 (0xFFFFFFFF) constructores públicos OrientationEventListener pública (contexto Contexto) desde: Nivel 3 API

Crea un nuevo OrientationEventListener. Parámetros contexto para el OrientationEventListener. public OrientationEventListener (Context context, int rate) Desde: API Nivel 3

Crea un nuevo OrientationEventListener. Parámetros contexto para el OrientationEventListener. velocidad a la que se procesan los eventos del sensor (ver también SensorManager). Utilice el valor predeterminado de SENSOR_DELAY_NORMAL para la detección de cambio de orientación de pantalla simple. Métodos públicos canDetectOrientation pública booleano() desde: Nivel 3 API

pública desactivar vacío() desde: Nivel 3 API

desactiva la OrientationEventListener. public void activar() desde: Nivel 3 API

Habilita el OrientationEventListener por lo que supervisará el sensor y llamar onOrientationChanged (int) cuando cambia la orientación del dispositivo. public abstract void onOrientationChanged (orientación int) Desde: API Nivel 3

Se invoca cuando la orientación del dispositivo ha cambiado. El parámetro de orientación está en grados, que van de 0 a 359. La orientación es 0 grados cuando el dispositivo está orientado en su posición natural, 90 grados cuando su lado izquierdo está en la parte superior, 180 grados cuando está boca abajo y 270 grados cuando está orientado el lado derecho está en la parte superior. ORIENTATION_UNKNOWN se devuelve cuando el dispositivo está cerca de plano y no se puede determinar la orientación.

+6

http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks – MatrixFrog

+0

No es útil copiar y pasar la documentación no formateada de la API. Un ejemplo sería más aconsejable. – Spindizzy

0

Supongo que se refiere al Magnetómetro dentro del Héroe.

Calibrarlo es una tarea difícil y siempre deberá requerir la interacción del usuario para una calibración confiable. Hay estrategias separadas para lidiar con eso. Podría pedirles a los usuarios que mantengan el dispositivo en dirección norte y que luego lo recuperen. Si los usuarios no saben dónde está el norte, puede pedirles que dirijan el dispositivo hacia el sol y según la ubicación y la hora, puede calcular dónde se encuentra.

Dejando de lado la calibración, supongo que su problema es que las lecturas que obtiene del sensor son inexactas. Por supuesto, la calibración es un requisito previo para lecturas precisas, pero también hay otros factores en juego.

Es una práctica común complementar los datos del sensor de un sensor con los datos de un sensor diferente para aumentar la precisión. Puede usar el GPS para determinar un rumbo cuando el usuario se está moviendo. Sin embargo, si se mueve lentamente, esto también es impreciso. Puede integrar los datos informados por el acelerómetro para adivinar los cambios de orientación (no la orientación absoluta). Pero, sinceramente, un girómetro sería más ideal en este caso.

Los sistemas que funcionan de esta manera a veces se llaman Inertial Navigation Systems (INS) porque pueden, dado un punto fijo en el espacio, determinar su posterior posición relativa y orientación con precisión sin más datos externos. El uso de un filtro de Kalman es una práctica común para volver a calibrar el sistema de vez en cuando cuando esté disponible una posición absoluta (por ejemplo, recuperada a través del GPS).

Aunque no es realista implementar un INS de pleno derecho, sin duda puede extraer algunas ideas de cómo funcionan para que sus lecturas de orientación sean más precisas.

Cuestiones relacionadas