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

No comments:

Post a Comment