He estado trabajando en una pequeña aplicación de brújula en los últimos días, y he puesto el código en funcionamiento, pero parece que la lectura de la brújula no es precisa. Después de calibrar ambos teléfonos, mi primera prueba de que encontré esto en el que simplemente sostuve el teléfono y la superficie plana miré la lectura, luego la volteé horizontalmente y la puse contra la misma superficie plana (un giro de 180 *) y el valor no cambia 180 * estaba más cerca de 240 *.la brújula de Android parece poco fiable
Luego probé la lectura frente a una brújula, a veces la lectura parecía estar cerca pero en otros puntos era más de 50 * off. Incluso traté de poner mi teléfono y mi brújula en el piso para mantener las brújulas alejadas de cualquier interferencia magnética con los mismos resultados (nótese que también mantengo la brújula y el teléfono separados manteniéndolos en la misma dirección alineándolos con los bordes de un libro) .
Luego puse la aplicación de muestra en otro teléfono (primero fue Nexus S, el segundo fue Motorola droid 1). Entre los dos teléfonos, la diferencia varía entre ser igual en algunos puntos pero en la mayoría de los puntos estar entre 50 y 15 grados.
He revisado la documentación y también he revisado muchas publicaciones en el foro y no veo a nadie con los mismos resultados. Puede haber un pequeño error en mi código que está causando que mi lectura salga de manera incorrecta, o algún error documentado que no veo.
¡Cualquier idea o sugerencia sería muy apreciada!
Heres mi código en el sensor cambió en mi clase SensorEventListener
public void onSensorChanged(SensorEvent event)
{
// If the sensor data is unreliable return
if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
{
Toast.makeText(main.this, "Sensor Status Unreliable",Toast.LENGTH_SHORT).show();
}
// Gets the value of the sensor that has been changed
switch (event.sensor.getType())
{
case Sensor.TYPE_ACCELEROMETER:
m_vfgravity = event.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
m_vfgeomag = event.values.clone();
break;
}
if (m_vfgravity != null && m_vfgeomag != null)
{
if(SensorManager.getRotationMatrix(m_vfinR, m_vfI, m_vfgravity, m_vfgeomag))
{
SensorManager.getOrientation(m_vfinR, m_vforientVals);
m_fCompBearing = (float) Math.round((Math.toDegrees(m_vforientVals[0])) *2)/2;
//convert to 0-360 from -180-180
if(m_fCompBearing < 0.0)
{
m_fCompBearing = 360 + m_fCompBearing;
}
mCompHead.setText("" + (int)m_fCompBearing);
}
calcOffset();
rotateCmp();
}
}
Y código en el crear de mi actividad
mSMngr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSListener = new cSensorListener();
mSMngr.registerListener(mSListener,
mSMngr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_UI);
mSMngr.registerListener(mSListener,
mSMngr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
Gracias de antemano!
Edición: también lo intenté con el droide X con los peores resultados hasta el momento ... Cuando el teléfono se gira alrededor de 45 grados (girado alrededor del eje z un sistema de coordenadas de la computadora) el rumbo de la brújula puede cambiar más de 180 grados, De hecho, el valor del encabezado va en la dirección opuesta a los otros teléfonos cuando se gira en la misma dirección. Este es el único teléfono que produce este resultado incluso después de la calibración en la configuración. También su es un fondo de pantalla en vivo brújula que pruebo que no tiene el mismo problema. Así que supongo que podría hacer algo en el software para evitar esto.
¿Estás seguro de que Android es el problema y no el hardware? –
Una fuente obvia de diff sería magnética frente al norte verdadero. FWIW, mi unidad básica de garmin gps apunta hacia adelante si giras un círculo sin moverse. La única forma de utilizar estas unidades gps básicas es apuntar en la dirección de desplazamiento y _mov_ adelante. Esto puede no tener nada que ver con su problema, ¿pero? – JAL
Primero de gracias por las respuestas rápidas. bueno, se supone que el administrador del sensor siempre debe regresar al norte magnético, el gps regresaría al verdadero norte porque usa la dirección del movimiento en lat/lon que se basa en el norte verdadero. En cuanto a que se trata de un problema de hardware, esta es una posibilidad, sin embargo, he visto aplicaciones que arrojarán resultados similares en todos los ámbitos y se preguntaron cómo lo harían. Probé también con DroidX y los resultados fueron muy diferentes en el Droid X, mi imagen de brújula incluso giró en direcciones opuestas. – ocross