Xylos brands

Een robot op afstand bedienen? Maak kennis met TensorFlow voor JavaScript.

Tijdens Xylos Inspire 2018 demonstreerden we hoe je een Lego Mindstorms-robot op afstand bedient met je eigen lichaam. In deze blogpost vertellen we je hoe we dat precies doen.  
 

Een robot programmeren: beginnen bij het begin 

Met Lego Mindstorms is het kinderspel om een prototype van een bedienbare robot te maken. Met Lego-blokjes, een programmeerbare EV3-steen, motoren en sensoren bouw je zelf een robot die kan wandelen, praten, schieten en op bijna elke denkbare manier kan bewegen. De motoren en sensoren zijn aan de programmeerbare EV3-steen gekoppeld. Er zijn verschillende soorten sensoren beschikbaar om bijvoorbeeld afstanden te meten of kleuren te herkennen, maar ook aanrakingssensoren, en gyroscopen.

Natuurlijk kun je zelf een robot ontwerpen, maar wij hebben besloten gewoon een standaardrobot te bouwen. Voor dit project gebruiken we de sensoren van de robot niet. 

Op de EV3-steen is vooraf een standaard besturingssysteem geïnstalleerd dat verschillende door Lego ontworpen standaardrobots ondersteunt. Je kunt de steen ook aansluiten op de EV3-software en zelf programmeren met de meegeleverde bouwstenen, maar het nadeel hiervan is dat de mogelijkheden nogal beperkt zijn. 

Voor onze demo wilden we beginnen met iets eenvoudigs, zodat we elke beweging van de robot volledig zelf in handen hadden. Dat deden we met behulp van het besturingssysteem EV3DEV: dit besturingssysteem op basis van Debian Linux zet je op een SD-kaartje, dat je vervolgens in de steen steekt. Met het Debian-besturingssysteem in de robot konden we onze eigen code gaan schrijven. Dat deden we in Python omwille van de goede open-sourceondersteuning (een volledige lijst ondersteunde programmeringstalen vind je op de EV3DEV-pagina). Met onze eigen Python-code konden we commando's naar de verschillende motoren sturen en een remote WebSocket-server linken, zodat de robot ook op externe commando's reageert. Als je geïnteresseerd bent in de code, vind je de open-sourcecode terug op de GitHub-repository onderaan deze blogpost. 

Wat doe je met… videobewegingen?

Wanneer de bediener voor de camera beweegt, worden zijn bewegingen in real time naar commando's vertaald. Die commando's worden als REST API-calls naar de Lego Mindstorms-robot gestuurd. Het proces om de video van een webcam te detecteren, de beelden te analyseren en commando's naar de robot te sturen, hebben we in JavaScript uitgeschreven en verloopt volledig via de browser. De beelden worden geïnterpreteerd door TensorFlow, het populaire framework voor deep learning van Google. Een neuraal netwerk neemt één videoframe als input en geeft de positie van een aantal keypoints op het lichaam terug. Deze posities worden dan omgezet in commando's. Alles gebeurt met de geweldige nieuwe JavaScript API van TensorFlow. 

Kort gezegd bestaat onze oplossing uit drie delen: 

  1. Een Lego Mindstorms-robot met een EV3-steen.
  2. Een Kubernetes-container die commando's registreert en deze via een WebSocket-verbinding naar de robot doorstuurt. 
  3. Een JavaScript-applicatie die webcamvideobeelden leest, het beeld interpreteert en de robot commando's stuurt. 
     

Hoe kun je… commando's doorsturen via REST API?

Voor de communicatie van de gebruiker naar de robot hebben we als tussenschakel een API gebouwd. De API is een container die uit twee delen bestaat. Als eerste verwerkt hij alle binnenkomende aanvragen van de gebruiker. Er zijn verschillende eindpunten mogelijk, zoals 'vooruit', 'achteruit' en 'schiet'. Daarnaast host de container ook een WebSocket-server om boodschappen naar de robot te sturen. De API zet elke aanvraag om in een boodschap, die vervolgens door de luisterende WebSockets wordt opgevangen. De belangrijkste reden waarom we deze logica uit de robot hebben gehaald, is dat deze een beperkte hardwarecapaciteit heeft. We hadden al een Kubernetes-cluster, dus beslisten we al snel deze als container te hosten. De precieze Kubernetes-configuratie en implementering van de cluster bespreken we niet in deze blogpost, maar als je graag meer wilt weten, vind je het deploymentbestand en het containerbestand in de Git-repository. 

Hoe kun je… commando's versturen met TensorFlow voor JavaScript?

Voor dit project gebruikten we de JavaScript API van TensorFlow. Laten we het eerst even hebben over deze nieuwe technologie en wat deze zo belangrijk maakt. Tot voor kort had het bekende deep-learningframework van Google alleen een Python API. Wie een neuraal netwerk wou maken of trainen, moest dus Python installeren. Een model (neuraal netwerk) trainen en inferentie (voorspellingen maken met het model) gebeurde voornamelijk op de server. Om het model te trainen, moesten gebruikersgegevens op de server worden gezet, want daar vond de training plaats. Wanneer het getrainde model dan aan de slag moest, moesten er nieuwe gegevens naar de server worden verzonden om er bruikbare conclusies uit te kunnen trekken. 

