Aventuras en la programación y el desarrollo de GPS: un tutorial geoespacial

Publicado: 2022-03-11

Todo comenzó en un viaje de senderismo a Zbevnica hace más de 10 años. Tenía mi nuevo GPS conmigo y un amigo mío tenía un GPS conectado a un teléfono con Windows ME. La caminata fue excelente, pero cuando volvimos a nuestros autos, nos sorprendió ver que un GPS decía que habíamos caminado 6,2 km, mientras que el otro reportaba 6,7 ​​km. Uno afirmó que nuestra ganancia de elevación (es decir, la suma de todas las partes cuesta arriba de nuestra caminata) había sido de 300 m, mientras que el otro lo informó como 500 m.

Siendo un programador (y eventualmente un programador GIS), inmediatamente me intrigó el problema. Me dije a mí mismo, "esto no debería ser tan difícil de arreglar con un guión simple". Después de todo, las rutas de GPS son solo una lista de tuplas en forma de (latitud, longitud, elevación) , ¿verdad?

Bueno en realidad no.

Y así comenzó mi excursión al fascinante mundo de las pistas GPS, los errores de seguimiento y, en general, la programación GIS.

Los sistemas de información geoespacial (SIG) son un dominio enorme y complejo que abarca proyecciones cartográficas y datos geodésicos), procesamiento de datos raster y vecto y sensores remotos. Una introducción completa a este dominio estaría mucho más allá del alcance de este artículo. Y dado que centrarse en un problema específico a menudo puede ser una forma útil de introducirse en un nuevo dominio de todos modos, presentaré algunos desafíos específicos de SIG que encontré y algunas posibles soluciones; a saber:

  • Cómo reconocer, comprender y corregir mediante programación los errores de rastreo GPS
  • Cómo calcular y derivar información útil adicional de las rutas de GPS

Para empezar, las rutas de GPS no son solo una serie de tuplas (latitud, longitud, elevación) . Muchos dispositivos habilitados para GPS también proporcionarán metadatos como el tiempo, la frecuencia cardíaca, etc. Algunos dispositivos GPS incluso proporcionarán información sobre la precisión de los datos; alias, "dilución de la precisión". Pero, desafortunadamente, la mayoría de los dispositivos GPS, especialmente los de gama baja que dominan el mercado, no brindan esta información y nos queda el desafío de deducir la precisión del dispositivo por nuestra cuenta (e idealmente corregir en consecuencia, cuando sea posible). ).

Comencemos con un posible algoritmo para detectar dispositivos GPS de gama baja (como la mayoría de los teléfonos inteligentes) que generalmente tienen datos GPS de baja calidad.

Errores de elevación e idiosincrasias

Si vive en ciertas partes del mundo, es posible que haya notado algo extraño en la precisión de la elevación del GPS cuando graba las rutas con su teléfono inteligente. Cuando verifica las elevaciones, se registran consistentemente como más altas o más bajas (por un valor constante) que la elevación correcta. Por ejemplo, vivo en Višnjan (Croacia) y mi Android me sigue diciendo que estoy aproximadamente a 35-40 metros por encima de la altura real.

Por ejemplo, aquí hay un gráfico de elevación de GPS de una caminata corta que hice hace unos meses:

Este gráfico demuestra problemas con la precisión de elevación del GPS en la programación GIS.

Dos cosas a tener en cuenta aquí.

Primero, la "colina" en la primera parte de los datos GPS registrados fue completamente fabricada por el dispositivo . Mientras que el gráfico parecería indicar que el punto más alto de nuestra caminata estaba a solo unos cientos de metros del comienzo, en realidad fue alrededor de 4 km más tarde.

En segundo lugar, lo que quizás sea más importante (y no visible en el gráfico) es que todo el gráfico es inexacto . Los valores de altitud se informaron constantemente como aproximadamente 30-40 metros más altos de lo que eran en realidad, como discutiremos con más detalle más adelante en este artículo.

