Denne blog bruges af Kim Munk Petersen (20063667), Andreas Koefoed-Hansen (20062154) og Tim Rasmussen (20061947) som dagbog i forbindelse med kurset Embedded Systems/Legolab på Århus Universitet.

torsdag den 29. oktober 2009

Robot Race - Øvelsesgang 6

Denne uges opgave går ud på at få robotten til at køre så hurtigt som muligt, samtidig med at den følger Alishan train track. Regelsættet vi bruger under denne øvelse er en smule mindre end det oprindelige sæt, men giver stadig god udfordring. Vores regelsæt er som følgende:
  • Robotten skal starte fra startområdet. Ingen dele af robotten må stikke ud af start arealet.
  • Et tryk på ENTER starter robotten og robotten skal så følge sporet til at vende området, den øverste platform. Fra vende området skal robotten køre tilbage, indtil robotten kører ind i start området igen. Robotten skal derefter stoppe og tid der er gået siden starten skal vises på LCD. Bilen skal være inde i start området, før den stopper.
  • Når robotten er på toppen, bør robotten være inde i vende området før den kører tilbage.
Begge gruppe medlemmer har deltaget aktivt i at forsøge at løse denne opgave.

Hvordan greb vi det an?

Vi starter hvor vi slap sidste gang med vores robot og gik i gang med at få den til at følge linjen. Dette var dog ikke så let som vi troede, så vi besluttede os for at dele banen op i flere steps. Disse steps kan ses på billedet. På denne måde vidste vi hele tiden hvor på banen vi var og kunne på den måde udføre den rigtige handling ud fra dette. Vi brugte de 2 lyssensorer fra sidste gang, som hele tiden sørgede for at holde os opdateret på hvor vi var på banen. Dette betød at når vi f.eks. så sort på begge lyssensorer første gang, så vidste vi at vi var kørt ud af start området. Det var ideen, at vi ville blive ved sådan indtil ruten var gennemført. Dette lykkes dog ikke for os. Vi nåede rundt i det første sving, men kom så heller ikke videre.



Hvorfor kom vi ikke videre?

Grunden til at vi ikke nåede til toppen og ned igen var hovedsageligt manglende tid. Da klokken blev over 11 og vi begge var nødt til at gå kl. 12, måtte vi erkende at der ikke var tid nok til at kode robotten helt færdig. Så i ren panik for at se om vi kunne nå toppen, gik vi over til at anvende en sekventiel tilgangsvinkel. Dette betød at vi satte robotten til at køre ligeud et stykke tid (tiden det skulle tage at komme op til første sving) og når den tid så var gået skulle robotten dreje til højre og derefter fortsætte lige ud. Det lykkedes os også at få robotten forbi første sving, men herefter gav robotten op og begik selvmord.

Vi nåede derfor ikke til toppen, hvilket vi begge er en smule irriteret over, men man kan jo ikke vinde hver gang. Vi vidste godt at vi umuligt kunne vinde, da vi så hvor hurtigt nogle af de andres robotter kom til toppen og ned igen. Målet blev derfor for os blot at komme på toppen og ned igen.

torsdag den 8. oktober 2009

Forberedelse til robot race - Øvelsesgang 5

Denne uges opgave går ud på at få robotten til at følge en linie og stoppe når den når til målområdet. Opgaven er en god forberedelse til næste uges race, hvor det gælder om at få robotten hurtigst til toppen og tilbage igen. Under denne uges øvelser, har begge gruppemedlemmer deltaget aktivt.

Black White Detection
For at kunne udføre denne og senere opgaver, var vi nødt til endnu engang at bygge vores robot.

Opgaven går ud på at anvende klassen BlackWhiteSensor som vi har fået udleveret. Klassen indeholder en række metoder, hvor 2 bruges til at kalibrere farverne og to bruges til at bestemme om lyssensoren befinder sig over en hvid eller sort farve. Måde denne afgøre dette på er ved at lave et blackWhiteThreshold, som er summen af de to farvers værdi diveret med 2.

For at teste brugen af BlackWhiteSensor klassen, oprettede vi vores eget test program. BlackWhiteTest.
Programmet opretter en ny BlackWhiteSensor som vi herefter kalder calibrate metoden på. Denne metode sørger for at værdierne for hvid og sort bliver gemt og beregner blackWhiteThreshold.
Resten af test programmet udskriver blot den målte værdi og undersøger om der er tale om en sort eller hvid farve.

Programmet brugt i denne opgave kan findes:
http://www.cs.au.dk/~tiras/filer/LEGO/BlackWhiteSensor.java
http://www.cs.au.dk/~tiras/filer/LEGO/BlackWhiteTest.java

Line Follower with Calibration
Denne opgave går ud på at stifte bekendtskab med hvordan man kan anvende BlackWhiteSensor klassen til at få robotten til at følge en linie. Vi får udleveret programmet LineFollowerCal, som netop gør bruge af funktionerne til at bestemmer om den følger linjen.

Programmet brugt i denne opgave kan findes:
http://www.cs.au.dk/~tiras/filer/LEGO/LineFollowerCal.java

