Thursday, February 28, 2013

Week 5

Dato:

28-02-2013

Varighed:

Fælles lab: 5 timer
Blog: 4 timer

Deltagere:

Steffen Høi
Nikolaj Mols Hansen
Martin Vang
Ulrik Sahl Lystbæk

Status

Vi har monteret NXT lyssensoren, som beskrevet i LEGO Mindstorm Education NXT Base Set 9797.

Mål

Målet for denne øvelsesgang er at lave opgaverne for "Week 5 - Sequential and reactive control strategies"1 og derigennem lære hvordan NXT lyssensoren kan bruges til at få LEGO 9797 bilen til at følge en sort linje og stoppe for enden af linjen, når billen kører ind i "målzonen", der i dette tilfælde er et stykke grønt rektangulært papir for enden af linjen. Ideen er at vi skal bruge lyssensoren til at opfange tre forskellige farver. Desuden er målet også at oprette et blogindlæg for denne laboratoriesession.

Plan

  • Montere NXT lyssensoren på LEGO 9797 bilen.
  • Løse opgaverne for "Week 5 - Sequential and reactive control strategies"1.
  • Udarbejdelse af blogindlæg for "Week 5 - Sequential and reactive control strategies"1.

Opgaver


Black White Detection

Vi har monteret NXT lyssensoren som beskrevet i LEGO Mindstorms Education NXT Base Set 9797 manualen s. 32 til 34.
Til at afprøve den udleverede klasse BlackWhiteSensor.java2, brugte vi det udleverede program LineFollowerCal.java3. LineFollowerCal.java3 bruger calibrate metoden fra BlackWhiteSensor.java2 til, at indstille standardværdier for hvid og sort. Metoden light fra BlackWhiteSensor.java2 bruges til at få en måling fra sensoren, som BlackWhiteSensor.java2 er konstrueret med. Når lyssensoren er kalibreret, fortsætter LineFollowerCal.java3 til et loop, hvor der udover at blive tilført kraft til motorerne bliver taget prøver med lyssensoren, og de prøver bliver udskrevet på LCD'et. Derfor kunne vi bruge programmet til også at teste forholdene mellem målinger for sort og hvid.
Selvom værdierne fra lyssensoren teoretisk ligger mellem 0 til 100, ligger de målinger, vi har registreret mellem 39-60. Den laveste værdi er for sort, og den højeste er for hvid.

Line Follower with Calibration

Programmet LineFollowerCal.java3 har vi brugt og beskrevet lidt i afsnittet "Black White Detection" ovenover. Derfor beskriver vi ikke hele programmet igen, men kun den del der ikke er beskrevet endnu. Den essentielle del som programmet gør, der ikke er beskrevet, er når motorerne tilføres kraft i loopet. Motorerne tilføres kraft på baggrund af om sensoren har taget en måling, som vurderes at være sort, fordi værdien er tættere på den kalibrerede sorte værdi end den hvide. Hvis den er sort føres der kraft til den venstre motor, således at bilen drejer til højre. Hvis ikke må målingen antages at være hvid, og programmet handler symmetrisk til den anden retning. Dvs. at den højre motor tilføres den samme kraft, som den venstre hvis det havde været en sort måling.
Resultatet er at bilen kan følge en linje mellem sort og hvid ved konstant at oscillere fra side til side.

ColorSensor with Calibration

I denne opgave har vi lavet en klasse, som vi har kaldt BWOURSENSOR.java4 i stedet for "ColorSensor.java", fordi vi synes, det var mere oplagt, da det er en lyssensor, vi anvender, og vi på den måde ikke kommer til at forveksle den med farvesensoren.
Som tidligere nævnt fik vi farveværdierne 39 og 60 for henholdsvis sort og hvid. Vi målte farveværdien fra det grønne kvadrat som der senere skal standses på til at være 47. I stedet for at kalibrere hver gang, vi skulle afprøve programmet, har vi hardcoded de tre værdier for farverne i BWOURSENSOR.java4.
I stedet for at have en grænseværdi mellem sort og hvid, har vi ændret det til, at der nu er to grænseværdier. Én mellem sort og grøn og én mellem grøn og hvid. Idéen bag udregningen er fuldstændig den samme, men udvidet til at grøn er et interval mellem sort og hvid, som vist nedenfor.

greenWhiteThreshold = (greenLightValue + whiteLightValue)/2; greenBlackThreshold = (greenLightValue + blackLightValue)/2 + 5;




For at vurdere om farven er sort, skal værdien af en måling være mindre end greenBlackThreshold og for at vurdere om den er hvid, skal den være større end greenWhiteThreshold. Til at finde ud af om farven er grøn, har vi tilføjet metoden green, som ses her:
int temp = ls.readValue(); return (temp >= greenBlackThreshold && temp <= greenWhiteThreshold);




Det eneste der sker er, at der afgøres, om værdien af målingen ligger indenfor det interval, som angiver, at den er grøn.

Line Follower that stops in a Goal Zone

