Système bluetooth de géolocalisation en intérieur

De Ensiwiki
Aller à : navigation, rechercher


Project schedule.png
Titre du projet Système bluetooth de géolocalisation en intérieur
Cadre Projets Réseaux Mobiles et Avancés

Équipe Rémi Battet, Camille Beluze, Emmanuel Leroux
Encadrants Franck Rousseau


Introduction

L'objectif du projet est de permettre à un client se déplaçant dans un bâtiment (spécialement équipé d'appareils bluetooth adaptés) d'obtenir sa position approximative. Les données de localisation pourraient alors être utilisées dans d'autres buts, notamment de le cadre d'autres projets IoT.

Ce système repose sur des "ancres". Il s'agit d'appareils répartis dans les bâtiments et émettant régulièrement des beacons bluetooth indiquant leur position. Puisque la puissance de ces messages décroit avec la distance (et d'autres paramètres comme les obstacles rencontrés), on peut utiliser la puissance des signaux reçus pour estimer la distance qui sépare l'émetteur (l'ancre) du récepteur.

Tout appareil bluetooth dans le batiment peut alors recevoir les beacons des ancres à proximité et estimer sa position en fonction de la puissance du signal reçu (RSSI) et de la position des ancres.

Prérequis

Matériel utilisé

Lors de nos expérimentations nous avons utilisé cinq ancres : des raspberry 3B sous raspbian.
Nos essais ont été réalisés à l'intérieur d'une unique salle, d'une dizaine de mètres de long. Pour étendre la zone couverte, il est nécessaire d'augmenter le nombre d'ancres. Le seul rôle des ancres étant d'émettre des beacons bluetooth, les raspberry devraient pouvoir être remplacés par des appareils bluetooth bien plus simple.

Le "client" avec lequel la solution a été testée est un ordinateur portable sous --Indiquer l'OS-- et équipé d'un dongle bluetooth.
L'utilisation d'un ordinateur portable nous a permis d'avoir une interface graphique pour visualiser graphiquement les résultats obtenus mais tout appareil bluetooth capable d'utiliser un programme python devrait convenir.

Logiciels nécessaires

Sur les ancres :

  • NodeJS

Sur le client :

  • Python (testé sur la verion 3.6.5)

Tutoriel

Mise en place

Pour les ancres

Pour configurer chaque ancre :

  • Placez-vous dans le dossier anchor/
  • Exécutez les commandes suivantes
 ./Install-Global.sh
 npm init
 ./Install-Node-Project.sh

Pour les clients

Sur les clients que l'on veut localiser, il faut avoir python3 (testé en version 3.6.5) avec :

  • la librairie matplotlib
  • la librairie beacontools
  • la librairie numpy

Utilisation

Pour les ancres

La localisation est relative, dans un repère choisi par l'utilisateur. Chaque ancre doit connaitre sa position, cette position est indiquée dans le fichier .env sous la forme

 X=[Position de l'ancre en X]
 Y=[Position de l'ancre en Y]

Les coordonnées doivent être des nombres entiers. Les longueurs sont exprimées en centimètre.


Une fois les ancres configurées, vous pouvez commencer à émettre les beacons bluetooth en tapant

 ./iBeacon.sh

ou directement

 sudo node ./Advertise-iBeacon.js

Pour les clients

Une fois python3 et les librairies installées, vous pouvez lancer le programme principal :

 sudo python3 localisation.py

Ce programme affiche chaque seconde la position estimée, lorsque les données reçues le permettent.

Implémentation

Émission des beacons bluetooth

Réception des beacons bluetooth et estimation de la distance entre le client et les ancres

La réception des beacons se fait grâce à une librairie python : beacontools.

Le fichier ScannerBeacon.py stocke, pour chaque ancre, les informations issues des beacons reçus dans une classe dédiée : Scanner.

  • La méthode get_RSSI permet d'obtenir la moyenne de la puissance des signaux reçus depuis une ancre dans les dernières secondes (les résultats plus anciens sont effacés pour libérer la mémoire).
  • La classe permet aussi d'obtenir la position de l'ancre et le Tx (la puissance du signal à un mètre de l'émetteur, nécessaire au calcul de la distance).

Une fonction distance_from_RSSI permet d'estimer la distance qui sépare le client de l'ancre grâce au RSSI. Cette fonction a un paramètre optionnel, n, la constante d'atténuation du signal. Cette constante est nécessaire au calcul de la distance et dépend (entre autres choses) des obstacles entre le client et l'ancre. Sa valeur peut être affinée par l'expérimentation.

Triangulation

Le fichier principal du client, localisation.py, va d'abord récupérer les informations sur les ancres, puis va tourner en boucle. Environ toutes les secondes, il va récupérer la distance estimée entre chaque ancre et le client. Nous allons nous servir de ces informations pour trianguler la position du client. Pour cela nous avons besoin de trois ancres différentes, et nous avons 3 choix parmi n ancres. Comme nous avons peu d'ancres, nous allons explorer chacun des triangles que l'on peut former avec ces points (10 avec 5 ancres). Avec un plus grand nombre, le nombre de choix possibles augmenterait exponentiellement et il faudrait alors limiter le nombre de triangles utilisés. Pour chaque triangle, nous allons grâce aux positions des ancres et leurs distance par rapport au client pouvoir calculer la position du client. Pour simplifier les calculs, nous allons dans la fonction triangularisation translater les points et changer de base pour nous retrouver dans le cas exact du document de référence (p 6). Une fois cela fait nous allons utiliser triangularisation_base_saine pour trouver le point estimé du client et le renvoyer après avoir retransformé ses coordonnées dans la bonne base. Après avoir fait cela pour tous les triangles, nous prenons la moyenne des points trouvés, cela sera une approximation de la position du client que nous afficheront.

Interface graphique

Le fichier GUI.py met à disposition une classe permettant facilement de créer et mettre à jour l'interface graphique lorsque les ancres changent ou qu'une nouvelle position est estimée.

Pistes d'amélioration

L'utilisation de la puissance du signal pour calculer des distances est très imprécise. Actuellement, les RSSI sont moyennés après avoir éliminé les valeurs extrêmes. D'autres traitements peuvent être mis en place pour tenter d'avoir des résultats moins fluctuants.

Le calcul de triangulation ne peut être fait que sous certaines conditions sur les distances client-ancre estimées. Lorsque les conditions nécessaires au calcul ne sont pas respectées, d'autres analyses pourraient être mises en place (par exemple une estimation de la position basée sur l'ancre détectée comme étant la plus proche).

Les résultats de nos analyses (les positions estimées) servent uniquement à mettre à jour l'interface graphique. Des fonctions pourraient être mise en place pour permettre de facilement récupérer ces résultats afin de s'en servir dans d'autres programmes.

Références

Ce pdf nous a indiqué l'algorithme à suivre pour trouver la position du client à partir de bluetooth: https://www.researchgate.net/publication/321925322_An_Indoor_Location-Based_Control_System_Using_Bluetooth_Beacons_for_IoT_Systems