2012-07-27 19 views
10

Escritura de una aplicación de registro GPS ~GPS para Android Localización velocidad no fiable

Estoy encontrando los valores devueltos por el método getSpeed() en Locations informado por LocationManager son masivamente poco fiable. Estoy usando LocationManager.GPS_PROVIDER, filtrando las ubicaciones provistas a través del onLocationChanged para una mejor precisión. Incluso con niveles de precisión de un solo dígito, la velocidad devuelta es generalmente ridículamente alta. Estamos hablando de hasta 200 mp/h (sí, sé que está conectado en metros/seg) cuando el teléfono está parado.

Estoy probando la misma base de código en dos modelos diferentes de teléfonos Android, ejecutando dos versiones diferentes del sistema operativo, y viendo los mismos problemas, así que espero que esto sea un problema de código.

¿Qué me estoy perdiendo? Intenté promediar ubicaciones durante un período de tiempo, pero no sirvió para nada. ¿Tendré que calcular mis propios valores de velocidad en función de la distancia recorrida/hora? Esto sería decepcionante.

Como verás, no estoy haciendo nada especial: un poco de filtrado para mayor precisión, incluso después de esto, tanto AverageSpeed como _bestLocation.getSpeed() son regularmente imposibles de alcanzar, incluso cuando la precisión de la ubicación es buena.

public void onLocationChanged(Location location) { 
    if (location.getAccuracy() < 25f) { 
     _recentLocations.add(location); 

     if (_bestLocation == null || location.getAccuracy() <= _bestLocation.getAccuracy()) 
      _bestLocation = location; 
    } 

    if ((_bestLocation != null && _bestLocation.getAccuracy() < 10f && _recentLocations.size() >= 10) 
      || _recentLocations.size() >= 25) 
    { 
     int Count = 0; 
      float TotalSpeed = 0f; 
      float AverageSpeed = 0f; 
      for (int i = 0; i<_recentLocations.size(); i++) { 
       if (_recentLocations.get(i).hasSpeed()) { 
        Count++; 
        TotalSpeed += _recentLocations.get(i).getSpeed(); 
       } 
      } 

     if (Count > 0) 
       AverageSpeed = TotalSpeed/Count; 
     } 
} 
+0

¿Has probado esto en diferentes lugares * * así? En algunos lugares, simplemente no obtendrá una solución de GPS sin importar qué. – Piskvor

+0

Debería haber especificado, estoy obteniendo correcciones muy aceptablemente precisas - 5 - 10 metros típicamente. Los lugares son lo más variados posible: viajes de la oficina a los sitios del cliente y el hogar, etc. –

+0

@DanWray hai, ¿ha solucionado este problema, ahora estoy luchando con lo mismo, podría ayudarme con esto ?. –

Respuesta

22

He trabajado en el hardware de GPS durante más de 7 años. La lectura de precisión tampoco es 100% precisa. Los fabricantes declaran la precisión junto con el sistema utilizado para medirla. CEP, RMS, 2DRMS y R95 son algunos de los sistemas. Lea este artículo para más información: http://en.wikipedia.org/wiki/Circular_error_probable

La cifra de precisión no incluye valores atípicos. Por ejemplo, si se establece una precisión de 5 metros, las lecturas tomadas en buenas condiciones de señal tendrán un error máximo de 5 metros, el 95% del tiempo. No se puede decir nada sobre las lecturas restantes del 5%. La protección contra estos valores atípicos es la salsa especial que hace que una buena aplicación basada en ubicación se destaque del resto.

Algunas cosas que puede hacer son:

  1. filtrar los increíblemente altas velocidades. Use la altitud como pista para estar en un avión.
  2. Correlacione la información de los sensores de movimiento y vea si están de acuerdo con GPS. Las firmas del sensor de movimiento serán muy diferentes en el estado estable y en movimiento.
  3. El tamaño típico de una celda GSM/3G es inferior a un kilómetro en áreas urbanas y de 5-10 kilómetros en áreas escasamente pobladas. Si el vehículo se mueve a gran velocidad durante un tiempo y la información de la torre de la celda sigue siendo la misma, usted sabe que algo anda mal.
  4. ¿El dispositivo GPS lee hacia el norte un momento y hacia el sur al siguiente también a alta velocidad? Si es así, lo más probable es que sea un error de GPS.
  5. Verifique el número de satélites utilizados en el cálculo de GPS. 12 es sobresaliente, 9 es saludable, 5 o menos es malo, 4 es mínimo para latitud, lon + altitud cálculo, 3 es mínimo para el cálculo lat, lon. Cualquier menos de 3 no es una lectura válida. Puede confiar mucho más en la validez de los datos si el número de staellites es alto.