Fra det ovenstående emne "ColorSensor with Calibration", har vi muligheden for at se om farven på en måling er grøn. Nu forsøger vi at stoppe på et grønt felt efter at have fulgt en sort-hvid linje. LineFollow2.java5 er vores modificerede udgave af den udleverede LineFollowerCal.java3. I LineFollow2.java5 anvender vi BWOURSENSOR.java4 til, at se når farven grøn aflæses.
Vores første idé var at stoppe, når én måling blev registreret til at være grøn, men når den kører mellem den sorte og hvide linje, vil den vurdere farven til at være grøn, når målingen ligger tilstrækkeligt meget på både sort og hvid. Til gengæld er det ikke lang tid det sker, fordi den oscillerer meget, og som følge deraf, vil der hurtigt komme enten en sort eller en hvid måling hurtigt efter. Derfor satte vi bilen til først at stoppe, hvis der havde været fem grønne målinger i træk. På den måde kørte bilen fint rundt, og stoppede på det grønne felt, hvilket man også kan se i nedenstående video.



PID Line Follower

PID controllers handler om at lave en blødere/mindre oscillation for vores linje-følgende robot. Vores tilgang var at implementere selve algoritmen for så at prøve os lidt frem. Efter lidt usystematisk forsøgen, mest for at se om vores algoritme gjorde som den burde, viste det sig dog, at vi havde forbedret hastigheden af gennemløbet med godt 7% power (vi har valgt udelukkende at se på, hvor stort power-output vi var i stand til at sætte på motorerne i gennemsnit, som måling for hvor "hurtigt" vi kom igennem banen).

Altså kan vi allerede, uden korrekt at "tune" vores algoritme komme frem til, at vi kan opnå en ganske betragtelig forbedring vha. PID. Hvor vi har valgt at lade vores kode være som den er, synes vi dog, at det er interessant at se på, hvordan vi kunne gribe opgaven an, hvis vi havde brug for at opnå en endnu større forbedring.



Billedet ovenfor beskriver en basal PID. Med den udleverede kode svinger power på motor A og B med +/- alt efter den samlede error. Dette betyder, at vi er nødt til at se på, hvor meget vores samlede error kan blive - en total error på over 100+% er uønsket, hvis vi gerne vil igennem banen.
I vores tilfælde gik vi efter at lade error kontrollere omkring 25% af vores totale power, og lade vores basis fremdrift være 75%. Til at starte med, fandt vi en skaleringsfaktor, der gjorde at vi kunne oscillere os nogenlunde igennem banen. Derefter satte vi den en smule ned, og introducerede i og d. Da det var den forholdsmæssige forskel på værdierne i artiklen, vi arbejdede ud fra, valgte vi at sætte i=1/100*p og d=1/10*p. Dette gav os den ønskede forbedring, dog med den bemærkning at vi nulstiller i hver gang, vi ser en sort streg. En systematisk fremgangsmåde, der sikkert giver et godt resultat, vil være at halvere p. Derefter sættes i lidt op (oprindeligt sat til 0) og d tilpasses for at lave en dæmpende effekt.

Vores kode kan ses i LineFollow3.java6. Nedenstående video viser, hvordan bilen fulgte den sorte linje efter at programmet blev uploadet til den.



Color Sensor

I denne opgave har vi lavet programmet LineFollow4.java7, som er en modificeret udgave af den udleverede LineFollowerCal.java3. Som den første strategi for at løse opgaven, valgte vi at trække alle tre farver. Vi beregnede gennemsnittet af de tre farver og delte den med 2.55, som er en hundrededel af maksimumsskalaen for en RGB farve. Vores intention med den beregning var, at vi nu havde et gennemsnit af nuancen inden for alle tre farveskalaer, og vi ville give en mere præcis værdi til den samme algoritme, som vi brugte i forrige opgave i forbindelsen med sort/hvid-sensoren. De første test viste sig hurtigt, at det ikke var tilfældet, og efter en række test opdagede vi, at det skyldtes hastigheden på farvesensoren. Tiden det tog for farvesensoren at tage alle tre målinger betød, at robotten havde bevæget sig en betydelig del imellem hver måling, og derfor blev det meget upræcist.

Ud fra de første resultater kom vi til den konklusion, at vi enten skulle ændre måden robotten bevægede sig på, og derved få den til at bevæge sig langsommere og mere forsigtigt fremad, eller også skulle vi forbedre timingen på sensoren. Vi fandt ud af, at sensoren var meget hurtig til at foretage målinger inden for en farveskala, hvilket betød at vi ligesom ved sort/hvid-sensoren kunne foretage målinger inden for kun en af skalaerne og navigere på samme måde.

Vi diskuterede evt. fremtidige forbedringer, og den mest åbenlyse var at undersøge, hvilken af de tre farver, der giver det bedste resultat. En mere kompleks forbedring kunne være at benytte den bedste farve til at navigere med og lokalisere hvilke områder, der er problematiske for denne farve. Ved målinger der ligger inden for det problematiske område, vil man så stoppe robotten og undersøge området nærmere med de to andre farver for at danne en mere præcis måling.

Konklusion

Denne uge har vi monteret lyssensoren på LEGO 9797 bilen og fået indblik i hvordan denne fungerer ved at lave ugens opgaver. Dette har vi blandt andet gjort ved at foretage målinger med BlackWhiteSensor og teste forholdene mellem sort og hvid. Ved at bruge programmet BlackWhiteSensor.java2 har vi set, hvordan vi kan kalibrere lyssensoren og derved indstille standardværdier for sort og hvid og via programmet registrere lysværdierne med lyssensoren. Ud fra de registrerede målinger har vi, via programmet, kunnet påvirke de to motorer alt efter, om det var sort eller hvid, der blev registreret. På den måde har vi kunnet få vores robot til at følge den sorte linje ved konstant at oscilere fra side til side. Endvidere har vi fået lyssensoren til at kunne registrere tre farver; sort, hvid og grøn ved at lave grænseværdier i programmet BWOURSENSOR.java4 ud fra de lysværdier, vi registrerede for de forskellige farver. Dette har vi kunne bruge til få robotten til at stoppe ved et mål i form af et grønt rektangulært område. Vi har derigennem set, hvilke udfordringer, der kan kan være med at registrere en farve, hvis lysværdi ligger mellem sort og hvid samt kommet frem til en løsning på dette. Derudover har vi erfaret, hvordan vi med en PID controller kan få robotten til at oscilere mindre, samt at det kan være en udfordring, at finde ud af præcist, hvilke variabler man skal ændre på, og hvor meget man skal ændre på disse for at få det bedste resultat. Til slut har vi stiftet bekendtskab med NXT farvesensoren, hvor vi har erfaret at det er nødvendigt at tage højde for hastigheden på farvesensoren, når man skal tage målinger med denne. Det kunne enten være ved at få robotten til at bevæge sig langsommere, forbedre timingen på sensoren eller foretage målinger inden for kun én farveskala.
____________________________________________________________________________________________________________

1. https://services.brics.dk/java/courseadmin/DigitalControl/pages/Week+5+-+Sequential+and+reactive+control+strategies
2. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson4.dir/BlackWhiteSensor.java
3. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson4.dir/LineFollowerCal.java
4. https://sites.google.com/site/digikaison/BWOURSENSOR.java
5. https://sites.google.com/site/digikaison/LineFollow2.java
6. https://sites.google.com/site/digikaison/LineFollow3.java
7. https://sites.google.com/site/digikaison/LineFollow4.java

Thursday, February 21, 2013

Week 4

Dato:

21-02-2013

Varighed:

Fælles lab: 5 timer
Blog: 3 timer

Deltagere:

Steffen Høi
Nikolaj Mols Hansen
Martin Vang
Ulrik Sahl Lystbæk

Status

Vi har monteret lydsensoren, som beskrevet i LEGO Mindstorm Education NXT Base Set 9797.

Mål

Målet for denne øvelsesgang er at lave opgaverne for "Week 4 - Acting and actuators"1 og derigennem forstå hvordan NXT lydsensoren kan bruges til at lave LEGO 9797 bilen om til en lydkontrolleret bil. Desuden er målet også at oprette et blogindlæg for denne laboratoriesession.

Plan

  • Montere sensoren på LEGO 9797 bilen.
  • Løse opgaverne for "Week 4 - Acting and actuators"1.
  • Udarbejdelse af blogindlæg for "Week 4 - Acting and actuators"1.

Opgaver


Opgave 1

I denne opgave skulle vi montere sensoren på LEGO 9797 bilen som beskrevet i LEGO Mindstorms Education NXT Base Set 9797 manualen s. 24-26. Vi har programmeret, kompileret og downloadet et simpelt Java-program1 til at teste lydsensoren. Nedenstående tabel viser de resultater, vi har fået ved at placere robotten på nogle faste positioner og prøve med lyden af et klap2 samt en fløjtelyd3 i forskellige afstande. Vi har afspillet de to lydklip fra en computer i stedet for selv at klappe og fløjte for, at få en så konsistent lyd som muligt. Resultaterne er vist i følgende tabel:

Lyd
30 cm
60 cm
90 cm
120 cm
150 cm
Klap
21
16
13
9
8
Fløjten
54
30
21
26
13

Ud fra målingerne vi har lavet er lydsensoren nogenlunde stabil idet lydniveauet falder stødt.

Vores opstilling så ud som følgende:


Opgave 2

I denne opgave har vi brugt dataloggeren DataLogger.java4 til at indsamle lyddata, hvilket vi har gjort via SoundSampling.java5. Vi har brugt den målte data fra forsøget med fløjtelyden til at lave nedenstående graf.

Opgave 3

