Inhoudsopgave:

Zelflerende chaotische robot: 3 stappen
Zelflerende chaotische robot: 3 stappen

Video: Zelflerende chaotische robot: 3 stappen

Video: Zelflerende chaotische robot: 3 stappen
Video: FNaF 4 ist das WICHTIGSTE SPIEL IN DER GESCHICHTE (von Five Nights at Freddy's natürlich) 2024, Juli-
Anonim
Zelflerende chaotische robot
Zelflerende chaotische robot

Ben je geïnteresseerd in machine learning, AI en robots? Je hoeft niet op een chique universiteit te werken. Dit is een beschrijving van mijn chaotische robot. Het is een heel eenvoudige robot om te demonstreren hoe je zelflerende code kunt gebruiken en hoe je deze kunt implementeren in een arduino-platform, in dit geval een Arduino due. Het is een heel goedkoop platform!

De code evolueert de robot zodat de robot leert kruipen. Het krijgt feedback van de muis die wordt achtervolgd. De code is "genetisch". Dit betekent dat een aantal individuen worden getest en de beste worden gehouden en baby's krijgen. Dit betekent dat de code op een evolutionaire manier evolueert.

Stap 1: Hardware AKA de robot

Hardware AKA de robot
Hardware AKA de robot
Hardware AKA de robot
Hardware AKA de robot
Hardware AKA de robot
Hardware AKA de robot

Jij hebt nodig:

- 1 Arduino Due

- 8 microservo's

- 1 PS/2-muis

- 1 levelshifter

- een variant van een sensorschild of iets dergelijks, ik werd het sensorschild beu en las het mijne.

-draden

-externe 5V voeding voor de servo's

- wat stukjes schroot, wat lijm en wat staaldraad. En plakband!

Dus leg de Due op de grond. Zet de servo's in een ring eromheen. Zet ze samen met schroot, lijm en draad. Dit is het chaosgedeelte! Omdat het chaotisch is in zijn ontwerp, is het onvoorspelbaar om te bepalen hoe te bewegen om het te laten kruipen. Daarom is zelflerende code de juiste keuze!

Tips: gebruik wat vrij zware metalen onderdelen, dit maakt het voor de robot makkelijker om te bewegen.

Sluit de servo's aan op de due, in mijn geval zijn ze aangesloten op D39, 41, 43, 45, 47, 49, 51, 53.

Sluit de servo's aan op de externe 5V-voeding. Bouw hiervoor een soort schild, of gebruik een sensorschild of iets dergelijks. Voed de servo's NIET vanaf de 5V-pin, het is niet genoeg, Due zal branden. Ik heb een klein prototypebord gebruikt om de 5 V naar alle servo's te verdelen. Dit bord bevat ook de niveauverschuiver voor de PS/2-muisklok en datalijnen. Het bord voedt de muis ook met 5V. Onthoud dat de aarde van externe voeding op Arduino moet worden aangesloten vanwege aarde! schema's laten zien hoe je alles kunt aansluiten.

Sluit de PS/2 aan op voeding (5V) en aarde. Verbind de klok- en datalijn van de PS/2 met de Due via een levelshifter. (te verwachten gaat 3.3V, PS/2 gaat 5V). Sluit de klok aan op D12 en data op D13.

Voor meer informatie over het PS/2-protocol is dit een zeer goede instructie:

www.instructables.com/id/Optical-Mouse-Od…

De PS/2-bibliotheek van jazzycamel die ik heb gebruikt:

Stap 2: De code

De code
De code

Laat ik eerst zeggen: ik ben GEEN programmeur. Sommige onderdelen zijn erg uitgebreid, een ervaren programmeur zou het natuurlijk kunnen inkorten en zo en zo.

De code is zelflerend en dit is de kern van het project. Dit is het leuke eraan! Het betekent dat de robot evolueert en steeds beter wordt, in dit geval wordt hij beter in kruipen. Het verbazingwekkende hiervan is dat de robot zal evolueren naar waar je hem ook op terugkoppelt. In dit geval sleept het een PS/2-muis en hoe langer de muis wordt gesleept, hoe meer punten hij krijgt.

Dit betekent ook dat je deze code kunt gebruiken om je robot te trainen om iets anders te doen, zolang het maar wordt gemeten en teruggekoppeld naar de robot!

Zoals je op de afbeeldingen kunt zien, wordt de muis aan een dun koord gesleept. Eerst werd het in de muiskabel gesleept. De kabel is echter nogal stijf, dus de robot leerde de muis te schudden in plaats van te slepen. Schudden leverde hoogtepunten op…

De code gebruikt 50 personen. De kern hiervan is een array van 50x50 bytes.

Een individ is een array van bytes. Wanneer het individu wordt gebruikt om de robot te laten draaien, wordt dit individu naar een functie in de code met de naam "tolken" gestuurd.

Aan het begin van een run zijn er 8 variabelen m1, m2, m3, m4, m5, m6, m7 en m8 (één voor elke servo). In deze robot hebben ze allemaal constante startwaarden. In "tolken" worden de mś omgezet in een case/swich-lus, afhankelijk van de waarden van het individu. bijvoorbeeld een waarde van "1" voert het volgende uit: m1 = m1 + m2.

Als een individu is: 1, 2, 3, 0, 0, 0, 0….. dan wordt de mś op de volgende manier getransformeerd:

m1 = m1 + m2;

m1 = m1 + m3;

m1 = m1 + m4;

Tolken is een lijst van 256 verschillende wiskundige bewerkingen, dus elke mogelijke waarde van de individs-array vertegenwoordigt een wiskundige verandering van de m-waarden.

Het tolken-proces wordt 4 keer gedaan, met uitlezing tussen elke ronde, waardoor vier verschillende motorcodes voor elke "m" worden gegenereerd. De motorcodes zijn de waarden die later naar de servo's worden gestuurd.

In elke stap van de ontwikkeling strijden 4 individuen om te kruipen. De beste twee personen zullen ouders zijn van twee baby's, de baby's zullen de twee slechtste personen vervangen. Wanneer baby's worden gemaakt, wordt een splitsing van "genetische code" van de ene ouder ingeruild voor een plak van de andere ouder, dit creëert twee nieuwe individuen.

Als geen enkel individu presteert, zal mutatie van de individuen plaatsvinden om nieuwe te genereren.

Je kunt de code vinden op GitHub:

Stap 3: Hoe het te trainen?

Dit is het lastige deel. Om goed te kunnen trainen, moet je hem na elke run "resetten". Dit betekent dat je hem elke keer in dezelfde positie moet zetten.

Ik heb een paar controlepunten in de code geplaatst om er zeker van te zijn dat de robot in zijn startpositie staat.

Dus lijn de robot uit en laat hem draaien.

Het test 4 individuen en kiest vervolgens de beste 2 om ouders te worden. Nadat de slechtste is vervangen door de baby's, worden er enkele gegevens afgedrukt over de prestaties van de individuen. Het drukt ook de 50x50-array af. Het is verstandig om deze te kopiëren naar een Excel-sheet of iets dergelijks. (of schrijf een behoeftecode tijdens de verwerking) Als de Due opnieuw wordt ingesteld (dit gebeurt om verschillende redenen), verliest u uw trainingswerk niet. U kunt de array kopiëren/plakken in de code en doorgaan met trainen waar u was gebleven.

Mijn robot leerde na een paar uur kruipen. Download de video om hem te zien kruipen. Het ging niet in de richting die ik dacht dat het zou gaan!

Probeer ook verschillende vloeren! Mijn robot presteerde het beste op een nylon tapijt.

Mogelijke verbeteringen:

1. Het zou beter zijn om een aparte nano te hebben om de PS/2-muis te lezen en de verwerkte afstand die serieel is verplaatst naar de nano te sturen. Het lezen van mijn PS/2-muis is een beetje wankel. Dit is de reden waarom de muis delen van de code leest/wist.

2. een soort testopstelling die de robot terug naar zijn startpositie sleepte, zou de training versnellen.

3. Ik denk dat het verstandig is om het wat langzamer te trainen dan ik deed. Langzamer trainen zorgt ervoor dat het "in de goede richting" wordt getraind. De gemiddelde prestatie van verschillende testruns zou een mogelijke manier kunnen zijn.

Aanbevolen: