{ "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", "\n", "\n", " Tester cette fonction. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def type_app(trame):\n", " \"fonction qui renvoie le type d'appareil utilisé\"\n", " correspondance = { \"BD\":\"Beidou\", \"GB\":\"Beidou\" , \"GA\":\"Galileo\" , \"GP\":\"GPS\", \"GL\":\"GLONASS\"}\n", " prefixe = trame[0][1:3]\n", " return correspondance[prefixe]\n", "\n", "type_app(trame) # pour l'affichage du type d'appareil utilisé pour la trame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 6. Compléter la fonction suivante, qui récupère le nombre de satellites de la trame et donne une information sur la qualité du signal, en utilisant la correspondance suivante : \n", "\n", "\n", "\n", " Tester cette fonction. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def qualite(trame):\n", " \"fonction qui renvoie la qualité du signal GPS\"\n", " nbre_sat = ...\n", "\n", " ...\n", " \n", " \n", "\n", "qualite(trame)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 7. On donne la fonction suivante, qui permet d'obtenir la latitude de la trame en degré. \n", "\n", " A noter: \n", " \n", " Dans la trame initiale $GPGGA , 064036.289 , 4836.5375 , N , 00740.9373 , E , 1 , 04 , 3.2 , 200.2 , M , , , , 0000*0E \n", "\n", " le codage 4836.5375 correspond à 48° 36.5375' ( ' signifie minute, c'est à dire un soixantième de degré) et on convertit ainsi en degré : 48 + 36.5375 / 60 \n", "\n", " Tester cette fonction et écrire une fonction similaire pour la longitude. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def latitude(trame):\n", " \"fonction qui donne la latitude en degré décimal avec cardinalité\"\n", " lat_dm = trame[2]\n", " lat_deg = int(lat_dm[:2]) # récupération du nombre entier de degré\n", " lat_min = float(lat_dm[2:]) # récupération du nombre de minute sous forme d'un nombre float à virgule\n", " lat_final = lat_deg + lat_min/60 # calcul final avec conversion des minutes en degrés\n", " return lat_final , trame[3] # on renvoie la latitude en degré décimal, avec la cardinalité (N ou S)\n", "\n", "latitude(trame) " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Ecrire ici une fonction qui donne la longitude en degré décimal avec cardinalité, et tester\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 8. On donne ci-dessous une nouvelle trame de norme NMEA. Appeler les fonctions écrites précédemment pour isoler les informations contenues dans cette trame." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "trame2_brute='$GPGGA,123519,4807.038,N,01131.324,E,1,08,0.9,545.4,M,46.9,M,,*42'\n", "trame2=trame2_brute.split(\",\") \n", "trame2 " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Effectuer une saisie pour obtenir le type d'appareil ayant émis la trame\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Effectuer une saisie pour obtenir la qualité de la localisation gps suivant le nombre de satellites\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Effectuer une saisie pour obtenir la latitude en degré décimal avec la cardinalité\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Effectuer une saisie pour obtenir la longitude en degré décimal avec la cardinalité\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "© Copyright Franck CHEVRIER 2019-2021 https://www.python-lycee.com.
\n", "Les activités partagées sur Capytale sont sous licence Creative Commons." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.10" } }, "nbformat": 4, "nbformat_minor": 2 }