mandag den 10. december 2007

Vejfinder 2

Blog2:

Varighed: 7 timer, Deltagere: Mads, Rolf og Janus

Dagens plan er at få sat projektfilerne op i netbeans og starte på de forskellige interfaces (i Java).

  • Opsætning af det softwaremæssige arbejdsmiljø
  • Forsøg med BlueTooth-kommunikation
  • Udformning af et fælles sæt af domæneobjekter (objekter fra vejfinder-domænet)

Netbeans, lejOS og hvordan det hele virker

Vi valgte at prøve at få LeJOS og NXT compiling til at virke igennem Netbeans eftersom dette er vores foretrukne udviklingsmiljø.

Vi fik det til at virke ved at "stjæle" et build.xml script fra en af lejos sample-filerne og så tilrette denne til at virke med vores projekt.

Det rettede build.xml script:build.xml
Den rettede build.properties:build.properties

Ved hjælp af disse 2 filer kunne vi importere vores nye VejFinder-projekt som et Netbeans projekt med eksisterende Ant script (build.xml).

De første tests med BlueTooth

Først ville vi gerne bare kunne sende et eller andet for at teste Bluetooth. Det kunne f.eks. være en "int" eller en "String", hvor vi kunne printe denne til LCD'en, så vi kunne bekræfte at vi havde korrekt fat i kommunikationen imellem PC og NXT. Derfor satte vi os til at kigge på Bluecove API'en, for at finde ud af hvordan det hele virkede.[bluecove]

De første tests gik godt og efter lidt tid havde vi nu en java klasse, som kunne finde Bluetooth adapteren på pc'en; og via den scanne efter og finde vores NXT.

Her løb vi ind i vores første problem, da API'en fra BlueCove er lidt svag lige omkring hvordan man rent faktisk opretter en forbindelse til et "RemoteDevice", som er den klasse man står med efter at man har fundet en anden Bluetooth enhed.
Vi fandt dog ud af, at man skulle lave en yderligere ServiceSearch på dette device for at få den URL, som man skal connecte til. Nu fik vi åbnet en forbindelse til NXT'en, og vi forsøgte derefter glade at sende en String via OutputStream'en fra connectionen. Denne blev dog ikke opdaget af NXT'en, som overhovedet ikke lod til at have modtaget noget i det hele taget.

Efter mange timers tests/forsøg endte vi med at kunne sende "noget", så NXT'en mente at den modtog noget. Den mente desværre bare ikke at det den modtog var det samme, som det vi mente at vi sendte!

Imorgen vil vi kigge nærmere på at oprette Bluetooth forbindelsen via de klasser der findes i "lejos.pc.comm" - en pakke, som vi netop fandt ud af eksisterede!

Domænespecifikke objektstrukturer

Inden for vores kortlægningssystem har vi valgt at lave en fælles repræsentation af et vejfelt, kaldet Block (blok).
En blok har en type, der kan findes i BlockType. Typen er en af CROSSING, TCROSSING, TURN, STRAIGHT eller UNKNOWN. Grunden til at der findes en ukendt type er, at mens kortet bygges op, kan en blok måske være ukendt, indtil samtlige ud- og indgange til denne blok har været besøgt.

En blok har derudover en position, som fortæller hvor denne blok er placeret. Vi har valgt at robotten altid befinder sig på (0,0) og peger mod "øst" i koordinatsystemet når den starter og hver blok er præcis 1 enhed lang. Hvis robotten kører fremad 1 felt vil den således befinde sig i (1,0). Hvis den istedet drejede til højre og kørte fremad 1 felt ville den være i (0,1).

Ud over en type og en position har en blok også en række forbundne nabo-blokke. Der kan kun findes forbindelser til naboer i de fire retninger, som er defineret i Direction (NORTH, SOUTH, EAST, WEST). Alt efter hvilken type blok, der er tale om, kan to eller flere af disse være sat til at referere til en anden blok (det er også tilladt kun at have én eller ingen sat under opbyggelsen af kortet men blokken er i så fald ikke "veldefinerede").


Figur: Illustration af hvordan en blok er defineret.

Alt efter i hvilke retninger der findes forbindelser til nabo-blokke, er det muligt at finde typen af en blok (via. detectType() eller getType() hvis den direkte er sat). Derefter kan man undersøge hvordan blokken vender (via getRotation()). Dette er specielt nyttigt i forbindelse med kommunikationen med den centrale computer-enhed.


Figur: De forskellige block-typer og rotationer er samlet i tabel-form med rotationsværdier i toppen, typeværdier til venstre og konstant-navne til højre.

I første omgang ville vi gerne have at en blok kunne repræsentere sig selv i tekstuel form - f.eks. som "[(x,y), type, rotation]". Dette blev vi dog nødt til at fjerne fra systemet, da lejOS havde en fejl i implementationen af StringBuffer, som bevirkede at man ikke kunne tilføje strengværdien af et heltal til en streng blot ved den normale Java brug:

String string = "[("+xPosition+","+yPosition+"),"+getType()+","+getRotation()+"]";
Det ovenstående oversætter kompileren til en liste af StringBuffer kald. Problemet er at så snart StringBuffer.appendInt(int) bliver kaldt, opstår der en uendelig løkke i lejOS firmwaren på NXTen. LejOS-udviklerne er blevet gjort opmærksomme på problemet og en rettelse vil være med i næste udgave af firmwaren. En midlertidig løsning er at lave nye Integer objekter for hver gang man vil tilføje et heltal - så kan man bruge StringBuffer.appendObject() istedet for StringBuffer.appendInt():
String string = "[("+new Integer(xPosition)+","+new Integer(yPosition)+"),"+new Integer(getType())+","+new Integer(getRotation())+"]";
Det eneste tilbageværende problem er så at lejOS ikke har en garbage-collector. Der vil derfor være en del hukomelses-spild ved denne metode.
Som endelig løsning valgte vi at flytte ansvaret for tekstuel repræsentation væk fra Block og ind i de klasser, som kommunikerer med den centrale computer. Ved at gøre dette kan vi istedet sende informationerne i seperate pakker og kan derfor undgå at skulle repræsentere dem som tekst-strenge.

Konklusion

Vi fik opnået det meste af det som vi ville idag. F.eks. virker lejos nu under Netbeans, så vi kan bruge denne til udviklingen. Vi fik også udført en lang række tests af Bluetooth-kommunikationen - og selvom det ikke virkede helt rigtigt er vi nu sikre på, at vi er så langt i processen, at det vil komme til at virke imorgen.

Vi fik startet på projektets klasse-struktur og nåede alt i alt en helt masse. Fundamentet er nu lagt for at kunne komme videre med VejFinder!

Noter

Ingen kommentarer: