fredag den 30. oktober 2009

Øvelse 6

Dato: 8. oktober 2009
Øvelsens varighed: 3 timer
Gruppemedlemmer: Annette, Samuel og Rasmus



Mål

Formålet med denne øvelse er at videreudvikle på robotten fra øvelse 5, så den kan køre så hurtigt som muligt på en Alishan train track.
Baggrundsinfo
The Alishan train track has been used at a robot competition called World Robot Olympiad in 2007. The origional rules for the Alishan train track competition are more complicated than the rules we are going to use for our robot race but the track is the same except that the start area - the flat area at the floor level - is covered with a green color.


Figur 1 - The Alishan train track

Rules:
The car must start from the start area. No part of the car is allowed to exceed the start area.
A push on ENTER starts the car and the car should then follow the track to the retrace area, the top platform. From the retrace area the car should drive back until the car drives into the start area again. The car should then stop and time elapsed since start should be shown in the LCD. The car should be inside the start area before it stops.
When on the top the car should be inside the retrace area before going back.

You are allowed to use any LEGO elements to build your car.

(Fra øvelsesoplægget: http://www.legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson6.dir/Lesson.html )

Sekventiel vs. Reaktiv styring

Der findes forskellige måder at strukturere den software, som styrer robottens adfærd, f.eks. den sekventielle og den reaktive. Den sekventielle model går ud på at robotten følger en række procedurer eller steps, i en bestemt rækkefølge, for at opnå målet.

Den reaktive model derimod bygger på et stimuli-respons princip, hvor robottens sensorer aktivere forskellige kodesekvenser som styrer robottens adfærd.

Forskellen mellem den sekventielle og den reaktive model, er bl.a. at en sekventiel model kan implementeres uden brug af sensorer. Den sekventielle model kræver til gengæld et ensartet miljø og en ensartet interaktion mellem miljøet og robotten. Ifølge Fred G. Martin har den sekventielle model yderligere den fordel at der i robotten gemmes information om det miljø, som robotten færdes i.

I forbindelse med denne opgave var det med i overvejelserne at benytte en sekventiel model, ved simpelthen at lade robotten kører banen igennem ved hjælp af timere. Dvs. robotten skulle kører frem et stykke tid, drejer et stykke tid, køre frem igen et stykke tid, drejer...osv.

Som tidligere nævnt er det vigtigt at robotten navigere i et ensartet miljø, og fra vores erfaring med NXT'en ved vi at motorkraften er meget afhængig af batteriniveauet hvilket ville resultere i at vi ikke præcis kunne sige hvor langt robotten ville nå i et givet tidsrum. Dette kunne evt. løses vha. en omdrejningstæller, men vi valgte i stedet at gå videre med den reaktive model, baseret på Linefollower projektet. Robotten følger den sorte linie på banen og er udstyret med 3 lyssensorer foran så den kan se når den sorte stribe deler sig.

Robottens adfærd afhænger af hvilke sensorer der bliver påvirket. Løsningen hviler på nogle antagelser omkring miljøet, bl.a. omkring vinklerne mellem de sorte linier ved forgreningerne. Det er også værd at bemærke at denne løsning ikke er afhængig af batteriniveauet. En anden ting som vi bemærkede ved forskellige test, var at nogle gange når robotten fejlede og vi lod den kører, skete det at den kom ind på det rigtige spor igen.

Det ville nok have været mindre sandsynligt med en sekventiel løsning.




Status
Dette er en fortsættelse af sidste øvelse der blev afsluttet med at lave et program, der, udover at følge den sorte linje på en hvid baggrund, skulle kunne detektere den grønne farve i målområdet og stoppe. Det lykkedes dog ikke at få det til at fungere, da der fejldetekteres på overgangen mellem den hvide og den sorte farver, så den tror det er grøn.


Fremgangsmåde
1. Detektere forgreninger og følge banen opad.
2. Detektere at den har nået toppen
3. Få den til at vende på toppen.
4. Detektere forgreninger og følge banen nedad.
5. Detektere den grønne flade og få bilen til at stoppe. Løsning på problem med fejldetektering af grøn.
6. Tidtagning

Resultater
0. Programmet fra sidste gang, hvor der kun detekteres sort og hvid blev testet igen for at sikre at alt var i orden. Det var det ikke, den kørte for hurtigt over linjen og nåede derfor ikke at detektere linjen og styre efter den. Efter lidt fejlsøgning viste det sig at det skyldes at robotten ikke var helt opladet sidste gang og det var den nu. Ved at sætte motorkraften lidt ned kunne robotten igen følge den sorte linje. Det er selvfølgelig lidt ærgerligt når en del af udfordringen er at få den til at være hurtigst, men vi må prioritere at den overhovedet kommer op og ikke kører forkert på vejen.

1. Detektering af forgreninger og følge banen opad.
Der er to underpunkter til denne del af programmet. Den første forgrening kræver at bilen følger linjen til højre og den anden forgrening kræver at bilen følger linjen til venstre. For at robotten ved hvilken retning den skal dreje til, har vi valgt at indføre endnu to lyssensorer, så der nu er en i midten som sørger for at robotten følger linjen og en i hver side som sørger for at detektere hvilken retning robotten skal dreje til, se Figur 2.


Figur 2 - Robotten med de tre lyssensorer


Figur 3 - Den første forgrening

Højre sensor rammer den sorte streg først, se Figur 3 og den slukkes (senere beskrives hvorfor) og robotten starter med at dreje mod højre. Efterfølgende aktiveres sleep() i 1700ms og når tiden er udløbet tager den midterste sensor igen over og sørger for at robotten finder den sorte streg og fortsætter op ad rampen. Denne fremgangsmåde er brugbar fordi robotten ikke rammer stregen til venstre og stregen til højre på samme tid.


Figur 4 - Den anden forgrening

Den anden forgrening detekteres på samme måde som den første, men med venstre lyssensor, se Figur 4. Når venstre lyssensor registrerer den sorte streg drejer robotten til venstre. Selve drejet varer ligeledes 1700ms vha. sleep() og når de 1700ms er gået sørger den midterste sensor igen for at robotten kører videre på den sidste strækning mod den øverste platform.
Vi oplevede dog to problemer under arbejdet med den anden forgrening. Første problem var at robotten under drejet krydser stregen flere gange og på den måde blev ved med at dreje rundt helt ukontrolleret. Det er grunden til at vi indførte at slukke for sidesensorerne første gang de møder en sort streg som også beskrevet under a.

Det andet problem var at op mod den anden forgrening kørte robotten på venstre side af den sorte streg. Det vil sige, når den detekterer sort drejer den mod venstre og når den detekterer hvid drejer den mod højre. Efter den anden forgrening er robotten på højre side af stregen, så for at undgå at den kommer ud af kontrol skal den nu dreje mod venstre når den detekterer hvid og højre når den detekterer sort. Dette medfører at den nu kører på højre side af stregen og der er ikke længere problemer med at den kommer ud af kontrol.

2. Detektering af toppen.
Den øverste platform er afgrænset med en bred sort kant. Da der er indført yderligere to sensorer har vi nu en række med tre sensorer og de bruges til sammen at detektere om toppen af banen er nået. For at verificere at den har nået toppen stopper robotten når de på samme tid detekterer den sorte kant, se Figur 5. Da kanten er så bred som den er giver det ikke problemer hvis robotten kommer lidt skævt ind på platformen for sensorerne er indenfor den sorte kant på samme tid.

Figur 5 - Sort kant på toppen

3. Vende på toppen
Der har ikke været tid til at få bilen til at vende på toppen, men vi har diskuteret hvordan vi ville implementere det hvis der var tid. Valget er faldet på en sekventiel fremgangsmåde, så detektering af sort på alle tre sensorer starter en sekvens, hvor robotten først kører fremad i et givent stykke tid for at komme ind på midten af overfladen. Her skal den vende 180 grader om sin egen akse ved at der sættes power på begge motorer i modsat retning.
Mulige problemer med denne fremgangsmåde kunne være at robotten ikke ender midt på platformen og vi derfor risikerer at den falder ned når den skal vende. Arbejdet med denne opgave har nemlig tidligere vist, at en fuldt opladet robot kører hurtigere end når den ikke er fuldt opladet. Desuden ved vi ikke om hjulene kan dreje så skarpt som det er nødvendigt når den skal dreje om sin egen akse.
Når robotten har vendt skal den igen køre frem og den midterste sensor skal begynde at detektere sort og hvid så den følger linjen nedad.

4. Detektere forgreninger og følge banen nedad.
Fra toppen og ned er banen ligesom nedefra og op. Det vil sige første forgrening oppefra skal resultere i at robotten drejer til højre og anden forgrening skal sørge for at robotten drejer til venstre.

5. Den grønne flade detekteres.
For at få robotten til at stoppe, nede ved startområdet når den er færdig med hele banen, er det nødvendigt at kunne detektere den grønne farve.
Efter tidligere kun at have brugt en enkelt sensor til både at følge den sorte linje, og til at finde den grønne farve, bruges der nu en sensor, til kun at detektere grøn. Dette gøres for simplicitet, så hver sensor kun har et formål.
Problemet fra sidste øvelse med at robotten gik i stå, skyldes at robotten var kodet til at stoppe, med det samme sensoren læste en lysværdi, der svarede til den grønne farve på banens startområde. Det viste sig, at lysværdien lige på grænsen mellem den hvide overflade og den sorte streg, havde samme værdi som den grønne farve.
For at løse dette problem, tjekkes lys-værdien to gange efter hinanden. Hvis den første gang viser at lys-værdien svarer til grøn, går koden videre til tjek nummer to, ellers stopper tjekket. Dette tjek gør præcis det samme som det første, men først hvis dette tjek viser grøn farve, stopper robotten. Der er et mellemrum på 75 millisekunder mellem hvert tjek, hvilket er lang nok tid til at sensoren har passeret overgangen mellem hvid og sort. Altså kommer den kun til at måle to grønne værdier i træk, når den faktisk er på noget grønt.
Den lys-værdi der bliver tjekket på, er blevet målt med et lille simpelt program, til at være 40. For at kompensere for ændringerne i lysforhold, bliver der tilføjet en afvigelse på +/- 2, så værdierne ligger mellem 38 og 42. Lamperne over banen var tændt på det tidspunkt, og lyset på det sted i lokalet var rimelig konsistent. Derfor har denne lys måling virket fint de gange den har været afprøvet.

Med disse indstillinger, stopper robotten når sensoren kommer ind på det grønne område, se Figur 6. Hvis man vil have robotten helt ind på den grønne flade, kan den programmeres til det. Når den rammer den grønne overflade med sensoren, skal den blot køre ligeud i et fastsat tidsrum. Dette ville kræve en del afprøvning og skulle tilpasses, men burde virke.


Figur 6 - Detektering af grøn








6. Tidtagning
Turen op ad rampen varer 1 minut og 25 sekunder. Det kan ses i filmen http://www.youtube.com/watch?v=v8qv3HZ_AHo.
Hele koden består af de fire klasser BlackWhiteSensor.java, Calibrate.java, Car.java og LineFollowerCal.java, som alle kan hentes her. http://www.daimi.au.dk/~u071252/DL/Øvelse6_kode.rar.


Konklusion:
Ved at bryde opgaven ned i delelementer er det lykkedes at implementere det meste. Robotten kan køre op mod toppen af rampen og undervejs vælge den rigtige retning i de to forgreninger. Den kan detektere at den har nået toppen og stoppe. Vi har givet et forslag til hvordan den kan vende på toppen og turen nedad adskiller sig ikke fra turen opad så det skulle heller ikke være noget problem. Den grønne flade i målområdet kan også detekteres så bilen stoppes. Robotten skulle egentlig være helt inde på det grønne område inden den stopper, men det viser at det er muligt at løse det problem vi havde i øvelse 5. Derudover ville det også være relevant at lege lidt med hastigheden for alene turen op ad rampen varer 1 minut og 25 sekunder hvilket er lige i overkanten, men det må selvfølgelig ikke gå ud over sikkerheden i opkørslen.

Referencer:
Kode:
http://www.daimi.au.dk/~u071252/DL/Øvelse6_kode.rar

fredag den 16. oktober 2009

Øvelse 5

Dato: 1. Oktober 2009
Øvelsens varighed: 3 timer
Gruppemedlemmer: Annette, Samuel og Rasmus

Mål
Formålet med denne øvelse er at bygge en robot efter LEGO modellen 9797. Derefter skal lyssensoren undersøges ved at lave målinger på forskellige farver.
Fremgangsmåde
Den samme robot som vi har brugt de tidligere uger bruges igen. Nu med lyssensoren monteret.
Klassen BlackWhiteSensor.java bruges i et projekt til at undersøge hvilke værdier vi får tilbage når sensoren holdes over en hvid overflade og en sort overflade. Værdien for den pågældende intensitet skrives ud på displayet.
Der bygges videre på projektet fra sidste test. Programmet udvides nu til at kunne detektere tre forskellige farver, hvid, sort og grøn.
Car.java klassen er tidligere brugt ved undersøgelse af ultrasonic sensor. Den indeholder metoder til at få venstre og højre motor til at køre fremad, tilbage og stoppe. LineFollowerCal.java sørger for at robotten kan følge en sort (mørk) linje på en hvid (lys) baggrund. De to klasser bruges sammen med den udvidede BlackWhiteSensor.java klasse så bilen bruger de kalibrerede værdier og grænser til at teste hvilken farve gulvet har og styrer efter det. I første omgang som nævnt kun hvid og sort så den kan følge en sort linje.
Det sidste projekt som kan følge en sort linje udvides til at få robotten til at registrere når den når det grønne underlag og stoppe med at køre.


Resultater
1. Sensoren er monteret på robotten. Den sidder lavt og er ikke fleksibel.

2. Projektet BlackWhiteSensor1 er lavet ud fra BlackWhiteSensor klassen. Programmet er tilpasset ved at lave en main() hvor der oprettes et BlackWhiteSensor objekt, kalibreringsmetoden kaldes (kalibrerer ved at aflæse værdier for en sort og en hvis overflade) og så længe escape knappen på robotten ikke aktiveres udlæses aktuelle værdier for overfladen som lyssensoren er over. BlackWhiteSensor klassens metode light() der returnerer værdier for lysintensiteten bruger metodekaldet readValue() som har en returværdi på mellem 0 og 100. Programmet blev testet og vi fik følgende værdier:
Sort = 36
Hvid = 59

3. For at kunne detektere grøn bygges videre på projektet. Det er nødvendigt at ændre kalibreringsmetoden så først kalibreres nu sort, derefter grøn og til sidst hvid, ligesom før ved at holde sensoren over den givne farve og til sidst beregnes tærskelværdien mellem sort og grøn som halvdelen af forskellen mellem de to farves sensorværdier og tærskelværdien mellem grøn og hvid beregnes på tilsvarende måde:
blackGreenThreshold = ((greenLightValue-blackLightValue)/2) + blackLightValue;
greenWhiteThreshold = ((whiteLightValue-greenLightValue)/2) + greenLightValue;
Dette testes og resultaterne skrives ud på displayet og det kan verifceres at beregningerne passer.

Efterfølgende ændres black() og white() metoderne og der laves en green() metode. De bruger tærskelværdierne fundet under kalibrering og returnerer true eller false. I main() bibeholdes koden fra BlackWhiteSensor projektet og der tilføjes tests hvor black(), green() og white() metoderne kaldes.
En test viser at sort og hvid er som før målt ca. hhv. 36 og 59 og grøn har værdien 38. Disse værdier er svære at bruge, da der ikke er stor afstand mellem resultaterne. I stedet for at kalde readValue() for at få returneret en værdi for lysintensiteten ændres koden til at kalde readNormalizedValue(), som returnerer den rå værdi direkte fra A/D konverteren. Her er intervallet 0-1023, hvor lave værdier er mørkt og høje værdier er lyst.
Med denne metode fik vi værdierne:
Sort = 378
Grøn = 537
Hvid = 613

Dermed fungerer farvetesten som den skal og vi kan se på LCD displayet at når sensoren holdes over grøn står der: Black: False, Green: True og White: False helt som ønsket. Koden kan ses i projektet BlackWhiteGreenSensor2.

4. BlackWhiteFollower3 projektet er et nyt projekt med den gamle BlackWhiteGreenSensor klasses metoder. Dog er main fjernet. Main ligger nu i LineFollower4 klassen der sammen med Car5 klassen udgør resten af projektet. Ideen er her at prøve den ny BlackWhiteGreenSensor klasse til i første omgang at kunne detektere sort og hvid så robotten kan følge en sort streg på en hvid baggrund.

Robotten er afprøvet på en rampe med en sort linje i midten, se figur 1 på http://www.legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson6.dir/Lesson.html . Robotten følger linjen fint opad og nedad, men har lidt problemer når den skal fra den skrå rampe og op på de plane stykker af banen. Det skyldes sandsynligvis at der er et lille stykke tid hvor afstanden mellem lydsensoren og banen er større. Det skal der udtænkes en løsning på, eventuelt kan sensoren sættes på en fleksibel arm med et hjul på, så der hele tiden vil være den samme afstand mellem gulv og sensor.

5. Til GreenBlackWhiteFollower bruges igen BlackWhiteGreenSensor. Som det ses i Figur 1 sørger robotten for at holde sig på kanten af den sorte linje som før ved at detektere på om den returnerede sensorværdi svarer til sort eller hvid. Den sidste test går på om der detekteres grønt. I dette tilfælde stopper bilen med det samme og sætter kun i gang igen hvis den flyttes og der ikke længere detekteres grønt.
Figur 1
Testen af programmet på rampen har vist at der er problemer. Bilen går hele tiden i stå. Det ser ikke ud til at der er fejl i koden så det skyldes at den simpelthen detekterer grøn hele tiden. Det vil sige at der er problemer med den måde vi detekterer farverne på, for overgangen mellem den sorte linje og underlaget giver tilsyneladende en returværdi der svarer til den grønne lysintensitet.
Der er ikke mere tid til denne øvelse, så i næste øvelse skal vi starte med at have løst dette problem.

Konklusion:
Robotten fik påmonteret sensoren, og de senere undersøgelser har vist at den muligvis skal sættes på en fleksibel arm for at undgå problemer når den skal over en kant.
Målinger med lyssensoren gav os de forskellige intensiteter af hvid, grøn og sort og da det gav os værdier på 36 og 38 for hhv. sort og grøn besluttede vi i stedet for at læse de rå værdier fra A/D converteren, det giver større intervaller mellem farverne og fungerede bedre.
En videreudvikling af projektet gjorde det muligt at få robotten til at følge en sort linje med udgangspunkt i lyssensorens kontinuerte målinger og intervallerne for sort og hvid.
En tilføjelse til programmet der bestod i at detektere den grønne farve og stoppe robotten gav problemer. I overgangen mellem den sorte linje og den hvide baggrund er der målinger som svarer til den grønne farves lysintensitet og det medfører at robotten stopper hvor det ikke er meningen. Vi har ideer til hvordan vi kan undgå dette og vil arbejde videre med det i næste uge.

Referencer:
1. BlackWhiteSensor projektet af Ole Caprani tilføjet main: http://www.daimi.au.dk/~u071252/DL/BlackWhiteSensor.java

2. BlackWhiteGreenSensor projektet (udvidelse af BlackWhiteSensor ): http://www.daimi.au.dk/~u071252/DL/BlackWhiteGreenSensor.java

3. BlackWhiteFollower: http://www.daimi.au.dk/~u071252/DL/BlackWhiteFollower.rar

4. LineFollower: http://www.daimi.au.dk/~u071252/DL/LineFollowerCal.java

5. Car: http://www.daimi.au.dk/~u071252/DL/Car.java

Faste læsere

Bidragydere