Cuando podemos detectar que el track tiene estos errores, podemos deducir que probablemente el dispositivo sea un GPS de baja calidad.

Este es el tipo de cosas que pueden suceder con los dispositivos GPS baratos. Y cuando podemos detectar que la pista tiene estos errores, podemos deducir que el dispositivo es probablemente un GPS de baja calidad que, por lo tanto, se puede esperar que también tenga otros errores, no solo errores de elevación, que son comunes a tales dispositivos.

Errores de elevación de inicio

Básicamente, existen dos técnicas que emplean los dispositivos GPS para determinar la elevación: "altitud GPS" (según lo informado al dispositivo por el sistema satelital GPS) y "altitud barométrica" ​​(calculada por el dispositivo en función de las lecturas de presión barométrica). Ninguno es perfecto.

Los valores de altitud del GPS pueden tener muchos errores pequeños (generalmente en el rango de +/- 10 m), lo que puede ser particularmente problemático si luego decidimos calcular la ganancia de elevación acumulada. La altitud barométrica, por otro lado, es sensible no solo a la altitud sino también a las condiciones climáticas, que pueden introducir su propio conjunto de imprecisiones.

Por lo tanto, algunos dispositivos emplean un enfoque híbrido, usando lecturas barométricas para registrar la elevación pero usando lecturas de GPS para ayudar a (re) calibrar esos valores, para ayudar a tener en cuenta los cambios climáticos (presión), etc. Con tales dispositivos, al iniciar la ruta, la elevación barométrica puede ser completamente incorrecta, pero luego, al recalibrarla con más y más datos satelitales de GPS, los datos de elevación se vuelven más confiables. Por lo tanto, no es raro que estos dispositivos se encuentren con el tipo de error de inicio de "colina falsa" que observamos anteriormente en nuestro gráfico de elevación.

Errores continuos de elevación del GPS

Para explicar el error constante en los informes de altitud, debemos volver a la geografía de nuestra escuela primaria. Los profesores de geografía suelen explicar que la Tierra no es una esfera sino un elipsoide. Si esto fuera estrictamente cierto, la altitud sería fácil de calcular matemáticamente. Pero no lo es. La Tierra es irregular; en realidad, se parece más a una patata que se asemeja a un elipsoide que a un elipsoide perfecto, lo que significa que para el desarrollo de GIS necesita un conjunto de datos de altitud detallado para casi todos los puntos de la tierra. En geodesia, este elipsoide de referencia (también conocido como datum) es una superficie definida matemáticamente que se aproxima al geoide, la figura "más real" de la Tierra.

Además, es importante reconocer que incluso estos datos son meras aproximaciones de la forma real de la superficie de la Tierra. Algunos funcionan mejor en ciertas partes del mundo y otros funcionan mejor en otros. Como ejemplo, la imagen a continuación (generada usando mi biblioteca Ruby) muestra cómo la Tierra difiere de uno de los modelos elipsoides más utilizados (el datum WGS84). Las porciones negras representan partes de la Tierra arriba, y las blancas representan partes de la Tierra abajo, el elipsoide ideal (los contornos continentales e insulares se muestran en rojo).

Este gráfico representa la superficie de la Tierra, generado por una biblioteca Ruby para programación geoespacial y GIS.

Puede ver que India está por debajo del elipsoide WGS84, siendo la parte sur el mínimo absoluto (¡casi -100 metros!) y Europa está por encima.

Dado que los dispositivos GPS de baja calidad no emplean tales datos, en realidad solo están calculando la elevación asumiendo un elipsoide perfecto. De ahí su constante inexactitud.

Detección y corrección de errores de elevación del GPS

En el desarrollo de aplicaciones de GPS, la detección de que un dispositivo que registró nuestro recorrido tiene este tipo de errores se puede realizar utilizando el conjunto de datos del modelo gravitacional terrestre EGM2008, también denominado a veces conjunto de datos de "ondulaciones del geoide". Con EGM2008, podemos aproximar la diferencia entre la superficie terrestre real y el elipsoide ideal.