I denne opgave skal vi bruge programmet SoundCtrCar.java6, der benytter sig af klassen Car.java7 til at bevæge bilen i forskellige retninger. Programmet med lydstyring får robotten til gentagne gange at vente på en høj lyd. Første gang den hører en høj lyd, kører den ligeud, anden gang drejer den til højre ved kun at give den venstre motor fart, tredje gang drejer den til venstre og sidste gang stopper den. Hvis der er trykket på escape-knappen når den er færdig med de fire skridt, stoppes programmet. Hvis der ikke er trykket på escape udføres det hele igen.
I metoden waitForLoudSound tages der konstant prøver med lydsensoren indtil en prøve ikke er mindre end treshold, som er sat til 90. Når en prøve er 90 eller større returnerer funktionen, hvilket i dette program semantisk betyder, at der har været en høj lyd.

Opgave 4

I denne opgave skal vi ændre i programmet SoundCtrCar.java8  og få det til at terminere som en effekt af at escape-knappen trykkes. Den eksisterende termineringsfunktion poller på knappen for at tjekke, om den er trykket. Hvis escape-knappen er nede, vil programmet forlade main-loopet og derved terminere. Denne måde at behandle termineringen på åbner for en række problemer. Første problem er at eksekveringen kan gå ind i et indre loop så punktet, hvor escape-knappen polle ikke nåes. Det andet problem er at hvis punktet først nåes efter at knappen er sluppet igen, så vil den returnere falsk, når der polles, om den er trykket ned.

For at få programmet til at terminere når escape-knappen trykkes, laver vi en instans af ButtonListener, der har metoderne buttonPressed og buttonReleased, som skal implementeres. Instansen af ButtonListener kan tilføjes til escape knappens opførsel events. Til dette bruges den statiske wrapper metode Button.ESCAPE.addButtonListener. Vi har valgt at ligge termineringslogikken i buttonReleased, hvilket betyder, at det udføres, når knappen slippes. For at få programmet til at terminere rydder vi først skærmen, stopper evt. bevægelse af bilen, hvorefter vi kalder System.exit(0) som får programmet til at terminere med exit code 0.

Opgave 5

I denne opgave skal vi få robotten til at opfange, hvis der klappes. For at  opfange et klap bruger vi igen lydsensoren til at analysere lyden den kan opfange. Kravene for et klap lyder på følgende:

          En lyd der er under 50.
          Indenfor de næste 25 milisekunder kommer der en lyd over 85.
          Indenfor de næste 250 milisekunder kommer der igen en lyd under 50.

Den første måde vi løste problemet på var at benytte et indre loop for hver fase, så når første fase er opfyldt går den ind i et indre loop og venter det tilladte tid på, at denne fase bliver opfyldt og det samme gælder den sidste fase. Problemet med denne løsning er, at hvis programmet befinder sig i det f.eks. tredje indre loop pga. lyde, der næsten er et klap, så vil et evt. klap på det tidspunkt muligvis ikke registreres. For at løse det problem har vi valgt at sample lyden ind i en buffer for hvert 5. milisekund. Ved hver sampling går vi så baglæns i bufferen fra den sidste sampling og undersøger om kriterierne for et klap er opfyldt. Hvis et klap er opfyldt, tæller vi en tæller op på skærmen og clearer bufferen for at undgå, at samme klap registreres flere gange. SoundSampling.java9 viser, hvordan vi sampler lyden i en buffer, og hvordan vi løbende i funktionen isAClap analyserer bufferen for om et klap er hændt. Vi har brugt dataloggeren til at optage klapmønstret10

Opgave 6

I denne opgave har vi monteret to lydsensorer og prøvet at bruge læsningerne fra disse sensorer til altid at køre mod retningen med den højeste lyd. Til dette har vi implementeret programmet FunBot.java11. Resultatet af en kørsel af dette program kan ses i nedenstående video.

Vi havde nogle udfordringer med at adskille lyden fra de to sensorer, hvilket vi prøvede på at løse med papir mellem og rundt omkring begge sensorer for at isolere lyden, men det kom aldrig til at virke helt efter hensigten. Desuden kan baggrundslyd og den måde hvorpå lydbølgerne blev udsendt i rummet også have spillet en rolle.

Konklusion

Denne uge har vi fået monteret lydsensoren på LEGO 9797 bilen og fået et indblik i, hvordan denne fungerer ved at lave ugens opgaver. Dette har vi bl.a. gjort ved at lave afstandsmålinger af en fløjte- og klappelyd og set, at lydsensoren fungerer nogenlunde stabilt. Endvidere har vi igen brugt dataloggeren til at indsamle og gemme lyddata, som vi har kunnet lave en graf over for at illustrere sammenhængen mellem afstanden og lyd. Vi har også erfaret hvordan robotten kan bevæge sig bestemte retninger i forbindelse med, at den hører en høj lyd. Desuden har vi stiftet bekendtskab med Java Threads, Listeners og Events og set hvordan disse virker specifikt for leJOS herunder ButtonListeneren. Dertil har vi også lært hvilke udfordringer, der er med at genkende lyde, og at man bliver nødt til at være opmærksomme på lyde, der næsten overlapper hinanden, samt hvad man kan gøre for at løse dette. Til sidst har vi erfaret, at der kan være nogle udfordringer med at bruge to lydsensorer til at styre bilen i retningen af en høj lyd.

