Pepper 2019 – Localisation wifi par ESP8266

Il n’est pas possible d’utiliser les commandes systèmes de Pepper en programmation normale. En effet, les accès « sudo » sont verrouillés par le constructeur. Pour localiser le robot en fonction des signaux wifi, il faut donc y embarquer un matériel communicant supplémentaire, un peu comme un GPS dans une voiture.



Taille : 75mm x 35mm
Le principe retenu utilise une carte ESP8266 qui scanne le réseau wifi en permanence,
et publie le résultat sur une page HTML de son site internet local.

Le logiciel embarqué dans la carte ESP :

  1. s’initialise pour avoir une adresse IP fixe
  2. se connecte au Wifi local
  3. initialise un serveur web
  4. scanne en permanence le wifi local
  5. la page HTML d’accueil est recrée en fonction des résultats du scan, avec
    les 4 signaux les plus forts.



Page renvoyée par l’ESP

Initialisation de l’ESP


void setup() {
  Serial.begin(115200);
  // IP statique
  IPAddress ip(192, 168, 1, 222);
  IPAddress gateway(192, 168, 1, 254);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress dns(192, 168, 1, 254);
  WiFi.config(ip, dns, gateway, subnet);
  WiFi.begin(ssid, password);
  Serial.println("");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.print("\nConnexion ");
  Serial.println(ssid);
  Serial.print("Addresse IP: ");
  Serial.println(WiFi.localIP());
  ...
}

Scan réseau

La fonction Wifi.scanNetworks() renvoie le nombre de wifi détectés. Les fonctions Wifi.SSID(i) et Wifi.RSSI(i) renvoient respectivement
le i-ème SSID détecté ainsi que la force du signal (le rssi)

void loop() {

    Serial.println("scan ...");
    // WiFi.scanNetworks renvoie le nombre de reseaux trouves
    int n = WiFi.scanNetworks();
    Serial.println("scan ok");
    if (n == 0)  Serial.println("Pas de reseau");
    else {
      Serial.print(n);
      Serial.println(" Wifi : ");
      SCAN=1;
      raz(); 
      for (int i = 0; i < n; ++i)  {
          ajoute((WiFi.SSID(i)).c_str(), WiFi.RSSI(i)); 
          Serial.print(i + 1);
          Serial.print(": ");
          Serial.print(WiFi.SSID(i));
          Serial.print(" (");
          Serial.print(WiFi.RSSI(i));
          Serial.println(")\n");
      }
      SCAN=0;
    }
   server.handleClient();
}

 

Stockage des n meilleurs résultats

Les wifi détectés sont stockés dans un tableau de structures.
Chaque structure contient un SSID et son RSSI. On ne conserve que les NWIFI les meilleurs

#define NWIFI 4

struct Swifi {
  char wf[128];
  int rssi;
} TW[NWIFI];


// RAZ du tableau des meilleurs wifi
void raz() {
  for (int i=0; i<NWIFI; i++) {
     TW[i].rssi=-1000;
     TW[i].wf[0] = 0;
  }
}

// Ajout d'un wifi dans la sélection.
// Seulement s'il fait partie des meilleurs ..
void ajoute(const char *ssid, int rssi){
   int r = 0;
   while (rr; i--) TW[i]=TW[i-1];
   TW[r].rssi = rssi;
   strcpy(TW[r].wf, ssid);
}

 

Fabrication de la page HTML

La page HTML est fabriquée à partir de la dernière mesure de wifi.
La fonction handleRoot() renvoie le message à chaque client web
qui a fait la requête http://192.168.1.222/

 


// page html
char html[128*NWIFI];

void handleRoot() {
  char b[128];
  html[0] = 0;
  while (SCAN==1) delay(10);
  for (int i=0; i<NWIFI; i++) {
     sprintf(b,"%s;%d\n", TW[i].wf, TW[i].rssi);
     strcat(html, b);
  }
  server.send(200, "text/plain", html);
}

 

Code complet

ScannerDoc.ino

Récupération des informations en python

Le programme python utilise le module requests. Le code est trivial :


La trace d’exécution est dans la partie droite

« 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

Projet « Pepper 2019 »