Con EGM2008, podemos aproximar la diferencia entre la superficie terrestre real y el elipsoide ideal.

Pero para saber si nuestro track GPS tiene este error necesitamos una cosa más: la elevación real . Una base de datos pública que puede ser útil para este propósito es la Misión Topográfica de Radar de Transbordador (SRTM). SRTM es una base de datos basada en ráster que proporciona valores de elevación con una resolución de aproximadamente cada 30 m (en el ecuador) para EE. UU. y cada 90 m para el resto del mundo. Por ejemplo, al calcular los valores de SRTM para los puntos de la ruta anterior, aparece un gráfico diferente (la línea azul):

Una gran herramienta para el desarrollo de aplicaciones GPS es la base de datos SRTM de valores de elevación GIS.

Una pequeña molestia aquí son los bordes ásperos del gráfico, pero esto se suaviza fácilmente. Tenga en cuenta que al suavizar perdemos poca (o ninguna) precisión, ya que SRTM en sí solo proporciona puntos discretos en posiciones equidistantes, entre los cuales necesitamos interpolar en cualquier caso. Aquí hay una versión del gráfico anterior con una línea roja superpuesta que representa los datos SRTM suavizados:

Este es un gráfico de datos de elevación GPS suavizados de la base de datos SRTM.

Todo esto se puede hacer fácilmente, dicho sea de paso, usando mis bibliotecas GPS Python:

  • srtm.py: un analizador de python para datos de elevación de Shuttle Radar Topography Mission (SRTM)
  • gpxpy: una biblioteca de python simple para analizar y manipular archivos GPX (GPX, el formato de intercambio de GPS, es un formato de datos XML ligero para datos de GPS)

Para los usuarios de Ruby, también está mi biblioteca de analizador Geoelevations.rb para ondulaciones SRTM y EGM2008.

Habiendo detectado estas anomalías, dependiendo del tipo de software con el que estemos trabajando, podemos (a) autocorregir los errores nosotros mismos o (b) simplemente informar al usuario que se han detectado imprecisiones en sus datos de elevación.

Además, dado que hay diferentes algoritmos que se pueden usar para corregir mediante programación estos errores de elevación del GPS, es posible que queramos darle al usuario la opción de seleccionar qué algoritmo emplear (por ejemplo, ¿quiere el usuario que solo usemos los datos SRTM suavizados? "tal cual" o el usuario quiere que usemos los datos SRTM para ayudar a corregir las elevaciones informadas por el dispositivo).

Suavizar la pista y eliminar los valores atípicos

Si un jugador de fútbol usara un dispositivo GPS y grabara un juego, la pista resultante sería un desastre. El campo de juego estaría densamente lleno con una pista que consistía en muchos giros bruscos, aceleraciones y desaceleraciones.

Afortunadamente, la mayoría de los casos en los que las personas usan GPS no tendrán este mismo patrón: las líneas de seguimiento del GPS (y las aceleraciones) serán relativamente suaves. En tales casos, se puede suponer que los puntos erráticos en nuestra pista son inducidos por errores y, por lo tanto, dichos valores atípicos pueden eliminarse razonablemente con una función de suavizado.

Como desarrollador de GIS, el suavizado se logra más comúnmente iterando a través de los puntos y cambiando las coordenadas en función de los valores de las coordenadas vecinas. Por ejemplo, podemos cambiar cada latitud y longitud con un algoritmo como el siguiente:

 points[n].latitude = points[n-1].latitude * 0.3 + points[n].latitude * .4 + points[n+1].latitude * .3 points[n].longitude = points[n-1].longitude * 0.3 + points[n].longitude * .4 + points[n+1].longitude * .3

Cuanto mayor sea el coeficiente, mayor será el impacto del punto vecino correspondiente o la ubicación modificada del punto actual. Los coeficientes que utilizo en este ejemplo (0,3, 0,4, 0,3) son algo arbitrarios, pero en la mayoría de los casos querrá que su suma sea igual a 1,0. (Un enfoque más sofisticado, por ejemplo, sería usar la distancia entre puntos y luego, cuanto más cerca esté el punto, mayor será el coeficiente correspondiente).

