torsdag den 20. september 2007

NXT Programmering, Lesson 3

Varighed: 3-timer, Deltagere: Mads, Janus og Rolf

Målet med dagens arbejde er at udvikle et system til at styre bilen fra sidste lesson ved hjælp af lyd. Til dette formål vil vi benytte lydsensoren fra NXT pakken.

Test af lydsensoren

For at undersøge hvordan lydsensoren virker udførte vi en del eksperimenter med forskellige lyde. En af de ting vi fandt ud af var at lydsensoren rapporterer lyd-niveauet i noget, der svarer til en decibel-skala. Denne værdi er dog ikke vægtet efter det menneskelige øre, så det er således muligt at få store udslag på lyde som ikke lyder tilsvarrende høje. F.eks. vil sensoren give et relativt stort udslag hvis man blot bevæger en håndflade imod den og stopper foran den. Denne bevægelse skaber et "stort" lufttryk ved sensoren, men bevægelsen ligger uden for den menneskeligt hørbare del af lydspektret.

På grund af sampling-hastigheden i testprogrammet vi brugte (300ms) gav klap foran mikrofonen ikke altid så store udslag som forventet (idet selve "energien i klappet" faldt imellem to samples).

Mikrofonen opfanger også en del af baggrundsstøjen i lokalet, det bliver vi nødt til at tage hensyn til når vi laver vores styring til robotten.

En lyd-styret bil

For at afprøve hvordan en mulig implementation af en lydstyring kunne virke testede vi programmet SoundCtrCar.java. Bilen skifter imellem 4 tilstande når den udsættes for lyde:

  • Stop
  • Frem
  • Venstre
  • Højre
Som standard benytter programmet threshold-værdien 90 for at se om input er kraftigt nok til at aktivere et skift imellem tilstandene. Hvis dette ændres til 20 reagerer bilen meget hurtigere, men den bliver også mere følsom over for andre urelaterede lyde i rummet.


Testprogrammet benytter polling til at se om escape-knappen er blevet trykket på, men det poller kun i det yderste loop. Derfor prøvede vi både at polle i de inderste løkker og også at bruge ButtonListener - begge dele virkede fint.

Klap-styret bil

Sivan Toledo mener at lydmønsteret for et klap optaget igennem lego's lydsensor er en lav basis i et stykke tid (f.eks. på under 50) efterfulgt af et stort udslag (f.eks. over 85), der falder tilbage under basis efter maksimalt 250ms. På denne måde vil Sivan fange at et klap er en enkeltstående ikke-vedvarende begivenhed.

Først implementerede vi en udgave af programmet, der ikke tog højde for startvineauet - med andre ord kunne man lave en lang, høj lyd, og robotten ville så starte/stoppe når lyden sluttede. Dette program opførte sig nogenlunde som SoundCtr.java fra forrige afsnit.
Dernæst lavede vi en ny udgave som huskede samples tilbage i tiden, så det var muligt at undersøge om der havde været stilhed før et stort udslag blev set. Denne udgave fulgte Sivan's lydmønster. Efter at have fået ondt i hænderne af at klappe begyndte vi at teste med korte og lange fløjt i stedet. Robotten kan fint skelne imellem korte og lange fløjt og reagerer korrekt ved at skifte tilstand ved korte fløjt og ignorere lange fløjt. Når der testes med klap eller fløjt er det ikke alle som bliver opfanget ved en threshold-værdi på 85, vi testede derfor en værdi på 45 istedet, for at se om mønsteret alene er godt nok til at se forskel på lydene. Dette var en stor success idet robotten nu kunne styres selv fra flere meters afstand - ganske morsomt!
Det eneste problem med den lave threshold-værdi var at hvis folk sagde/råbte korte ord ville det tælle som "klap" (hvilket vi dog har valgt at acceptere på grund af den ganske successrige klap-detektering. Sammenlignet med den simple form for klap-detektering fra SoundCtrCar er denne form for styring meget bedre idet ikke alle lyde aktiverer skiftet, kun korte kommandoer eller klap.



Konklusion

Vi har nået dagens mål.

Vi fandt ud af at mikronen ikke rapporterer lydniveauet i vægtet dB(A) men bare noget som ligner uvægtet (direkte) dB.

Det er vigtigt at sætte et fornuftigt threshold baseret på baggrundslyd i lokalet

Ingen kommentarer: