søndag den 21. september 2008

Legolab week 4.

Test af lydsensoren.

Dato: 21/9 2008

Forsøg:
Lydniveauer fra forskellige afstande og forskellige lyde.


Lydniveau målinger.
Vi har konstrueret et program der måler lyden og gemmer målingerne i en datafiler. Vi har så plottet datafilerne. Først har vi målt knips, klap og fløjten i en afstand af 30 cm., dernæst fra 1 m.




Målinger fra 1 meters afstand.


Da der er noget spændende støj på målingen af klappet, har vi lavet en ny måling fra en meter afstand hvor vi kun klapper 2 gange.

På målingen ses at der mellem klappene igen fremkommer støj med en lignende frekvens, for at finde ud af hvad baggrundsstøjen er har vi lavet en måling hvor der ikke blev larmet.



Det er tydeligt at der er en baggrundsstøj med en frekvens på ca. 3,2hz. Det er samme frekvens der er observeret i målingerne for klappene. Derfor skyldes de lydbølger, der er opfanget efter klappet ikke selve klappet, men at der er 3,2hz baggrundsstøj med maks værdi på 4-5.
Med baggrund i denne information kan man se at Jack stortset ikke kan skelne knips fra baggrundsstøjen. Derimod kan han tydeligt høre hvis man fløjter eller klapper. Selvom vi med 1 meter forsøgene var 3 gange længere væk end ved 30cm forsøgene så opfanger Jack stadig meget af lyden. Det vil derfor være svært for Jack at bruge lyden til at bedømme afstand til objekter.


Program der opfanger klap til at styre bilen.
For at vide mere om klaps natur har vi lavet en højopløst graf af et klap.

For at se hvad støjen ved tale er har vi snakket mens Jack lyttede på.

Ud fra graferne har vi valgt at implementere en klasse som kan kører i sin egen tråd og lytte efter klap, så vi kan styre Jack med klap for fremtiden.

Programmet ser således ud:

public class Clapclass extends Thread

{


private static SoundSensor ss = new SoundSensor(SensorPort.S2);

private static final int BACKGROUND_NOISE = 30;

private static final int CLAP_NOISE = 70;

private static final int CLAP_SPIKE_TIME = 25; //millisecond

private static final int CLAP_SUBSIDE_TIME = 125; //millisecond

private static final int WAITTIME = 5; //millisecond


private boolean running;

private int clapStartTime;

private boolean clapping;

private boolean newClap;


public Clapclass(){

running = true;

clapping = false;

newClap = false;

}


public void run(){

int prevSound = ss.readValue();


while(running){

int sound = ss.readValue();


if (!clapping){

clapStartTime = (int)System.currentTimeMillis();

clapping = true;

}else{

int clapTime = (int)System.currentTimeMillis();

if (clapTime <= (clapStartTime + CLAP_SPIKE_TIME) && sound >= CLAP_NOISE){

// Clap starting

clapTime += WAITTIME;

}else if ((clapStartTime + CLAP_SPIKE_TIME) <>

&& clapTime <= (clapStartTime + CLAP_SPIKE_TIME + CLAP_SUBSIDE_TIME)

&& sound <= prevSound){

// Clap subsiding

clapTime += WAITTIME;

if (sound <>

// Clap over

Sound.playTone(440, 1000);

newClap = true;

clapping = false;

}

}else{

// The clap didn't meet the criteria

clapping = false;

}

}

prevSound = sound;


try { Thread.sleep(WAITTIME); }

catch (InterruptedException _) {}

}

}


public boolean pollClap(){

if(newClap){

newClap = false;

return true;

}

return false;

}

}


Ud fra vores data har vi valgt at sige at et klap kan starte ved enhed 70, i stedet for højere. Vi har også valgt at sætte vores baggrundsstøj til 30, så vi kan tale i baggrunden, jvf tale diagrammet ovenfor. Dette har påvirket den tid det ta'r før klappet er 'ovre', dvs lydstyrken for klappet ikke kan kendes fra baggrundsstøjen, så denne er blevet reduceret.


Som noget fremtidigt skal klassen udvides til at gemme de sidste x antal klap og kunne genkende dobbeltklap, måske også huske en højeste lydstyrke, således at den kan bruges til at styre robotten. :)

torsdag den 11. september 2008

Legolab week 3

Den ultrasoniske sensor:

Egenskaber for sensoren:
Vi har lavet 2 forsøg for at finde den vinkel, sensoren kan se ud til siderne med.
De 2 forsøg er lavet med en plade der stod foran Jack, men forskudt til den venstre side, som første billede illustrerer. I andet forsøg er pladen vinklet iforhold til Jack, så ultralydsbølgerne lettere kan komme tilbage til modtageren. (Billede 2).

