PM2M-2016-GeolocOutdoor/Suivi
Géolocalisation Outdoor sans GPS par Trilatertion RSSI
Etudiants M2PGI PM2M: AVRIL Sébastien, BOTTRAUD Jean-Yves, FAGNO Loïc, BERGER Stéphane
Dépôt Git : github
Documents : Rapport - Transparents - Flyer - Video
Objectif
Réaliser un service temps-réel de géolocalisation outdoor sans GPS (ie tres basse consommation d'energie) en long range (LoRa). Le service sera mis en oeuvre au moyen de Spark Streaming.
Contexte
Algorithmes existants :
- Local Positioning Systems: LBS Applications and Services https://books.google.fr/books?id=aV3LBQAAQBAJ
- Algorithms for Location Estimation Based on RSSI Sampling http://www.ece.umd.edu/~cpap/published/cpap-franco-rt-08.pdf
- Outdoor Localization System Using RSSI Measurement of Wireless Sensor Network http://www.ijitee.org/attachments/File/v2i2/A0359112112.pdf
- Overview on RSSI-based Positioning Algorithms for WPS http://www.diag.uniroma1.it/~querzoni/corsi_assets/1314/GreatIdeas/great_ideas_de_nardis_2.pdf
Bases de code:
Objectif du projet
Matériel utilisé
- STM32 Nucleo
- Shield MBedLoRa SX1276
- Semtech LoRaMote
Technologies utilisées
Plan de développement
- Etude de faisabilité
- Mise en place des outils
- Développement de la fonction de trilatération
- Tests
Mise en place de l'infrastructure
Programmation du modem Nucleo LoRa
Compiler et flasher le programme suivant via Mbed
- https://developer.mbed.org/users/donsez/code/SX1276Receiver/
- https://developer.mbed.org/users/donsez/code/SX1276Lib/
Pour flasher les STM32 Nucleo, il est préferable d'utiliser l'utilitaire sous Windows STSW-LINK004 de ST
et OpenOCD sous Linux/MacOS en utilisant avec le bon fichier de configuration : par exemple, scripts/board/st_nucleo_l1.cfg pour les Nucleo L1XX.
Pour plus d'info sur le STM32, https://leanpub.com/mastering-stm32
Définition des formats de messages envoyés
LoRaMote --> Modem LoRa Nucleo
- LoRaWAN DataUp (non chiffré) avec le payload décrit à la page 17 du LoRaMote User Guide
- Voir page 15 de la spécification LoRaWAN https://www.lora-alliance.org/portals/0/specs/LoRaWAN%20Specification%201R0.pdf
Modem LoRa Nucleo -- (SERIAL PORT) --> Host
- RX;modem;size;rssi;snr;freq;bw;sf;cr;buffer
Host --> Spark
- timestamp_host;host_id;devaddr;modem;size;rssi;snr;freq;bw;sf;cr;latitude_host;longitude_host;altitude_host
- timestamp_host;host_id;devaddr;modem;size;rssi;snr;freq;bw;sf;cr;latitude_host;longitude_host;altitude_host;number_satellites_host
- timestamp_host;host_id;devaddr;modem;size;rssi;snr;freq;bw;sf;cr;latitude_host;longitude_host;altitude_host;latitude_mote;longitude_mote;altitude_mote;number_satellites_mote
latitude_mote;longitude_mote;altitude_mote;number_satellites_mote servent à calculer la précision de la trilatération calculée par les algorithmes de LBS par RSSI.
Ecriture de générateurs de messages
Afin de tester les algorithmes
Enregistrement des messages
En vue de les rejouer sur les algorithmes
Ajout d'un timestamp_cluster à chaque message.
Envoi des messages avec Logstach
Calcul de trilatération avec Spark en Scala
Modifcation du code de la LoRaMote
Affichage dans Kibana
- Affichage des positions sur une carte
- Graphe d'évolution de la précision de l'estimation par RSSI
Expérimentations et Résultats
Lecture de la valeurs RSSI
Afin de vérifier nos résultats il fallait connaître le rapport entre distance et RSSI. D'après la documentation du module nous avons :
RSSI (dBm) = -157 + Rssi pour une émission LF ou RSSI (dBm) = -164 + Rssi pour une émission HF.'
d'après les informations documents trouvées sur le web nous avons :
RSSI = -(10*n)* log10(d) + A
A = valeur RSSSI à 1 mètre (mesurée ) et n = 2 valeur constant de propagation des ondes dans l'air.
on en tire alors la formule pour la distance en fonction du RSSI.
d = 10exp((RSSI-A)/(10*n))
D'après la lecture sur le port série nous avons -28 Dbm à 1 mètre.
Trilatération
Les calculs de trilatération se base sur le schéma suivant :
Le calcul se faisant sur les trois coordonnées GPS, il faut effectuer un changement de repère dans un premier temps puis calculer la coordonnée du point dans le nouveau repère. Ensuite effectuer l'opération inverse pour trouver les coordonnées GPS. Les coordonnées GPS étant en °, il faut avant tout calcul les transformer en coordonnées (x,y,z ). Nous nous sommes basés sur le calcul des coordonnées sphériques.
ElasticLogstashKubana
Logstash : Création d'un fichier de conf pour récupérer les données dans de fichiers de log et les filtrer. Dans un premier temps on filtre les données reçues par les récepteurs LoRa, puis on les envoie sur dans un bash pour le calcul. Le bash met a jour un fichier de log que Logstash filtre aussi mais transmet les données à Elastic search. Pour cela, il a fallut modifier le fichier template de Logstah.
Tests
On a décidé d'utiliser trois de nos habitations car :
- elles sont en en étage. - elles sont à des distances raisonnables (2 km max) - Il y a un accès à internet pour envoyer les données sur le serveur.
Résultats
Problèmes rencontrés
- RSSI : Impossible de valider la valeur RSSI par rapport à la distance (mesures réelles comparées avec la formule de calcul)
- Trilatération : le calcul nécessite une transformation des coordonnées GPS en sphérique (x,y,z) puis un changement de repère : notre algorithme donne des résultats insatisfaisants
- Logstah : Après la réception de 3 trames d'un émetteur provenant de 3 recepeteurs, on envoie les données du parse dans un output de type EXEC qui appelle notre trilatération. Blocage de logstash de manière aléatoire sur EXEC, même si le EXEC est un simple écho .
- Elasticsearch : utilise un type geopoint. Il faut intégrer un template à Logstash pour définir cette structure
- Kubana : le nom des index utilisés est défini dans le template de Logstah (Logstash-*). Si on donne un nom d'index différent, il ne sera pas pris en compte par Kubana. Mettre un * dans le template de Logstash.