Lavet af Nanna Bunkenborg, nabun12, Jakob Høg, jasoe12, Simon Juul, sijuu10, Stefan Petersen, stepe10, Henning Vestergaard, henve12.

 

Introduktion

Multiagent systemer er betydelige idet, at agenter med simple instruktioner kan fuldføre en større opgave via samarbejde. Jo mindre kompleks hver agent er, jo lettere er den at erstatte.

Formålet med dette projekt har været at simulere denne tanke, at agenter arbejder sammen for at opnå et fælles mål. En brainstorm for klassen resulterede i et koncept, hvor fire grupper skulle bygge hver deres agent med individuelle opgaver.

Konceptet for denne gruppe er blevet til børn (agenter), der bliver “væk” i forskellige terræner – by, havn og skov. I disse terræner skal de voksne (agenter) finde børnene og bringe dem hjem eller markere, at det pågældende barn er fundet.

Denne gruppes opgave har været at programmere og bygge børnene og få dem til at ”kalde” på de voksne samt at blive væk i de forskellige terræner.

 

Metode og materialer

For at få agenterne til at opføre sig på denne måde har vi benyttet os af diverse sensorer og aktuatorer til både fremdrift og styring/opførsel af agenten. Valget af sensorer og aktuatorer blev baseret på, hvad agenten skulle kunne og på hvilken måde dette skulle gøres – f.eks. valget af sensor til detektering af banens farveforskelle. Disse valg blev diskuteret indbyrdes i gruppen og taget i fællesskab ift. formålet for agenten.

Opbygningen af selve agenten afhang af sensorerne og aktuatorernes placering ift. navigering gennem terrænerne. Til opbygningen benyttede vi os af en iterativ proces, hvor den første agent gennemgik flere prototype faser. Placeringen af sensorerne og aktuatorerne skulle tage højde for omgivelserne og samtidigt gøre agenten stabil, så den kan bevæge sig rundt på banen uden problemer eller fare for at tippe.

Selve agenten består af en standard opsætning af en LEGO Mindstorm robot, der skal kunne bevæge sig rundt på en flad overflade. Denne blev derefter tilpasset ift. den optimale placering af sensorerne i form af en high-fidelity prototype. Børnene er blevet bygget så små som antallet af sensorer og aktuatorer tillader for at give illusionen om, at de er børn.

Aktuatorerne, i form af motorer, bør være placeret optimalt ift funktion og balance. Disse bør placeres i bunden af agenten og er her blevet placeret ift en guide for optimal opsætning af hjul og gear. Bag på agenten er der placeret et ekstra drejehjul til balancering af agenten.

Sensorerne består bl.a. af to lyssensorer, der registrerer banens farver. Disse placeres på agenten, så de kan opfange banens farver uden at blive forstyrret af udefrakommende lys. I første omgang blev der ikke taget højde for dette lys, hvilket senere blev taget højde for i form af “skyklapper” lavet af sort karton. Jo tættere placeringen af sensorerne er på jorden, jo bedre – dog ikke så tæt, at der ikke længere kan registreres andet end sort pga. mangel på lys.

Ydermere er agenten udstyret med en ultralydssensor. Denne bør placeres forrest på agenten og bruges til at undgå objekter. Placeringen er essentiel for detekteringen af objekter og andre agenter baseret på højden af placeringen.

Desuden er der påsat et kompas, der registrerer agentens orientering. Dette bruges for at kunne dirigere agenten rundt på banen. Placeringen af kompasset skal tage højde for støjen fra NXT’en, der kan forstyrre kompasset, og er derfor placeret over NXT’en.

Multiagentsystem

Et multiagentsystem (M.A.S.) er et computersystem bestående af flere interagerende intelligente agenter i et miljø. Agenterne i dette projekt er de forskellige agenter. Specifikt for denne gruppe er agenterne de såkaldte børn.

Karakteristika

Et multiagentsystem er som sagt bestående af agenter i et miljø. Disse agenter kan inddeles i forskellige kategorier:

  • Softwareagenter
  • Fysiske agenter
  • Passive agenter
  • Aktive agenter

Softwareagenter er computerprogrammer, som agerer for en bruger eller et andet program. De er virtuelle og kun aktive i virtuelle miljø. Fysiske agenter er virkelige og agerer i reelle fysiske miljø. Passive agenter er agenter uden nogle mål, som dermed ikke udfører nogen handlig af sig selv, men kan agere under udefrakommende input. Aktive agenter har definerede mål, som de søger at opnå i deres miljø. Foruden disse kategorier er det også vigtigt at en agent kan udøve en vis autonomi i deres miljø.

MOISE modellen beskriver hvordan et multiagent organiseres. Deres opførsel inddeles i forhold til deres rolle i miljøet, og derefter beskrives de individuelle agenters roller ri og missioner mi. En rolle beskriver blot agentens identitet i miljøet f.eks. ”Reparatør”. Missioner er opbygget af: Mål Gi, planer Pi, handlinger Ai og ressourcer Ri, som foreskriver agentens opførsel under udførelsen af missionen. Missionens type  kan inddeles i to typer t: Forpligtede O og tilladte P  missioner. Forpligtede missioner er missioner, som agenten er nødsaget til at udføre, hvorimod tilladte missioner er missioner, som ikke er strengt nødvendige for agenten, men den alligevel kan påtage sig at udføre.

ri={miM, iℕ }

mi=〈t,Gi,Pi,Ai,Ri

Efter roller og missioner beskrives de organisatoriske forbindelser. Dvs. hvilken opførsel agenterne skal have når de interagerer med en agent med en anden rolle end deres egen.

Hvis systemet er tilstrækkeligt stort defineres grupperinger af agenter, samt en overordnet organisatorisk struktur.

Børneagenterne er aktive, fysiske agenter. Deres rolle i systemet og miljøet er ”Barn”. De har en mission om at ”blive væk” og har en indlæst kode, som foreskriver deres opførsel – at vende hjem –, når de bliver fundet af en voksenagent.

Rolle: Barn, Mission: Bliv væk
Mål:
Plan: Kør rundt på kortet
Handling: Tilpas opførsel til del af kortet jeg befinder mig på
Ressourcer Farver på kortet

For vores agenter er der ikke noget overordnet mål, deres opførsel er ganske enkelt at køre rundt på kortet på en tilfældig manér.

I forhold til de organisatoriske forbindelser skal det siges, at børneagenternes opførsel ændres, når de interagerer med de andre agenter i systemet. Hvis et barn bliver fundet af en af de ”voksne” agenter bliver de ”sendt hjem”. Dermed overskrives deres oprindelige mission, og deres nye mission bliver at køre til ”hjemme”-feltet.

 

Resultater

Endelige opsætning:

13113168_10205829539727808_1391801297_o

————————————————————————————————

13214953_10205844689626546_121960120_o

Aktuatorerne består af to motorer sat fast i bunden af agenten, hvor de har fået påsat store, men smalle dæk og gear til styring af fremdriften og en IR-emitter, der sender information til de andre agenter i systemet. Placeringen af aktuatorerne er valgt ud fra guiden for opsætningen af agenten til optimal funktionalitet med indbygget gear. Gearet gør at motorerne skal yde mindre for hver omdrejning, og agenten kan køre hurtigere.

13184626_10205844689786550_61504728_o

Lyssensorerne er placeret forrest på agenten og så langt mod jorden som muligt for at få de bedste resultater. Disse er desuden udstyret med ”skyklapper” for at holde påvirkningen fra udefrakommende lys minimal.

13161299_10205844689866552_2087826621_o

Ultralydssensoren er placeret forrest på agenten i en højde, der er passende ift højden af banens objekter og de andre agenter.

13199428_10205844690106558_293849214_o

Kompasset er placeret øverst på agenten i en højde af min 10-15 cm fra NXT’en for at undgå støj.

13170672_10205844690706573_1721580363_o

IR-emitteren på toppen af agenten udsender et signal til de andre agenter, så disse kan genkende lokationen af det pågældende barn og dermed bedømme den passende behaviour.

Den konceptuelle model

 