Forsøg 1.
Pladen er placeret så langt mod venstre, som det var muligt, således Jack stadig kunne se pladen. lyden må således forventes at være reflekteret på pladen ved det markerede sted (Lille pink streg).
Vinkel mellem Jacks ultralydssensor og pladen, blev målt til 23.5 grader.

Forsøg 2.
Dette forsøg minder om forsøg 1. Vi har her vinklet pladen så lydbølgerne får retning mod jack, når de rammer pladen. Ved dette setup, kan Jack opfange pladen når den står optil 30grader fra dens direkte synsfelt. Forklaringen på at dette hjælper , er at bølgerne, som kommer tilbage er meget svagere end dem der bliver sendt ud. Bølgernes styrke aftager ca. proportionalt med den afstand de sendes gennem luften.



Da lyd bevæger sig med ca. 340m/s i atmosfærisk luft, tager det ca 15ms for en lydbølge at bevæge sig frem og tilbage fra et objekt der er 2.5m væk. 2.5m er den afstand vi kan måle med den ultrasoniske sensor.
Antaget at man så tilføjer en sikkerhedsmargin på 5ms , så man ikke risikerer at objekter der er lidt over 2.5m væk forstyrrer ens målinger , skal man afsætte omkring 20ms til en sample. Det giver en sample frekvens på 50hz.


Trackeren:
Når Jack kører tracker programmet, forsøger han at opnå en afstand på 35 cm til det objekt han kan se. Ser han intet kører han bare ligeud indtil han ser et. Måden han forsøger at ramme de 35 cm er ved reactive control, dvs Jack bare reagerer ud fra hvor han ser væggen og hvor tæt på væggen han er. Jacks afstand fra hans mål, hans error, bruges til at beregne et gain, som multipliceret med error giver en hastigheds nedsættelse. Denne skal hvis den er kalibreret rigtig gøre at Jack ikke overskyder sit mål og ender med at oscillere omkring sit mål. Metoden er også kendt som proportional derivative (PD) control.
Vi har udvidet Jack med proportional integral derivative control, ved at bruge Motor klassen i stedet for MotorPort, da Motor bruger tachometeret til at se integrere over motorens rotation.
Som udgangspunkt oscillerer jack med ~1-2 centimeter omkring hans mål. Noget af denne oscillering skyldes at Jack er sat til at sove hver 300 msec, og noget af den skyldes at Jack faktisk ikke er programmeret til at stå stille hvis han opnår sit mål. Så noget af det første der skulle gøres ved Tracker klassen var at fjerne sleep, for at få målinger noget oftere. Dernæst satte vi Jack til at stoppe sine motore hvis hans error var 0.
Dette gjorde at vi kunne få Jack til at stoppe ved hans mål uden at pille ved gain.

tirsdag den 2. september 2008

Legolab week 2

Når Captain Jack bruger sin lyssensor med floodlight slået til, ser han hvor meget ting under ham reflekterer. Farverne sort og hvid fungere på den måde at de reflektere hhv. mindst og mest lys. Jack bruger så en tærskelværdi til at afgøre om han befinder sig på noget sort eller hvidt.

Vi har brugt standardværdien på 45, hvilket fungerede glimrende ved test. Hvis ikke den havde virket, så ville vi kunne finde det ved at tage de to ekstremer (helt hvid og helt sort) og vælge en tærskel midt mellem de to.

Farvetabel
Yellow 55%
Black 52%
Red 49%
Green 37%
Blue 32%
White 30%
Lyssensoren måler lysstyrke og ikke i farver, hvilket i tabellen kan ses da der næsten ikke kan skelnes mellem hvid, blå og grøn eller rød, sort og gul.

Hvis vi sætter lyssensoren til at måle på ambient light kan Captain Jack ikke længere følge en sort streg, da han måler baggrundslyset, så i et ekstremt case kan han dreje højre om sig selv hele dagen og venstre hele natten.

Med en linjetykkelse på cirka 2cm kunne Jack sagtens følge den rundt med sleep tid på 100 og naturligvis med en sleeptid på 10. Sætter vi Jack til at opdaterer hvert sekund havde den stakkels kaptajn nærmest ikke en chance for at opfatte linjen og der udbrød stor jubel da han en enkelt gang spottede den.
I et så simpelt program som giver det faktisk ikke mening at ha sat sleep værdien så højt da vi ikke skal bruge processortiden til andre ting, så en værdi på 100 eller 10 må siges at være bedre.

Ved at bruge de prædefinerede strenge til output, havde heapen hele tiden 52448 enheder fri. Men skiftede vi til at skrive strengene direkte til lcd displayet, kunne vi se hvordan heapen fik mindre og mindre fri plads i takt med at flere streng objekter blev oprettet pr. iteration. Til sidst måtte garbage collectoren sætte ind, så mængden af fri heap lå imellem ~52448 og ned til ~0.

It lives!

The monster has awakened...


Polly want's a cracker? Yarr... Captain Jack will bring Polly one.