Thursday, April 18, 2013

Week 9

Dato:

18-04-2013

Varighed:

Fælles lab: 7 timer
Blog: 4 timer

Deltagere:

Steffen Høi
Nikolaj Mols Hansen
Martin Vang
Ulrik Sahl Lystbæk

Status

Vi har bygget en sumo wrestling LEGO-robot med en løftemekanisme og programmeret den, så den kan kæmpe mod andre sumo wrestling LEGO-robotter i en sumo arena.

Mål

Målet for denne laboratoriesession er at bygge og programmere en sumo wrestling LEGO-robot, der kan kæmpe mod andre sumo wrestling LEGO-robotter i en sumo arena, som beskrevet på "figur 1"1.

Plan

  • Konstruere en sumo wrestling LEGO-robot ud fra de udleverede instruktioner fra "Week 9 - Agents and behaviour selection in agents, subsumption architecture"2.
  • Programmering af LEGO-robotten, så den kan kæmpe mod de andre sumo wrestling robotter i sumo arenaen.
  • Udarbejdelse af blogindlæg for denne laboratoriesession.

Opgaver


Konstruktion af sumo wrestling LEGO-robotten

Vi startede med at hente programmet Lego Digital Designer3, hvilket var nødvendigt for at, vi kunne læse instruktionerne for, hvordan man bygger de forskellige moduler, der til sammen udgør sumo wrestling LEGO-robotten. Nedenunder ses hvordan, LEGO-robotten til sidst kom til at se ud.




LEGO robot that exhibits several behaviors

Vi har uploadet det udleverede SumoBot-program4 til LEGO-robotten og afprøvet LEGO-robotten på sumo arenaen. Da vi observerede robotten i sumo arenaen, lagde vi mærke til at robotten havde 3 typer adfærd; Drive, Turn og Avoid, der blev skrevet på LCD-skærmen.  Sumo wrestler Lego-robotten startede med at køre lige ud og i den forbindelse blev der på LCD-skærmen skrevet 0 ved alle typer adfærd, hvilket betyder at ingen af de tre typer adfærd bliver undertrykt. Desuden blev f skrevet på displayet, hvilket betyder, at LEGO-robotten kører lige ud. Hvert 5. sekund blev denne adfærd undertrykt af Turn-adfærden, der fik LEGO-robotten til at dreje og på LCD-skærmen kom der et 1-tal ved Drive-adfærden, hvilket betyder, at denne bliver undertrykt af den nye adfærd, som LEGO-robotten får. Desuden blev skrevet t på LCD-skærmen, da robotten drejede. Når sumo wrestling LEGO-robotten kom for tæt på den hvide kant i sumo arenaen, blev Avoid-adfærden aktiveret, hvilket medførte, at der blev skrevet et 1-tal ved både Drive-adfærden samt Turn-adfærden, da den nye adfærd undertrykker dem begge. Desuden blev der på LCD-skærmen udskrevet b, f og s. På LCD-skærmen blev lysværdien for lyssensoren desuden også udskrevet.

Nedenstående video viser hvordan, robotten opførte sig samt hvilke værdier, der blev uskrevet på LCD-skærmen, i forbindelse med kørslen af programmet.


Behaviors as concurrent threads

Vi kiggede nu indeni klasserne for de tre forskellige typer adfærd for at identificere hvordan betingelsen, der udløser de forskellige adfærd, er implementeret, samt hvordan handlingerne for hver adfærd er implementeret. De tre implementerede adfærd; Drive, Turn og AvoidEdge har prioritering således, at AvoidEdge kan undertrykke Drive og Turn. Turn kan undertrykke Drive og Drive kan ikke undertrykke nogen. Drive kører derfor altid, medmindre den bliver undertrykt. Det vil sige, at der ikke er nogen betingelse, der får Drive til at køre, andet end at den ikke må være undertrykt af nogen anden adfærd. Når Drive udføres kører LEGO-robotten bare lige frem. Turn venter i 5 sekunder og prøver så at tage kontrol. Hvis ikke Turn undertrykkes af AvoidEdge, stopper den, venter 300 ms., drejer til en tilfældig vinkel og stopper. AvoidEdge bruger lyssensoren til at tjekke, om den ser hvid. Hvis den ser hvid, må det være den hvide kant, som omringer den sorte bane, og AvoidEdge bliver udført. AvoidEdge bakker først, venter 1 sekund, drejer til venstre, venter 800 ms., stopper og venter til sidst 500 ms.

