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

Braitenberg/Tom Dean - Øvelsesgang 7

Dato:
05-11-2009

Antal timer brugt:
5 timer

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

Denne uges opgaver:
Denne uges opgaver går ud på at benytte principperne i Tom Dean's note til at implementere Braitenberg's forskellige køretøjer. 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øs i følgende rækkefølge:
  1. Implementering af robot der kører mod lyset. Gjort brug af Tom Deans note.
  2. Implementering af en robot der gør brug af to tråde til at kontrollere hver forbindelse.
  3. Ændre implementering til at ændre værdien af MIN_LIGHT og MAX_LIGHT, så de følger værdierne målt levertiden n.
Formålet med denne uges øvelser er at forstå hvordan robottens handlinger kan afhænge af det miljø den færdes i.

Vigtige kodestumper vil være inkluderet i rapporten, mens der linkes til hele koden.

Fysiske overvejelser:
Vi har placeret 2 lyssensor på toppen af robotten til at indsamle oplysninger om lysforholdene. Sensorerne er placeret med ca. 10 cm mellemrum for at sikre en forskel i de målte værdier. Sensorerne kunne være placeret sammen, men herved vil forskellen på de målte værdier være mindre. Dette ville måske være en løsning hvis det er en lommelygte der f.eks. lyser på robotten. En lommelygtes spredning afhænger af hvor langt den er fra objektet, men lysstyrken vil oftest være stærkest i midten. Hvis sensorerne er placeret langt fra hinanden , vil lygtens lyskejle ikke ramme begge sensorer, hvorved robotten vil, hvis den følsomhed er lav, kører i hak. Da vi satser på at få robotten til at køre mod et vindue eller en dør, hvor der er normalt lysindfald, vælger vi at placere sensorerne med godt 10 cm. mellemrum. Et billed af robotten kan ses på nedenstående billede:





Implementation program til NXT-robotten med formålet at søge mod lys ved brug af Tom Deans note:

Vi benyttede de kodeeksempler der var i Tom Deans note til at lave metoderne til at udregne average og normalized values af inputtet fra lyssensorne, og derved bestemme hvor hurtigt motorerne skal køre.
Vi har en variabel kaldet beta der kan sættes til en værdi mellem 0 og 1. Denne variabel benyttes i forbindelse med udregning af average og bestemmer hvor meget der skal tages hensyn til de forgående læste værdier. Hvis beta er sat til 1 bliver der ikke taget hensyn til de værdier der er læst førhen, og hvis den er sat en værdi tæt på 0, får den læste værdi ikke meget indflydelse på hvordan avarage værdien bliver.

average = (int) ((beta * normalized) + ((1-beta)*average));

Vi testede dette ved printe både den nyeste læste værdi ud til skærmen, samt average værdien. Når beta var sat til 1 var værdierne ens, og når beta var lavere ændrede værdien sig langsommere til til den værdi der blev aflæst hvis sensoren tidligere har været i omgivelser med andre lysforhold.

Da vi prøvede at sætte motorerne til at køre efter den average værdi der blev udregnet var resultatet ret uventet. Når vi lyste med en lommelygte på sensoren kørte robotten imod lyset, men det var en ret ujævn motorgang.

Lyssensorens raw-values er ikke i et interval mellem 0-100 så vi var nødt til at normalisere værdierne så de kunne sendes videre til motorerne. Dette blev gjort at metoden normalize, der benytter værdierne MAX_LIGHT og MIN_LIGHT til at omregne den rå lysværdi.
Outputtet blev beregnet som følgende:
int output = (100 - ((light - MAX_LIGHT) * 100) / (MIN_LIGHT - MAX_LIGHT));

Vi lavede nogle test for at bestemme hvad MAX_LIGHT og MIN_LIGHT skulle sættes til og kom frem til at værdierne henholdsvis skulle være 300 og 600 for at robotten kunne arbejde i de omgivelser hvor vi var.

Ved normal loftsbelysning kørte robotten ikke, men hvis den blev vendt imod et vindue eller op mod loftslamperne begyndte den at køre imod lyset.