Vi vil ikke gør mere ud af denne beskrivelse da næste opgave omhandler samme enme, blot den tilføjelser og ændringer af BlackWhiteSensor klassen.

ColorSensor with Calibration
Denne opgave går ud på at lave et nyt program ColorSensor, som kan kende forskel på sort, hvid og grøn. Programmet er en udvidelse af BlackWhiteSensoren klassen. Tilføjelserne består i at vi har lavet en ekstra variabel greenLightValue, indeholder den kalibrerede værdig for grøn. Ligeledes er et nyt greenWhiteThreshold lavet, som indeholer summer af den grønne og hvide værdi divideret med 2.
Vi har nu to thresholds der indeholder gennemsnittsværdien af henholdsvis sort - grøn og grøn - hvid.

Vi har tilføjet en ny metode green(), som returnere true hvis den aflæste værdi ligger imellem de to thresholdes.

Denne løsning virker for det meste, men kan have problemer med at skelne mellem sort og grøn, da de to værdi ligger meget tæt op af hinanden. En lille forskel i lysmængden kan derfor kan derfor være med til at påvirke resultatet.

ColorSensor programmet kan findes på:
http://www.cs.au.dk/~tiras/filer/LEGO/ColorSensor.java

Line Follower that stops in a Goal Zone
Denne opgave går ud på at få robotten til at følge en linje og stopper når den når til målområdet. For at løse denne opgave har vi gjort bruge af ColorSensor klasse og LineFollowerCal. Klassen LineFollowerCal er blevet modificeret således at den nu også gør brug af metoden green() til at bestemmer om den er nået til målområdet.

Til at starte med gjorde vi kun bruge at en lyssensor, men det viste sig hurtigt at det var svært for den at følge linjen. Grunden til dette er som beskrevet i forrig opgave at den har svært ved at se forskel på sort og grøn.

Dette problem løste vi, ved at tilføje en ekstra lyssensor til robotten. Dette har gjort at den nu er meget mere præcis og nu følger linjen til punkt og prikke. :D
Grunden til at den nu følger linjen bedre, er at den nu kigger ved siden af linjen i stedet for på linjen.

Det nuværende program ser du som følgende:
http://www.cs.au.dk/~tiras/filer/LEGO/LineFollowerCalColor.java

torsdag den 1. oktober 2009

Selv-balancerende robot - Øvelsesgang 4

Opgaven i denne uge går ud på at bygge en robot der selv kan balancere. Det vil sige at den står og vipper frem og tilbage uden at vælte. Under arbejdet med denne øvelse har begge gruppemedlemmer deltaget aktivt.

Som beskrevet tidligere, så går opgaven ud på at bygge og programmere en robot til selv at kunne balancere. Det er meningen at vi skal tage udgangspunkt i Steve Hassenplug, Philippe Hurbain og Brian Bagnall ideer i konstruktionen af sådanne robotter. Vi kigge på designet, hvorefter vi så selv gik i gang med at bygge en robot. Da vi var færdige og havde fået monteret lyssensoren gik det op for os at der var en vejledning på hjemmesiden til hvordan robotten kunne samles.. Vi valgte dog at holde fast i vores eget design.

Hvordan arbejde vi os frem
Vi startede med at finde ud af hvilken værdier vores lyssensoren sendte retur. Vi var dog ikke helt sikkert på hvilken metode vi skulle bruge. Lyssensoren har følgende (og flere) valg muligheder:
readValue(); getLightValue(); getNormalizedLightValue();
Vi valgte til at starte med at anvende getLightValue(). Ved at anvende denne metode fandt vi ud af at vi skulle have robotten til at balancere omkring værdien 50. Vi mente at brugen af en proportional controller var vejen frem, da den tog hensyn til error mellem vores ønsket værdi på 50 og den målte værdi. Denne error mente vi at vi kunne bruge til at bestemme om robotten skulle køre frem eller tilbage. Efter at have kodet på dette et par timer og vores robot stadig opførte sig en syg høne der gik og hakkede i jorden, måtte vi indse at proportional controller nok ikke var vejen frem.

Vi fandt derefter frem til at man kunne anvende en PID controler i stedet. En PID controller forsøger at rette den error der er imellem den målte værdi og den ønskede værdi ved beregninger og derefter sørger for at de rigtige handlinger bliver udført. Formlen for PID controler er som følgende:
MV(t) = POUT + IOUT + DOUT
Når disse værdier er beregnet ud af en mænge målte data, vil det være muligt at få robotten til at balancere..

Hvor langt nåede vi?

Eftersom vi havde brugt alt vores tid på at kode en proportional controler, var der ikke mere tid tilbage fredag. Vi ville derfor gerne have implementeret PID controller, men pga. presset fra et andet kursus har vi desværre været nødt til at opgive håbet om at få robotten til at balancere.
Den kode vi nåede at få lavet, kan findes på
http://www.cs.au.dk/~tiras/filer/LEGO/Balance.java

Vi vil dog i den kommende evaluerings periode, hvis der bliver tid, forsøge at implementere PID controlleren.

Faste læsere