Le problème de la localisation.
Le guidage par le robot implique que l’on connaisse à chaque instant sa localisation précise. Le principe retenu est la triangulation de position en fonction de la force des signaux wifi du voisinage. La surface du CHBS est recouverte par plus de 900 bornes wifi. Un sous ensemble de ces bornes précisément identifiées et placées sur un plan sera suffisant pour permettre une géolocalisation convenable.
Sachant que ce principe de guidage par wifi est une clé fondamentale du projet, quelques mesures ont été faites afin de vérifier la faisabilité.
Dans la figure ci dessous, sont pointées quelques bornes wifi dans le couloir qui conduit de l’accueil au « pôle femme, mère, enfant ». Seules sont mentionnées les bornes visibles dans le couloir. Il en existe de nombreuses autres …
Un programme de test détaillé plus bas a permis de faire des relevés de forces des signaux wifi présents dans le niveau 0.
Dans le tableau suivant, seules quelques bornes sont sélectionnées :
Ces bornes suffisent pour obtenir la position de l’utilisateur dans le couloir principal : la courbe obtenue en prenant le maximum de la famille des courbes sélectionnées paraît facilement exploitable
Programme de test
Préliminaire
Le programme de test est écrit en python et nécessite le module wifi. Installation :
pip install wifi
Le module date un peu, mais est toujours fonctionnel : https://github.com/rockymeza/wifi
# -*- coding: utf-8 -*-
# Claude G. - 2018
import wifi
def Search():
wifilist = []
cells = wifi.Cell.all('wlp3s0')
for cell in cells:
wifilist.append(cell)
return wifilist
"""
calcule la qualité q d'un signal sous forme d'entier
0 < q <= 70 à partir de n = "q/70"
"""
def quality(n) :
q = int((n.quality.split('/'))[0])
return q
""" reçoit un tableau de dictionnaires (de wifi) renvoie le tableau rangé par
ordre décroissant de force de signal
"""
def triBulle(a) :
n = len(a)
print(n)
for i in range(n-1) :
for j in range(n-1,i,-1) :
print(a[j])
if quality(a[j]) > quality(a[j-1]) :
a[j],a[j-1] = a[j-1],a[j]
"""
Reçoit une liste de wifi du voisinage
et renvoie la liste des wifi appartenant à l'établissement
"""
def selectionneWifi(liste):
return liste
if __name__ == '__main__':
# Récupération de la liste des wifi
lw = Search()
print(lw)
# .. rangement par ordre décroissant de force
triBulle(lw)
# on ne garde que les wifi connus
lw = selectionneWifi(lw)
for lwi in lw:
print(lwi.ssid + " " + lwi.address + " " + lwi.quality)
print( str(quality(lwi)) )
Extrait de la sortie du programme en un point donné :
wifi-chbs 34:BD:C8:AC:49:32 25/70
25
wifi-chbs-mobiles 34:BD:C8:AC:4A:2F 24/70
24
\x00 34:BD:C8:AC:4A:2E 23/70
23
wifi-chbs-patients 34:BD:C8:AC:49:34 23/70
23
\x00 34:BD:C8:AC:4A:29 23/70
23