{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![En tête general](https://raw.githubusercontent.com/PythonLycee/PyLyc/master/img/En_tete_general.png)\n",
"\n",
"\n",
"© Copyright Franck CHEVRIER 2019-2021 https://www.python-lycee.com.
\n",
"Les activités partagées sur Capytale sont sous licence Creative Commons.\n",
"\n",
" Pour exécuter une saisie Python, sélectionner la cellule et valider avec SHIFT+Entrée.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Lecture d'une trame GPS de norme NMEA\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pour transmettre des informations de géolocalisation, on utilise des trames (paquets) dont la forme est normalisée. La norme utilisée est la norme NMEA 0183 (norme spécifique notamment pour la communication entre équipements marins, contrôlée par la National Marine Electronics Association (USA)) \n",
"\n",
"Exemple de trame :\n",
"### $GPGGA , 064036.289 , 4836.5375 , N , 00740.9373 , E , 1 , 04 , 3.2 , 200.2 , M , , , , 0000*0E\n",
"\n",
"(exemple tiré de la page wikipedia associée à NMEA )\n",
"\n",
"Voici ci-dessous la trame codée en langage Python et en commentaires les légendes permettant de déchiffrer cette trame.\n",
"Le but est d'obtenir des fonctions Python qui permettent d'automatiser le déchiffrement d'une telle trame.\n",
"\n",
"Pour chaque zone Python, on peut l'exécuter en pressant SHIFT+ENTREE.\n",
"Pour cette première zone, cela permettra de mettre la trame en mémoire."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"trame_brute='$GPGGA,064036.289,4836.5375,N,00740.9373,E,1,04,3.2,200.2,M,,,,0000*0E'\n",
"\n",
"\"\"\"\n",
"$GPGGA : En-tête pour le type de trame (GP pour le type d'appareil et GGA pour l'identifiant de trame)\n",
"064036.289 : Trame envoyée à 06 h 40 min 36 s 289 (heure UTC)\n",
"4836.5375,N : Latitude 48° 36.5375' Nord ( = 48° 36' 32,25'' Nord= 48,608958° Nord) \n",
"00740.9373,E : Longitude 7,682288° Est = 7° 40' 56.238\" Est\n",
"1 : Type de positionnement (le 1 est un positionnement GPS)\n",
"04 : Nombre de satellites utilisés pour calculer les coordonnées\n",
"3.2 : Précision horizontale ou HDOP (Horizontal dilution of precision)\n",
"200.2,M : Altitude 200,2 en mètres\n",
",,,,,0000 : D'autres informations peuvent être inscrites dans ces champs\n",
"*0E : Somme de contrôle de parité, XOR sur les caractères entre $ et *\n",
"\"\"\"\n",
"\n",
"trame_brute #pour afficher le contenu mémoire de trame_brute"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
" 1. La trame GPS est pour l'instant codée sous forme d'une chaine de caractère (str).\n",
"Exécuter l'instruction ci-dessous, qui va permettre d'obtenir les différentes données, séparées par des virgules dans une liste (list). \n",
"\n",
"Au final, la trame est codée sous forme d'une liste, dont chaque élément est une chaine de caractère. La structure est Liste=[...,...,...]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"trame=trame_brute.split(\",\") #création d'une liste (éléments identifiés par une séparation par virgule)\n",
"\n",
"trame #pour afficher le contenu mémoire de trame\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" 2. Pour accéder aux différents éléments de la trame, on utilise la syntaxe trame[k] pour accéder au k ème élément de la trame. (Attention, les éléments sont numérotés à partir de 0) \n",
" \n",
"Exécuter les instructions suivantes et compléter les commentaires. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"trame[7] # trame[7] permet d'obtenir ... ... ...\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"int(trame[7]) # int( ) permet ... ... ..."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" 3. Saisir l'instruction nécéssaire pour obtenir l'altitude. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Saisir l'instruction pour obtenir l'altitude\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" 4. Tester les saisies suivantes, compléter les commentaires et proposer une saisie. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"trame[0]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"trame[0][1:3] #permet de récupérer ... ... ..."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#écrire une saisie permettant de récupérer l'information 'GGA' sur le type de trame.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" 5. La fonction suivante permet de déterminer le type d'appareil qui a émis la trame, en utilisant la correspondance suivante : \n",
"\n",
"