Skip to content

Décoder une trame NMEA

Un récepteur GPS a calculé sa position. Il doit maintenant la transmettre à l'appareil qui l'utilise (ton téléphone, un GPS de voiture, un bateau). Sous quelle forme ?

Pas sous forme de jolie carte : sous forme de texte brut, dans un format vieux de quarante ans, que tous les récepteurs du monde parlent. Ce format s'appelle NMEA 0183, et une de ses lignes s'appelle une trame.

Cette séance se fait sans machine. Tu vas décoder une vraie trame, au crayon.

Une trame, ça ressemble à ça

$GPGGA,101530,4806.678,N,00140.800,W,1,09,0.8,45.2,M,48.0,M,,*66

Illisible ? Pas tant que ça. Regarde : c'est du texte, découpé en champs séparés par des virgules. Tu connais déjà cette idée, c'est exactement le principe du CSV du chapitre sur les données.

Il suffit de savoir ce que chaque position signifie. Voici la clé :

Champ Valeur Signification
1 $GPGGA type de trame (GGA = position et altitude)
2 101530 heure UTC : 10 h 15 min 30 s
3 4806.678 latitude
4 N Nord (ou S pour Sud)
5 00140.800 longitude
6 W Ouest (ou E pour Est)
7 1 qualité du signal (0 = pas de position, 1 = position valide)
8 09 nombre de satellites utilisés
9 0.8 précision (plus c'est petit, mieux c'est)
10 45.2 altitude en mètres
(autres champs techniques)
dernier *66 somme de contrôle

Le $ marque le début de la trame, le * sa fin.

Le piège : ce ne sont pas des degrés

Voici l'erreur que tout le monde commet la première fois.

La latitude vaut 4806.678. On serait tenté de lire « 4806,678 degrés ». C'est absurde : une latitude ne dépasse jamais 90 degrés.

En réalité, le format est degrés puis minutes, collés l'un à l'autre :

4806.67848 degrés06,678 minutes

  • Les deux premiers chiffres sont les degrés : 48.
  • Tout le reste correspond aux minutes : 06.678.

Et une minute d'angle vaut un soixantième de degré. Pour obtenir une valeur utilisable sur une carte, il faut donc convertir :

\[\text{latitude} = 48 + \frac{6{,}678}{60} = 48 + 0{,}1113 = \mathbf{48{,}1113°}\]

Pour la longitude, ce sont TROIS chiffres

La longitude s'écrit 00140.800. Cette fois, ce sont les trois premiers chiffres qui donnent les degrés : 001, et le reste les minutes : 40.800.

Pourquoi trois ? Parce que la longitude peut aller jusqu'à 180 degrés, alors que la latitude ne dépasse pas 90. Il faut donc une position de plus pour l'écrire.

\[\text{longitude} = 1 + \frac{40{,}800}{60} = 1 + 0{,}68 = \mathbf{1{,}68°}\]

Et comme le champ suivant indique W (Ouest), cette longitude est négative : -1,68°.

Nord/Sud, Est/Ouest : le signe

Sur une carte numérique, on n'écrit pas « N » ou « W », on utilise un signe :

  • Latitude : Nord positif, Sud négatif.
  • Longitude : Est positif, Ouest négatif.

Où est-on ?

Rassemblons : latitude 48,1113, longitude -1,68.

Ces deux nombres, dans cet ordre, sont ce que tu peux coller dans n'importe quel site de cartographie.

Exercice - Trouver le lieu

Colle 48.1113, -1.68 dans un site de cartographie. Dans quelle ville se trouve ce récepteur GPS ?

Correction

À Rennes.

Remarque au passage l'ordre : on écrit toujours la latitude d'abord, la longitude ensuite. L'inverser t'enverrait en Somalie.

Exercice - Décoder une trame complet

Voici une autre trame. Décode-la entièrement.