+3

Útil. He estado trabajando con aplicaciones de GPS durante mucho tiempo también y el primer indicador de precisión que suelo usar es el recuento de satélites. En el caso de Android, había pasado por alto que el recuento de satélites está disponible a través del método getExtras(), y he estado confiando en la precisión informada en metros para mi nivel de confianza. Tomaré en cuenta tus comentarios e intentaré mejorar mi código, gracias. –

+2

Muy cierto. La documentación de Android también proporciona una muy buena descripción de cómo funcionan los proveedores de ubicación y cómo filtrar ubicaciones no publicadas. http://developer.android.com/guide/topics/location/strategies.html –

+0

puntos bien escritos. (Y) – Farhan

1

dispositivos GPS son los velocímetros de posición, según la distancia al receptor se ha movido desde la última medición. Sus cálculos de velocidad no son sujetos a las mismas fuentes de error que el velocímetro del vehículo (tamaño de la rueda, relaciones de transmisión/transmisión). En cambio, la precisión posicional del GPS , y por lo tanto la precisión de su velocidad calculada, es dependiendo de la calidad de la señal del satélite en ese momento. Los cálculos de velocidad serán más precisos a velocidades más altas, cuando la relación de error de posición al cambio de posición es menor.

De Wikipedia.

Probablemente deberías probar esto en un lugar donde tengas buena potencia de señal.

+0

Entendido, y gracias por su comentario. He escrito esta misma aplicación para ejecutar en teléfonos Blackberry y similares en WinMo y WP7 y nunca he tenido tales problemas con la velocidad frente a la precisión del GPS. Como puede ver en el código, no aceptaré una posición con una precisión de <25m y, normalmente, veré una precisión de <10m, especialmente cuando el teléfono está afuera y en movimiento (es decir, cuando necesito la velocidad). Con este nivel de precisión, esperaría ver valores de velocidad que estén, al menos, en el orden correcto de magnitud. –

+0

No soy consciente de las diferencias entre los teléfonos, pero tuve el mismo problema en el iPhone cuando probé una ubicación diferente. Los lugares donde la precisión del GPS está en pocos metros, obtuvimos muy buena precisión en la velocidad, pero en los lugares en los que tenía 50 metros de precisión, teníamos una precisión de velocidad muy mala. Y al igual que la cita explica, se basa completamente en la estimación de la ubicación, la velocidad se calcula mediante la estimación de la ubicación anterior y la estimación de la ubicación actual y la diferencia de tiempo. – codetiger

+0

Sin embargo, fue muy bueno en lugares abiertos al aire libre. – codetiger

1

Estoy experimentando el mismo problema. Creo que la señal de GPS depende de una ubicación, alguna ubicación puede dar una salida exacta de la ubicación de lo contrario un resultado 'no tan confiable'. En mi caso, estaba ubicado a unos 200 metros de mi ubicación real. ¿Qué hay de tí?

Para agregar, GPS_PROVIDER no funciona aquí en mi área. NETWORK_PROVIDER lo hace, y es el que da el resultado de 200 metros de distancia.

+0

Tengo la suerte de poder usar GPS_PROVIDER, sin embargo, incluso con NETWORK_PROVIDER, he podido ver soluciones más precisas que 200m. ¿Has intentado ver a tu oyente durante un período de tiempo y buscar una mayor precisión? Algo similar a mi código anterior. Por supuesto, la cobertura de red/wifi variará enormemente en diferentes áreas del mundo, por lo que su experiencia podría diferir un tanto de la mía. –

+0

Sí, traté de obtener el mejor proveedor, la mejor precisión y también el mejor criterio, pero cuando uso el GPS_PROVIDER, no devuelve ningún resultado de ubicación. – JetPro

0

Parece que la mayoría de la gente está asumiendo que la información de velocidad del GPS se basa en la comparación de posiciones relacionadas con la diferencia de tiempo. Este método no es muy bueno para determinar la velocidad y es peor a bajas velocidades de viaje.

Los receptores de GPS pueden dar salida a la medición de velocidad en función del desplazamiento Doppler de las mediciones de satélite. La precisión de la medición de velocidad basada en Doppler es MUCHO mejor que las mediciones de velocidad basadas en cálculos de posición/tiempo.

Google en GPS Doppler de velocidad y encontrará mucho para leer.

Un enlace está aquí: http://nujournal.net/HighAccuracySpeed.pdf

/Urban Holmdahl