La trame NMEA
Objectifs
Comprendre ce qu’est une trame NMEA : une suite de caractères mis dans un format particulier (normalisé) pour permettre un échange entre systèmes et logiciels. Exploiter la trame obtenue pour réaliser une carte personnalisée. Manipuler une chaine de caractères. Extraire des informations.
Principe
Lorsqu’un récepteur GPS reçoit une information, il la transmet (au smartphone, à l’ordinateur auquel il est connecté, à l’interface gps de voiture) à l’aide d’une « phrase » dont la forme est strictement codifiée. On appelle cette « phrase » une trame.
Recuperez votre propre trame NMEA (partie qui ne sera pas traitée pendant la séance)
Travail personnel en amont : Si possible, installer l’application NMEA Tools sur votre smartphone sur Androïd ou NMEAGps sur iOS. Selon le mobile utilisé, pour enregistrer une série de trames GPS, il faut faire :
- Sur Android : enregistrement pour démarrer > attendre quelques secondes que le signal se stabilise > enregistrement pour arrêter > Choisir Enregistrer puis nommer le fichier votre_nom.txt
- Sur IOS iphone : attendre que la barre de détection de la position passe au vert puis > Bouton log en position ON pour démarrer > attendre quelques secondes que le signal soit enregistré > log pour arrêter > L’application propose alors de récupérer un fichier nmea.log dans une application (notes, …) ou de le partager.
Que contient la trame NMEA ?
Parmi les différentes lignes constituant la trame, l’une d’entre elles débute par les symboles $GPGGA
Les données sont mises dans un format particulier expliqué ici :
La valeur numérique recherchée est celle de la latitude et de la longitude du lieu :
Ces valeurs sont mises sous la forme DDMM.MMMM :
lorsque l’on lit 4836.5375, la valeur doit être comprise comme : 48°36,5375'
c’est à dire :
- 48°
- 36,5375 minutes d’arc
Travail
Ajoutez votre fichier nmea.log au dossier du notebook. Ou bien, utilisez celle capturée par votre professeur, présente dans ce dossier.
lecture du fichier nmea.log
Executer le script suivant
fichier = open('docs/nmea.log','r')
lignes = fichier.readlines()
for i,ligne in enumerate(lignes):
if ligne !='\n': # tester si la ligne est non vide
print('lignes['+ str(i)+'] \n'+ ligne)
fichier.close()
Repérer la première ligne qui commence par $GPGGA
- noter le numéro de ligne
- créer une variable
i
qui contiendra le numéro de la ligne
i =
- afficher la ligne extraite de la trame NMEA :
print(lignes[i])
- affecter
lignes[i]
à la variabletrame
print(lignes[
trame = lignes[
sélectionner des caractères
Une chaine de caractère peut être manipulée comme une liste en python. Ainsi, chaque caractère occupe un rang. Le premier caractère est le rang zero 0.
Pour extraire une série de caractères d’une variable, on ajoute [rang debut : rang fin+1] à la suite du nom de cette variable.
Par exemple : Pour extraire le nom ‘boby’ de la chaine titre = 'boby joe roi des mers'
, on fait :
titre[0:4]
Testez le :
- executez la cellule suivante
- puis extraire ‘joe’ de la chaine
titre
en écrivantprint(titre[rang debut : rang fin+1]
(remplacer rang debut : rang fin+1 par des valeurs numériques)
titre = 'boby joe roi des mers'
print(titre[
sélectionner les caractères de positionnement
Selection de l’heure :
On souhaite afficher les caractères relatifs à l’heure :
On rappelle que le premier caractère $
a le rang zero 0, le suivant G
le rang 1, etc…
pour extraire l'heure de la variable trame
, on fait : trame[7:16]
si les caractères relatifs à l’heure occupent les rangs 7 à 15.
- afficher la variable
trame
- Puis afficher
trame[7:16]
(ajuster eventuellement les bornes)
print(trame)
trame[7:
Selection de la latitude
- dans la variable trame, calculer le rang des caractères que vous souhaitez extraire pour la latitude (N) :
Procéder de la même manière que pour l’heure pour extraire cette fois les 9 caractères de la latitude contenus dans cette trame qui commencent par 43… :
trame[17:
- affecter alors ce resultat à la variable
latitude
latitude =
longitude
Vous allez refaire le même travail pour la longitude. Dans la même cellule :
- extraire les caractères de longitude de la variable
trame
à partir de leurs rangs, puis l’affecter à la variablelongitude
: fairelongitude = trame[debut:fin]
- afficher
longitude
marquer la position sur une carte
Pour ouvrir la carte du site openstreetmap, avec des coordonnées latitude (-25.175342) et longitude (31.563275), taper dans la barre URL du navigateur :
http://www.openstreetmap.org/?mlat=-25.175342&mlon=31.563275&zoom=15
Il vous faudra modifier le format des valeurs numériques passées en paramètre. Les valeurs numériques doivent être exprimées en valeurs décimales.
Liens
document dont est extrait ce TP : https://disciplines.ac-toulouse.fr/informatique/sites/informatique/files/fichiers/localisation/tramenmea_final_avecios.pdf