$GPGGA,174512,4852.350,N,00220.180,E,1,07,1.2,35.0,M,44.0,M,,*70
  1. À quelle heure cette position a-t-elle été relevée ?
  2. Combien de satellites étaient utilisés ?
  3. Quelle est la latitude, en degrés décimaux ?
  4. Quelle est la longitude, en degrés décimaux (attention au signe) ?
  5. Quelle est l'altitude ?
  6. De quelle ville s'agit-il ?
Correction
  1. 17 h 45 min 12 s (heure UTC ; en France en hiver, il est une heure de plus).
  2. 7 satellites.
  3. Latitude : 4852.350 donne 48 degrés et 52,350 minutes, soit \(48 + \frac{52{,}35}{60} = 48 + 0{,}8725 = \mathbf{48{,}8725}\). Le champ vaut N, donc positif.
  4. Longitude : 00220.180 donne 2 degrés (trois premiers chiffres : 002) et 20,180 minutes, soit \(2 + \frac{20{,}18}{60} = 2 + 0{,}3363 = \mathbf{2{,}3363}\). Le champ vaut E, donc positif.
  5. 35 mètres.
  6. 48.8725, 2.3363 : Paris.

Exercice - Une trame qui ne dit rien

Un récepteur, allumé dans un sous-sol, produit cette trame :

$GPGGA,082230,,,,,0,00,,,M,,M,,*6D

Que s'est-il passé ? Quels champs le prouvent ?

Correction

Le récepteur n'a pas de position. Deux champs le disent :

  • le champ de qualité vaut 0 (« position non valide ») ;
  • le nombre de satellites vaut 00 : il n'en capte aucun.

Et logiquement, les champs de latitude et de longitude sont vides (on voit les virgules se suivre : ,,,,,). Il connaît juste l'heure de son horloge interne.

C'est cohérent avec la séance précédente : le signal GPS ne passe pas les murs. Dans un sous-sol, le récepteur n'entend plus personne.

À quoi sert la somme de contrôle ?

Le *66 de la fin est une somme de contrôle (checksum). C'est un nombre calculé à partir de tous les caractères de la trame.

Le récepteur le calcule avant d'envoyer, et l'appareil qui reçoit le recalcule de son côté. Si les deux ne correspondent pas, c'est que la trame a été abîmée pendant le transport (un caractère perdu, un parasite électrique) : elle est alors jetée.

C'est un principe très général en informatique : on ne se contente pas d'envoyer des données, on envoie de quoi vérifier qu'elles sont arrivées intactes. Tu le retrouveras dans le thème sur Internet.

Le lien avec les photos

Souviens-toi du thème sur la photographie : une photo prise avec un téléphone contient des métadonnées EXIF, et parmi elles, souvent, une position GPS.

C'est très exactement le résultat de ce que tu viens de décoder. Le récepteur GPS du téléphone produit une position, et l'appareil photo l'écrit dans le fichier, à côté des pixels.

Une photo publiée sans précaution dit donc elle a été prise. Tu sais maintenant d'où sort ce chiffre, et comment le lire.

Ce qu'on retient

  • Une trame NMEA est du texte découpé en champs séparés par des virgules (comme un CSV). Chaque position a une signification connue.
  • La trame GGA donne : l'heure UTC, la latitude, la longitude, la qualité, le nombre de satellites, l'altitude.
  • Le piège : la latitude 4806.678 se lit 48 degrés et 06,678 minutes, pas 4806 degrés. On convertit avec \(\text{degrés} + \frac{\text{minutes}}{60}\).
  • Latitude : 2 chiffres de degrés (max 90). Longitude : 3 chiffres (max 180).
  • S et W donnent des valeurs négatives. On écrit toujours latitude, puis longitude.
  • Une trame vide avec une qualité à 0 et 00 satellite signifie que le récepteur ne capte rien (sous-sol, tunnel).
  • La somme de contrôle permet de détecter une trame abîmée en chemin.

Et ensuite

Tu sais produire des coordonnées. Reste à les poser sur une carte, et à comprendre comment ces cartes sont fabriquées.