Le projet se situe dans le contexte global de l’amélioration de l’accueil au sein du Centre Hospitalier de Bretagne Sud (CHBS de Lorient).
Pour bien comprendre les enjeux, il est important d’avoir quelques chiffres en tête :

  • 97 500 m2 de planchers construits – 42 000 m2 de surface utile

  • Plus de 3000 locaux

  • 691 lits et places dont 118 pour le pôle Femme-Mère-Enfant et 573 pour les activités de médecine et de chirurgie,

  • 4 plateaux d’hébergement comprenant chacun 112 lits,

  • 4 unités de 28 lits par plateau,

  • 80 % de chambres individuelles,

  • 1500 places de stationnement.

  • le système d’informations du CHBS en quelques chiffres :

    • Environ 120 outils informatiques différents ( pour le médical, l’administratif, DRH, paye , radiologie, imagerie …)

    • 3000 ordinateurs

    • plus de 900 bornes wifi, rien que sur le site du CHBS ( données, téléphone, sécurité …)

Malgré la qualité reconnue de l’accueil et une signalétique présente, il est très fréquent que les visiteurs se perdent en allant à leur rendez vous, étant donné la longueur des couloirs et le nombre d’intersections et de niveaux.

À certaines heures de la journée ou de la soirée, il peut, dans certains endroits, n’y avoir personne pour indiquer une direction ou une destination.

L’idée explorée par les responsables du CHBS est d’avoir une flotte de robots interactifs, pour renseigner et guider.

C’est dans ce cadre que se projet prend naissance : un robot Pepper va être programmé et testé pour des missions d’accueil et de guidage. Pour cela, des réunion avec les responsables du CHBS, accompagnée d’une visite officielle du CHBS nous a permis de rencontrer les cadres de santé des différents services du CHBS qui sont partants pour ce projet.

Note : dans ce même contexte, un autre projet est mené, plus exigeant en terme d’interactivité, mais a priori plus simple en terme de guidage. Ce 2ème projet, présenté dans un autre document concerne uniquement la chirurgie ambulatoire.

Pepper : le robot Pepper est un robot humanoïde de 1,20m de hauteur incluant quatre microphones directionnels ; une caméra 3D et deux HD ; deux émetteurs et récepteurs à ultrasons ; six capteurs lasers ; trois détecteurs d’obstacles ; trois roues omnidirectionnelles ; vingt moteurs haute précision pour les gestes (tête, bras, dos) ; accès autonome à Internet ; écran tactile de 10 pouces ; batterie lithium-ion de grande capacité (autonomie d’environ 12 heures).

Ce robot est spécialisé dans l’interactivité : conversation, reconnaissance faciale …

Expériences similaires

Des expériences ont déjà été conduites, comme par exemple dans les hôpitaux belges de Liège et d’Ostend en juin 2016. Les difficultés rencontrées, et les erreurs commises là bas doivent être prises en compte dans la réalisation pour le CHBS. En particulier :

  • si le robot est placé à l’accueil dans un emplacement quelconque, le public passe sans le voir : il est complètement transparent.
    Même avec une certaine interactivité, il a du mal à capter l’attention. Une présentation humaine (à partir de l’accueil) paraît indispensable dans un premier temps ;

  • les tests avec le public doivent se faire avec des programmes ne nécessitant pas la présence active d’un informaticien qui « débugge » en direct ;

  • l’interaction image/son devra toujours être doublée par une proposition d’interaction sur la tablette embarquée. En effet, la reconnaissance faciale de Pepper fonctionne bien pour un visage plutôt proche de la caméra. D’autre part, il est en difficulté lorsqu’il y a plusieurs visages. Or, dans un hall d’accueil, on peut s’attendre à des arrivées de visiteurs accompagnés de leur famille, voire à des attroupements.

  • Pepper est sensible aux bruits de fond. Des travaux, des enfants qui chahutent rendent l’interaction vocale difficile.

  • Pour le guidage, l’utilisation des capteurs infra rouge ne suffit pas à cause des variations de lumière.

Ces résultats doivent être pris comme points d’entrées pour la réalisation. Les tests devront être faits régulièrement sur site, afin de valider les étapes en situation réelle.