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
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.
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
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.
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


No comments:
Post a Comment