konceptuel

  1. Kalibrering
    Her kalibreres agenten så sensor-målinger passer med det lys der er i miljøet.
  2.  
    1. Kør tilfældigt rundt
      Agenten kører rundt på banen i en tilfældig bane.
    2. Undgå objekter
      Agenten tjekker efter forhindringer for at undgå at støde ind i objekter.
    3. Kald på hjælp
      Agenten kalder på hjælp ved at udsende infrarød-lys som kan fanges af de voksne agenter som leder efter børneagenterne.
    4. Vent på kald
      Agenten afventer kald fra “bluetooth-master” om at et agent-barn er fundet. Hvis ikke den modtager noget, så fortsætter den med at køre tilfældigt rundt i stadie 2.
  1. Barn Fundet
    Når et agent-barn er fundet, får begge børneagenter en melding fra “bluetooth-masteren”. Begge børneagenter stopper med at køre tilfældigt rundt og den ene børneagent slukker sit infrarøde lys. Nu kan “de voksne agenter” se hvilket barn de har fundet; det med tændt eller det med slukket infrarød lys.
  1. Kør hjem
    Den børneagent, som er fundet, kører hjem ved at huske sin startposition ud fra kompasset. Det andet går tilbage til stadie 2 og kører igen tilfældigt rundt.

 

Kodehighlights

I alle NXC programmer starter koden altid i main task.
Her initialiseres sensorer så de er klar til at blive brugt og  tasks startes så de køres sideløbende.

task main() {
  SetSensorLowspeed(IN_1); //Ultrasound sensor
  SetSensorLight(IN_2); //Right lightsensor
  SetSensorLowspeed(IN_3); //Compass sensor
  SetSensorLight(IN_4); //Left lightsensor
  OnFwd(OUT_B, 100); //turn on infrared emitter
  start SensorCheck;
  calibrate();
  Precedes(objectAvoidance, lineTracking, BTCommunication);
}

Den første task der igangsættes er SensorCheck, der bliver fulgt op af calibrate() funktionen.

SensorCheck er en central task for agenten, som sørger for at indsamle værdier fra alle sensorer og sætte dem til globale variabler så andre tasks kan tilgå disse værdier. Siden tasks kører sideløbende kan man derved undgå at sensorer værdierne ikke bliver opdateret når agenten er i gang med andre funktioner.

De sensorer som der bliver samlet data fra er de 2 lyssensorer, ultralydssensoren og kompas sensoren. Ved lyssensorerne tages gennemsnittet af 100 målinger da værdierne kan fluktuere. For kompasset bliver værdierne korrigeret i forhold til en midlertidig ønsket retning at køre i, og derved har agenten både et globalt og lokalt kompas at korrigere efter.

for(int i = 0; i < 100; i++) {
  tempright += Sensor(IN_2);
  templeft += Sensor(IN_4);
}
tempright = tempright / 100;
templeft = templeft / 100;
leftsensor = templeft;
rightsensor = tempright;
TextOut(0, LCD_LINE5, "Left");
NumOut(50, LCD_LINE5, leftsensor);
TextOut(0, LCD_LINE6, "Right");
NumOut(50, LCD_LINE6, rightsensor);

ClearLine(LCD_LINE7);
currentCompass = SensorHTCompass(S3);
TextOut(0, LCD_LINE7, "Compass:");
NumOut(50, LCD_LINE7, currentCompass);

ClearLine(LCD_LINE8);
ultraSound = SensorUS(S1);
TextOut(0, LCD_LINE8, "Ultra:");
NumOut(50, LCD_LINE8, ultraSound);

relBearing = currentCompass - tmpDir;
if(relBearing < 0){
  relBearing += 360;
}

Kalibrerings funktionen kører efter SensorCheck er startet, og fungerer ved at brugeren sætter agenten over en bestemt farve og trykker på den orange knap hvor agenten vil måle farven og gemme dem så den kan genkende den. Dette bliver gjort for alle farver der har relevans for agenten. Igen tages gennemsnittet af 100 målinger.

