¿Cómo obtener el vector de velocidad de los datos GPS NMEA?

Estoy escribiendo un programa para recibir e interpretar datos NMEA de un receptor GPS. Estoy trabajando con un receptor GPS Adafruit Ultimate integrado con un Arduino.

La sentencia $GPRMC NMEA contiene el parámetro Velocidad en nudos , que me interesa. Quiero convertir esto en un vector de velocidad, es decir, encontrar la velocidad en cada dirección (Vx, Vy, Vz). ¿Es esto posible mediante algún cálculo matemático oa través de los datos NMEA?

La biblioteca de Adafruit para el GPS también proporciona una función para obtener el valor de la velocidad (en nudos (igual que arriba)).

No estás "escribiendo un código". Eso no es una cosa que se hace. Estás escribiendo código en tu programa. Hasta donde yo sé, obtienes velocidad, pero no velocidad. Para obtener la velocidad, tendría que obtener conjuntos consecutivos de coordenadas GPS, traducir de grados a metros, luego calcular las velocidades a partir de eso y el tiempo transcurrido entre los conjuntos de coordenadas.
@JRE se ha evitado por poco el fin del mundo; "a" "alguno".

Respuestas (2)

Desafortunadamente, aunque el propio receptor lo sabe, parece que no se entregó. La mayoría de las aplicaciones solo quieren la velocidad 2D, así que eso es lo que envían las sentencias NMEA. Y estoy bastante seguro de que la biblioteca de Adafruit solo está leyendo los datos de NMEA.

Cada conjunto de GPS tiene otros métodos para acceder a los datos, algunos de los cuales probablemente podrían recuperar la velocidad 3D que está rastreando, pero será más difícil rastrear y recibir eso.

Tal vez sea suficiente calcularlo a partir de ubicaciones 3D sucesivas, pero eso es más complejo. Si tiene suficiente CPU, la conversión de NMEA Lat/Long a UTM puede ayudar. Luego, puede restar puntos sucesivos y obtener diferencias de norte/este/altitud en metros, que se pueden leer fácilmente como una velocidad 3D (en relación con la superficie).

+1Si bien la pregunta se refiere específicamente a la generación de un vector de velocidad utilizando datos de GPS NMEA, su respuesta es importante porque destaca que para hacer esto correctamente, realmente debe intentar pasar al firmware del módulo tarde o temprano para obtener acceso a la información más oportuna y sin procesar. parámetros que están disponibles allí.

El Adafruit Ultimate GPS y el video de Lady Ada se mencionan y vinculan en la pregunta ¿El PhoneSat de la NASA realmente intentó usar el GPS desde el propio teléfono? :

donde el firmware se ha modificado para extender la altitud a al menos 50 km como ejemplo.

Además, el uso de unidades GPS comerciales de consumo para aplicaciones de vuelos espaciales se analiza en las siguientes preguntas, y especialmente en sus respuestas:

Como sugiere este comentario , primero deberá convertir una serie de posiciones de GPS en algunas coordenadas cartesianas y luego usar alguna forma de derivada numérica para inferir un vector de velocidad.

La mayoría de los módulos GPS para consumidores aficionados generarán sentencias NMEA que proporcionan coordenadas GPS a una frecuencia de "latidos cardíacos" de 1 Hz. Tendrá que leer su documentación con mucho cuidado para interpretar el tiempo, pero debe haber una oración NMEA que incluya AMBOS, las coordenadas GPS 3D de latitud, longitud y altitud necesarias para construir un vector, y el tiempo GPS. Si tiene todo eso en una sola oración, PODRÍA creerlo, pero necesita leer la documentación cuidadosamente.

Si los tiene durante dos segundos consecutivos, puede convertir cada uno a una coordenada XYZ en el marco de su elección en unidades de metros, restarlos para obtener una posición delta, dividir por la diferencia de tiempo (en segundos) entre los dos (presumiblemente 1 segundo) y listo , ¡tiene un vector de velocidad aproximado de su flujo de datos NMEA de Adafruit Ultimate GPS !

Luego asignaría esa velocidad al punto medio en el tiempo entre esos dos tiempos. También puede usar tres puntos y usar un ajuste cuadrático para posicionar esos tres, diferenciar el cuadrático en el tiempo en el medio para obtener un vector de velocidad que se aplique a esa instancia de latido en particular.

Por supuesto, en cualquiera de estos casos, sus velocidades ahora serán históricas y no instantáneas, pero deberían ser lo suficientemente buenas para una aplicación de filtro Kalman simple .

Cómo convertir de GPS lat / lon / alt referenciado a un elipsoide de referencia geodésica (creo que GPS usa WGS84 ) a coordenadas centradas en la Tierra (ya sea fijas en la Tierra para hacer referencia a la Tierra o "inercial" para hacer referencia a la órbita de la Tierra) es una pregunta diferente, y puede encontrar respuestas aquí en Space SE (vea la respuesta de @DavidHammen solo por ejemplo), o en otros sitios de Stack Exchange como GIS , por ejemplo.

También puede leer más en estos enlaces, aunque mucho (pero no todo) se aplica a datos más avanzados dentro del módulo GPS, no a los resultados finales de NMEA:

Lab 2 parece usar la Ecuación del Gran Círculo, la Tierra se modela como una esfera, no como un elipsoide.
@Uwe Por supuesto que tienes razón. Quería incluir una gama de niveles de dificultad y profundidades, tanto para el OP como para futuros lectores. Ese es un cálculo con el que uno puede comenzar, pero tiene razón, un elipsoide de referencia es la superficie correcta para usar. Esto también me hace notar que mi enlace a la "esfera de referencia" está roto, y también que debo cambiarlo a "elipsoide".
El GPS se usa frecuentemente con WGS84, pero los receptores GPS flexibles permiten la selección de un elipsoide de referencia local como CH-1903, Potsdam, Cape, Tokyo, Australian 1954 y muchos más. Aquí hay un buen mapa de Munic con los mismos valores de coordenadas en diferentes sistemas de mapas. Desniveles de hasta 700 m. Pero para la mayoría de los receptores GPS, WGS84 se selecciona en el momento de la entrega.
@Uwe, ¡es un artículo fascinante! Me tomaré un tiempo y lo leeré detenidamente. Gracias por la aclaración.