tirsdag den 11. december 2007

Vejfinder 3

Blog3:

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

Dagens plan er at få konstrueret et kommunikations-API til at kommunikere imellem NXTen og en central computer via Bluetooth. Samtidigt ønsker vi at begynde på at udforme algoritmen til at følge streger (i bund og grund en modificeret udgave af vores tidligere LineFollower, dog nu via positioning-klasserner fra lejOS).

  • BlueTooth API og tests
  • LineFollower oversættes til at understøtte positionering i et grid
  • Start af kortopbyggelsesalgoritme
  • Begyndelsen til PC ui'en som skal bruges til at vise det fundne kort

BlueTooth API og tests

Idag startede vi med at lave en simpel test med lejos.pc.comm-klasserne - og nu virkede det! Vi kunne sende "int" og "String" over Bluetooth og modtage dem igen. Det vil sige at kommunikationen virkede både fra PC->NXT og NXT->PC.

Vi fortsatte selve opbygningen af vores Bluetooth-kommunikations-API.
API'en består af en klasse kaldet "BTCommunication", som findes både på PC'en og på NXT'en. Denne klasse tager sig af at oprette forbindelsen og stille metoder til rådighed til at sende og modtage int/String over den oprettede forbindelse.

Eksempel på brug af BTCommunication til at oprette en Bluetooth forbindelse, lave en GREET udveksling og derefter lukke forbindelsen igen.
String ADDRESS = "001653005c81";
BTCommunication btComm = BTCommunication.getSingleton();

//Try and open a connection
boolean open = btComm.openConnection(ADDRESS);

if( open ) {
    try {
        //Send GREET, and wait for response, then sent our response!
        btComm.startSending(this);
        btComm.sendCommand(Protocol.GREET);
        String response = btComm.readString();
        btComm.sendString("WE_ARE_BORG");
        btComm.stopSending(this);
        System.out.println("NXT Greeted us with: "+response);
        btComm.closeConnection();
    }
    catch(IOException e) {
        System.out.println("Error communicating: "+e);
    }
}

Som det ses fra eksemplet bruger vi en startSending() / stopSending() kommando omkring det vi vil sende. Dette er for at sikre, at ingen andre threads bruger Bluetooth-forbindelsen samtidigt med at vi selv er igang med at bruge den.

På NXT-siden er BTCommunication en Thread, som bliver startet op og derefter ligger og kører i baggrunden. NXTen kan ikke selv "sende" noget, men venter passivt på at den bliver kontaktet af PCen. Dette er et bevidst designvalg, med henblik på at gøre Bluetooth-koden i NXTen så kort og simpel som mulig.

Til at hjælpe med debugging har vi lavet en NXTLogger klasse til PC'en. Denne klasse bruger den nylavede Bluetooth API til at spørge NXTen om den har en string, som den vil have logget. På NXTen kan man kalde BTCommunication.getSingleton().log(besked). Denne metode returnerer når PCen har hentet beskeden. Med andre ord kan vi logge strenge fra NXTen via PCen så længe NXTLogger-klassen kører. Hvis den ikke kører vil NXTen gå i stå, hvilket er en konsekvens af at vi har valgt at NXTen ikke selv kan sende information, men kun blive forespurgt om information).

Her følger et eksempel på output fra PCen ved kørsel af vores Bluetooth API + NXTLogger

run:
Searching for device [001653005c81]...
BlueCove version 2.0.0 on winsock
Found: Min NXT
        Found: btspp://001653005c81:1;authenticate=false;encrypt=false
Found wanted device!
Opening connection...
Connected to Min NXT
NXT Greeted us with: VEJFINDER_NXT_3000
NXTLogger: We reached this point!!
NXTLogger: Just before we die!

Kort-opbyggelse

Vi har overvejet forskellige måder at opbygge softwaresystemet på i NXTen:

  1. Enten kan der være tale om en LineFollower-klasse med mulighed for at modtage kommandoer (som f.eks. "drej til højre", "følg linien 3 cm" etc.) hvor en GridBuilder styrer hvilke kommandoer, der bliver sendt, baseret på hvor den mangler at få opbygget en del af kortet.
  2. Eller også kan vi lægge selve kontrollen i LineFolloweren, hvorved GridBuilderen får en mere passiv rolle: den skal blot se hvor robotten befinder sig og hvordan verdenen omkring den ser ud og derudfra opbygge sit kort. GridBuilderen har i denne model ikke selv mulighed for at styre søgningen.
  3. Eller vi kan vælge at have et delt kontrol-system via suppression, hvor LineFollower kan suppresses af GridBuilderen, når denne har brug for f.eks. at dreje til højre eller venstre i et kryds. [subsumption]
  4. Sidst men ikke mindst kan vi vælge at bruge motivations-baseret behaviour styring[motivation], hvor GridBuilderen sætter en høj motivation når den har behov for at styre selv.

Efter at have diskuteret fordele og ulemper ved de to første løsninger blev det rimeligt klart (ud fra argumentation som også findes i de refererede kilder), at løsning 3 eller 4 ville være at foretrække, i tilfælde af at der senere skal udviddes med yderligere opførsel.

Forskellen mellem 3 og 4 er at den motivations-baserede løsning giver mulighed for "glidende skift" imellem forskellige opførsler. Dette er en fordel når det er ukendt præcist hvornår en opførsel skal overtage kontrollen fra de andre. Vi blev dog enige om, at i vores tilfælde er det mere relevant med pludselige og helt veldefinerede skift, hvor den mest kontrollerende delkomponent i hierarkiet direkte undertrykker underliggende komponenter. Netop det at vores komponenter kan opstilles i et hierarki peger på metode 3, hvor metode 4 i højere grad, pga. den øgede fleksibilitet, også henvender sig til situationer, hvor der findes flere komponenter i samme niveau i et hierarki - hvilket ikke er tilfældet for os. Vi har af denne grund valgt at benytte subsumption-/suppressionteknikken til at implementere vores styringssystem.

MapMaker UI

Vi kom igang med starten til vores UI, som skal bruges til at vise det fundne kort. Samtidigt kan UIen nu bruges til at forbinde til en NXT, og vise outputtet fra NXTLogger.


Her ses den spæde start til vores user interface

Konklusion

Bluetooth kommunikationen virker nu! Vi kan både sende og modtage int / String. Og vi har fået lavet vores Bluetooth API til både PC og NXT, så vi kan begynde at bruge Bluetooth til test og debugging. Samtidigt har vi fået lavet NXTLogger klassen, så vi nu kan logge debug beskeder fra NXTen direkte til PCen. På denne måde er vi kommet ud over problemet med den lille LCD skærm :)

Vi er også kommet igang med selve strukturen til vores styringssystem.

Noter

  • [Subsumption] Yderligere beskrivelse af subsumption og alternativer kan findes i Tom Deans noter omkring Robot Architectures og kapitel 10 i Dean, T., Wellman, M., Planning and Control, Morgan and Kaufmann, 1991.
  • [Motivation] Thiemo Krink beskriver i "Motivation Networks - A Biological Model for Autonomous Agent Control." hvordan motivations-værdier kan bruges til at udvælge behaviours og i "Cooperation and Selfishness in Strategies for Resource Management." (Proceedings of the Marine Environmental Modelling Seminar (MEMS-99), vol. 1, p. 295-305) hvordan man kan benytte motivation til optimering af resourcestyring ved at "tune" adaptive agents til omgivelserne.

Ingen kommentarer: