Xylos brands

Si vous souhaitez commander un robot à distance, découvrez TensorFlow pour JavaScript!

Au cours de l’événement Xylos Inspire 2018, nous vous avons démontré comment commander un robot Lego Mindstorms avec votre propre corps. Dans ce billet de blog, nous passons dans les coulisses pour en découvrir les détails.
 

Programmer un robot : commençons par le commencement !

Lego Mindstorms est un jouet pour les enfants qui consiste à construire le prototype d’un robot télécommandé. Avec des blocs Leo, une brique programmable EV3, des moteurs et des capteurs, vous pouvez construire un robot qui peut marcher, parler, tirer et bouger de presque toutes les manières possibles. Les moteurs et les capteurs sont couplés à la brique EV3 programmable. Il existe différents types de capteurs disponibles pour, par exemple, mesurer les distances ou reconnaître les couleurs, mais également des capteurs tactiles et des gyroscopes.

Vous pouvez naturellement concevoir vous-même un robot, mais nous avons décidé de construire un robot standard. Pour ce projet, nous n’utilisons pas les capteurs du robot.

Un système de commande standard a été préinstallé sur la brique EV3 qui soutient différents robots standard conçus par Lego. Vous pouvez également connecter cette brique au logiciel EV3 et même programmer avec les modules livrés. Seul inconvénient, les possibilités sont plutôt limitées dans ce cas.

Pour notre démo, nous souhaitions commencer avec quelque chose d’assez simple afin de maîtriser parfaitement chaque geste du robot. C’est ce que nous avons fait à l’aide du système d’exploitation EV3DEV: ce système d’exploitation basé sur Debian Linux a été placé sur une carte SD qui est ensuite intégrée à la brique. Avec le système d’exploitation Debian dans le robot, nous avons pu écrire notre propre code. Nous l’avons fait en Python en raison du bon support open source (vous trouverez une liste complète des langages de programmation supportés sur la page EV3DEV). Avec notre propre code Python, nous avons pu envoyer des commandes aux différents moteurs et relier un serveur WebSocket à distance, pour que le robot réponde également à des commandes externes. Si vous êtes intéressé par le code, vous trouverez le code open source sur le référentiel GitHub en dessous de ce billet de blog.

Que faire avec les... mouvements vidéo ?

Lorsque l’opérateur se déplace devant la caméra, ces mouvements sont traduits en temps réel en commandes. Ces commandes sont alors envoyées sous la forme d’appels REST API vers le robot Lego Mindstorms. Nous avons écrit le processus pour détecter la vidéo à partir d’une webcam, pour analyser les images et pour envoyer des commandes au robot en JavaScript et ce processus s’effectue entièrement via le navigateur. Les images sont interprétées par TensorFlow, le populaire cadre d’apprentissage profond de Google. Un réseau neuronal prend une image vidéo comme input et donne la position d’un certain nombre de points clés sur le corps. Ces positions sont ensuite converties en commandes. Tout se passe avec la nouvelle super interface de programmation d’application JavaScript de TensorFlow.

Bref, notre solution se compose de trois parties :

  1. Un robot Lego Mindstorms avec une brique EV3 ;
  2. Un conteneur Kubernetes qui enregistre les commandes et les transmet au robot via une connexion WebSocket ;
  3. Une application JavaScript qui lit les images vidéo de la webcam, interprète l’image et envoie les commandes au robot.

Comment transférer des commandes via REST API ?

Pour assurer la communication de l’utilisateur au robot, nous avons conçu une API comme maillon intermédiaire. L’API est un conteneur composé de deux parties. Dans un premier temps, elle traite toutes les demandes reçues par l’utilisateur. Différents points finaux sont possibles, comme « avant », « arrière » et « tirer ». Ensuite, le conteneur héberge également un serveur WebSocket pour envoyer des messages au robot. L’API convertit chaque requête en un message qui est ensuite collecté par les WebSockets à l’écoute. La raison principale pour laquelle nous avons retiré cette logique du robot, c’est parce qu’il a une capacité matérielle limitée. Nous avions déjà un cluster Kubernetes, nous avons donc rapidement décidé de l’héberger comme conteneur. Ce billet de blog n’abordera pas la configuration exacte Kubernetes et la mise en œuvre du cluster. Mais si vous désirez en découvrir davantage à ce propos, vous trouverez le fichier de déploiement et le fichier conteneur dans le référentiel Git.

Comment envoyer des commandes avec TensorFlow pour JavaScript?