____________________________________________________________________________________________________________

1. https://services.brics.dk/java/courseadmin/DigitalControl/pages/Week+4+-+Acting+and+Actuators
2. http://soundjax.com/clapping-1.html
3. http://soundjax.com/whistle-1.html
4. http://legolab.cs.au.dk/DigitalControl.dir/NXT/src/DataLogger.java
5. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson3.dir/SoundSampling.java
6. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson3.dir/SoundCtrCar.java
7. http://legolab.cs.au.dk/DigitalControl.dir/NXT/src/Car.java
8. https://sites.google.com/site/digikaison/SoundCtrCar.java
9. https://sites.google.com/site/digikaison/SoundSampling.java
10. https://sites.google.com/site/digikaison/Claps.txt
11. https://sites.google.com/site/digikaison/FunBot.java

Thursday, February 14, 2013

Week 3

Week 3

Dato:

14-02-2013

Varighed:

Fælles lab: 5 timer
Blog: 4 timer

Deltagere:

Martin
Nikolaj
Steffen

Status

Vi har samlet LEGO 9797 og monteret UltraSonic sensoren, som beskrevet i LEGO Mindstorm Education NXT Base Set 9797. Desuden har vi fået leJOS til at virke på alle computerne i gruppen. Computeren med OS X virker dog ikke med tilslutning via Bluetooth.

Mål

Målet for denne øvelsesgang er at lave opgaverne for "Week 3 - Sensing and Sensors - Analog|Digital conversion"1 og derigennem forstå hvordan sensorerne i Lego Mindstorms virker. Endvidere er det et mål at få leJOS installeret på de resterende maskiner, så alle gruppens computere kan kommunikere med robotten. Desuden skal der oprettes et blogindlæg med henblik på denne laboratoriesession, hvor vi skal huske på den feedback, vi fik fra forrige uge (Week 2).

Plan

  • Afslutning af installation af leJOS.
  • Løse opgaverne for "Week 3 - Sensing and Sensors - Analog|Digital conversion"1 .
  • Udarbejdelse af blogindlæg for "Week 3 - Sensing and Sensors - Analog|Digital conversion"1 .

Afslutning af installation af leJOS


OS X


Efter at have fulgt tutorialen "Getting Started on OS X"2 uden succes blev tutorialen, der beskriver, hvordan man installerer og kører leJOS via et plugin i Eclipse3 , fulgt. Installationen af pluginet var simpel, men da der skulle kompileres et Java-program for at teste, at der kunne uploades til robotten, opstod fejlen "This Java instance does not support a 32-bit JVM.". Efter at have søgt på internettet var det første bud på en løsning af dette problem at tjekke om alle filerne i bin mappen af leJOS havde fået tilføjet switchen -d32, der sikrer at Java-filerne bliver kompileret med 32-bit versionen af Java på OS X. Dette var dog implementeret som standard i den nyeste version af leJOS. Løsningen på problemet var derimod at hente 32-bit versionen af Eclipse i stedet for 64-bit versionen, der allerede var installeret på computeren i forbindelse nogle tidligere projekter. Java-programmet kunne derefter kompileres og uploades til robotten via USB. LeJOS kører derfor nu også fint på OS X. 

Da leJOS var kommet op at køre i Eclipse, og man kunne overføre programmerne til robotten via USB, blev det forsøgt at få det til at virke med den indbyggede Bluetooth i MacBooken. Det lykkedes at finde og forbinde til robotten via "Bluetooth" i systemindstillinger, men da det blev afprøvet i Eclispe kunne den her ikke finde robotten. Status er derfor at overførsel af programmer til robotten fungerer med USB, men ikke med Bluetooth på computeren, der kører OS X. 

Windows 8


Skiftet fra Ubuntu til Windows skete, da understøttelsen af leJOS til Linux er dårlig. Dette kombineret med at installationen ikke ligefrem var "mint" bidrog til, at det ikke længere kunne betale sig at bruge flere timer på de problemer, der var med at få leJOS til at virke i Linux. Følgende trin blev derfor foretaget:
  1. Hent Windows 8 Pro N fra Dreamspark (bemærk at man kun kan hente fra Windows-maskiner).
  2. Installer Windows 8. (ca. 30 min)
  3. Installer Java.
  4. Installer leJOS via guiden4. (ingen problemer/advarsler undervejs)
  5. Installer leJOS igen - første gang virkede kommunikationen imellem robotten og Eclipse ikke.
Efter disse 5 trin virkede alt på nær det indbyggede bluetooth-kort. Dette kort tog længere tid at få til at virke end resten af installationen. Windows kunne nemlig ikke finde ud af at tænde for kortet uden driveren, som ikke kunne installeres uden at kortet var tændt. Dette blev dog løst på følgende måde:
  1. Installer Window 7 driveren i kompatibilitet mode.
  2. Aktiver kortet.
  3. Installer Windows 8 driveren.
