fredag den 31. oktober 2008

Uge 8; Braitenberg vehicles

Deltagere:
Morten, Lars og Thomas.



Tom Dean figur 1.
Goal:
Med inspiration fra Tom Dean og Braitenberg, vil vi eksperimentere med simple kontrolmekanismer, ie. analoge følere simuleret i NXT'en og forbundet på forskellige måder.
I følge Tom Dean kan vi igennem eksperimenterne forvente at se opførsler, der af uoplyste mennesker nemt kan misforståes og tillægges en psykologisk egenskab eller tolkes som en form for bevidsthed.

Meningen er at bygge simple kontrolmoduler, der så kan forbindes forskelligt og vægtes forskelligt i en større fælles kontrolenhed.
Et andet mål med eksperimenterne er at finde ud af hvorvidt denne simple styring, vil kunne gøre det ud for en kæmpehjerne, med en forholdsvis stor mængde conditional branching.

Plan:
Der skal programmeres en java-klasse, der kan modellere en enkelt analog sensor.
Sensoren skal have en metode, der kan returnere et tal der mapper til et input power til en MotorPort. Den fysiske lego model bliver blot en modificeret udgave af vores LineFollower robot, hvor lyssensorerne peger fremad i stedet for nedad.
Vehicle 1, figur 2
Ved hjælp af disse komponenter vil vi lave vehicle 1 på Dean's figur 1.
Herefter vil det være nemt at konstruere vehicle 2a og vehicle 2b. Ved at instanciere to nye sensorklasser eller vehicle 1, og så forbinde sensor og motor med symbolske ledninger i java main-metoden.

Activities:
Vehicle 1, 2a, 2b:
Vehicle 1 konstrueredes gennem javaimplementationen OldLight.java og V1.java
OldLight nedarver fra Thread så den kan løbe uafhængigt af klassen Car.
I V1 oprettes en ny OldLight med en sensorport som argument. Oldlight har en metode 'readValue()' der returnerer en heltals værdi mellem 0 og 100 der passer til motorportens controlMotor(int a, int b).

V2a.java og V2b.java konstrueres ved som en aggregering af 2 stk OldLight og Car-klassen.

Car-klassen er til denne uges opgaver blevet udvidet, med yderligere metoder til hjælp i de tre vehicle klasser.

I ovenstående, er den værdi der overføres mellem sensor og motor baseret på mængden af lys, dvs. at jo mere lys der observeres, jo større værdi sendes ud til motoren.
Om der er mere eller mindre lys end før, bestemmes ved at sammenligne med gennemsnittet af hvad der er målt før. Dvs. hvis den nuværende sampling er over den forventede værdi så er det ensbetydende med at der er mere lys og derved sendes der en større værdi ud til motoren.

Inhibition (-):
V2bminus.java er et forsøg på at gøre det omvendte i forhold til ovenstående. Bilen starter ud med at køre med fuld power, og når den møder kraftigere lys mindskes den værdi der sendes ud til motoren.

Omkring maxlight og minlight:
Disse bruges i normaliseringen af den målte lysværdi til outputtet.
Der er lavet to versioner af lyssensoren OldLight.java og OldLight2.java. I OldLight.java bruges 'Math.max()' til at tjekke om den nyligt målte lysværdi er højere end hvad der hidtil er set. I så fald gemmes den nye værdi i variablen 'maxlight'. Ligeledes for 'Math.min()' og variablen 'minlight'.

Det kan her nævnes at ved opstart af disse programmer måltes der indledningsvis en maxværdi på 48, dvs. maxlight blev ikke mindre end 48 selvom det var mørkt, ie. at lysniveauet faktisk blev udlæst til 24. Man kan forestille sig at der et eller andet sted under initialiseringen af sensorernes hardware er der blevet målt 48...

For kun at huske max og min værdier for de sidste N målte værdier, er der i OldLight2.java implementeret en form for cirkulær buffer af længde N. Den cirkulære sample buffer gennemløbes for hver runcycle, for at sætte variablerne maxlight og minlight.

Plansforbruget for algoritmen kan aldrig blive under O(n), men tidsforbruget pr måling kan forbedres. Lige nu er det også O(n), men hvis man tjekker om den værdi man smidder væk og den værdi man indsætter påvirker max/min, kan man gøre den forventede tid pr måling betydeligt bedre. Dette under antagelse af, at de værdier man måler er nogenlunde tilfældige. Worstcase-tiden stadig O(n), men de fleste gange vil den være væsentligt bedre,

Observationer:
Det vægtede gennemsnit blev brugt som en form for bang bang kontrol, - således at hvis der blev observeret mere lys end gennemsnittet indenfor de sidste 10 sekunder, vil robotten reagere. I udregningen af det vægtede gennemsnit, brugte vi variablen Beta, der blev sat som en magisk konstant, fundet ved eksperimentering.
Ved N sat til 250 huskedes den gamle værdi i ca. 8 sekunder.

Plan fremtid:
At påmontere et lys på toppen af NXT'en og eksperimentere med flere vehicles på samme tid, - for at se hvorledes de reagere i forhold til hinandens bevægende lyskilder.

onsdag den 15. oktober 2008

Uge 5+6 : Racing bots

Deltagere: Thomas og Morten.

Goal:
Målet med ugernes aktivitet er, at bygge og programmere en liniefølgende robot i stil med den allerførste. Et følgende mål med aktiviteten er, at få robotten til at følge den officielle bane hurtigst muligt.

Plan:
Indledningsvis konstruerer vi en robot med udgangspunkt i den første robot vi byggede, herefter afprøver vi denne med den sidste udgave af vores LineFollower program. Efter de indledende aktiviteter skal designet optimeres, både det fysiske design og programmet.

Activities:
Den første simple model optimerede vi med større hjul og flere lyssensorer og opnåede en omgang på banen på 24 sek. Herefter begyndte vi en radikal ændring af robotten, vi endte med at have en robot med gearing og drejeligt baghjul. Denne model viste sig at være så hurtigt, at vi havde væsentlige problemer med at holde den på banen og således fik vi ikke noget godkendt løb på banen.

torsdag den 2. oktober 2008

secrets...uuuuh!

Kommandoen til rent faktisk at køre et program der forbinder til NXT'en via bluetooth:

java -Djava.library.path=../../lejos_nxj/bin/ -cp ../../lejos_nxj/lib/pccomm.jar:. BTSend "navn" "adresse"

ps. stierne er relative i dette tilfælde...

look ma' allmost w/ no hands!


Første forsøg, upload af Sejway.java
med standard opsætning af variabler.

tagtagtag