Pour ce projet, nous avons utilisé l’API JavaScript de TensorFlow. Penchons-nous, dans un premier temps, sur cette nouvelle technologie et sur le secret de son importance. Jusqu’à récemment, le cadre d’apprentissage profond de Google n’avait qu’une API Python. Ainsi, quiconque voulait créer ou former un réseau neuronal devait donc installer Python. La formation d’un modèle (réseau neuronal) et l’inférence (faire des prédictions avec le modèle) se faisaient principalement sur le serveur. Pour former le modèle, les données utilisateur devaient être placées sur le serveur, car c’est là qu’avait lieu la formation. Lorsque le modèle formé a dû démarrer, de nouvelles données ont dû être envoyées au serveur pour en tirer des conclusions utiles.

Aujourd’hui, nous avons toutefois TensorFlow pour JavaScript. Et nous pouvons directement construire, former et utiliser des réseaux neuronaux dans le navigateur grâce à JavaScript, ce qui permet de créer des applications web intelligentes et hautement interactives. Pour ce faire, l’utilisateur final n’a pas besoin d’installer Python : il n’a besoin que d’un navigateur web tel que Google Chrome, Firefox ou Edge.

Ces applications de navigation ne fonctionnent pas seulement sur des ordinateurs portables, mais également sur des smartphones. Moyennant les autorisations nécessaires, elles ont accès à l’appareil photo intégré, à l’accéléromètre et aux autres capteurs de l’appareil. Lorsque nous faisons fonctionner TensorFlow via le navigateur, les données personnelles de l’utilisateur ne doivent pas être transférées à des fins d’inférence, ce qui permet une économie de bande passante et protège la vie privée de l’utilisateur. Les tâches de deep-learning qui s’effectueraient normalement sur le serveur avec Python, se déroulent désormais via JavaScript.

1. Former des processeurs graphiques avec Python

Pour la formation d’un modèle de deep-learning (ou tout autre modèle), vous avez besoin de nombreuses données et de beaucoup de puissance de calcul. C’est pourquoi cela se fait généralement avec des processeurs graphiques ou GPU puissants, et non avec un ordinateur portable ou un smartphone. Heureusement, vous pouvez également récupérer des données du serveur pour former un puissant GPU avec Python. Ensuite, il suffit d’importer tout dans JavaScript. Vous pouvez également importer un modèle général formé au préalable avec des données provenant de différentes sources et reformer ce modèle localement avec vos propres données. Lors de la reformation, le réseau neuronal apprend continuellement et s’adapte pas à pas à vos données, de sorte qu’il fonctionne plus efficacement pour vous.

2. Postures du corps sur image avec Posenet

Pour démontrer les possibilités de TensorFlow pour JavaScript, Google a créé une bibliothèque Posenet open source pour JavaScript. Avec Posenet, chaque développeur peut utiliser des photos ou des vidéos de personnes pour déduire des postures corporelles à partir des images. Ces images sont envoyées au réseau neuronal préformé. La sortie du réseau neuronal reconnaît la position de 17 points de repère sur le corps. Ils apparaissent sous la forme de coordonnées sur l’image.

À l’aide de ces coordonnées, une logique simple peut formuler les commandes du robot sur la base de la posture de l’utilisateur. Voici comment cela se présentait pour notre robot : adopter une position neutre, avec les mains en bas signifie que le robot doit s’arrêter. Si vous tenez vos mains à l’horizontale, le robot avance. Si vous levez les deux bras en l’air, il recule. Vous pouvez le diriger vers la gauche ou vers la droite en étirant les bras horizontalement et en vous penchant un peu dans la direction souhaitée, un peu comme un avion qui effectue un virage. L’application Javascript envoie des commandes à l’API à distance sur la base de votre posture et l’API envoie ces commandes au robot via les WebSockets.

3. Tirer des projectiles avec Logitech

Enfin, notre robot peut également tirer des projectiles. L’utilisateur doit être capable de le faire lorsqu’il commande le robot. Notre solution est une simple commande à distance de présentation de Logitech : apparemment, notre code JavaScript reconnaît le fait d’appuyer sur le bouton de lecture comme une pression sur les touches F5 ou ESC. À chaque clic, la touche commute entre F5 et ESC. Finalement, c’est logique : comme les fans de PowerPoint le savent, vous pouvez commencer une présentation avec F5 et la terminer par ESC. L’action par défaut de la touche F5 dans le navigateur (rafraîchissement de la page) sera alors écrasée.

Pour la démo, l’application fonctionnait localement et l’API qui enregistrait les commandes et les envoyait vers le robot était hébergée sur Azure. Avec une application qui fonctionne en toute sécurité via l’internet, toute personne qui détient les autorisations nécessaires peut commander le robot.

Nous avons maintenant une application JavaScript pour l’utilisateur, un robot qui exécute les commandes et une API qui envoie les commandes de l’application au robot via des WebSockets.
Intéressé par le code source de ce projet ? Cliquez ici.

Partager cet article de blog

Also interesting for you

Laissez une réponse

Votre adresse email ne sera pas publiée. Les champs requis sont indiqués.