Aquí hay un ejemplo de una pista con muchos errores aleatorios:

Uno de los mayores desafíos de seguimiento por GPS en el desarrollo de SIG es un trayecto con muchos errores aleatorios.

Tenga en cuenta cómo la pista no sigue bien el camino, tiene muchos giros bruscos e irregulares y, a veces, se desvía por completo del camino esperado.

Después de algunas iteraciones de "suavizado", esta misma pista se transforma en:

Después de suavizar los errores de rastreo, el rastreo GPS en este programa aún es imperfecto, pero mejor.

Si bien eso es mucho mejor, todavía es ciertamente imperfecto. Tenga en cuenta que todavía hay lugares (particularmente cerca de la mitad del camino) donde la pista todavía se desvía de la carretera.

Hay otras cosas que puedes probar. En ciertas regiones y para ciertas aplicaciones de GPS, también puede usar los datos de OpenStreetMap (OSM) para tratar de adivinar el camino correcto y luego "ajustar" los puntos a esta nueva línea. Si bien esto a menudo puede ser útil, también puede ser imperfecto, como en los casos en que los datos de OSM contienen dos líneas paralelas (por ejemplo, una autopista y una carretera cercana) o muchas rutas cercanas.

Si podemos deducir que la ruta era una ruta de senderismo y tenemos la opción de ajustarnos a una carretera o un camino cercano, podemos suponer con seguridad que la caminata fue a lo largo del camino y no de la carretera.

En tales casos, una posible solución sería intentar detectar el tipo de actividad, utilizando algunas de las técnicas que se comentan más adelante en este artículo. Si podemos deducir, por ejemplo, que la ruta era una ruta de senderismo y tenemos la opción de ajustarnos a una carretera o un camino cercano, podemos suponer con seguridad que la caminata fue por el camino y no por la carretera.

También tenga en cuenta que, si bien este ejemplo demuestra el suavizado de las coordenadas de la superficie (es decir, longitud/latitud), el suavizado puede ser una técnica igualmente válida para eliminar las aberraciones en los datos temporales o de elevación, o incluso en los datos de frecuencia cardíaca y cadencia de bicicleta.

Los ejemplos de beneficios y usos adicionales del suavizado podrían incluir:

  • Cálculo de la ganancia de elevación total. Para calcular la ganancia de elevación total en una pista, no es suficiente simplemente sumar todos los pequeños "saltos" cuesta arriba porque a menudo contienen pequeños errores. Suavizar la elevación antes de hacer la suma a menudo puede ayudar a aliviar este problema.
  • Eliminación de valores atípicos. Después del "suavizado", los puntos que están demasiado lejos de la pista se pueden detectar más fácilmente. A menudo, se puede suponer que estos son valores atípicos y se le puede pedir al usuario que pregunte si se deben eliminar.

Hay un tipo de problema en el que este algoritmo se queda corto: en algunos casos, el GPS registrará un camino suave, pero el camino será "desplazado" por una diferencia constante en alguna dirección. En tales casos, el suavizado puede suavizar aún más la línea, pero no corregirá este error de desplazamiento.

Un problema adicional menos obvio, pero significativo, con la técnica de suavizado simplista que hemos descrito es que la transformación modifica todos (o casi todos) los puntos en la ruta, incluso aquellos que pueden no estar equivocados. Aunque este enfoque más simple tiende a ser una solución razonable para el usuario promedio de GPS, los algoritmos de suavizado más sofisticados ciertamente se pueden emplear en la programación GIS. En algunos casos, incluso puede ser mejor simplemente eliminar los valores atípicos sin realizar ningún suavizado según el usuario, el dispositivo y la aplicación.

Detección de la velocidad máxima

