Innehållsförteckning:

Självlärande kaotisk robot: 3 steg
Självlärande kaotisk robot: 3 steg

Video: Självlärande kaotisk robot: 3 steg

Video: Självlärande kaotisk robot: 3 steg
Video: Framtida utmaningar och möjligheter inom välfärdssektorn - Anders 2024, November
Anonim
Självlärande kaotisk robot
Självlärande kaotisk robot

Är du intresserad av maskininlärning, AI och robotar? Du behöver inte jobba på något snyggt universitet. Detta är en beskrivning av min kaotiska robot. Det är en mycket enkel robot för att demonstrera hur man använder självlärande kod och hur man implementerar den i en arduino -plattform, i detta fall en Arduino. Det är en väldigt billig plattform!

Koden utvecklar roboten så att roboten lär sig att krypa. Den får feedback från musen som dras bakom. Koden är "genetisk". Det betyder att ett antal individer testas och de bästa bevaras och kommer att få barn. Detta innebär att koden utvecklas på ett evolutionärt sätt.

Steg 1: Hårdvara AKA Roboten

Hårdvara AKA the Robot
Hårdvara AKA the Robot
Hårdvara AKA the Robot
Hårdvara AKA the Robot
Hårdvara AKA the Robot
Hårdvara AKA the Robot

Du behöver:

- 1 Arduino Due

- 8 mikroservos

- 1 PS/2 mus

- 1 nivåhöjare

- någon variant av en sensorsköld eller liknande, jag tröttnade på sensorskärmen och svetsade min egen.

-trådar

-extern 5V strömförsörjning för servon

- några metallskrot, lite lim och lite ståltråd. Och tejp!

Så lägg Due på golvet. Lägg servon i en ring runt den. Lägg ihop dem med metallskrot, lim och tråd. Det här är kaosdelen! Eftersom det är kaotiskt i sin design är det oförutsägbart att bestämma hur man ska flytta för att få det att krypa. Det är därför självlärande kod är vägen att gå!

Tips: använd några ganska tunga metalldelar, det gör det lättare för roboten att röra sig.

Anslut servon till behörigheten, i mitt fall är de anslutna till D39, 41, 43, 45, 47, 49, 51, 53.

Anslut servon till den externa 5V strömförsörjningen. För detta, bygg någon slags skärm, eller använd en sensorsköld eller liknande. Mata INTE servona från avgifterna 5V -stift, det räcker inte, Due kommer att brinna. Jag använde en liten prototypkort för att distribuera 5 V till alla servon. Detta kort har också nivåskiftaren för PS/2 -musklockan och datalinjerna. Brädet matar också musen med 5V. Kom ihåg att ansluta jord från extern ström till Arduino due ground! schematik visar hur du ansluter allt.

Anslut PS/2 till ström (5V) och jord. Anslut klockan och datalinjen på PS/2 till Due genom en nivåväxel. (förfaller till 3,3V, PS/2 går till 5V). Anslut klockan på D12 och data på D13.

För detaljer om PS/2 -protokollet, är detta en mycket bra instruerbar:

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

PS/2 -biblioteket av jazzycamel som jag har använt:

Steg 2: Koden

Koden
Koden

Låt mig först säga: Jag är INTE en programmerare. Vissa delar är mycket omfattande, en skicklig programmerare kan naturligtvis förkorta det och så och så.

Koden är självlärande och detta är kärnan i projektet. Detta är den roliga delen av det! Det betyder att roboten utvecklas och blir bättre och bättre, i det här fallet blir den bättre i att krypa. Det fantastiska med detta är att roboten kommer att utvecklas till vad du än återkopplar den till. I detta fall drar den en PS/2 -mus och ju längre musen dras, desto högre poäng får den.

Detta betyder också att du kan använda den här koden för att träna din robot att göra något annat, så länge den mäts och matas tillbaka till roboten!

Som du kan se på bilderna dras musen på en tunn sladd. Först drogs den in muskabeln. Kabeln är dock ganska stel, så roboten lärde sig att skaka musen istället för att dra den. Skakning producerade höga poäng …

Koden använder 50 individer. Kärnan i detta är en array på 50x50 byte.

En individ är en uppsättning byte. När individen används för att köra roboten skickas denna individ till en funktion i koden som kallas "tolken".

I början av en körning finns det 8 variabler m1, m2, m3, m4, m5, m6, m7 och m8 (en för varje servo). I denna robot har de alla konstanta startvärden. I "tolken" transformeras mś i en case/swich loop beroende på individens värden. till exempel utför värdet "1" följande: m1 = m1 + m2.

Om en individ är: 1, 2, 3, 0, 0, 0, 0….. så kommer mś att transformeras på följande sätt:

m1 = m1 + m2;

m1 = m1 + m3;

m1 = m1 + m4;

Tolken är en lista med 256 olika matematiska operationer, så alla möjliga värden för individs array representerar en matematisk förändring av m -värdena.

Tolkenprocessen görs fyra gånger om, med avläsning mellan varje varv, vilket genererar fyra olika motorkoder för varje "m". Motorkoderna är de värden som senare skickas till servon.

I varje steg i utvecklingen tävlar fyra individer i krypning. De två bästa individerna kommer att vara föräldrar till två barn, barnen kommer att ersätta de två värsta individerna. När barn görs byts en skiva "genetisk kod" från en förälder mot en bit från den andra föräldern, detta skapar två nya individer.

Om ingen individ alls presterar kommer mutation av individerna att äga rum för att generera nya.

Du hittar koden på GitHub:

Steg 3: Hur man tränar det?

Detta är den knepiga delen. För att träna ordentligt måste du "återställa" det efter varje körning. Det betyder att du måste sätta den i samma position varje gång.

Jag har satt några kontrollpunkter i koden för att säkerställa att roboten är i sitt utgångsläge.

Så rikta in roboten och låt den gå.

Den testar 4 individer och sedan väljer de två bästa att vara föräldrar. Efter att ha ersatt det värsta med barnen skriver det ut några uppgifter om individernas prestanda. Det skriver också ut 50x50 -matrisen. Det är klokt att kopiera detta till ett excelark eller liknande. (eller skriv någon behovskod under bearbetning) Om förfallodagen återställs (detta händer av olika skäl) kommer du inte att förlora ditt träningsarbete. Du kan kopiera/klistra in matrisen i koden och fortsätta träna om du lämnade.

Min robot lärde sig att krypa efter ett par timmar. Ladda ner videon för att se den genomsöka. Det gick inte åt det hållet jag trodde att det skulle!

Prova också olika våningar! Min robot presterade bäst på en nylonmatta.

Möjliga förbättringar:

1. Det vore bättre att ha en separat nano för att läsa PS/2 -musen och skicka det bearbetade avståndet som flyttats över serien till nano. Läsningen av min PS/2 -mus är lite skakig. Detta är anledningen till att musen läser/rensar delar av koden.

2. någon form av testrigg som drog roboten tillbaka till sitt utgångsläge skulle påskynda träningen.

3. Jag tror att det är klokt att träna det lite långsammare än jag gjorde. Långsammare träning säkerställer att den tränas "i rätt riktning". Den genomsnittliga prestandan för flera testkörningar kan vara ett möjligt sätt.

Rekommenderad: