Teleguide2011-1
Sommaire
Robot téléguidé 1, le Gros Tony
Étudiants: Jean-Dominique Lancieri et Thomas Maurice.
1ère étape, construction du robot
Pour construire le robot, nous avons d'abord essayé de suivre les instructions du manuel Lego fourni, mais plusieurs problèmes d'érgonomie sont assez vite apparus, comme par exemple la non utilisation d'un moteur et l'espace insuffisant entre les moteurs restants pour intercaler les capteurs de luminosité et de puces RFID. Nous avons donc décidé de développer notre propre châssis plus large que celui de base, pour éviter de trop élever le robot par la suite en ajoutant des composants, afin de conserver un assez bon équilibre.
Idée d'amélioration du guidage par wifi
Plutôt que de récupérer les ordres de direction lorsque l'on clique sur la page web du robot, on peut les récupérer via un joystick raccordé à une machine qui enverra les ordres a la foxboard par wifi. Le guidage sera ainsi plus intuitif (et plus rigolo...).
Principe
- Un programme client récupère les informations d'une manette de jeu (état des axes, hats et boutons) et les convertit en ordres simples (avancer/tourner à telle vitesse).
- Le programme client envoie les ordres via un protocole textuel simple à un programme serveur tournant sur la foxboard.
- Le programme serveur envoi des ordres dans la "mailbox" du robot via bluetooth, en lui indiquant quelles actions effectuer (tourner un moteur,bipper...) et combien de temps.
(Programme client en C++ avec la SDL pour la gestion du joystick et programme serveur en C++ standard, partie réseau réalisée avec une petite lib réseau en C++ la libtsocket)
Programme
La libtsocket
La libtsocket est une petite bibliothèque réseau orientée objet développée par Thomas Maurice. C'est en fait une surcouche orientée objet des sockets de la STL. Elle a pour but de permettre de développer rapidement des petites applications réseau en ne se préoccupant pas de la partie manipulation des sockets qui est assez lourde à l'usage. La libtsocket inclue aussi la possibilité de se connecter en SSL (sans toutefois pouvoir effectuer de vérifications sur les certificats, versions de protocoles etc...) de manière assez simple. La bibliothèque est codée en C++ standard et est portable sous Linux et Windows (OSX non testé), elle se compose de 3 classes simples :
- Server_socket qui définit une socket serveur
- Client_socket qui définit une socket client
- Connected_socket qui définit une socket connectée (récupérée par) une socket serveur. Elle s'utilise exactement comme une Client_socket (elles héritent toute deux de la classe mère Abstract_socket)
Server_socket
Cette classe définit une socket serveur. Elle se déclare simplement :
Server_socket(int port); // Pour une utilisation simple Server_socket(int port, int type, bool use_ssl, std::string cfile, std::string kfile); // Pour SSL
On bind la socket au port choisi avec :
int Server_socket::connect_socket(); // qui renvoie 0 si tout est glop, -1 si pas glop
On peut ensuite récupérer les éventuelles connexions entrantes avec :
std::vector<Connected_socket> Server_socket::get_pending();
Le vector étant de longueur nulle si personne ne tente de se connecter.
On peut ensuite asser à la manipulation des sockets récupérées par le biais de la classe Connected_socket.
Connected_socket
Cette classe permet de gérer les connexions entrant sur une Server_socket. Le constructeur n'a pas besoin d'être explicité (on construit la socket en lui passant le file descriptor qui va bien et les éventuels paramètres de contexte SSL) car géré par le Server_socket. Les fonctions intéressantes de cette classe sont les suivantes pour la préparation à la lecture :
bool Connected_socket::can_getline() // Si une ligne a été reçue (pour les protocoles en mode texte // à la IRC, HTTP, ou juste Telnet. bool Connected_socket::can_getchar() // Pareil mais avec un char. bool Connected_socket::can_getchars() // Pareil mais avec plusieurs chars (octets pour les protocole binaires).
Ensuite pour la lecture :
std::string getline(); // Récupère la dernière ligne (en ancienneté) su buffer et l'efface std::vector<char> getchars(); // Récupère les octets du buffer et les efface std::string getchars_as_string(); // Récupère les octets du buffer en tant que chaine char getchar(); // Récupère le plus vieux caractère du buffer et l'efface
Puis pour l'écriture :
int Connected_socket::write(std::string data) // Écrit une chaîne int Connected_socket::write(char c) // Écrit un octet int Connected_socket::write_line(std::string data) // Écrit une chaîne plus un retour chariot \n
Enfin quelques accesseurs :
std::string Connected_socket::get_host() // Renvoi l'IP int Connected_socket::get_port() // Renvoi le port bool Connected_socket::is_connected() // Renvoi si la socket est connectée, en cas d'erreur // de lecture ou d'écriture la socket sera considérée comme // fermée.
Et les classiques opérateurs de comparaison == et != (qui portent sur l'host et le port de la socket) Enfin, on ferme la socket en appelant la méthode :
Connected_socket::close_socket() // tadadaaaaaaaaam
Documentation
Page man du programme mstormjoystick
mstormjoystick(1) Joystick Mindstorm controller mstormjoystick(1) NAME mstormjoystick - Logiciel de contrôle du robot Lego Mindstorm via le réseau. SYNOPSIS mstormjoystick --host host --port port --key key DESCRIPTION Ce programme permet de communiquer avec le serveur joystick-server et de ce fait de contrôler le robot Lego Mindstorm qui est equipé du pro‐ gramme guidage.nxc. Ce programme est développé pour la manette de jeu Logitech RumblePad 2, il est donc possible qu'une autre manette provoque des comportements inattendus si elle est utilisée avec ce pro‐ gramme. Pour capter les évènements de la manette, le programme utilise la bibliothèque SDL, et pour communiquer à travers le réseau, il utilise la libtsocket une petite bibliothèque réseau orientée objet développée en C++. OPTIONS --host host Spécifie l'host de connexion --port port Spécifie le port de connexion --key pass Spécifie le pass de connexion UTILISATION Le programme se lance après avoir une manette configurée branchée à la machine, la manette sera automatiquement détectée (en théorie) et la connexion au serveur se fera automatiquement après la détection de la manette. Les contrôles sont simples : Les hats Permettent de contrôler le robot pas à pas, en fait ils permet‐ tent de résaliser le plus petit déplacement possible dl de manière à diriger le robot en précision. Les axes Permettent de diriger le robot en continu et non pas à pas comme avec les hats. Lors d'un déplacement en avant, il est possible de faire tirer le robot plus à droite ou plus à gauche pour cor‐ riger un éventuel défaut mécanique ou une inégalité du sol. C'est en revanche impossible si le robot recule, il reculera bêtement en ligne droite. Notez que si le robot tourne, par gain de place, il tournera sur place ce qui permet d'affiner encore la direction. Les boutons Le bouton 9 est le bouton d'arrêt du programme, il doit être utilisé pour quitter le programme joystick. Le bouton 10 est le bouton d'arrêt du programme ET du serveur (hébergé sur la même machine ou sur la foxboard). Appuyer sur ce bouton causera l'arrêt des deux processus. Les boutons 3 et 1 permettent quand à eux de pivoter légèrement sur place sur la droite ou sur la gauche. Le bouton 5 permet au robot de jouer les permières mesures de la marche impériale de Star Wars, du plus bel effet. Le bouton 2 est un avertisseur sonor, un genre de klaxon si le robot en a besoin. PROBLEMES CONNUS Parfois les contôles semblent inversés, c'est parce que la manette est passée pour une raison X ou Y en mode axes inversés, appuyez sur le bouton mode et tout devrait rentrer dans l'ordre. AUTEURS Thomas Maurice <thomas.maurice@polytech-lille.net> Jean-Dominique Lancieri <jean-dominique.lancieri@polytech-lille.net> Version 1.0 Thomas MAURICE - Mars 2012 mstormjoystick(1)
Page man du programme joystick-server
joystick-server(1) Joystick-server Mindstorm controller joystick-server(1) NAME joystick-server - Intermédiaire entre le robot Lego Mindstorm et la manette de jeu qui sert à le contrôler. SYNOPSIS joystick-server --port port --key key --target XX:XX:XX:XX:XX:XX DESCRIPTION Ce programme permet de faire le lien entre le programme joystick et le robot Lego Mindstorm équipé du programme guidage.nxc. Il transforme les commandes reçues par le logiciel joystick en ordres plus simples (chaines d'entiers) compréhensibles plus simplement par le robot. Pour communiquer avec le robot le programme utilise libbluetooth et une sur‐ couche fournie par les développeurs du NXC. Pour communiquer à travers le réseau, il utilise la libtsocket une petite bibliothèque réseau ori‐ entée objet développée en C++. OPTIONS --port port Spécifie le port d'écoute --key pass Spécifie le pass de connexion --target XX:XX:XX:XX:XX:XX Adresse MAC de la brique Lego Mindstorm UTILISATION Le programme se lance sur un ordinateur équipé d'une clef bluetooth ou bien de la foxboard qui est montée sur le robot. Le lancement n'est pas bien compliqué, il suffit de fournir les paramètres du programme au moment de taper la commande et c'est tout. PROBLEMES CONNUS La vitesse de transmission peut être lente si le programme est lancé depuis une foxboard, dû à la lenteur de son tout petit processeur. Pour obtenir un résultat optimal, sans aucun lag, il faut le lancer depuis une 'vraie' machine. MESSAGES D'ERREUR Endpoint not connected Le programme n'a pas réussi à s'appairer avec le robot, pour pallier à cela vous devez lancer 'bluetooth-agent 1234' et répondre positivement à la demande d'apairage qui s'affichera sur la brique. No route to host Le programme n'a pas pu initialiser le bluetooth. Soit la clé bluetooth du serveur n'est pas reconnue par le serveur, soit elle n'est pas connectée soit le robot n'est pas dans les par‐ ages avec son bluetooth activé. AUTEURS Thomas Maurice <thomas.maurice@polytech-lille.net> Jean-Dominique Lancieri <jean-dominique.lancieri@polytech-lille.net> Version 1.0 Thomas MAURICE - Mars 2012 joystick-server(1)
Problèmes rencontrés
Mécaniques
Pour des raisons mécaniques, il arrive que la trajectoire du robot soit parfois biaisée. Ce défaut peut cependant être corrigé en adaptant un peu la direction du joystick. Nous avons du également amélioré la structure du robot, en la renforçant, pour éviter le flambage. Une amélioration serait possible, en utilisant la boussole du robot, et en gardant le cap pour aller tout droit.
Réseaux
Nous avons eu quelques problèmes mineurs de connexions, notamment par rapport au bluetooth. Rien d'insurmontable, les solutions sont abordées plus haut, dans le man du programme joystick-server.
Programmation
Une des tâches les plus prenantes consiste à programmer le robot en nxc. Les difficultés ont été rencontrées à l'interface entre les senseurs, moteurs et le programme, parfois. Il a notamment fallu tester et afficher les valeurs recueillies par le robot, afin d'adapter les algorithmes. Les documentations disponibles permettent de s'en sortir, et même parfois de faire jouer la marche turque à tony.