Vandaag hebben we echter TensorFlow voor JavaScript. Nu kunnen we neurale netwerken rechtstreeks in de browser bouwen, trainen en gebruiken dankzij JavaScript, wat het mogelijk maakt om intelligente, uiterst interactieve webapplicaties te maken. Daarvoor hoeft de eindgebruiker Python niet te installeren; hij of zij heeft alleen een webbrowser nodig, zoals Google Chrome, Firefox of Edge. 

Deze browserapplicaties werken niet alleen op laptops, maar ook op smartphones. Mits de nodige machtigingen krijgen ze toegang tot de ingebouwde camera, versnellingsmeter en andere sensoren in het apparaat. Als we TensorFlow via de browser laten werken, moeten de persoonlijke gegevens van de gebruiker niet worden doorgestuurd voor inferentie, wat bandbreedte bespaart en de privacy van de gebruiker beschermt. Deep-learningtaken die normaal gezien met Python op de server zouden gebeuren, verlopen nu bij de gebruiker via JavaScript. 

1. GPU’s trainen met Python

Voor het trainen van een deep-learningmodel (of enig ander model) heb je veel gegevens en rekenkracht nodig. Daarom wordt dit meestal met krachtige GPU's gedaan, niet met een laptop of smartphone. Gelukkig kun je ook gegevens van de server ophalen om een neuraal netwerk op een krachtige GPU te trainen met Python. Daarna importeer je gewoon alles in JavaScript. Je kunt ook een algemeen model importeren dat vooraf getraind is met gegevens uit verschillende bronnen en dat model lokaal hertrainen met je eigen gegevens. Bij het hertrainen leert het neurale netwerk voortdurend bij en raakt het stap voor stap op jouw gegevens afgesteld, zodat het efficiënter gaat werken voor jou. 

2. Lichaamshoudingen op beeld met Posenet

Om de mogelijkheden van TensorFlow voor JavaScript aan te tonen, heeft Google een open-source Posenet-bibliotheek voor JavaScript gemaakt. Met Posenet kan elke developer foto's of video's van mensen gebruiken om lichaamshoudingen uit de beelden af te leiden. Die beelden worden naar het voorgetrainde neurale netwerk gestuurd. De output van het neurale netwerk herkent de positie van wel 17 herkenningspunten op het lichaam. Die verschijnen als coördinaten op het beeld. 

Met deze coördinaten kan eenvoudige logica robotcommando's formuleren op basis van de houding van de gebruiker. Voor onze robot ging dat als volgt: neutraal staan met je handen naar beneden betekent dat de robot moet stoppen; als je je handen horizontaal houdt, rijdt hij naar voren; hou je beide handen omhoog, dan rijdt hij achteruit. Je kunt hem naar links of rechts sturen door je armen horizontaal te strekken en naar de gewenste richting te leunen, een beetje zoals een vliegtuig dat een bocht maakt. De Javascript-applicatie stuurt commando's naar de remote API op basis van je houding en de API stuurt die commando's via WebSockets door naar de robot. 

3. Projectielen afschieten met Logitech

Tot slot kan onze robot ook projectielen afschieten. Dat moet de gebruiker dus kunnen doen terwijl hij de robot bestuurt. Onze oplossing hiervoor is een eenvoudige presentatie-afstandsbediening van Logitech: blijkbaar herkent onze JavaScript-code het indrukken van de afspeelknop als het indrukken van de F5- of ESC-toets. De knop schakelt bij elke klik tussen F5 en ESC. Eigenlijk is dat logisch: zoals PowerPoint-fans weten, kun je een presentatie starten met F5 en stoppen met ESC. De standaardactie van de F5-toets in de browser (de pagina vernieuwen) wordt dan overschreven. 

Voor de demo werkte de applicatie lokaal en was de API die commando's registreert en naar de robot doorstuurt, gehost op Azure. Met een applicatie die veilig via het internet werkt, kan iedereen met de nodige machtigingen de robot besturen.   

Nu hebben we een JavaScript-app bij de gebruiker, een robot die commando's uitvoert en een API die commando's van de applicatie naar de robot stuurt via WebSockets. 
Geïnteresseerd in de broncode voor dit project? Klik dan hier.

Benieuwd wat de IoT-wereld voor jouw bedrijf kan betekenen? Duik dan zeker in ons aanbod.
 

Deel dit blogbericht

Also interesting for you

Laat een antwoord achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd.

Breng jouw kennis en skills naar een hoger niveau

Schrijf nu in voor onze nieuwsbrief en krijg maandelijks:

  • Uitnodigingen voor Xylos' events & webinars
  • De laatste blogposts en cases
  • Nieuwste IT-trends