Class Behavior

Trådene til alle adfærd er erklæret daemon tråde, så de ikke eksplicit behøver at blive afsluttet. Når alle andre end hovedtråden er daemon tråde, stopper JVM med at eksekvere tråde, når hovedtråden dør, hvilket er, hvad der sker i det udleverede program.

Klassen Behavior bruger SuppressNode til at undertrykke adfærd, som er på et lavere niveau end den selv. Når en Behavior instantieres, skal en reference til den adfærd, som ligger på niveauet lige under den Behavior, der instantieres, med i constructoren. Den første Behavior instantieres med null som den Behavior, der bruges til SuppressNode. Når en Behavior skal undertrykke de Behaviors, der er på lavere niveau kaldes suppress() på den, hvilken undertrykker den Behavior, der er på niveauet lige under den. Dette bliver den ved med, indtil den forsøger at undertrykke null. Dette betyder, at alle Behaviors helt ned til laveste niveau er undertrykt.

Add a behavior OverturnOpponent

Udfordringen ved denne opgave (at vælte modstanderen) lå dels i at lave en konstruktion, der faktisk var i stand til at vælte en modstander og dels i at programmere en adfærd, der var velfungerende i hierarkiet af de eksisterende adfærd. Vi har valgt ikke, at gøre meget ud af konstruktionen, da vi tidligt i indledende tests fandt frem til, at det ville være temmelig svært at lave en robot-arm, der var i stand til at vende en sumo wrestling LEGO-robot om på ryggen. Vi har i stedet lavet en mere simpel arm, der blot skal løfte modstanderen nok fra jorden til, at han ikke har trækkekraft med sit hjul. Derefter burde de andre adfærd være i stand til at få modstanderen skubbet ud over siden af ringen (Drive).

Efter nogle tests med robotten, blev det tydeligt, at den havde svært ved at finde en modstander uden hjælp. Første problem, der skulle løses, var derfor at lave en Search-adfærd, der kunne finde modstandere. Denne adfærd drejer LEGO-robotten om dens egen akse, imens ultralydssensoren ser efter om, der er noget inden for 35cm. Hvis der er, stopper drejningen. Denne adfærd har højere prioritet end Drive, men lavere end alle andre. Lykkes det ikke LEGO-robotten at se en modstander efter ca. 190 graders omdrejning, bliver adfærden undertrykt i 2,5 sekunder.
Denne adfærd sikrer at LEGO-robotten er i stand til at finde og køre ind i ting, hvilket er vigtigt for at vores løfteadfærd kan blive relevant.
Løfteadfærden (Flip) er lavet på en sådan måde, at den ikke blokerer. Den har internt en værdi, der holder styr på om armen er på vej op, eller ned. Derudover har den en række fortolkninger af hardware-målinger (tacho-omdrejninger og sensor-distance), der kan oversættes til følgende:

  1. Hvis armen er ”helt nede”, og der er noget inden for 16cm, så løft armen meget hurtigt.
  2. Hvis armen er ”helt oppe”, så sænk den hurtigt.
  3. Hvis armen er imellem ”helt oppe” og ”helt nede”, så fortsæt med at udføre den sidste bevægelse.
  4. Ellers, Stop arm-motoren og vent til du ser noget inden for 16cm.

