torsdag den 16. februar 2012

NXT Programmering, Lesson 3

NXT Programmering, Lesson 3
Varighed: 4 timer
Deltagere: Mikkel, Troels, Jesper, Bjarke

Formål
I denne lab-session vil vi udvide vores robot med to lyd sensorer og undersøge hvordan disse kan bruges til at styre robotten på forskellige måder. Derudover vil vi lære at bruge en datalogger Java-klasse til at indsamle data, der kan eksporteres til en computer til videre behandling.

Plan
Følgende plan er baseret på [1].
1. Udvid robotten fra uge 2 med NXT lydsensoren, som beskrevet i bygningsmanualen [3].
2. Skriv et program der tester lydsensorerne og udfør en række tests, som beskrevet i [1].
3. Udvid programmet fra punkt 2 med en datalogger og eksporter den samlede data til computeren. Herefter plottes den indsamlede data i en graf. 
4. Implementer "sound controlled car" [7] og eksperimenter med dennes opførelse.
5. Undersøg hvordan et klap kan genkendes og anvendes til styring af robotten, baseret på [2]
6. Udvid robotten med endnu en NXT lydsensor.
7. Implementer et program der vha. input fra de to lydsensorer kan styre imod en lydkilde.

Resultater
1. Vi har udvidet robotten efter anvisningerne i [3]. Ved samme lejlighed har vi udvidet robotten som planlagt i punkt 6, for at samle mere data og lære om hvordan sensorerne opfanger lyd.

2. For at hente værdien ud af sensorerne har vi anvendt readValue() og skrevet dem på display'et.
public int readValue() 
Read the current sensor value. 
Returns: 
value as a percentage.

Beskrivelsen af readValue() kan ses ovenfor og programmet kan findes her [4].
Værdien er klart sammenhængende med amplituden og afstanden til mikrofonen. Derimod ser frekvensen ikke ud til at påvirke den målte værdi. Dette nåede vi frem til ved at måle en tone med konstant amplitude med varierende frekvens. Dette gav ingen nævneværdige udslag.

3. Vi har anvendt en let modificeret udgave af DataLogger.java til at samle lyd-data fra robotten [5]. 

Den indsamlede data hentede via programmet nxjbrowse. Det er et javaprogram der tilgår hukommelsen på robotten og kan eksportere den indsamlede data til et tekst dokument. Programmet startes med kommandoen nxjbrowse i commandopromten i windows, forudsat at softwaren er opsat som beskrevet i uge 1. 

Vi har lavet to indsamlinger der kan ses plottet på en graf herunder. Dataen kan findes her [6]:
Første graf er tilfældige lyde og anden er klap udført tæt på sensoren. 


4. Vi implementerede indledningsvist "sound controlled car" [7]. Denne implementation starter begge robottens motorer på 100, ved første lyd på over 90. Anden lyd på over 90 får bilen til at dreje mod højre, derefter venstre og fjerde lyd stopper den. 


Dog kan man ikke kan stoppe robotten før den er nået igennem hele dette loop. Dette ændrede vi ved at tilføje en boolean variabel kaldet run. Variablen starter som true og bliver ændret til false når et tryk på escape knappen registreres. Dette gjorde vi ved at tilføje en ButtonListener til escape knappen:

Button.ESCAPE.addButtonListener(new ButtonListener() {
@Override
public void buttonReleased(Button arg0) {
}
@Override
public void buttonPressed(Button arg0) {
run = false;
}
});
Derudover sørgede vi for, at while loopet inde i metoden waitForLoudSound også var afhængig af at run er true. Koden kan findes her [8].

5. For at lave en robot der kan startes og stoppes vha klap, skrev vi et program fra bunden. Indledningsvist baserede vi koden på [2].

Programmet består af et ydre while loop, der forsøger at genkende en klap lyd. Hvis lyden registreret af sensoren er under et 'lower threshold' starter et indre while loop der varer i 25 ms. Dette 'lytter' efter en lyd på over et 'upper threshold', hvilket et klap gerne skulle ligge over.
Hvis en lyd der er højere end 'upper threshold' registreres startes endnu et loop der over 250 ms poller om lyden falder til under 'lower threshold' igen. Hvis dette sker vil robotten genkende det som et klap.
Et klap skifter mellem robottens to tilstande: Stå stille og kør fremad. Koden findes her [9].



