Revenir
Revenir

Décrypter une trame NMEA

Prérequis : maîtriser les bases de la programmation Python (variables, entrées/sorties)

Sommaire

Avant de commencerPrésentationLa trame NMEADécodage de la trame NMEAPréparationTraitement des données avec PythonVers le notebook Capytale - Site

Avant de commencer

Prérequis : maîtriser les bases de la programmation Python (variables, entrées/sorties)
Contexte de la mise en œuvre de l'activité : en classe, en présence de l'enseignant
Ressources, matériel, documents nécessaires : Bibliothèque Python (folium)

Présentation

Depuis le lycée, Alice voudrait communiquer sa position à un ami. Elle dispose d'un ordinateur avec une application qui affiche la trame NMEA reçue grâce au récepteur GPS connecté à la machine. La trame NMEA est la suivante :
$GPGGA,123036.000,4850.8593,N,00220.6853,E,1,9,0.95,68.7,M,47.3,M,*6F
Vous allez réaliser un programme qui utilise les données de géolocalisation pour déterminer la position et visualiser l'endroit où se trouve notre récepteur sur une carte.

La trame NMEA

Décodage de la trame NMEA

Les différents éléments de la trame sont détaillés ici.  
$GxGGA  : Type de trame (x = A : GALLILEO ; P : GPS ; L : GLONASS ; B : BEIDOU ; N :  mixte P + L)
123036.000 : Trame envoyée à 12h30m36,000s (heure UTC format hhmmss.sss)
4850.8593  : Latitude 48.8476° décimaux DD (48+50.8593/60) ou 48°50'51.56" DMS (48+50+0.8593*60)
N : Nord
00220.6853 : Longitude 2.3447° décimaux (002+20.6853/60) ou 2°20'41.12" (002+20+0.6853*60)
E : Est
1 : Type de positionnement (le 1 est un positionnement GPS)
9 : Nombre de satellites utilisés pour calculer les coordonnées
0.95  : Précision horizontale
68.7 : Altitude
M : en mètres
47.3  : Correction de la hauteur du géoïde
M  : en mètres
,,,,,0000  : D'autres informations si besoin
6F  : Somme de contrôle de parité

Préparation

Pour convertir une chaîne de caractères en une liste en utilisant la virgule comme séparateur, on peut utiliser la méthode split :
chaine = "1,2,3"
chaine.split(",")renvoie ['1', '2', '3']
Pour connaître l'index d'un élément dans une liste, on utilise la méthode index.
ma_liste = ["1", "a", "toto"]
ma_liste.index("1")renvoie 0
ma_liste.index("a")renvoie 1
Pour connaître l'élément depuis l'index :
ma_liste[2]renvoie toto
ma_liste[:2] renvoie les deux premiers éléments : "1" et "a"
ma_liste[1:] renvoie tous les éléments à partir de 1 : "a" et "toto"
Pour convertir un caractère d'une liste en nombre entierintou réelfloat:
int(maliste[0])renvoie 1
La bibliothèque folium permet d'ouvrir une carte et d'afficher des points. Les fonctions nécessaires sont les suivantes :
m = folium.Map(location=[43.29695, 5.38107]): pour créer une carte "m" centrée sur les coordonnées GPS données. On peut ajouter l'option zoom_start=12 pour obtenir un zoom particulier.
folium.Marker([43.29695, 5.38107],popup="lieu recherché").add_to(m): pour ajouter un marqueur et un commentaire.
m.save("carte.html") : pour sauvegarder la carte au format HTML que l'on peut visualiser avec un navigateur.

Traitement des données avec Python

On donne la chaîne de caractèresposreprésentant une trame NMEA. Il faut :
  • convertirposen liste (lpos),
  • extraire les nombres représentant la latitudenlatet la longitudenlong,
  • calculer la latitudelatet la longitudelonget
  • les afficher dans la console.
1. Complétez le programme suivant :
pos = "$GPGGA,123036.000,4850.8593,N,00220.6853,E,1,9,0.95,68.7,M,47.3,M,*6F"
lpos =..................................... # renvoie ['$GPGGA','123036.000','4850.8593','N',...]
nlat = ..................................... # renvoie 4850.8593
nlong = ...........................................
lat = ................................................................... # renvoie 48.84765499
long = ..................................................................................
print("latitude :", lat, " longitude :", long)
On souhaite localiser sur une carte de France les coordonnées relevées par le capteur GPS. Nous utilisons le langage Python avec la bibliothèque « folium ».
2. Complétez le programme suivant :
import folium
m = ...........................................................................................
folium.Marker(.............................................................).add_to(m)
m.save("carte.html")

Vers le notebook Capytale - Site