Stratégie de développement d’un plugin hardware pour Navigation RF-ID Pepper (Partie 1)

Le team Pwavrobot développe actuellement un module hardware basé sur Raspberry PI Zéro pour permettre à Pepper de naviguer simplement sans utiliser de trop grosses ressources système. le projet de base sur la conception d’un prototype comportant, une carte RPi Zero, un module WIFI soudé sur la carte Rpi zéro, un module Neuftech Gros GY-273 Module HMC5883L (trois axes boussole magnétomètre capteur 3V-5V), un lecteur de TAGS RF-ID 125 khz RhydoLabz,  une batterie Li-Ion 2000 mA, 3.7v .


Le développement d’un prototype ultra fin permettra de coller la carte sous Pepper pour lui permettre de lire des autocollants RF ID collés sur le sol, distants d’environ 15 cm les uns des autres et uniformément répartis sur le sol.

 

 

Algorithme serveur de navigation Pepper (Python)

Mappage des localisations de tous les Tags RFID au sol dans base de données dans fichier texte RPIZero, monté en mémoire RPI zero. Association numéro de salle ou de porte à ID unique RFID. Enregistrement de la position des TAG RFID nécessitant la gestion d’un angle de mur ou une cassure de trajectoire.

Box python d’envoi de la destination par fonction go2dest(#salle) ou go2rfid(#ID_TAG) vers serveur Rpi Zero . Langement depuis chorégraphe à Chargement en mémoire Rpi zero de la destination puis lancement du serveur d’écoute de position RPi en arrière plan.

Serveur RPI : écoute du premier ID_TAG à portée de récepteur, calcul de la distance, lecture de la carte magnétomètre pour détermination de la position par rapport au nord magnétique. Calcul du déplacement théorique vers cible (angle théta + x,yz) et communication du motion a Pepper. Remise en écoute du serveur. Oubli de l’ID_TAG analysé et écoute du TAG suivant.

A chaque TAG enregistré par Rpi Zero : Vérification d’absence de TAG cassure trajectoire (sinon recalcul spécifique avec routine dédiée). Vérification de l’absence de dérive dans la direction du vecteur trajectoire. Si dérive, arrêt pepper et recalcul de trajectoire vers destination puis renvoi de la nouvelle trajectoire au robot.

Composition Rpi Zero

1 RpiZero + Module magnétomètre boussole + Lecteur RFID 125 khz avec écoute à 15 cm. Batterie Li-Ion ; Epaisseur estimée :  3 mm sous socle Robot. Module collé sous Pepper. Système Raspbian + Python 2.7 + Lib Math. Module WIFI soudé sur Carte mère RPI.

Stratégie de développement : module fixable pour permettre adaptation à Pepper, Nao, Buddy, drone etc …

 

Première partie: Le développement du module boussole électronique sur le RPi Zéro

CABLAGE

Le câblage du module HMC5883L sur le RPI zéro est assez aisé.

La correspondance des connecteurs est comme suit

Pi pin number       Pi pin name        HMC5883L pin name
--------------------------------------------------------
1                   3V3                VCC
6                   Ground             GND
3                   SDA                SDA
5                   SCL                SCL

La câblage pratique est exposé sur les photos qui suivent

20161009_153621

20161009_153602_001

Raspberry-Pi-Model-Zero-Mini-PC

 

INSTALLATION DES LIBRAIRIES ET RECONNAISSANCE DU MODULE

L’installation des librairies sous Raspbian est assez simple et se fait avec les commandes

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install i2c-tools
sudo apt-get install python-smbus
sudo apt-get install python3

Créez un répertoire dans /home

mkdir ~/boussole 

cd /home/boussole

Installer le git

git clone https://github.com/quick2wire/quick2wire-python-api.git

(si git n’est pas installé: sudo apt-get install git)

Lancer la commande

mv ./quick2wire-python-api ./code

pour rendre le nom du sous repertoire plus simple à manipuler

Créer un fichier setup.env dans le réperoire. convient 2 lignes

export QUICK2WIRE_API_HOME=~/boussole/code
export PYTHONPATH=$PYTHONPATH:$QUICK2WIRE_API_HOME

Aller dans le répertoire ./code

cd /home/boussole/code

Et lancer git

git clone https://bitbucket.org/thinkbowl/i2clibraries.git

Lancer un raspi-config depuis le terminal en mode root

Puis activer les fonctions I2C comme indiqué dans les photos qui suivent

20161009_155911

20161009_155921

20161009_155928

Il n’y a plus qu’à rebooter

Une fois rebooté, se reconnecter à un terminal en mode root.

Et vérifier que le module du magnétomère I2C est reconnu en lancant la commande

i2cdetect -y 1

Raspbian doit indiquer

i2cv006f-large

 

PROGRAMMATION TEST

Se positionner dans /home/boussole/code

Est créer un programme PYTHON3 que nous appelerons readtest.py

demotitre-1

 

#!/usr/bin/python3

import time
import os

from i2clibraries import i2c_hmc5883l

hmc5883l = i2c_hmc5883l.i2c_hmc5883l(1)

hmc5883l.setContinuousMode()
hmc5883l.setDeclination(9,54)

while True:
os.system('clear') # on linux / os x
print(hmc5883l)
time.sleep(1)

Lancer l’application avec la commande

python3 readtest.py

 

VERIFICATION DU BON FONCTIONNEMENT DE L’APPLICATION

 

DEVELOPPEMENT DE LA BOX PYTHON POUR CHOREGRAPHE

Le développement de la Box Python est assez simple sous Choregraphe. Le principe est de lancer la requête à travers un socket et de récupérer la valeur. Rien de très original. Juste du code pour manipuler les sockets et pour attendre la réponse avec un timeout. Je vous mets le code.

inputed

Une fois la box créée , il suffit de développer un script simple du type de celui ci dessous.

angulaire-sdss

Puis on lance le code magneto_server.py sur le RPi Zéro. Il n’y a plus alors qu’à démarrer le script chorégraphe qui va interroger RPi Zéro, puis le magnétomètre, extraire la valeur de l’angle par rapport au nord et la renvoyer à l’OUPUT self.onStopped(). On pourra alors lui faire dire la valeur trouvée ou, mieux, traiter l’information pour en déduire l’angle que Pepper doit prendre pour se diriger sur sa cible. Une boucle régulière pourra lancer la box python régulièrement pour affiner le calcul de positionnement.

 

LE CODE SOURCE DE LA BOUSSOLE PEPPER

Le code source pour tout ça est télechargeable ici.

Aller à la partie 2 de ce dossier

 

Sources utiles:

 

 

 

Publié dans Programmation, Python, Toutes les rubriques articles