onsdag den 7. november 2007

ESEA - Labnotes

NXT Programming - Lektion7 - fortsat onsdag d. 7. nov. 2007
Varighed: 4.0 timer - kl. 17:00 - 21:00
Gruppemedlemmer: Aslak, Ruben og Lars

Gruppens mål for dagen:

  • At få løst de problemer vi havde i fredags, se Lektion 7. Problemerne bestod i, at robotten stoppede af sig selv efter ganske kort til og udskrev en exception i displayet, samt, at vi ikke kunne udskrive fra vores 2 tråde i displayet. Når vi forsøgte at skrive i displayet fra de 2 tråde, så fik vi en anden exception og koden blev aldrig startet op på NXT'en.
  • At, når det første punkt er løst, observere Braitenberg-robottens opførsel i begge konfigurationer (2a og 2b i lektionensbeskrivelsen fra Lektion 7). Disse Braitenberg-robotter, som vi forsøger at implementere vha. NXT'en, kan ses på følgende side: http://www.legolab.daimi.au.dk/DigitalControl.dir/NXT/Lesson7.dir/Lesson.html
Den Første Del
Vi startede eftermiddagen med at addressere det første problem fra sidste gang, nemlig at robotten stopper efter et kort stykke tid med en fejlmeddelse på skærmen. Ved at ændre på måden vi skriver ud på displayet lykkedes det at få robotten til at fortsætte "uendeligt". Denne ændring kan ses af det følgende kode:


String str1 = "Left read: ";
while(true) {
try {
light = ls.readValue(); // 2. step
LCD.clearDisplay(); // 1. step
LCD.drawString(str1, 0, 1); // 1. step
LCD.drawInt(light, 14, 1); // 2. step
LCD.refresh(); // 1. step

}
}

Linierne i den ovenstående kode efterfølges af kommentare, som henviser til i hvilket trin vi skrev linierne. Først brugte vi de linier mærket "1. step" og da det fungerede tilføjede vi linierne mærket "2. step".

Efterfølgende var vi interesserede i, at få de to tråde til at skrive ud på skærmen med en opdateringsfrekvens, som gør det muligt at se hvad der står. Hvis trådene opdaterer hver gang de læser en sensor-værdi, så bliver displayet opdateret så ofte, og hermed også slettet så ofte, at det som effekt blinker alt for hurtigt. Displayet blinker så hurtigt, at det ikke er muligt af aflæse. Dette løser vi ved at lade de 2 tråde sove i et stykke tid (laver en løkke, som laver ingenting:

int i = 10000;
while (i > 0) {
i--;
}


Denne fremgangsmåde gør reaktionstiden for robotten længere, idet der ikke bliver reageret på lysændringer sålænge den ovenstående while-løkke eksekveres. Dog er det nu lykkedes os, at løse de 2 problemer, som var dagens første mål. Nu kan vi observere hvordan robotten opfører sig, når den udsættes for lys.

Koden, som den ser ud under de følgende observationer:
http://userportal.iha.dk/~20060651/JavaFiles_ESEA/Lektion7/fortsat/MotorLightLeft.java

http://userportal.iha.dk/~20060651/JavaFiles_ESEA/Lektion7/fortsat/MotorLightRight.java

http://userportal.iha.dk/~20060651/JavaFiles_ESEA/Lektion7/fortsat/RobotA.java

Den Anden Del

Når robotten er i den ene konfiguration, hvor højre lyssensor styrer højre motor, og venstre sensor styrer venstre motor, opfører robotten sig nogenlunde som forventet. Med det samme skal det siges, at de monterede RCX-lyssensorer har en meget lille 'range' indenfor hvilken de måler lyset. Den laveste måling vi kunne opnå er på omkring 16-20 og den højeste måling er omkring de 40-45. Dette er ikke en 'range' som tydeligt stiger, når vi bringer lyskilden tættere og tættere på sensorene. Derfor opfører robotten sig heller ikke helt som forventet/håbet.

Nok fordi vi, som forklaret ovenfor, har indsat en "tom" while-løkke, at robotten reagerer forsinket på lysintensitetsændringer. Altså reagerer robotten relativt pludseligt på højere lysintensitet og drejer kraftigt imod/væk fra lyskilden, alt efter om robotten er i 2A, eller 2B opsætning (se linket under det andet punkt i målsætningen for denne lektion). Vi har altså, med andre ord, gjort robotten relativt langsomtopfattende, idet den ikke reagerer når koden står i tomgang i de "tomme" while løkker. Udover dette, så har lyssensorene (RCX-generation lyssensorer) ikke så stor 'range', dvs. der er ikke så stor forskel på den laveste måling (16-20) til den højeste måling (40-50). Denne sidste måling er med en lygte direkte ind i sensor, dvs. relativt uopnåeligt i en virkelig situation. Indfaldsvinklen på det lys om sensorene skal måle intensiteten på, skal også være stort set lig 0 grader (direkte frontalt ind i sensoren) for at det bliver opfattet.

Alt i alt gør dette, at robotten reagerer for kraftigt, når den endelig reagerer. Holdes et lys til højre for robotten, når den er sat til at køre mod lys, så drejer den alt for kraftigt imod lyset, og den modsatte sensor når ikke at reagere, fordi robotten er i en tilstand af "køre mod lyset til højre". Der er flere årsager til denne opførsel, bl.a. reagerer robotten for kraftigt, og de tråde, som robotten kører i kan ikke afbryde hinanden.
En løsning på dette ville være hvis en tråd aflyttede begge sensorer, og kunne sige ( i ovenstående tilfælde) at robotten skulle dreje mod højre SÅLÆNGE at lysintensiteten målt ved højre sensor var højere end ved den venstre. Vi forsøgte ikke at indbygge denne funktionalitet, idet opgaven for i dag lagde op til, at der skulle implementeres 2 tråde som hver især styrede en sensor og en motor.

Dette var hvad vi nåede på denne lektion.

Ingen kommentarer: