• No results found

Strukturer ObjectModule innehåller de två strukturerna buffer och object_list. Strukturen buffer är en cirkulär buffert som innehåller de 20 senaste samplade x, y och z positionerna för varje aktuellt ansikte tillsammans med tidsstämpeln för varje sampling i mikrosekunder för varje ansikte.

Den andra strukturen object_list är en matris innehål- lande hastigheterna i x, y och z led för alla samplade an- sikten tillsammans med det beräknade aktivitetsindexet för varje ansikte.

Funktioner void tick()

Vid varje tick beräknas och sparas de verkliga position- erna för x och y, dvs. x_cm och y_cm, på platsen [ob- ject_index][current_node[object_index]] i bufferten. Dessutom sparas det verkliga avståndet till ansiktet z_cm ihop med tidsstämpeln t1 på samma plats i bufferten. Därefter anropas metoderna calculateVelocity() och cal- culateActivity(). Slutligen sparas ansiktenas x och y posi- tioner i bilden, avstånd till dem i cm i z led, ansiktenas aktivitetsindex samt deras hastigheter i z led i output_ob- ject_matrix.

void calculateVelocity()

calculateVelocity() beräknar hastigheterna i x, y och z led genom att jämföra de aktuella x, y och z positionerna med de samplade positionerna två platser tillbaka i bufferten (buddy_node). Hastigheterna sparas sedan i x_velo, y_velo och z_velo i object_list.

void calculateActivity()

calculateActivity() beräknar ett aktivitetsindex för det aktuella ansiktet genom att ta absolutloppet för de olika hastigheterna multiplicerat med en skalfaktor, som för tillfället är 1 för alla hastigheterna.

void valid_velocity()

valid_velocity() kontrollerar om hastigheten för det aktu- ella ansiktet är giltig genom att beräkna absolutbeloppet för hastigheterna i x, y och z led och jämföra med max- hastigheterna i repsektive led. Om någon av hastighe- terna överstiger dessa returnerar funktionen false, annars true.

3.3 ModeSelector

ModeSelector är den modul som med hjälp av para-

metrarna från ObjectModule avgör vilket mode, dvs. tillstånd, som AGDA ska befinna sig i. En beskrivning av AGDA:s fyra olika modes följer senare i rapporten. Input Input till ModeSelector är matrisen OBJECTS från ObjectModule som innehåller de aktuella ansiktenas x och y positioner i bilden, deras avstånd till kameran i cm i z led, ansiktenas aktivitetsindex samt deras has- tigheter i z led.

Output Output från ModeSelector är vektorn STRESS som innehåller det valda mode som AGDA ska anta härnäst.

Funktioner void tick()

Vid varje tick beräknas först ett genomsnitt för alla an- sikten med hjälp av funktionen CalculateFaceAverage(). Detta genomsnitt innehåller ett genomsnittligt avstånd till kameran i cm i z led, ett genomsnittligt aktivitetsin- dex samt en genomsnittlig hastighet i z led. Därefter val- ideras avståndet till det genomsnittliga ansiktet för att avgöra vilket mode som ska väljas. Om avståndet till ansiktet är mellan 130 och 350 cm väljs INTER- EST_MODE och om det är mindre än 130 cm väljs GIVE_EGG_MODE istället. Om avståndet istället är större än 350 cm väljs IDLE_MODE. Det valda läget sparas i en temporär vektor för att sedan valideras ytter- ligare. För att jämna ut rörelserna och bytena mellan olika modes håller olika räknare reda på hur många ggr ett visst mode har valts. När räknaren för ett visst mode har ökats till 10 nollställs räknaren och det valda modet sparas ner i output vektorn.

void CalculateFaceAverage()

CalculateFaceAverage() kontrollerar först om det aktu- ella ansiktet är tillräckligt långt ifrån kameran. Om det är för nära förkastas ansiktets värden och annars kontrolle- ras om hastigheten är så pass hög att AGDA ska bli rädd. Om så är fallet multipliceras denna hastighet med 10 för att ge den ett högre inflytande än de lägre hastigheterna. 3.4 FocusSelector

FocusSelector är den modul som med hjälp av para- metrarna från ObjectModule avgör om och i så fall vilket objekt som AGDA ska fokusera på.

Input Input till FocusSelector är matrisen OBJECTS från ObjectModule som innehåller de aktuella ansiktenas

x och y positioner i bilden, deras avstånd till kameran i cm i z led, ansiktenas aktivitetsindex samt deras hastighe- ter i z led.

Output Output från FocusSelector är vektorn FOCUS som innehåller det valda ansiktets x och y position i bil- den samt avståndet till ansiktet i cm i z led.

Funktioner void tick()

Vid varje tick valideras aktivitetsindexet från Object- Module för att avgöra om AGDA ska fokusera på objek- tet eller inte. Aktivitetsindexet skalas om genom att di- videras med ansiktets avstånd till kameran för att på så sätt ge ansikten närmre kameran ett högre index. Det an- sikte som har högst index sparas som det mest aktiva an- siktet. Därefter kontrolleras om det valda ansiktets z has- tighet överstiger 0 och isåfall sparas dess x och y position i bilden samt avståndet till objektet i cm i z led i vektorn FOCUS.

3.5 Movement

Modulen Movement är den modul som avgör när och på vilket sätt AGDA ska anta ett annat mode, med hjälp av input från FocusSelector och ModeSelector.

Input Input till Movement är vektorn STRESS från ModeSelector innehållande det valda modet samt vektorn FOCUS från FocusSelector innehållande ansiktets x och y position i bilden samt avståndet till objektet i cm i z led.

Output Output från Movement är vektorn OUTPUT som innehåller de framräknade vinklarna för AGDA:s tre mo- torer samt vektorn SPEED som innehåller vilka hastighe- ter de olika motorerna ska ha i skalan 0-1.

Funktioner void tick()

Vid varje tick kontrolleras det valda modet, vilken posi- tion AGDA har befinner sig i för tillfället samt om hon har ägget eller redan har lämnat ifrån sig det. Utifrån detta avgör Movement sedan vilken ny position AGDA ska anta samt om hon ska lämna ifrån sig ägget, ta till- baka ägget, skydda det, eller bara picka i marken.

void calc_degrees()

calc_degrees() beräknar vinkeln i x och y led mellan AGDA och det valda ansiktet.

3.6 AGDA:s modes

Hönan AGDA känner nu igen de rörelser personen fram- för utför och agerar utifrån dessa. AGDA kan befinna sig i fyra olika lägen, eller som vi kallar det modes. Dessa modes är:

Idle mode: Är det läge då det inte finns en person fram- för AGDA eller då personen som står framför har en ak- tivitetsnivå som är under ett visst tröskelvärde [11]. Intrest mode: Då personen framför istället har en aktiv- itetsnivå som överstiger ett visst värde kommer AGDA att bli intresserad av denna person och följa den samme med blicken [12].

Defence mode: Om personen framför har en hög aktiv- itetsnivå och om denne även befinner sig inom ett visst avstånd från AGDA kommer hon uppfatta situationen som hotfull och dra tillbaka sitt ägg. AGDA kommer också ställa sig i ett beskyddande läge och följa personen med blicken [13].

Give-egg mode: Då personen framför har en låg men intressant aktivitetsnivå som inte uppfattas som hotfull kommer AGDA istället att skjuta fram ägget och på så sätt uppmana personen att ta ägget [14].

3.7 AGDA V.2.0

Den största tekniska uppgraderingen i AGDA v2.0 jäm- fört med AGDA v1.0 är förmågan att upptäcka, utvärdera samt välja det mest aktiva ansiktet bland upp till tio olika ansikten. Förutom det är nu AGDA:s rörelser anpassade för situationen; t.ex. så rör hon sig snabbare när hon ska skydda sitt ägg (defense mode) än när hon letar efter mat (idle mode).

För att kunna använda flera olika ansikten används nu FACES från FaceDetector som input till ObjectModule istället för FACE_POSITION som användes innan. Yt- terliggare har buffertarna i ObjectModule utökats från vektorer till matriser, dvs. en buffert per ansikte.

Tidigare har inte FocusSelector haft någon egentlig funk- tion, då endast ett ansikte hanterats och skickats vidare till Movement, men nu letar FocusSelector upp det an- sikte med högst aktivitetsvärde och skickar endast vidare detta till Movement.

ModeSelector är den modul som varit svårast att uppdatera: inte för att koden blivit speciellt komplex

utan snarare för att det varit svårt att besluta hur vi ska välja ett mode när vi har flera ansikten. Antingen kan ModeSelector utgå från det ansikte med högst aktivitets- värde, dvs. samma ansikte som AGDA tittar på, och då totalt ignorera resten, eller så kan ModeSelector utvär- dera alla ansikten och fatta ett beslut utifrån det. Det för- sta alternativet hade onekligen varit lättare att imple- mentera men vi har ändå valt det andra alternativet efter- som det, enligt oss, bättre reflekterar hur en höna uppfat- tar en liknande situation.

För att kunna hantera input från tio olika ansikten har vi valt att skapa ett “virtuellt ansikte” som i viss mån kan sägas vara ett snitt av de tio ansiktena. Om det finns tre ansikten som tillsammans har 30 i aktivitetsvärde så in- nebär det att AGDA upplever det som om det totala ak- tivitetsvärde är 10, och agerar utifrån detta. Detta innebär dock att AGDA lätt får en skev verklighetsuppfattning och om t.ex. om 7 personer står still och en rör sig snabbt mot AGDA kommer hon inte att bli rädd, eftersom den totala hastigheten är väldigt låg. För att undvika detta har vi infört vissa skalfaktorer så att när någon rör sig snabbt mot AGDA väger detta tyngre än när någon står still, vil- ket resulterar i att AGDA blir rädd då den totala hastighe- ten upplevs hög.

I slutet av förra kursen hade vi skapat en egen lösning för att ändra motorernas hastighet under runtime men i och med att nya versionen av IKAROS och Dynamixel har en input för att ändra hastigheten, används denna istället. Detta gör det väldigt lätt att ge AGDA olika has- tigheter beroende på hennes olika rörelser. Det enda som har behövts ändras som en följd av detta är hur lång tid varje rörelse tar i anspråk.

3.7.1 Begränsningar i AGDA V.2.0

Om vi förutsätter att Kinectkameran och ansiktsigenkän- ningen fungerar så har AGDA följande begränsningar: • För det första är hon slö. Även om vi sätter att varje tick

ska ta 50 millisekunder körs ändå max 7 ticks/sekund. Detta resulterar i att det tar upp till en halv sekund, om hon har en dålig dag, innan AGDA reagerar på t.ex. en hotfull rörelse.

• Ytterliggare så är trösklarna för hur AGDA skapar det “virtuella ansiktet”, som nämns i sektion 3.7, ganska dåliga. Detta på grund av att hanteringen av flera olika ansikten implementerades väldigt sent i kursen och för- fining inte har hunnits med. Två personer går ganska bra, men fler än det har inte testats.

• Förutom dessa begränsningar är hon svår att starta och av någon anledning så krävs det att man startar IKA-

ROS tre till fyra gånger innan motorerna aktiveras. Det är inte heller ovanligt att man måste dra strömmen för AGDA mellan två körningar.

• Slutligen så finns det ingen garanti för att AGDA inte blandar ihop två ansikten med varandra men om ansik- tena är långt ifrån varandra borde felet sållas bort på grund av att de har en orealistiskt hög hastighet. Om ansiktena å andra sidan är nära varandra kan felet mycket väl uppstå.

3.8 AGDA:utseende

Eftersom vi vill att omvärlden ska interagera med AGDA är det viktigt att utseendet lockar till detta. För att inte hamna i "uncanny valley" [15], det tillstånd då robotar uppfattas obehagliga, har vi valt att ge AGDA ett ut- seende som påminner om ett mjukisdjur eller en muppet. Vidare vill vi att AGDA:s utseende även ska spegla ro- botens "personlighet". Eftersom AGDA är en nyfiken men rädd liten höna har vi valt att ge roboten en upp- spärrad och lite skrämd blick. Detta har även förstärkts med ett par ögonbryn.

3.9 Slutsats

Enligt ovanstående har vi lyckats implementera de fea- tures vi planerat, helt enligt den tidsplan vi lagt upp. Pro- jektet presenterades först i den första kursen. Där fick vi många nyttiga kommentarer som vi tagit med då vi fort- satt utveckla vårt system. På grund av yttre omständighe- ter, framför allt en mjukvarouppdatering av IKAROS, har vi varit tvungna att begränsa oss när det gäller den tekniska utvecklingen. Hela fokuset på den tekniska biten har lagts på att implementera en lösning för att AGDA ska kunna hålla reda på flera personer. Detta har vi, trots stor tidsbrist, lyckats implementera. Projektet i sin helhet presenterades inför publik den 3/12 och togs emot med bra respons från handledare och kollegor [16].

Eftersom vi vill att omvärlden ska interagera med AGDA är det viktigt att utseendet lockar till detta. För att inte hamna i "uncanny valley" [15], det tillstånd då robo- tar uppfattas obehagliga, har vi valt att ge AGDA ett ut- seende som påminner om ett mjukisdjur eller en muppet. Vidare vill vi att AGDA:s utseende även ska spegla ro- botens "personlighet". Eftersom AGDA är en nyfiken men rädd liten höna har vi valt att ge roboten en upp- spärrad och lite skrämd blick. Detta har även förstärkts med ett par ögonbryn.