Status for denne maskine er nu, at leJOS er installeret, samt at det fungerer med overførsel via Bluetooth.

Opgaver


Til opgave 1 og 2  skulle vi placere robotten foran forskellige objekter i forskellige afstande og sammenligne afstanden med læsningerne fra sensoren. Vi har lavet afstandsmålinger på en skraldespand, affaldsposen i skraldespanden og en mur.

1. På billedet nedenunder ses skraldespanden og affaldsposen, som vi har foretaget afstandsmålinger på. Da vi lavede målingerne på skraldespanden, havde vi trukket posen helt væk, og da vi lavede målingerne på affaldsposen, havde vi trukket den ned, så den dækkede hele siden.
























2. Muren vi har lavet afstandsmålinger på.

























Opgave 1

Nedenstående skema viser målingerne med det udleverede program SonicSensorTest.java5 i version alfa_03. Dvs. med prøveinterval på 300 msek.
Genstand
45 cm.
75 cm.
105 cm.
135 cm.
165 cm.
195 cm.
225 cm.
Max
Skraldespand
45
75
106
138
255
255
255
150
Mur
45
76
107
138
168
199
232
255
Affaldspose
40
72
255
255
255
255
255
78

Ud fra de målinger vi har foretaget, er vores konklusion, at den maksimale afstand det er muligt at registrere en genstand fra med UltraSonic sensor er afhængig af den genstand, der skal registreres. Vi ved ikke helt præcist, hvorfor der er forskel på genstandene, men vi har overvejet, at det f.eks. kunne være at nogle genstande absorberer mere lyd end andre.

Opgave 2

I denne opgave har vi forsøgt at gøre miljøet så ens som muligt i forhold til, hvordan det var, da målingerne til opgave 1 blev foretaget, men denne gang med et prøveinterval på 10 msek. Nedenstående skema viser resultatet af målingerne.

Genstand
45 cm.
75 cm.
105 cm.
135 cm.
165 cm.
195 cm.
225 cm.
Max
Skraldespand 10 m/sek
45
76
107
140
169
198
228
255
Mur 10 m/sek
45
76
106
138
168
199
255
208
Affaldspose 10/msek
45
76
103
137
255
255
255
154

Det kortere prøveinterval i opgave 2 i forhold til opgave 1 gør, at det er muligt for UltraSonic sensoren, at registrere genstande, som den på større afstande har haft problemer med .

Opgave 3

Den måde hvorpå vi har fået de bedste resultater med UltraSonic sensoren er ved at sætte prøveintervallet til 0 og måle med en mur som genstand. Betingelsen for et godt resultat er i dette tilfælde at have størst mulig afstand fra UltraSonic sensor og genstanden, vi måler på.
Vi har lavet en måling på 253 cm, og det er muligvis et spørgsmål om, at placere sensoren præcist nok for at få en måling på 254 cm.

Angående spørgsmålet om hvorvidt lydens hastighed har betydning for vores sensors brugbarhed:
Da den maksimale måleafstand er 2,55m hen til og tilbage fra et objekt, får vi at tiden fra vores sensor påbegynder at måle på virkeligheden, til vi har et resultat, har en nedre grænse på:
(2,55 m * 2) / 340,29 m pr sek = 14.987 msek

Denne nedre begrænsning er dog ikke speciel. Vi vil altid være nødt til at se på hvor hurtigt en given sensor er i stand til at give os et måleresultat ift. hvor hurtigt, vi forventer at få et billede af virkeligheden i vores programmer.
Derudover vil en mere typisk brug af sensoren (50 cm) give et mærkbart bedre resultat:

(0,5m * 2) / 340,29 m pr sek = 2.9387 msek

Dette delay er mærkbart bedre og langt mere typisk i de programmer, vi har arbejdet med hidtil.

Opgave 4

For at lave denne opgave skulle vi først hente programmet Tracker.java6 og uploade det til robotten. Bilen som styres af programmet Tracker.java kører ind mod den nærmeste mur og står derefter på en distance af ca. 35 cm. fra muren og oscillerer frem og tilbage.
Fordi programmet foretager beregninger på målinger det har aflæst fra miljøet og derefter justerer sin adfærd i forhold til målingerne, er det en closed loop control.

Opgave 5

I denne opgave  skal vi prøve at få robotten til at oscilere ved at justere på konstanterne i controlleren.  Hvis vi indstiller trackeren med nedenstående værdier oscilerer robotten.

velocity = 50, pGain = 1.5, dGain = 0.5

Vi er dog ikke sikker på, hvilken konklusion vi skal drage ud fra dette.

Vi har taget udgangspunkt i pseudokoden fra ugesedlen, der beskriver en generisk PID Controller og brugt denne til at lave ændringer i Java-filen Tracker.java7. Resultatet blev at robotten kørte hen til væggen, oscilerede kort og derefter stoppede. Vi har ikke eksperimenteret med så mange variabler, da det er tidskrævende at gætte på hvilke konstanter, der skal ændres på for vores robot, men vi ved at en PID-controller kan bruges til at få en blød opbremsning i stedet for oscilering.