void calibrate() {
  ClearScreen();
  TextOut(0, LCD_LINE1, "Calibration");
  TextOut(0, LCD_LINE2, "Press button for white");

  while(!ButtonPressed(BTN4, true)){
    TextOut(0, LCD_LINE1, "Calibration");
    TextOut(0, LCD_LINE2, "Press button");
    TextOut(0, LCD_LINE3, "Next color: ");
    TextOut(0, LCD_LINE4, "White");
  }
  for( int i = 0; i < 100; i++){
    WhiteLeft += leftsensor;
    WhiteRight += rightsensor;
  }
WhiteLeft = WhiteLeft / 100;
WhiteRight = WhiteRight / 100;
ClearScreen();
TextOut(0,LCD_LINE2, "Left: ");
NumOut(50,LCD_LINE2, WhiteLeft);
TextOut(0,LCD_LINE3, "Right: ");
NumOut(50,LCD_LINE3, WhiteRight);
Wait(1000);

Herefter startes 3 sideløbende tasks af main tasken, objectAvoidance, lineTracking og BTCommunication.

objectAvoidance bruger ultralydssensoren til at undgå objekter foran agenten. lineTracking sørger for enten at “roame” miljøet så agenten kan blive fundet af de voksne agenter, ved at f.eks følge linjerne på banen og generelt bare kører rundt. Hvis agentens state ændres til noget andet sørger lineTracking også for denne funktionalitet, som f.eks. At gå hjem til start. BTCommunication lytter efter beskeder fra de voksne, og vil ændre det state agenten er i fra “roaming til “goHome” hvis en voksen agent giver den kommandoen.

Da både objectAvoidance og lineTracking har kontrol over agenten motorer, og begge har metoder der tager tid at udfører, betyder det at der skal være en måde at man kan bestemme hvem der har rettigheder til agentens aktuatorer. Til dette bruges mutex, som kan tages og gives slip på. Da alle handlinger på aktuatorer er omgivet af et krav om at man skal have mutex’en acquired kan de kun handle hvis den er fri til det.

Eksempelvis her i object avoidance:

task objectAvoidance(){
  while(true){
     if(ultraSound < NEAR){
       Acquire(motorMutex);
       tmpDir = currentCompass+turnValue;

       if(tmpDir > 360){
         tmpDir -= 360;
       }

       Off(OUT_AC);
       Wait(1000);
 
       if(ultraSound > NEAR+5){
         OnFwd(OUT_AC, DriveSpeed);
         Release(motorMutex);
       }
       else{
         OnFwd(leftmotor, 20);
         OnRev(rightmotor, 20);
         until(relBearing < 3 || relBearing > 356);
         Off(OUT_AC);
         Release(motorMutex);
       }
     }
  }
}

Bemærk at objectAvoidance bruger agentens kompas til at dreje med. Den nye retning som agenten skal dreje imod sættes til den nuværende retning + turnValue. Der tages højde for hvis 360 grader overskrides. Selvom der er et until loop vil sensor målinger stadig blive udført i SensorCheck så den kan læse på den relative afstand fra den ønskede retning.

Når den ønskede retning er nået vil den give afkald på motorMutex variablen der styrer al adgang til aktuatorerne, og der kan igen tages hensyn til linjer og lignende.

lineTracking fungerer lignende ved at tage fat på motorMutex når disse værdier er målt på lys sensorerne og agenten vil handle derefter.
I BTCommunication set nedenunder har vi en metode til at lytte efter indkommende bluetooth information fra de voksne agenter. BTCheck, som er en subrutine, vil slukke for agenten hvis der ikke er oprettet en bluetooth forbindelse til en anden agent inden programmet starter.

sub BTCheck(int conn){
  if (!BluetoothStatus(conn) == NO_ERR){
    TextOut(5, LCD_LINE2, "Error");
    Wait(1000);
    Stop(true);
  }
}

task BTCommunication(){
  string in;
  //BTCheck(0); //If BTCheck is on it requires a BT connection active for the robot to run.
  while (true){
    if (ReceiveRemoteString(IN_MBOX, true, in ) != STAT_MSG_EMPTY_MAILBOX){
      TextOut(5, LCD_LINE1, "Slave receiving");
      if(in == "StopIR"){  //this robot will stop IR emitter
        Acquire(motorMutex);
        Off(OUT_ABC);  //other robot just does > Off(OUT_AC);
      }
      if(in == "GoHome"){
        state = "goHome";
        OnFwd(OUT_AC, DriveSpeed);
        Release(motorMutex);
      }
      if(in == "dontGoHome"){
        OnFwd(OUT_AC, DriveSpeed);
        OnFwd(OUT_B, 100);
        Release(motorMutex);
      }
    }
    Wait(100);//take breath (optional)
  }
}

Når vi for en indkommende besked fra en voksen vil agenterne (begge børn) stoppe op. Ved at tage hold på motorMutex, kan ingen andre tasks håndtere aktuatorerne. Det ene barn vil slukke for sin IRSensor, og det andet vil holde den tændt. Derved kan den voksne agent se hvilket barn det har fundet ved læse om IR målingen ændrer sig. Det ene barn vil få at vide det skal gå hjem og det andet vil få at vide det skal fortsætte med at roame banen.
Til at gå hjem har vi taget en hardcoded funktion i brug der fortæller agenten at den skal bevæge sig imod en prædefineret retning på kompasset. Den skal fortsætte indtil den måler sort, hvorefter vi kan kende agentens retning til hjem basen, og vil nu gå imod denne prædefinerede retning.

what

Dette er en meget hardcoded metode at komme hjem på, men det er meget svært for agenten at kende forskel på det grå, grønne og lilla område så derfor må vi udnytte at fra denne retning kan vi kører imod lilla uden at ramme ind i det grå område.

agenten ved den er hjemme når den er på lilla område og den måler en lysegrå streg. Da den ikke kan kende forskel på det grå og lilla område, og der er streger i begge område er det derfor vigtigt vi undgår dette område på hjemvejen i stadie 2.

 

Diskussion

Sensor input definerer hvordan den skal agere i forhold til de opgaver den er blevet givet. Det fysiske aspekt, altså de omgivelser børneagenterne er i, bør derfor ikke ændres. agenten kender kun sit område (farven) hvis sensorerne læser det som er programmeret,  eksempelvis var der forskel på prototypebanen og den endelige løsning. Overfladen på banerne var forskellige og agenterne måtte derfor kalibreres på ny.

bane

Vi havde ingen måde hvorpå at kunne kende forskel på objekter og andre agenter. En af løsningerne var en kontakt på hver agent, således at når den aktiveres vil et barn være markeret som fundet. Dette præsenterer dog en række meget præcise bevægelser fra barn / voksen og øger kompleksiteten betragteligt, en løsning med infrarødt lys blev valgt.  

Forbedringer:

Havde vores agenter været udstyret med en farvesensor i stedet for blot en lyssensor, ville det have været lettere at kende forskel på farverne på banen.

 

Konklusion

Vi har to agenter, der hver kan bevæge sig tilfældigt rundt på en farvekoordineret bane og samtidigt undgå objekter/forhindringer. Disse holder sig på banen ved brug af lyssensorer, der registrerer og undgår den sorte farve.

Børnene udsender et signal via IR-emitter på toppen, der giver de voksne besked om det pågældende barns lokation.

Placeringen af diverse aktuatorer og sensorer er valgt ift den optimale funktion fra disse.

Agenterne vil, efter at være blevet fundet, bevæge sig tilbage til ‘hjem’-feltet (det lilla felt) gennem en forprogrammeret rute, hvor de der vil blive.

 

Perspektivering

Børneagenterne som agenter uden mål er en speciel form for agent, idet de ikke har megen funktion inden for systemet. Dette giver en anderledes tilgang til programmeringen af en agent, da agentens opførsel ikke bliver fokuseret på løsningen af en specifik opgave, men mere en generel relation til omgivelserne i miljøet. Sådan en tilgang kunne være nyttig i designet af multiagentsystemer til mere generelle formål, eftersom agentens interaktion med omgivelserne bliver førsteprioritet.

Leave a Reply