Disse fire punkter, der er i prioriteret rækkefølge, sikrer at robotten aldrig låser eller bruger nævneværdig tid indeni en kritisk sektion af koden for Flip. Grunden til at dette er vigtigt er, at vi ikke kan være sikre på, hvornår en adfærd, der er højere i hierakiet vil undertrykke vores Flip. I vores tilfælde valgte vi kun at placere Avoid over Flip, og det kan naturligvis diskuteres hvor ofte, robotten er ved at vælte en modstander, imens den kører ud over kanten.

Vores adfærdshieraki er nu som følger, da vores Search erstatter Turn:

Avoid   3
Flip       2
Search  1
Drive    0

I forbindelse med AvoidEdge, har vi fundet en pudsig detalje, hvilket er, at den desværre nogle gange får robotten til at køre ud over kanten, i stedet for væk fra den. Dette sker konsekvent hver gang, robotten har en meget skæv vinkel på den hvide yderkant. Adfærden Avoid vil så bakke en smule (følge kanten tilbage) og lave et sving til venstre ud over kanten. Billedet nedenfor viser, hvordan indfaldsvinklen skal være med blå, hvor robotten bakker tilbage til med grøn, samt hvordan den er hardcoded til at svinge derefter. Det skal dog bemærkes, at vores robot er højre-venstre forvirret, hvilket betyder at billedet sandsynligvis er spejlvendt ift. alle andre robotter. Princippet er dog præcis det samme.
Vi har forsøgt at ændre denne adfærd en smule for at undgå dette i vores robot ved at dreje på stedet, i stedet for at lave et sving. Derudover er der pillet en smule i variabler i vores AvoidEdge, for at få vores konkrete robot til at være lidt hurtigere om at komme tilbage på banen.

Nedenstående video viser en sumo wrestling kamp mellem vores LEGO-robot og en anden gruppes LEGO-robot, efter at vores LEGO-robot har fået monteret en løftemekanisme og en modificeret udgave af SumoBot-programmet5 uploadet.


Konklusion

Denne uge har vi, ud fra de udleverede instruktioner, bygget en sumo wrestling LEGO-robot med en løftemekanisme og programmeret den, så den kan kæmpe mod andre sumo wrestling LEGO-robotter i en sumo arena. Vi har først observeret, hvordan det udleverede program udstyrer robotten med tre typer adfærd, samt hvilke omstændigheder, der gør at handlingen i adfærden bliver udført. Dernæst har vi set, hvordan SumoBot-programmet er programmeret med den reaktive strategi, som Fred Martin6 beskriver, samt erfaret at hver adfærd er sin egen tråd. Desuden har vi også set, at alle adfærd er erklæret daemon tråde, så de ikke eksplicit behøver at blive afsluttet, samt hvordan surpression-mekanismen virker. Til sidst har vi monteret en ekstra motor på LEGO-robotten og lavet en løftemekanisme, der skal forsøge at vælte modstanderens LEGO-robot, når denne kommer tæt nok på, samt implementeret den nye adfærd OverturnOpponent i SumoBot-programmet.

____________________________________________________________________________________________________________

1. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson8.dir/moresumosonboard.jpg
2. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson8.dir/Lesson.html
3. http://ldd.lego.com/
4. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson8.dir/Classes.zip
5. SumoBot-program med adfærden OverturnOpponent
https://sites.google.com/site/digikaison/SumoBot.java
https://sites.google.com/site/digikaison/Car.java
https://sites.google.com/site/digikaison/Turn.java
https://sites.google.com/site/digikaison/SuppressNode.java
https://sites.google.com/site/digikaison/Search.java
https://sites.google.com/site/digikaison/Flip.java
https://sites.google.com/site/digikaison/Drive.java
https://sites.google.com/site/digikaison/Behavior.java
https://sites.google.com/site/digikaison/AvoidEdge.java
6. Fred G. Martin, Robotic Explorations: A Hands-on Introduction to Engineering, Prentice Hall, 2001.

No comments:

Post a Comment