Opgave 6

For at lave denne opgave startede vi med at oversætte dette wallfollower-program8, til Java. Det lykkedes os dog ikke at oversætte programmet helt rigtigt, da det var nødvendigt for os at bytte om på højre og venstre motor for at den fulgte muren i stedet for at følge de steder, hvor der ikke er noget. Desuden har vi justeret konstanterne9. Den kom til sidst til at følge en mur, men det blev aldrig særlig godt. En video af dette kan ses herunder:
 

Vi har ikke nået at sammenligne NQC algoritmen med de forskellige forslag fra den udleverede tekst10. Det skyldes, at vi brugte lang tid på at få programmet oversat til Java. For at analysere programmet printede vi værdien af value variablen, hver gang der blev taget taget en ny prøve med UltraSonic sensoren, på LCD displayet. Værdien burde ligge mellem 0-255 da variablen blot bliver sat til distancen som sensoren returnerer, men i stedet fik den værdier mellem 0-2000. Når man skriver distancen fra sensoren direkte på displayet virker det fint. Vi brugte lang tid på at prøve at finde ud af hvorfor værdien fra value ikke var den samme, når vi skrev den på LCD displayet, som når værdien fra sensoren blev skrevet direkte til displayet i stedet for at blive gemt i en variabel. Vi fandt aldrig ud af hvorfor, og gik til sidst videre med at få programmet oversat i stedet for at analysere problemet.

Konklusion

Alle computerne kom til at fungere med leJOS, og vi fik udarbejdet en løsning til de fleste af ugens opgaver. Vi har lært hvordan Ultrasonic sensoren opdager objekter ved at udsende en kort høj-frekvens lyd og lytte for genlyde, samt hvordan vi kan bruge den til at måle afstand til objekter med vores robot. Undervejs i løsningen af opgaverne opdagede vi hvordan den fysiske virkelighed nogle gange registreres ukorrekt af en robots sensorer, hvilket kan have store konsekvenser, når man bruger close loop control - netop at man forsøger at korrigere for noget der ikke kræver korrektion. Typisk ved at køre ind i en væg.
Endvidere har vi forsøgt at tage feedbacken af vores blogindlæg fra sidste uge til os, idet vi har lagt ekstra vægt på at overveje adskillelsen af plan og mål samt tilføjet de punkter, som vi manglede (status, dato, varighed og deltagere). Vi har også prøvet på at være mere specifikke i henvisningerne til de guides og applikationer, som vi har brugt.

____________________________________________________________________________________________________________

1. https://services.brics.dk/java/courseadmin/DigitalControl/pages/Week+3+-+Sensing+and+Sensors+-+Analog|Digital+conversion
2. http://lejos.sourceforge.net/nxt/nxj/tutorial/Preliminaries/GettingStartedMac.htm
3. http://lejos.sourceforge.net/nxt/nxj/tutorial/Preliminaries/UsingEclipse.htm
4. http://lejos.sourceforge.net/nxt/nxj/tutorial/Preliminaries/GettingStartedWindows.htm
5. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson2.dir/SonicSensorTest.java
6. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson2.dir/Tracker.java
7. https://sites.google.com/site/digikaison/Tracker.java
8. http://www.philohome.com/wallfollower/wallfollower.nqc
9. https://sites.google.com/site/digikaison/WallFollower.java
10. Fred G. Martin, Robotic Explorations: A Hands-on Introduction to Engineering, Prentice Hall, 2001.

Thursday, February 7, 2013

Week 2

I vores første indlæg i gruppens lab-notesbog har vi forsøgt at følge anvisningerne fra kursets hjemmeside om, hvordan strukturen skal være.

Mål

Målet for første lab-session er at samle en robot i LEGO og eksperimentere med programmer til den og i den forbindelse lave øvelserne til denne uge.

 

 Plan

Vores plan for denne uge har været som følgende:
  • Installation af leJOS etc.
  • Samle robot af LEGO
  • Udarbejdelse af øvelser
  • Udforske LEGO Mindstorms muligheder og begrænsninger
  • Opsætning af blog.

 

Resultat

I vores gruppe er der både Linux, OS X og Windows 7/8 brugere og installationsprocessen har derfor varieret en del. Nedenstående afsnit beskriver nogle af de udfordringer, vi stødte på.

 

Installationsprocessen