Detectar la velocidad máxima de un track es bastante sencillo si disponemos de las coordenadas y marcas de tiempo de todos los puntos del recorrido. Simplemente calcule las velocidades entre los puntos y encuentre el valor más alto. Parece sencillo.

Pero recuerde, estamos tratando con dispositivos GPS de gama baja y no confiamos completamente en los datos, lo que puede tener ramificaciones significativas para nuestro cálculo. Si un dispositivo registra una ubicación cada 5 metros y en un punto comete un error al perder el punto 10 metros, ¡esa parte de la pista puede parecer 3 veces más rápida de lo que era!

Un enfoque común en el mundo del desarrollo SIG es extraer todas las velocidades entre puntos y luego simplemente eliminar el 5% superior (es decir, usar el percentil 95) con la esperanza de que el 5% eliminado represente la mayoría de los errores. Pero es cierto que esto no es científico y no garantiza resultados correctos. Al experimentar con esta técnica, probé diferentes valores para los percentiles y descubrí que algunos funcionaban bien para un dispositivo GPS y otros funcionaban bien para otros. Algunos funcionan bien para hacer senderismo y otros para andar en bicicleta. Pero en la mayoría de los casos, los resultados simplemente no me parecían correctos.

Después de probar muchos algoritmos, lo que funcionó para mí fue simple: agregar otro filtro para eliminar los extremos, no solo por velocidad, sino también por distancia, de la siguiente manera:

  1. Ordene los puntos por distancia entre vecinos y elimine el 5% superior.
  2. (Opcional:) Alise la pista (horizontal y/o verticalmente).
  3. Ordene los puntos por velocidad entre vecinos y elimine el 5% superior.
Este algoritmo produce resultados bastante creíbles, incluso para pistas de dispositivos GPS baratos con errores aleatorios.

Desde mi experiencia, este algoritmo produce resultados bastante creíbles, incluso para pistas de dispositivos GPS baratos con errores aleatorios.

Deducción del tipo de actividad

En muchos casos, la velocidad media es suficiente para determinar el tipo de actividad. Si la velocidad media es de 5 km/h, por ejemplo, es probable que sea una pista para caminar/senderismo, mientras que si la velocidad media es de 30 km/h, probablemente sea una pista para bicicletas, y así sucesivamente.

Pero si la velocidad promedio es de 12 kmh, no se puede estar seguro de si el usuario andaba en bicicleta de montaña o corriendo. En tales casos, la velocidad máxima a veces puede ayudar a diferenciar entre los dos tipos de actividades. Específicamente, podemos usar el hecho de que los corredores rara vez alcanzan una velocidad superior al doble de su promedio, mientras que los ciclistas lo hacen regularmente (por ejemplo, mientras van cuesta abajo por un camino que no es demasiado desafiante).

En consecuencia, una pista con una velocidad media de 12 kmh y una velocidad máxima de 18 kmh probablemente se registró mientras se ejecutaba, mientras que una pista con una velocidad media de 12 kmh y una velocidad máxima de 30 kmh probablemente se registró mientras se montaba en bicicleta de montaña. (Por supuesto, debemos estar seguros de que nuestra velocidad máxima calculada es correcta, para que esto funcione de manera confiable).

Porcentaje de cielo visible: un proxy inteligente para la detección de errores de GPS

La precisión de cada medición GPS (es decir, latitud, longitud y elevación) depende en gran medida del número de satélites que estaban visibles en el momento de la grabación. Entonces, si pudiéramos determinar de alguna manera cuántos satélites estaban "a la vista" en el momento de cada grabación, podríamos usar eso como una forma de aproximar la precisión de esa grabación. Si de alguna manera supiéramos, por ejemplo, que todos los satélites GPS necesarios están a la vista, podríamos suponer un alto grado de precisión para los datos GPS correspondientes. Por el contrario, si de alguna manera supiéramos que no hay satélites GPS a la vista, podríamos suponer que los datos son propensos a errores.

