Projet

Général

Profil

SSL light

Développé par Gregoire Passault,
Description
Sources

Tutoriel

Dans la salle 203 de SSL light (bâtiment 9B, ancien IUT info, désormais Hygiène et Sécurité ).
Adresse IP du Game Controler :
  • sur le poste fixe (Xeon): 172.16.0.101
  • sur le laptop Lenovo du fablab Cohabit: 172.16.0.104
    NB: Si on change de Game Controler, on peut facilement retrouver l'adresse IP sur le réseau local avec la commande hostname -I ou avec la commande : ip a | grep eno par exemple.

-- Lancement du jeu

  1. Démarrer le game controler (actuellement le PC04 DELL 1700)
  2. Entrer le mot de passe de session (post-it à l'écran)
  3. Le game controler s'ouvre automatiquement
    1. on peut le relancer manuellement via le terminal blueavec la commande python3 -m jssl.game_controller
  4. Ouvrir BlueMan (touche démarrer, taper "Blue", sélectionner Blueman)
  5. Dans Blueman, les quatre robots apparaissent, il faut activer la connexion série pour chacun (mais ça ne marche pas)

-- Comportement du dispositif (tests)

> Depuis le GAME CONTROLER :

[lundi 25 octobre - test par Pierre et Jean-Baptiste]
  • création d'un script d'appairage automatique des robots avec un port rfcomm* dédié, au démarrage de la machine du Game Controler : /home/<user>/bt.sh
  • constat d'une très forte sollicitation du CPU : certains pids atteignent régulièrement les 100%
  • test des actions sur les robots (blink, kick) depuis l'interface graphique du Game Controler
[mardi 26 octobre - tests par Habib]
  • Lorsqu'on lance htop , cela nous indique une grande consommation de la puissance de calcul du CPU :
    • 4 processus utilisent en continu entre 60 et 100% de CPU, parmi eux :
      • des requêtes faites par le script du game controler réparties en plusieurs processus
      • le serveur web : QTWebEngine
  • Une fois les robots allumés, lorsqu'on relance le game controler via le terminal, des messages d'échec de connexion avec les périphériques s'affichent :
    Opening connection with /dev/rfcomm2
    Exception
    Write failed: [Errno 5] Erreur d'entrée/sortie
    
    • De même dans l'interface graphique, qui les indiquent tous les 4 comme "not detected".
  • Pourtant, robot par robot, on obtient le comportement suivant après une nuit de recharge complète de leurs batteries sur secteur (1Ampère):
Robot Connexion en bluetooth Blink Kick Remove Hypothèses
RED II (adresse MAC : 20:18:08:30:10:57, port : /dev/rfcomm3 ) OK, mais affiché comme "non détecté" (interface graphique), [Errno 5] Erreur d'entrée sortie (terminal) OK OK OK problème de charge de batterie insuffisante (plus valable car testé après une nuit de recharge)? problème au niveau de la communication bluetooth?
BLUE I (adresse MAC : 20:18:08:30:02:03, port : /dev/rfcomm2 ) 1er essai : OK, mais affiché comme "non détecté" (interface graphique), [Errno 5] Erreur d'entrée sortie (terminal) OK OK OK
BLUE I 2éme essai : "no response" "no response" "no response" "no response" problème de charge de batterie insuffisante ? (plus valable car testé après une nuit de recharge)? problème au niveau de la communication bluetooth?
BLUE II (adresse MAC : 20:18:08:30:02:00, port : /dev/rfcomm1 ) OK, mais affiché comme "non détecté" (interface graphique), [Errno 5] Erreur d'entrée sortie (terminal) OK OK OK problème de charge de batterie insuffisante (plus valable car testé après une nuit de recharge)? problème au niveau de la communication bluetooth?
RED I (adresse MAC : 20:18:08:30:10:44, port : /dev/rfcomm0 ) 1er essai : OK, mais affiché comme "non détecté" (interface graphique), [Errno 5] Erreur d'entrée sortie (terminal) OK OK OK problème de charge de batterie insuffisante (plus valable car testé après une nuit de recharge) ? problème au niveau de la communication bluetooth?
RED I 2éme essai : "no response". Lorsqu'on tente de se connecter à lui depuis le terminal bluetoothctl connect <:::10:44>, on obtient un message d'erreur : failed to connect. org.bluez.Error.failed . "no response" "no response" "no response" problème de charge de batterie insuffisante (plus valable car testé après une nuit de recharge) ? problème au niveau de la communication bluetooth?
[mardi 26 octobre - tests par Grégoire]
Sur le poste fixe:
1. constat des déconnexions soudaines des appairages sur l'interface graphique ("no response") de plusieurs robots, assez aléatoirement
* 1.a. suppression de 3 des robots pour voir si on obtient le même comportement avec 1 seul robot
  • 1.b. l'instabilité semble moins forte à vue de nez
  • 1.c. le terminal affiche toujours les erreurs d'entrée/sortie en écriture pour les ports dédiés à la communication avec les robots
  • CCL: hypothèse que le problème vienne plutôt du Dongle bluetooth du poste fixe du Game Controler
    2. changement de machine : proposition de faire une installation d'un nouveau Game Controler sur un laptop avec un bluetooth fonctionnel pour comparer les 2 comportements.
Passage sur la laptop de Coh@bit:
1. Suivi de l'installation type : https://github.com/Rhoban/junior-ssl/blob/master/docs/programming.md
  • 1.a. sudo apt-get install python3 python3-pip
  • 1.b. pip3 install -U junior-ssl
  • 1.c. souci de version avec la librairie qt ( source : https://pypi.org/project/PyQt6/ ): nécessite la version 1 , et pas la version 0 (Anecdote : n'ayant pas de réseua internet depuis le réseau local "Aquarium", Grégoire a contourné le problème, dans le dossier des binaires python, en faisant un lien symbolique qu'il a nommé <nom-librairie-qt>.<version1> vers /<path_to>/<nom-librairie-qt>.<version0>;) . Cf .4 ++ ci-dessous :
2. Configuration d'un fichier /home/<user>/bt.sh pour relier chaque robot via leur adresse MAC à un point de montage unique sur le game controler ( /dev/rfcomm* ), et ainsi permettre la communication de clients à game controler :
( *sources* : pour comprendre ce qui se déroule en python : https://people.csail.mit.edu/albert/bluez-intro/x232.html, manipulation du service bluetooth via terminal : https://computingforgeeks.com/connect-to-bluetooth-device-from-linux-terminal/ )
  • 2.a. D'abord 1 ligne d' unbind par appareil (par robot-bluetooth) --> pour bien garantir que chaque appareil est désappairé à chaque relance du game controler
  • 2.b. Puis 1 ligne de bind par appareil --> appairage avec les appareils bluetooth des 4 robots
3. Puis, lancement du game controler avec la commande : python3 -m jssl.game_controller (dans le dossier path_to/junior_ssl)
  • 3.a. on ajoute tous les points de montage pour l'appairage
  • 3.b. puis, on clique bien sur le bouton "identify" pour faire assigner un nom de robot (blue1, red2, ...) à un point de montage, donc à un robot en particulier. Les mêmes noms sont ensuite utilisés dans le code python du programme qui lance les commandes d'action sur les robots depuis les joueurs clients.

4. Recherche des commandes dans l'historique des commandes du terminal avec history , et tentative de reconstituer ce qui a été fait ( à réorganiser à terme ):

# suggestion d'utiliser le paquet ipython pour le confort de lecture du code (colorie la syntaxe dans la console) :
python3 -m IPython
#télécharger le logiciel junior-ssl :
git clone https://github.com/rhoban/junior-ssl.git
#installer le logiciel junior-ssl
pip3 install -U junior-ssl
#vérifier la version du paquet contenant la chaîne de caractères "ssl" (pour vérifier la version du paquet jssl installée) :
python3 -m pip freeze| grep ssl
#lancer le game controler :
jssl-gc
#ou
python3 -m jssl.game_controller
#Grégoire a fouillé dans ces fichiers python contenant le code source du logiciel :
cd /usr/local/lib/python3.7/dist-packages/jssl
ls
vi /usr/local/lib/python3.7/dist-packages/jssl/video.py
vi /usr/local/lib/python3.7/dist-packages/jssl/control.py
vi /usr/local/lib/python3.7/dist-packages/jssl/robot.py
# On associe des ports aux adresses MAC de chaque robot dans le fichier @/home/useur/bt.sh@  (donner les droits : chmod 755). NB: les première lignes d'unbind relancent les appairages à chaque lancement du Game Controler pour s'assurer qu'on ne travaille pas avec des données passer qui seraient restées en mémoire.
rfcomm unbind 0 
rfcomm unbind 1 
rfcomm unbind 2 
rfcomm unbind 3 

rfcomm bind 0 20:18:08:30:10:57 
rfcomm bind 1 20:18:08:30:10:44
rfcomm bind 2 20:18:08:30:02:03
rfcomm bind 3 20:18:08:30:02:00

#puis on exécute le fichier /home/useur/bt.sh avant de démarrer le game controler, afin qu'il puisse y avoir assignation de ports séries dédiés aux connexion bluetooth. Gestion des assignations par rfcomm. En lançant la commande rfcomm -a , on peut lister les connexions actives dans le terminal.

Pour que cela s'exécute automatiquement à chaque démarrage du Game Controler ou à chaque démarrage de la machine hôte : configurer un cron .

#observer les échanges de données avec le point de montage du bluetooth d'un des robots (et communiquer avec si l'on veut) /dev/rfcomm<0-3>, avec le paquet cu ( cu  command  is used to call up another system and act as a dial in terminal. It can also do simple file transfers with no error checking. ):
sudo apt install cu
cu -l /dev/rfcomm<0-3>
bluetoothctl
list
paired-devices
# vérifier sur quels couples (adresse-IP,port) et sur quels couples (adresse-locale-du-host,sockets) les différents services fournis et reçus par la machine tournent.
# netstat - Affiche les connexions réseau, les tables de routage, les statistiques des interfaces, les connexions masquées, les messages netlink, et les membres multicast.
netstat -oa
#lancement de commande depuis le terminal sans passer par la console python3. Equivalent de la fonction  @client.gotoconfiguration('side')@ dans la console. Cette commande donne l'ordre à tous les robots de s'aligner sur le côté du terrain dans des coordonnées pré-configurées. Commande test avant de laisser les joueurs se lancer.
python3 -m jssl.place -t side
#travail sur la capture d'images par vidéo avec @guvcview@ (simple GTK+ interface for capturing and viewing video from devices supported by the Linux UVC driver. It fully supports video4linux2 so it should work  with  any  driver  that supports this API, including the gspca driver.)
sudo apt install guvcview
guvcview
guvcview -d /dev/video2
# autre source utilisée : "IMAGE RESIZING with OPENCV" sur https://learnopencv.com/image-resizing-with-opencv/ pour offrir de nouvelles possibilité de réduction de résolution d'écran par interpolation (calculs de moyennes de pixel).
# vérification des problématiques de consommation de cpu :
cat /proc/cpuinfo
htop
#problème avec la librairie QT (erreur lors de l'installation du paquet jssl). Source : https://stackoverflow.com/questions/57362015/how-to-fix-could-not-load-the-qt-platform-plugin-xcb-in-even-though-it-was  :
apt-cache search libxcb| grep util
sudo apt-get install libxcb-util0
ls /usr/local/lib/python3.7/dist-packages/PyQt5/Qt5/plugins/platforms/libqxcb.so
file /usr/local/lib/python3.7/dist-packages/PyQt5/Qt5/plugins/platforms/libqxcb.so
ldd libqxcb.so
cd /usr/lib
find . -name "*xcb*" 
sudo ln -s libxcb-util.so.0 libxcb-util.so.1
#Autre source utile sur le GUI, étant donné que QT est basé sur le protocole X et pas Wayland : https://www.debian.org/doc/manuals/debian-reference/ch07.fr.html#_gui_desktops . Explication schématique du fontionnement des 2 serveurs de rendus graphiques :https://wayland.freedesktop.org/architecture.html .

> Depuis les machines des joueurs (CLIENTS):

  • On ouvre la console python3 avec ipython (paquet permettant une colorisation syntaxique)
    python3 -m IPython
    >>import jssl
    >>client=jssl.Client('host=172.16.0.104')
    >>client.red1.kick() (La syntaxe <color><numbber> fonctionne avec la version 0.1.8 de jssl. Vérification de la version : pip3 -m freeze | grep ssl )
    >>client.red1.control() (cf documentation officielle : https://github.com/Rhoban/junior-ssl/ )
    >>client.red1.control() (cf documentation officielle : https://github.com/Rhoban/junior-ssl/ )

Exercices-Jeux

Réaliser un module de jeu (épreuve à passer) pour découvrir un aspect précis du programme
  • introduction (avant d'aller dans la salle SSL)
    • dessinez à la main le dispositif tel que vous l'avez compris
    • découvrons les bases d'un langage informatique (via python)
  • Localisations
    • de la balle
    • du robot
  • Kick
    • notion de consommation d'énergie (comment la formaliser? idées: barre de "faiblesse" du robot qui indique le stock de kicks disponible qui descend à chaque kick, épreuves incitant à être le plus précis et direct possible)
  • Déplacement et orientation
    • vitesse et changement d'orientation (control())
    • déplacement vers une coordonnée choisie
  • Enchaîner les actions en un click
    • passage de la console au Script