For at finpudse vores variable og lave bedre data indsamling, har vi udvidet DataLogger.java, således at vi også kan sende en streng med. Dette gør det muligt at tilføje beskeder til de målinger vi sender til dataloggeren, hvilket gør det lettere at tolke dataen.
public void writeSample(String message, int sample)
Tilføjer en linie data på formen: message + ": " + sample
Desværre fanger koden ikke udelukkende klap og nogle klap bliver umiddelbart ignoreret. Vi mistænker at baggrundsstøj fra bl.a. robottens egne motorer, samt at variablerne ikke er tweaket tilstrækkeligt kan være årsagen. Dette vil kræve en nærmere undersøgelse af målinger foretaget under kørsel.


6. Som beskrevet lavede vi tidligere denne udvidelse.


7. Koden til at vores Party Finder Robot, fungerede indledningsvist ved at de læste værdier fra hver sensor blev sammenlignet, hvorefter robotten ville køre fremad med forskellig power på hvert hjul. Denne power blev bestemt ud fra hvilken sensor der målte den højeste værdi, således at robotten ville dreje i den retning der målte den højeste lyd.


Desværre opførte robotten sig aldrig konsistent. 
Baseret på output fra robotten konkluderede vi, at hver enkelt måling ikke var konsistent nok, da almindelige lyde (musik, snak, klap, mm) generelt ikke ikke opfanges ens af hver sensor. Vi ændrede derfor programmet til at kigge på gennemsnittet over de seneste fem målinger og tilføjede et interval der tillod målinger fra sensorerne at varierer uden at det påvirkede robottens retning.


Dette virkede heller ikke som forventet. Målingerne fra sensorerne gav fortsat målinger med så store forskelle at robotten i højere grad roterer omkring sig selv, istedet for at søge imod en lydkilde. 


Vi mistænkte de to sensorer for ikke at måle lyd ens, hvilket vi testede ved at lade en computer afspille en konstant sinus-tone. Desværre viste dette, at de begge optog samme lyd, hvorfor der måtte være andre fejlkilder. 
Med denne konklusion indstillede vi arbejdet med robotten. Koden kan findes her [10].

Status
Vi fik udvidet robotten med to lyd sensorer og testet at begge kunne registrerer lyde. Vi lavede en række tests hvor vi optog lyde og eksporterede dem til computeren, hvor vi kunne lave grafer over lyden. Desværre måtte vi senere erkende at vores tilgang til de tests vi lavede ikke havde været tilstrækkelig striks. Vi manglede indsigt i hvordan lyden blev opfanget helt tæt på og hvor hurtig de målte værdier falder når afstanden til lydkilden forøges. At vi ikke gjorde os disse erfaringer her, blev et problem da vi i senere opgaver skulle finde fejlkilder og sætte variabelværdier.


Vores ClapCar implementation er ikke tilstrækkelig robust. Den ignorerer nogle klap og reagerer også på lyde, der ikke er klap. Vores vurdering er, at dette må skyldes variable der ikke er tweaket korrekt nærmere end fejl i koden. 


Slutteligt blev vores Party Finder Robot aldrig egnet til at finde fester. Som beskrevet bevæger den sig ikke konsistent mod en lydkilde, da vi ikke får konsistente målinger ind fra de to sensorer. Umiddelbart virker begge sensorer dog ens, så der må være andre fejlkilder der påvirker vores resultater.

Referencer
3. LEGO Mindstorms Education NXT Base Set 9797 building instruction, side 24-26.
4. http://dl.dropbox.com/u/357278/Lego/SoundSensorTest/SoundSensorTest.java
5. http://dl.dropbox.com/u/357278/Lego/DataLogger/DataLogger.java
     http://dl.dropbox.com/u/357278/Lego/DataLogger/SoundSampling.java
6. http://dl.dropbox.com/u/357278/Lego/DataLogger/FirstSample.txt
    http://dl.dropbox.com/u/357278/Lego/DataLogger/FourClapsSample.txt
7. http://legolab.cs.au.dk/DigitalControl.dir/NXT/Lesson3.dir/SoundCtrCar.java
8. http://dl.dropbox.com/u/357278/Lego/SoundCtrCar/SoundCtrCar.java
9. http://dl.dropbox.com/u/357278/Lego/ClapControlledCar/ClapCar.java
10. http://dl.dropbox.com/u/357278/Lego/PartyTeddy/PartyTeddy.java

Ingen kommentarer:

Send en kommentar