onsdag den 12. december 2007

Vejfinder 4

Blog4:

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

Idag skal vi videre med MapMaker UIen, så den kan vise vejstykkerne. Vi vil oså udbygge Bluetooth API'et til at kunne hente de fundne blocks fra NXTen. Vi skal desuden begynde implementeringen af vores BlockGrid.

  • Få pc programmet til at tegne vejblokke i et grid system.
  • Udvidde Bluetooth API'et til også at kunne sende blocks til PCen
  • Arbejde videre med NXTens grid block system.

Tegne vejblokke i map maker programmet

Vi fik implementeret tegning af vejblokke i vores map maker. Den kan nu, givet en BlockType, tegne et vejstykke i en given grid-position. Billederne bliver loaded med et lille trick: via et ImageIcon får vi adgang til billeddata:

Image img = new ImageIcon(pathToImageFile).getImage();

Alle 4 typer vej[vejstruktur] kan hentes ind og vises, indtil videre ignoreres en eventuel rotation af vejblokken dog.

Selve korttegningsalgoritmerne er implementeret i MapZonePanel, som er en extension af JPanel, hvor paintComponent(Graphics g) methoden er reimplementeret til at tegne vores kort.

BlockGrids og sammenhængen med BlueTooth

For at opbygge et kort er det naturligvis nødvendigt at have en måde at repræsentere det på. Når det skal sendes over BlueTooth er det upraktisk blot at have det repræsenteret i form af Blocks og deres indbyrdes links til hinanden. Derfor har vi tilføjet et BlockGrid, som er en beholder (i software-mæssig forstand), som kan indeholde Blocks. I BlockGrids kan det lade sig gøre hurtigt og nemt at tilgå Blocks via deres position i et net. Dette gør det nemt at overføre hele det opbyggede kort fra NXTen til en computer, hvilket kan ske blot ved at gennemløbe alle de Blocks, som findes i nettet.
En anden vigtig effekt af at have et net istedet for blot kæder af Blocks er, at det vil blive nemmere at gennemskue komplekse sammenhænge - som f.eks. en situation, hvor en lang kæde af Blocks leder tilbage til den samme start-blok, eller hvor en kæde af Blocks krydser sig selv.

NXTen skal selvfølgelig have mulighed for at sende det opbyggede kort til en central computer således at mennesker har mulighed for at forstå kortet. Som nævnt andetsteds benytter computer-programmet en pull-teknik til at samle data op fra NXTens kort-lager. Dette sker i BTCommunication-klassen, hvor kommandoen "MAPREAD" modtages og behandles. Alle blokkene i det centrale kort, der er opbygget i NXTen, kan på denne måde overføres blok for blok med information om deres position, type og rotation. I tilfælde af at NXTen, i sit forsøg på at opbygge et kort, er stødt på en blok, som den enten endnu ikke er færdig med at identificere, eller hvor blokken er identificeret forkert, kan dette kommunikeres tilbage. Den interessante del af protokollen kan findes i kommentaren i Protol.java:

/**
 * MAPREAD asks the NXT to send the entire map that it has built
 * pc: MAPREAD
 * nxt: #blocks (may be 0)
 * for (blocks){
 *     nxt: (int) xposition
 *     nxt: (int) yposition
 *     nxt: (int) type
 *     nxt: (int) detectedType
 *     nxt: (int) rotation (-1 if no correct type or inconsistent block)
 *     nxt: (int) detectedTypeRotation (-1 if not detected)
 * }
 */
Som det kan ses starter den centrale computer med at spørge efter kortet, hvorefter NXTen svarer ved at fortælle hvor mange blokke den har opdaget, efterfulgt af en liste af information omkring hver af disse blokke.

Konklusion

Idag blev vi næsten færdige med map maker programmet. Efter at Bluetooth-kommunikationen omkring polling af blokke fra NXTen til PCen kom til at virke, kan map maker nu tegne kortet, som det er gemt på NXT'en - dog i øjeblikket uden rotationer af vejblokke. Et lige stykke vej vil derfor f.eks. altid være orienteret som "-" og aldrig "|"; det skal ordnes imorgen.

Noter

  • [Vejstruktur] I modsætning til andre tidligere eksperimenter med område-mapping (som f.eks. Maja J Mataric, Integration of Representation Into Goal-Driven Behavior-Based Robots, in IEEE Transactions on Robotics and Automation, 8(3), Jun 1992, 304-312.) giver legopladerne anledning til en stærkt struktureret "verden" for robotten. Der er f.eks. ikke veje som fylder mere end én blok, eller hvor vejen kræver at man sætter blokkene sammen forskudt for hinanden. Denne simplifikation gør det nemmere at repræsentere kortet.

Ingen kommentarer: