« Pepper 2019 » – Détection de wifi

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