Kungliga Tekniska Högskolan (KTH) Programutvecklingsprojekt (2D1954) Systembeskrivning för projektgrupp Gestmenyer
Projektnamn: Gestmenyer Projektgrupp: Gestmenyer Gruppmedlemmar: Johnne Adermark, Hanna Hagelin, Patric Holm, Tippu Mahmood och Jonas Skubic. Beställare: CID (Centrum för användarorienterad IT-Design) och CVAP (Computational Vision and Active Perception Laboratory) vid NADA (KTH). Webbadress: www.nada.kth.se/projects/proj03/gestmenyer/ Dokument: Systembeskrivning Datum: 2003-05-08 1
Innehållsförteckning Systemskiss 3 Systemets delar 3 Filter 3 Musadapter 4 Pajmeny 4 Kommandocentral 6 2
Systemskiss Figur 1 Systemskiss Vårt projekt består av att bygga ett menysystem, styrt av handgester, som kan användas för att styra elektriska aparater. Systemet består av fyra delar, filter (2.1), musadapter (2.2), pajmeny (2.3) och kommandocentral (2.4). Dessutom finns ett gestigenkänningssystem som ger insignaler, detta finns tillgängligt hos uppdragsgivarna. Överföringen av information mellan gestigenkänningssystemet och filtret, liksom från kommandocentralen till den apparat som ska styras, sker via TCP/IP. Systemets delar Vi har valt att strukturera systemet som projektet resulterat i enligt figuren ovan. Denna uppdelning är på modulnivå eftersom vi anser att antalet klasser är för många för att redovisas i systembeskrivningen. För de som är intresserade av klasserna hänvisar vi till källkoden. Filter Pajmenysystemet styrs genom att det får indata från gestigenkänningssystemet. Indatan är i form av TCP/IP-paket som innehåller data om den igenkända handposen, handens position relativt kameran, handens storlek och en vinkel som anger handens rotation relativt kameran. Varje gång användaren håller upp handen mot kameran genereras ett antal sådana paket och ibland blir poseigenkänningen dessutom fel. Vi har alltså dels repetition i data, dels brus. Exempelvis när användaren gör handpose 3 kan indatan bestå av 7 paket för pose 3, följt av två felaktiga paket med pose 2 och sedan 6 paket med pose 3. Funktionen med filtret blir därmed att ta bort bruset i inläsningen av handposen, i exemplet ovan skall det med andra ord inse att den pose som användaren vill visa är handpose 3. 3
Sammanfattningsvis innebär ovanstående att filtret inser att en handpose a har gjorts om den tagit emot n stycken paket, varav p stycken anger att a har känts igen. Då filtret accepterar en handpose skapar det ett objekt som anger vilken pose som utförts, samt handens position, storlek och rotation. Poserna skickas sedan i form av event vidare till kommandocentralen. Musadapter Då ett av målen med projektet var att kunna styra pajmenyn med både gestigenkänning och mus skapade vi en musadapter. Musadaptern fungerar genom att lyssna efter olika MouseEvents i Java. Därefter skapar adaptern event av samma typ som filtret gör. När det gäller de olika handposer som används vid gestigenkänningen, ersätts dessa med exempelvis musklick. Musadaptern gör det möjligt för användaren att välja vilket inmatningssystem som den vill använda samtidigt som den förenklar testningsfasen av pajmenyn och kommandocentralen. Pajmeny Pajmenyn som är implementerad i Java2D och Swing har hand om att rita upp pajmenyer när de ska visas. När filtret eller musadaptern upptäcker att användaren gjort en pose eller bytt position anropas pajmenyn för att få redan på i vilket fält användaren befinner sig i antingen mittfältet, någon av tårtbitarna eller utanför menyn. Figur 2 Huvudmenyn 4
Figur 3 Undermeny för tv För att pajmenyn ska vara så flexibel som möjligt har dess struktur angetts i XML. Pajmenyprogrammet initieras med att en XML-fil läses in i programmet. XML-filen anger vilka val som finns i varje delmeny och dess parametrar. Exempel på parametrar som kan tänkas vara viktiga är storlek på menyn samt den text som ska visas i ett fält. <menu name='main' x='200' y='200' outerradius='120' innerradius='20'> <entry id='file' text='file' color='#998822' /> <entry id='help' text='help' color='#558822' /> <entry id='light' text='lightmenu' color='#558822' /> <entry id='tv' text='tvmenu' color='#558822' /> </menu> <menu name='light' x='200' y='200' outerradius='120' innerradius='20'> <entry id='lighton' text='light On' color='#998822' /> <entry id='lightoff' text='light Off' color='#558822' /> </menu> <menu name='tv' x='200' y='200' outerradius='120' innerradius='20'> <entry id='channel' text='channelmenu' color='#998822' /> <entry id='tvoff' text='tv Off' color='#558822' /> </menu> Figur 4 XML för menyns struktur I XML-filen för menyerna anges alltså inte menyhierarkier eller vad som sker när ett visst fält besöks. Detta hanteras av en kommandocentral och anges i dess XML-fil. 5
Kommandocentral Varje gång användaren antingen förflyttar markören till ett nytt fält eller byter handpose så genereras en händelse. Precis som i fallet med pajmenyn används en XML-fil för att göra systemet så flexibelt som möjligt. I XML-filen är olika kombinationer av händelser definierade såsom vilka kommandon som öppnar en ny meny eller att ett kommando sänds till ett annat system. Detta görs genom att händelserna samlas i en lista. När de senast inkomna händelserna stämmer överens med någon av de händelsekombinationer som angetts i XML-filen utförs det som XML-filen säger ska utföras, vilket i sin tur leder senare till att händelselistan rensas. <commandlist> <command name='back'> <openmenu>previous</openmenu> <eventlist> <event pose='3' area='center' /> </eventlist> </command> <command name='closemenu'> <openmenu>root</openmenu> <eventlist> <event pose='0' area='out' /> <event pose='1' area='out' /> </eventlist> </command> <command name='mainmenu'> <openmenu>main</openmenu> <eventlist> <event pose='0' area='root' /> <event pose='1' area='root' /> </eventlist> </command> </commandlist> Figur 5 Konfigurationsfil för kommandon 6