Tråde til kontrol af forbindelser
Implementeringen af tråde på NXT'en er lidt sværere end normalt, eftersom den ikke understøtter Runnable interfacet. Måden vi i stedet implementere det på er ved at lave en indre klasse kaldet WorkerThread der ekstender Thread. Konstruktøren i denne klasse tager som parameter en SensorPort og en MotorPort som derved parer de to enheder sammen. Hver objekt af WorkerThread der bliver oprettet, indeholder en række metoder til at returnere forskellige værdi tilknyttet objektet, samt en metode til at beregne den normaliserede værdi. Normalize metoden virker som beskrevet overfor.

I main metoden oprettes først LightSensor objekter, hvorefter FloorLight sættes til false.

LightSensor l1 = new LightSensor(SensorPort.S1);
LightSensor l2 = new LightSensor(SensorPort.S2);
l1.setFloodlight(false);
l2.setFloodlight(false);
herefter oprettes to objekter af WorkerThread, som derefter startes.

WorkerThread leftSensorThread = new WorkerThread(SensorPort.S1, MotorPort.C, null);
WorkerThread rightSensorThread = new WorkerThread(SensorPort.S2, MotorPort.B, null);
leftSensorThread.start();
rightSensorThread.start();
på denne måde oprettes to objekter der kører i hver sin tråd og samtidig forbinder en sensor med en motor.

Adaptivt lysinterval:
I teorien bør NXT-lyssensorerne kunne foretage målinger der resulterer i rå værdier i intervallet [0,1023]. Ved hjælp af eksperimenter har vi konstateret at dette interval er noget mindre i praksis. I vores kode bruger vi to variabler, MAX_LIGHT og MIN_LIGHT, til at angive grænsen for henholdsvis minimalt og maksimalt lys. Idet lyssensorerne fungerer således at der returneres en lav rå værdi ved kraftigt lys og en høj rå værdi ved svagt lys, har variablen MAX_LIGHT en lavere værdi end MIN_LIGHT hvilket ved første øjekast kan virke forvirrende.

Ved vores eksperimenter var den højest målte rå værdi ca. 800 (svagt lys) og den lavest målte ca. 100 (kraftigt lys). Som Tom Dean beskriver kan vi ikke vide hvilke lysforhold robotten kommer til at befinde sig i, hvilket betyder at vi med fordel kan lade MAX_LIGHT og MIN_LIGHT tilpasse sig forholdene. Dette gør vi ved at indskrænke det initielle lysinterval ift. vores målinger, og så lade det udvides automatisk hvis der er behov for det. Den initielle værdi for MAX_LIGHT er 300 og den initielle værdi for MIN_LIGHT er 600, altså begge 200 enheder fra værdierne målt i eksperimentet. Ifølge opgavebeskrivelsen skal kun de sidste N samples have indflydelse på tærsklerne, og vi har derfor implementeret en cirkulær liste indeholdende de sidste N målinger.

MAX_LIGHT og MIN_LIGHT justeres så efter henholdsvis største og mindste sample i listen, medmindre disse ligger inden for det initielle interval [300,600]. Grunden til at vi ikke tillader intervallet at blive indskrænket yderligere er at robotten vil blive for følsom over for ændringer i miljøet samt støj, og evt. risikere at få division med 0 hvor vi normaliserer lys-værdien i tilfælde af at MAX_LIGHT og MIN_LIGHT sættes til samme værdi. Som N bruger vi 5000 hvilket giver at den ældste sample i den cirkulære liste er ca. 50 sekunder gammel idet vi har indført et delay på 10ms i kontrol-loop'et.

Det selvjusterende lysinterval gør at robotten til dels "vænner" sig til dens omgivelser. Udsættes robotten for meget kraftigt lys således at dens MAX_LIGHT bliver meget lav, nedsættes dens lysfølsomhed hvilket kan ses ved at output'et fra normaliseringsfunktionen bliver lavere i takt med at MAX_LIGHT falder. Omvendt bliver den mere lysfølsom når den befinder sig i mørke områder hvilket giver en høj MIN_LIGHT, hvilket også ses ud fra normaliseringsfunktionen.

Ingen kommentarer:

Send en kommentar

Faste læsere