Det lykkedes os ikke at få installeret leJOS på Linux Ubuntu, selvom der blev brugt mange timer både på at følge installationsvejledningen, læse på forum, samt endda at emulere Windows. Det var ganske enkelt for besværligt at få leJOS til at fungere med de gamle versioner af forskellige programmer, da de nyeste specifikt ikke understøttes. Brugeren af Linux besluttede derfor at skifte til Windows imens kurset står på.
Der var også en del problemer med at få leJOS til at virke på OS X. Selve installationen af de forskellige programmer, som det fremgik i tutorialen, at man skulle installere, gik fint, men da det blev afprøvet om et simpelt Java program kunne kompileres via terminalen, opstod der en fejl, som umiddelbart lignede et problem med, at miljøvariablerne ikke var blevet sat rigtigt. Efter at have søgt på internettet og prøvet diverse løsninger af, lykkedes det desværre ikke at finde en løsning på problemet. Et medlem fra en anden gruppe fortalte dog, at han havde fået leJOS oppe og køre på OS X ved at følge guiden til, hvordan man installerer leJOS pluginet i Eclipse, hvilket skulle virke ret ligetil. Dette er blevet installeret og vil blive afprøvet i forbindelse med næste lab-session.  
Installation på Windows fungerede i løbet af ca. en halv time inklusiv installering af Bluetooth, så det er muligt at uploade programmerne til robotten trådløst.

Øvelser

Det første vi gjorde i forbindelse med øvelserne til denne gang var at kompilere og uploade Java-programmet LineFollower til den robot, vi har bygget. Dette program gør, at robotten kan følge en sort linje på en hvid baggrund, som vist på nedenstående billede.
























Opgave 1

Denne opgave gik ud på at placere lyssensoren over forskellige farver og måle lysværdierne. Nedenstående billede viser, hvilke farver, der blev brugt til i forbindelse med at bestemme lysværdierne.

























De forskellige lysværdier kan ses i nedenstående tabel:
Sort
35
Mørk grå
42
Blå
33
Rød
54
Grøn
37
Turkis
33
Gul
60
Lilla
47
Lys grå
48
Hvid
60

Lyssensoren opfatter lys på en skala fra 0 til 100, hvor 100 er meget lyst og 0 er mørkt. Da vi finder frem til hvilke lysværdier sort og hvid har, kan vi vælge en grænseværdi, der er imellem disse to lysværdier (35-60) for at afgøre, hvornår vi går fra sort til hvid. Programmet antager så, at lyssensoren er over et sort område, når lysværdien er under den gældende grænseværdi og over et hvidt område, når lysværdien er over grænseværdien.

Opgave 2

I denne opgave skal vi igen måle lysværdierne ud fra de samme farver, men denne gang med lyssensorens røde LED lys slået fra, så sensoren ikke længere måler reflektionen af det røde LED lys'. Derimod bliver det omgivende lysniveau målt. Nedenstående tabel viser de målte lysværdier med det røde LED lys slået fra.
 
Sort
18
Mørk grå
23
Blå
25
Rød
30
Grøn
23
Turkis
22
Gul
29
Lilla
29
Lys grå
25
Hvid
31

Opgave 3

I programmet er der sat en forsinkelse på 10 millisekunder mellem lyssensorens læsninger. I denne opgave har vi prøvet at ændre måleintervallet til 100, 500 og 1000 millisekunder. Når hastigheden på sensorlæsningen bliver sat ned, tager det længere tid for robotten at finde ud af, at den skal dreje, og derfor kommer den for langt væk fra den sorte streg til at kunne finde tilbage på en hensigtsmæssig måde.

 Opgave 4

Vi har i denne opgave brugt dataloggeren til at indsamle data fra robottens sensor, i dette tilfælde lysværdierne i forskellige udvalgte intervaller. De indsamlet data har vi brugt til at lave nedenstående grafer, hvor man kan se, hvordan de forskellige tidsintervaller påvirker udsvingene i grafen.






Opgave 5

I denne opgave skulle vi prøve at bruge tekststrenge direkte i kaldet til LCD.drawString i stedet for variablerne left og right, samt bruge Runtime.getRuntime().freeMemory() til at vise mængden af fri hukommelse på heapen gennem kørslen. Vi prøvede at logge heapens størrelse både med en streng direkte i drawString kaldet, med en streng som variabel, med en final streng og helt uden noget logik i while-loopet. Størrelsen af heapen var meget ens og steg og faldt næsten synkront for alle fire situationer.

 Konklusion

Denne uge har vi fået styr på de helt praktiske ting med at få leJOS til at køre - i hvert fald på Windows - samt bygget en funktionel robot og sat en blog op, hvor vi kan føre vores lab-notesbog. Ugens opgaver omhandlede i stor grad at opdage, hvordan den fysiske virkelighed bliver opfattet; kort sagt, at robotten kun kan reagere på den virkelighed den har læst, at den kan have begrænsninger ift. reaktionstid, samt hvilke programmæssige "knapper" vi har at trykke på, når vi senere skal til at programmere et eller flere adfærdsmønstre. Særligt logging kommer til at være rart at kende til senere brug. Vi har også fået en kendskab til, hvordan lyssensoren fungerer, og hvordan vi kan ændre indstillingerne for denne programmæssigt.
Bortset fra vores overraskende resultat med de deklarerede objekter og garbage collection (svingende hukommelsesbrug), har ugens opgaver dog været til at forstå og opført sig stortset som forventet.