Exercice 3 : Décoder une trame NMEA avec Python
1. Décoder l'heure affichée dans la trame
On considère la trame suivante : $GPRMC,180522.230,A,4329.127733,N,00128.75845,W,,,290220,000.0,W*64
On souhaite créer un programme sur Python qui donne l'heure, la latitude et la longitude de cette trame.
Sur Python, on définit une trame NMEA comme une chaîne de caractère :
Trame = "$GPRMC,180522.230,A,4329.127733,N,00128.75845,W,,,290220,000.0,W*64"
que l'on va convertir en liste avec l'instruction Liste=Trame.split(',') :
Liste = ['$GPRMC', '180522.230', 'A', '4329.127733', 'N', '00128.75845', 'W', '', '', '290220', '000.0', 'W*64']
Chaque élément de cette liste est une chaîne de caractères.
On applique la fonction suivante à notre exemple :
def heure(liste):
heure=int(liste[1][0:2]) #on affecte à la variable heure (définie en tant qu'entier) les 1er et 2ème caractères de la 2ème chaîne de la liste
minute=int(liste[1][2:4]) #on affecte à la variable minute (définie en tant qu'entier) les 3ème et 4ème caractères de la 2ème chaîne de la liste
seconde=float(liste[1][4:]) #on affecte à la variable seconde (définie en tant que nombre à virgule) les derniers caractères de la 2ème chaîne à partir du 5ème caractère
print("heure d'envoi : ",heure,"h",minute,"min",seconde,"s")
Explication détaillée de l'instruction heure=int(liste[1][0 :2]) :
Liste[1]
correspond au deuxième élément de la liste : c'est la chaîne '180522.230' indiquant l'heure.
Liste[1][0 :2]
correspond aux deux premiers éléments de cette chaîne : ‘18'
Int(liste[1][0 :2])
permet de convertir cette chaîne en nombre entier : 18 qui correspond au nombre d'heures.
La valeur stockée dans la variable heure est donc le nombre 18.
Question
Quelles vont les valeurs stockées dans les variables "minute" et "seconde" ?
minute = 05 car Liste[1][2 :4]
correspond aux 3ème et 4ème éléments de cette chaîne : ‘05'
seconde = 22.23 car Liste[1][4 :]
correspond aux éléments à partir du 5ème élément de cette chaîne : ‘22.230'
2. Décoder la latitude et la longitude affichées dans la trame
Ouvrir le fichier trame_NMEA.py à télécharger ci-dessous :
Question
En vous inspirant de la fonction heure, compléter les lignes 10, 11, 12, 13 de la fonction latitude et les lignes 16, 17, 18, 19 de la fonction longitude permettant d'obtenir la latitude et la longitude de la trame au format DMS.
la fonction round(x,4) permet d'obtenir un arrondi du nombre x avec 4 décimales.
Voici la correction du programme :
# fonction qui affiche l'heure d'envoi de la trame:
def heure(liste):
heure=int(liste[1][0:2])
minute=int(liste[1][2:4])
seconde=float(liste[1][4:])
print("heure d'envoi : ", heure,"h",minute,"min",seconde,"s")
#fonction qui affiche la lattitude:
def latitude(liste):
degre=int(liste[3][0:2])
minute=int(liste[3][2:4])
seconde=round(float(liste[3][4:])*60,4)
print("latitude : ", degre,"°",minute,"'",seconde,"'',",liste[4])
#fonction qui affiche la longitude:
def longitude(liste):
degre=int(liste[5][0:3])
minute=int(liste[5][3:5])
seconde=round(float(liste[5][5:])*60,4)
print("longitude : ", degre,"°",minute,"'",seconde,"'',",liste[6])
#fonction qui regroupe l'heure, l'altitude et la longitude:
def decodage(trame):
liste=trame.split(',') #permet la conversion de la chaîne en liste
heure(liste)
latitude(liste)
longitude(liste)
Fichier corrigé :
3. Décoder une trame complète
La fonction decodage convertit la trame en liste et regroupe les autres fonctions précédentes.
Question
Utiliser cette fonction pour obtenir les informations cherchées de la trame.
En utilisant, dans la console, la fonction decodage, on trouve les informations demandées :
>>> decodage("$GPRMC,180522.230,A,4329.127733,N,00128.75845,W,,,290220,000.0,W*64")
heure d'envoi : 18 h 5 min 22.23 s
latitude : 43 ° 29 ' 7.664 '', N
longitude : 1 ° 28 ' 45.507 '', W
4. Recherche du lieu présentée par la trame
Soit la trame $GPRMC,180522.230,A,4329.127733,N,00128.75845,W,,,290220,000.0,W*64
Question
A quel lieu correspondent ces coordonnées ?
utiliser le site https://www.coordonnees-gps.fr/ pour obtenir la localisation.
5. Recherche de l'événement correspondant à la trame
Pour aller plus loin : cette trame a été envoyée par le smartphone d'un individu.
Question
A quel événement sportif a-t-il assisté ?
Repérer le site indiqué et en déduire le sport puis rechercher à l'aide de la date et l'heure de la trame l'événement sportif qui a eu lieu.
L'adresse correspond au stade Jean Dauger de Bayonne (stade de rugby).
La trame nous indique la date : 29 février 2020 et l'heure : 18h05min22s.
Cette trame nous permet donc de situer la personne au match Aviron Bayonnais – Stade Toulousain du Top 14.