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 12. november 2009

SoundCar - Øvelsesgang 8

Dato:
06-11-2009

Antal timer brugt:
3 timer

Deltagende personer:
Kim Munk Petersen, Andreas Koefoed-Hansen og Tim Rasmussen

Denne uges opgaver:
Denne uges opgaver går ud på at se hvordan flere forskellige observerbare opførelser kan implementeres på en enkelt NXT. Til denne uges opgave skal der bruges en ultralydssensor. Vi har valgt at udfører opgaverne i den rækkefølge de er præsenteret i opgave beskrivelsen.

Dette betyder at opgaverne er løst i følgende rækkefølge:
  1. Observere robotten og se hvordan robotten opfører sig
  2. Find udløsningsbetingelserne og se hvordan robotten opfører sig med en eller to tråde aktive.
  3. Se på implementeringen af suppresser mekanismen Behavior.java, og sammenlign metoden med Fred Martin metode.
  4. Tilføjelse af "kør mod lyset" tråd.
Fysiske overvejelser
Eftersom vi allerede under sidste øvelsesgang havde monteret en ultralydsensor på toppen af robotten, har der ikke været nogen fysiske overvejelser under denne øvelse.





1. LEGO car that exhibits several behaviors
Programmet har 3 forskellige tråde der arbejder concurrent, men med forskellige prioriteter. Dette betyder at når robotten afspiller en lyd, så tager tråden PlaySound tråden kontrol over motorerne og stopper dem.
Når der ikke afspiller lyd kører robotten vha. RandomDrive tilfældigt rundt indtil den komme for tæt på et objekt. Hvis robotten kommer til en forhindring vil tråden Avoid sørge for at få robotten væk fra ved at overtage motorerne og undvige. Undvigelsesmanøvren fortsætter indtil PlaySound afspiller en lyd og tager rettigheden, eller den er langt nok væk fra objektet igen. Avoid bliver aktiveret hvis afstanden til objektet bliver mindre end 20.
På LCD panelet skriver robotten vha. definitionerne s = stop, f = forward, b = backward hvilken vej robotten kører samt hvor lang afstand der er til et objekt. Ud over disse informationer, skriver robotten også ud for drive, avoid og play hvor mange tråde der der suppresser den givne tråd.

2. Behaviors as concurrent threads
Ved at undlade at starte nogle tråde kunne vi tydeligt se den opførsel de enkelte tråde tilføjede til robotten.

Med kun RandomDrive tråden aktiv, vil robotten køre tilfældigt rundt og eftersom Avoid tråden ikke er aktiv vil robotten fortsætte med dette indtil den rammer ind i noget eller falder ud over kanten på bordet.
Når de to første tråde er aktive (RandomDrive + AvoidFront), vil robotten forsøge at undgå objekter tæt på, men stadig køre tilfældigt rundt når der ikke er forhindringer.
Når robotten opdager en forhindring suppresser den RandomDrive, som herved mister rettigheden til motorerne og AvoidFront tråden overtager alle rettigheder over motorerne.

3. Class Behavior
Et objekt er givet et andet objekt som det derefter kan suppresse. Dvs. at når tråden i PlaySound er aktiv vil den suppresse alle andre tråde, eftersom når PlaySound kalder suppress(), så vil suppress() metoden sørger for at suppressCount bliver talt op på det andet objekt. Det er lavet sådan at objekterne ikke kan udfører nogen handling hvis deres suppressCount er sat til 1 eller derover. Når f.eks. PlaySound er færdig med at udføre sin handling, så frigives motoren igen ved at tælle suppressCount ned igen. Fred Martin bruger et mere centraliseret princip, men ideen bag er stadig den samme. Han giver de forskellige tråede prioriteter, således at den tråd med den største prioritet får lov til at få den adgang den ønsker. Princippet gør brug af en metode kalder prioritize(), som kører concurrent med alle andre tråde. Den skanner igennem listen af aktive processer og finder den proces der har den højeste prioritet. Når den har fundet denne tråd, kopierer den trådens handlinger til motoren og udfører dem.

4. Add a behavior "Drive towards light"
Målet med forrige uges øvelser var at lave en robot der kørte i retning af lys. For at opnå mere erfaring med Rodney Brooks subsumption-arkitektur, tilføjede vi denne opførsel til samlingen af de tre eksisterende opførsler. Vi mener at det at følge lys bør have højere prioritet end RandomDrive og lavere prioritet end AvoidFront, hvorfor vi valgte at placere opførslen mellem disse. For at den nye opførsel, DriveTowardsLight ikke altid supress'er den underliggende opførsel, RandomDrive, har vi besluttet at den kun skal udløses når lyssensorerne ser et tilpas kraftigt lys, hvilet er implementeret vha. en justerbar tærskelværdi i vores kode. Vi har implementeret den nye opførsel ved at lave en klasse DriveTowardsLight der extender klassen Behavior.java givet i opgaven, og så copy paste'et kontrol-loop'et fra sidste uge ind i klassens run-metode, der er vist herunder:
public void run() {
while
(true) {
int leftValue, rightValue;
do {
leftValue = sensorLeft.readRawValue();
rightValue = sensorRight.readRawValue();
}
while(leftValue > lightThreshold && rightValue > lightThreshold);

suppress();
drawString("f");
forward(normalize(leftValue),normalize(rightValue));
delay(10);
release();
drawString(" ");
}
}
En anden interessant kodestump er det sted i klassen SoundCar.java, der også er givet i opgaven, hvor de forskellige opførsler instantieres og deres "prioritet", altså subsumption-ordenen, bestemmes:
rd = new RandomDrive("Drive",1, null);
dtw = new DriveTowardsLight("Light", 2, rd);
af = new AvoidFront ("Avoid",3,dtw);
ps = new PlaySounds ("Play ",4,af);

Ingen kommentarer:

Send en kommentar

Faste læsere