Pero antes de emocionarse demasiado, considere la complejidad de intentar resolver un problema GIS de este tipo. En primer lugar, necesitaría saber con qué sistema(s) satelital(es) GPS su dispositivo es capaz de comunicarse. Está el Sistema de Posicionamiento Global original con sede en EE. UU., el Gallileo europeo y el sistema GLONASS ruso. Algunos dispositivos funcionan con todos estos tipos de satélites, pero muchos no. Y muchos dispositivos ni siquiera informan qué sistema(s) utilizan.

Pero hay una forma inteligente de eludir esta complejidad y lograr una aproximación aproximada de la cantidad de satélites a la vista: usar el porcentaje de cielo visible como un proxy para la cantidad de satélites visibles . Cielo menos visible significa que nuestro GPS puede “ver” (o ser visto) por menos satélites. Pero, ¿cómo podemos calcular el porcentaje de cielo visible en cualquier punto de la Tierra? En realidad, la solución es bastante simple: podemos calcular la línea del horizonte que nos rodea utilizando los datos SRTM discutidos anteriormente.

Por ejemplo, este es el horizonte si se encuentra en el valle debajo de Triglav (el pico más alto de Eslovenia) calculado con SRTM:

Una imagen del horizonte del valle debajo de Triglav, creada usando código GIS.

(Para aquellos interesados, mi código para crear esta imagen se puede encontrar aquí).

Esta imagen está hecha básicamente de capas de gráficos de elevación equidistantes vistos desde un punto central. Cuanto más oscura es el área azul, más distante es la capa de elevación; cuanto más clara sea el área azul, más cerca estará la capa de elevación. Los puntos más altos dibujados representan la línea del horizonte. Si un satélite GPS está por debajo de esta línea en el cielo, nuestro dispositivo probablemente no pueda ver (o ser visto) por él. (Tenga en cuenta, sin embargo, que aunque la imagen se dibuja como un rectángulo aplanado, en realidad necesitaría algunos conocimientos básicos de geometría esférica para calcular correctamente el área debajo del horizonte).

Este método puede ser útil en situaciones como el senderismo en la montaña, donde puede pasar de estar en un cañón profundo (con mala recepción de GPS) a estar en la cresta de una montaña (con una recepción mucho mejor). Esto puede ser un indicador útil de qué partes de su pista pueden ser más propensas a errores.

Otra cosa a tener en cuenta es que esta no es una panacea para detectar errores de elevación del GPS. En primer lugar, la mayoría de las partes de la Tierra no son montañosas y, aun cuando lo sean, está en nuestra psicología sobreestimar las elevaciones; el porcentaje real del cielo visible es superior al 75% en la gran mayoría de las regiones habitadas . No obstante, este método puede ser útil en ciertas situaciones, como en el senderismo de montaña, donde puede pasar de estar en un cañón profundo (con mala recepción de GPS) a estar en la cresta de una montaña (donde la recepción del satélite probablemente sea mucho mejor). Si bien este método no es una medida absoluta de cuántos errores tiene la pista, puede ser un indicador útil de qué partes de su pista pueden ser más propensas a errores que otras.

Envolver

Hemos discutido algunos de los tipos más comunes de errores de rastreo de GPS que se pueden esperar con los dispositivos GPS de gama baja. Hemos proporcionado una comprensión de lo que los causa, así como algunas técnicas de programación GIS para corregirlos.

En algunos casos, podemos corregir la pista con un alto grado de confianza. En otros casos, al menos podemos alertar al usuario sobre partes de la pista que parecen cuestionables. En los casos en que no estemos seguros, siempre existe la opción de permitir que el usuario arregle la pista por sí mismo, con la ayuda de imágenes aéreas y mapas. Nuestras conjeturas probabilísticas pueden ayudar a resaltar aquellas partes de la pista en las que hemos detectado una mayor probabilidad de errores.

En muchos casos, las técnicas que hemos descrito pueden ser una "solución al 80 %" satisfactoria, proporcionando a los usuarios de dispositivos GPS de gama baja un nivel razonable de mejora automatizada de la precisión de sus recorridos GPS.