Vision Guided Robot Control

Storlek: px
Starta visningen från sidan:

Download "Vision Guided Robot Control"

Transkript

1 Vision Guided Robot Control 5-6- Eamensarbete p D-nivå Vision Guided Robot Control Reg.kod: Oru-Te-AUTO67-Mag/5 Peter Knutsson, Ted Persson, Tobias Strömberg Magisterprogrammet i Automatiseringsteknik 6p. Örebro Vårterminen 5 Eaminator: Gion Koch Svedberg Örebro universitet Örebro University Institutionen för teknik Department of technology 7 8 Örebro Örebro, SE-7 8 Sweden Peter Knutsson (83) Ted Persson Tobias Strömberg

2 Vision Guided Robot Control 5-6- Förord Detta projekt är indelat i tre stycken delprojekt. Rapporten är upplagd så att varje del har sitt eget kapitel för att få en bättre överblick. Läsaren kan således börja läsa om t e projektdel två och förstå innehållet utan att ha läst projektdel ett. Vi rekommenderar dock att man läser kapitlen Sammanfattning och Bakgrund först för att få en uppfattning om hela projektets omfattning. Varje projektmedlem har varit huvudansvarig för varsitt delprojekt: Projekt Tobias Strömberg Projekt Ted Persson Projekt 3 Peter Knutsson Alla har deltagit lika mycket i samtliga projekt och ansvarat lika mycket för att samtliga delprojekt ska uppnå sina uppsatta mål. Vi skulle vilja tacka AASS Centret vid Örebro Universitet för deras support under tiden som eamensarbetet fortlöpt. Vi vill även tacka vår handledare, prof. Ivan Kalaykov, för hans assistans och engagemang till oss. Mången tack också till personalen vid AASS; Michael Soron för utveckling av programvara, Gustav Tölt för inköp av kameror och linser samt Per Sporrong för allmän assistans. Utan er hade inte projektet varit möjligt. Örebro 5 Peter Knutsson Ted Persson Tobias Strömberg Peter Knutsson (83) Ted Persson Tobias Strömberg

3 Vision Guided Robot Control 5-6- Sammanfattning Målet för vårt eamensarbete har varit att förstå, hur man med hjälp av visionkameror och deras kontinuerliga bildflöde, kan göra så att en robot tar olika beslut beroende på vad kamerorna ser. Denna uppgift har delats in i tre olika delprojekt med stigande svårighetsgrad. Alla tre delprojekt har varsitt kapitel i denna rapport. Arbetet har utförts på AASS Centret, Tillämpade Autonoma Sensorsystem, vid Örebro universitet. De tre olika delprojekten innefattar: Pick n place av föremål (d v s upplockning och släppning) Inverterad pendel Fångande av flygande föremål De två första delprojekten har haft vår största prioritering medan det sista mest har setts som ett eperiment och testuppgift och därmed inte varit absolut nödvändigt att slutföra. Det första delprojektet har uppfyllts med ett satisfierande och nöjsamt resultat. Delprojekt två gav intressanta resultat men inte riktigt det vi hoppats på. Vid projektet fångande av ett flygande föremål har vi valt att satsa på den teoretiska delen då det med dagens system vid AASS Centret är nästintill omöjligt att erhålla ett acceptabelt resultat. Den här rapporten innehåller bilagor i form av källkod från programmeringsdelen samt utrustning kring roboten. Peter Knutsson 3(83) Ted Persson Tobias Strömberg

4 Vision Guided Robot Control 5-6- Abstract The goal of our project has been to understand, by means of vision cameras and the continuous flow of images, how to make a robot take different decision depending on what the cameras see. This task has been divided into three different side projects with rising difficulty. All three side projects have its own chapter in this report. The task has been performed at the Center for AASS, Applied Autonomous Sensor System, at Örebro University. The three different side projects consist of: Pick and place of an object Inverted pendulum Catching a flying object The two first side projects have had our first priority while the last one has been viewed as an eperiment and testing task and thereby not absolutely necessary to complete. The first side project have been achieved mostly with a satisfying and adequate result. Side project two provided interesting results but not quite what we hoped for. In catching a flying object we have concentrated on the theoretical part because with today s system at Center for AASS it is almost impossible to achieve an acceptable result. This report contains with the programming code and a description of the equipment surrounding the robot. Peter Knutsson 4(83) Ted Persson Tobias Strömberg

5 Vision Guided Robot Control 5-6- Innehållsförteckning Bakgrund... 7 Projekt... 8 Projekt... 8 Projekt Kamerakontrollerade robotprogram... 9 Projekt... Generell beskrivning... Systemets uppkoppling... IRB34 FlePicker... Kontrollsystem... 3 Verktyg för IRB34 FlePicker... 4 Cellen... 5 Buren... 5 Belysning... 5 Banorna... 5 Drivning av vagnarna... 6 Styrkort och motorer... 6 Arbetsobjekt... 7 Kamera... 7 CamCap... 8 Teori... Att spåra ett objekt i linjär rörelse... Att estimera en position för plockning eller placering av föremål med roboten... 3 Kamerans värld möter robotens... 5 Programmering... 6 VGRC (Vision Guided Robot Control)... 6 Programmeringsmetodik... 9 Flödesschema... 3 RAPID-program... 3 RobotStudio och ProgramMaker... 3 RAP... 3 Tester och resultat Begränsningar Förbättringar Slutsatser Projekt Generell beskrivning Val av robot Systemets uppkoppling... 4 IRB34 FlePicker... 4 Kontrollsystem Verktyg för IRB34 FlePicker Buren Belysning Arbetsobjekt Kameror Peter Knutsson 5(83) Ted Persson Tobias Strömberg

6 Vision Guided Robot Control 5-6- CamCap Teori Vision Avstånd... 5 Hastighet... 5 Tider... 5 Fuzzy Logic... 5 Tredimensionella visionsystem Programmering VGIP (Vision Guided Inverted Pendulum) Programmeringsmetodik... 6 Flödesschema... 6 RAPID-program... 6 RobotStudio och ProgramMaker... 6 RAP Filteroptimering Tester och resultat Begränsningar Förbättringar Slutsatser Projekt Generell beskrivning Kastet sett från sidan... 7 Eempel på ett kast Kastet sett uppifrån Tester och förväntade resultat Begränsningar Förbättringar... 8 Slutsatser... 8 Referenser... 8 Bilagor Peter Knutsson 6(83) Ted Persson Tobias Strömberg

7 Vision Guided Robot Control 5-6- Bakgrund Vid det intelligenta kontroll laboratoriet på centret för Tillämpade Autonoma Sensorsystem (AASS) på Örebro Universitet har det gjorts tidigare undersökningar på kamerastyrda program för robotar. Det hade nu kommit fram nya önskemål för att utöka kunskaperna och bevisen för hur denna typ av program fungerar i praktiken på de industrirobotar som Örebro Universitet använder i laborationer och forskning. Robotarna är av märket ABB och vi använde oss av modellen IRB34 FlePicker till våra projekt. Vi fick även tillfälle att komma i kontakt med en robot vars modellnummer är IRB4, se figur och figur nedan. IRB34 FlePicker kontrolleras med ett styrsystem av modell S4Cplus och IRB34 av det nyare IRC5. Figur. IRB34 Flepicker. Figur. IRB4. Den materiel som laboratoriet idag använder utöver robotarna är vanliga datorer av typen PC med nätverksanslutningar och Firewirekort samt kameror med Firewireanslutning. Den mjukvara som tidigare använts har varit Visual Basic samt Borland C++ (Visual C). Detta har vi valt att byta ut mot de senaste verktygen från Microsoft i form av Visual Studio.NET där språket som används är C-Sharp även betecknat C#. Prestandan för de kamerastyrda systemen skulle testas i tre skilda projekt. De tre projekten har olika svårighetsgrad samt enskilda problem. Följande tre projekt önskades bli undersökta vid AASS, Örebro Universitet: Peter Knutsson 7(83) Ted Persson Tobias Strömberg

8 Vision Guided Robot Control 5-6- Projekt Plocka och placera från en rörlig vagn Första delen av arbetet som har det enklaste problemet. Grundtanken med den här delen var att skapa en stabil plattform vad gäller både hårdvara och mjukvara för att kunna bygga vidare på inför de kommande delarna av arbetet. Ett föremål på en linjärt rörlig vagn skall spåras av en kamera och en punkt där objektet kan komma att plockas upp skall beräknas. Roboten skall sedan plocka upp objektet på den estimerade platsen. Den mest passande industriroboten IRB34 FlePicker från ABB användes till detta. Ett liknande skede skulle utföras för att placera objektet på en annan vagn. Uppgiften är rent tvådimensionell och målet med projektet är att undersöka hur systemet fungerar oberoende av hastigheten och riktningen på vagnarna. Dessutom skall hastighetstester göras för att se hur snabbt systemet kan bli. Projekt Inverterad pendel Den andra delen av arbetet var att undersöka ett gammalt problem inom automationens historia. Den inverterade pendeln i tre dimensioner skulle implementeras med hjälp av en industrirobot, även i detta fall en IRB34 FlePicker från ABB. Två kameror används för att ge programmet en tredimensionell bild av pendeln. Ett önskat mål med projektet var att om möjligt ta reda på hur liten vinkeln mellan kamerorna kunde göras utan att den tredimensionella prestandan på systemet gick förlorad. I utgångsläget skulle kamerorna vara vinkelräta mot varandra för att sedan flyttas så att de blev mer och mer parallella. Detta för att efterlikna det binokulära seende hos oss människor. Projekt 3 Fånga ett flygande objekt Det tredje och sista projektet i arbetet var ett önskemål om att testa laboratoriets materiel till ma vad gäller hastighet. Denna del av arbetet kom dock att betraktas som kuriosa då de tidigare projekten skulle komma att ta längre tid än beräknat, men enligt specifikationen skulle denna del endast utföras i mån om tid och därav den ringa omfattningen. Kurvbanan hos ett kastat föremål skall beräknas med hjälp av bilderna från en kamera. Med hjälp av den kalkylerade banan skall man förutsäga varifrån och vart föremålet kommer att träffa robotens arbetsområde och därigenom få roboten att förflytta sig till den estimerade punkten innan föremålet nått fram. Roboten i fråga skulle denna gång vara en IRB4 från ABB. Primärt skulle föremålet endast blockeras på den estimerade punkten av roboten och inte fångas i något gripande verktyg eller liknande. Peter Knutsson 8(83) Ted Persson Tobias Strömberg

9 Vision Guided Robot Control 5-6- Kamerakontrollerade robotprogram Man kan rent allmänt dela in kamerakontrollerade robotprogram i två kategorier, Eye- In-Hand och Eye-To-Hand. Skillnaden mellan dessa två typer av system är att Eye-In- Hand syftar till att kameran är monterad på robotens yttersta ael. I det andra alternativet med Eye-To-Hand monteras kameran eller kamerorna utanför roboten och ger systemet en överblick över både roboten och dess arbetsområde. Skillnaden mellan dessa två sätt att använda kameror är stor och båda har sina direkta fördelar. Många lyckade försök har dock gjorts med att kombinera de båda typerna av system för att erhålla det bästa av respektive. Följande beskriver eempel där de olika systemen bevisats fungera mest fördelaktigt. - Om man har en robotarm som skall plocka upp detaljer från en omgivning genom att först känna igen ett valt objekt och sedan gripa det är det fördelaktigt att använda Eye-In-Hand. Speciellt om man inte vet vart roboten befinner sig. Detta kan t e inträffa då man har enklare robotarmar eller liknande utan positioneringssystem. Eftersom robotarmens aktuella position kan vara placerad vart som helst i rummet skulle ett Eye-To-Hand system behöva hålla ordning på både robotens position samt målobjektets position för att veta hur roboten skulle förflyttas för att plocka upp det sökta objektet. - Låt oss nu föreställa oss att en robot som skall förflytta sig genom ett rum fyllt av hinder till en önskad position. Med Eye-In-Hand skulle roboten bli mycket närsynt och problemet skulle endast kunna lösas med hjälp av ett program som undviker hinder vilka roboten eventuellt skulle klara av att se när den befann sig mycket nära ett sådant. Om roboten istället var utrustat med ett Eye-To-Hand system skulle detta med hjälp av en kamera från t e taket kunna guida roboten snabbaste vägen mellan hindren till målet eftersom den takmonterade kameran har visuell kontroll över områden som omöjligt kan observeras från robotens aktuella position. Man kan dra slutsatsen att en robot som arbetar utan hänsyn till omgivningen samt inom mindre arbetsområden med fördel kan använda Eye-In-Hand medan en robot som måste ta hänsyn till objekt i omgivningen behöver ett eternt seende enligt principen för Eye-To-Hand. Detta för att undvika kollisioner och för att uppfatta relevant information som inte kan erhållas från robotens position. Våra projekt baseras endast på teorin om Eye-To-Hand även om alla tre projekten skulle kunna lösas med Eye-In-Hand, dock med helt andra resultat. Peter Knutsson 9(83) Ted Persson Tobias Strömberg

10 Vision Guided Robot Control 5-6- Projekt Generell beskrivning Målet med det första projektet var att ett föremål skall flyttas från en vagn i rörelse till en annan. Vagnarnas riktning och hastighet är oberoende av varandra och skall kunna varieras. Systemet skall styras visuellt d v s inga givare eller liknande skall användas. Systemets uppkoppling Figur.. Systemets uppkoppling i Projekt. Den mjukvara vi använde till visiondelen är ett program som heter CamCap. Med detta kunde vi bestämma vagnens position. Mera information om detta program kan ses i kapitlet CamCap. Bildbehandling och beräkningar som görs i detta program är tunga och kräver en kraftfull dator. Vi bestämde också tidigt att vi skulle lägga stor vikt vid att detta skulle ske i så hög hastighet som möjligt. Målet är att få vagnens koordinater i något som är så likt realtid som möjligt. Vi antog och såg sedan att detta kan vara en av de flaskhalsar som kan göra systemet långsamt och få roboten att reagera för sent vilket kan ge negativ effekt. Peter Knutsson (83) Ted Persson Tobias Strömberg

11 Vision Guided Robot Control 5-6- Med detta i åtanke valde vi att använda vår kraftfullaste dator till den här delen. Datorn som användes har dubbla processorer med en hastighet av 6 MHz vardera. Dessutom har den ett RAM-minne på 3,5 GB. Man kan se att när programmet körs så används en stor del av dess processorkapacitet och med en långsammare dator hade detta med största sannolikhet inte fungerat tillfredställande. Datorn har även ett kort med två stycken firewire-portar. Firewire är ett snabbt alternativ till dataöverföring för att ge en så kort fördröjning som möjligt. VGRC (Vision Guided Robot Control) är den mjukvara som vi skapade och designade själva till den här uppgiften. Det är programmerat i Visual studio.net vilket är ett kraftfullt program som gör det enkelt att skapa Windows-applikationer för en användarvänlig arbetsmiljö. Språket som användes var C# vilket för oss kändes lämpligast till uppgiften. Ingen av oss hade tidigare någon större erfarenhet av detta språk men vi kände ändå att detta inte skulle skapa några problem då dess likheter med C och C++ är stora. Vi har alla tidigare programmerat mycket i C. Den största fördelen med C# är dess minneshantering som är enklare och smartare än i motsvarande språk. Även för denna uppgift hade vi en kraftfull dator. Med två processorer med en hastighet på 7 MHz vardera och ett RAM-minne på 5 MB räckte den till för att klara uppgiften. Denna dator fick fungera som något av en huvuddator. På den här enheten sköttes alla uträkningar och omvandlingar av data. Genom en router kopplades den samman med visiondatorn och robotens styrskåp. Från CamCap erhålls data om vagnens positioner. För att ta emot dessa värden så inkluderades en TCP/IP-klient i programmet som läste av den ständiga strömmen av data som skickades från CamCap. En kamera kopplades in till vår visiondator. Kameran är av märket Marlin och modellen heter F-33C. Tillverkaren är Allied Vision Technologies. Den anslöts till datorn via firewire. Program skapade för att användas under operativsystemet Windows. Peter Knutsson (83) Ted Persson Tobias Strömberg

12 Vision Guided Robot Control 5-6- IRB34 FlePicker IRB34 är en robot från ABB som även är känd som FlePicker. Det är en robot som monteras uppochner i en robust robotcell och har därför arbetsytan under sig. Den absolut största fördelen med FlePicker är dess snabbhet. Enligt ABB så kan den hantera mer än 5 plockningar per sekund. För vidare information se referens. Den stora nackdelen är att robotens armar är väldigt klena och därför inte orkar med så stora laster. Runt ett kilo är mavikt. Även detta är enligt ABB och alltså inget som vi testat oss fram till då vår last vägde långt under mavikt. Figur.. IRB34 FlePicker från ABB. IRB34 är en robot med fyra alar. Ael, och 3 styr roboten i X-, Y- och Z-led. Genom olika kombinationer av dessa alar kan man röra roboten i tre dimensioner. Ael 4 sköter rotationen av verktyget som kan vara t e en gripklo, sugpropp mm. Roboten levereras också med ett vakuumsystem så att den ska kunna plocka upp olika föremål med ovan nämnda eempel på verktyg. Eftersom längden på ael 4 varierar är denna av teleskopmodell. Figur.3. Alarna för en IRB34. TCP (Tool Center Point) utmärker verktygsfästet. Peter Knutsson (83) Ted Persson Tobias Strömberg

13 Vision Guided Robot Control 5-6- Kontrollsystem För att kunna styra roboten och skicka kommandon till den så måste det finnas ett kontrollsystem. Det är den stora gråa lådan som står intill nästan alla ABB-robotar (se figur.4). För att styra vår FlePicker användes ett system som kallas S4Cplus. Systemet innehåller följande viktiga byggstenar: Handenhet Programmeringsspråket RAPID Två Ethernet-kanaler RAP Handenheten gör så att man kan styra (även kallat jogga) roboten med en liten joystick placerad på enhetens ovansida. På handenheten finns också knappar samt en display som visar inställda värden. I handenheten, eller rättare sagt i S4Cplus, finns dessutom ett Windowsliknande grafiskt gränssnitt med rullister och andra menyval. RAPID är ett högnivåspråk och är ganska lätt att ta till sig. ABB erbjuder ett program vid namn RobotStudio som genom grafisk programmering kan skapa färdiga RAPID-program. Mer om detta kan ses i avsnittet RAPID-program under kapitlet Programmering. S4Cplus kan kopplas ihop med ett nätverk av t e datorer och switchar genom Ethernet /Mbit. Detta gör att man kan sitta i en helt annan del av världen och styra roboten. RAP är ett robotprotokoll som gör att man kan styra roboten från t e en PC. En mycket bra och användbar implementering i vårt fall. Mer om detta i avsnittet RAP i kapitlet Programmering. Figur.4. Kontrollsystem S4CPlus från ABB med handenhet (TeachPendant). Peter Knutsson 3(83) Ted Persson Tobias Strömberg

14 Vision Guided Robot Control 5-6- Verktyg för IRB34 FlePicker När delprojektet startade så hade vi tillgång till en gripklo som personal vid AASS hade tagit fram sedan tidigare. Denna gripklo var mycket väl fungerande men vi ansåg att den var för stor och otymplig. Dessutom så var den ganska hög, runt 7 millimeter. Då arbetshöjden för en FlePicker är 5 mm och banorna med vagnarna bygger cirka 6 mm så blir det lite för litet spelrum mellan föremål och gripklo. För att undvika detta problem så tillverkade vi ett eget verktyg. Vi tänkte att om vi har en rund sugpropp istället så underlättar vi programmeringsbiten genom att inte behöva tänka på hur ael 4 står (rotationsaeln). Se figur.3. För att hålla nere vikten så mycket som möjligt valde vi att tillverka kroppen, som sugproppen sitter på, i plast. FlePicker klarar maimalt en belastning på ett kilo på grund av dess höga acceleration så vikten är väsentlig. Gängorna gjordes med gängsnitt och hela enheten kopplades på roboten. Vi kopplade på vakuumslangen och testade sugförmågan. Det visade sig att vi erhöll minimalt läckage och den skulle enkelt klara av att lyfta uppgiftens arbetsobjekt. Vakuumet kontrolleras via en ventil av styrsystemets I/O-kort. Detta gör att kontrollen av vakuumet kan ske i samma program som kontrollerar robotens övriga rörelser (se avsnittet RAPID-program i kapitlet Programmering). Figur.5. Det modifierade vakuumverktyget. Peter Knutsson 4(83) Ted Persson Tobias Strömberg

15 Vision Guided Robot Control 5-6- Cellen Roboten (IRB34 FlePicker) sitter monterad i taket på en bur enligt figur.6. Vagnarna är monterade på skenstyrningar där varje vagn drivs via en rem av varsin likströmsmotor. Nedan följer beskrivningar av de ingående komponenterna. Figur.6. Hela cellen med robot, ljusarmatur och banorna. Buren Roboten som normalt är takplacerad sitter monterad i en bur från ABB. Detta ger roboten en plan horisontell arbetsyta av storleken 88 cm samt ett arbetsområde på ca 5 cm högt ovan arbetsytan. Buren är mycket stabil och påverkas inte av robotens hastiga rörelser. Belysning och kamera sitter även dessa monterade i buren. Belysning I buren sitter två armaturer för lysrör monterade på varsin sida i taket enlig figur.6. Lysrören är av modell LT58w/84 från Narva vars speciella egenskap är att den har högre frekvens än normal rumsbelysning. Detta för att inte störa visionkameror som annars kan vara känsliga för denna typ av problem. Banorna Två banor används för att transportera de vagnar från vilka vi plockar och placerar föremål. Banorna är av märket THK och garanterar en linjär rörelse av vagnarna. Varje bana är bestyckad med en vagn. Datablad för banorna finns bifogat i bilaga 7. Peter Knutsson 5(83) Ted Persson Tobias Strömberg

16 Vision Guided Robot Control 5-6- Drivning av vagnarna På vagnarna sitter remmar monterade som i sin tur löper mellan ett remhjul och en motor. Varje vagn är försedd med en tvåläges vippströmbrytare som kopplats till styrkortet för motorn. Vid vagnarnas ändlägen har mothåll för strömbrytarna monterats sådant att motorns styrkort får signal när vagnen skall vända. Se figur.7. Fig..7. Vagnen med strömbrytare () och mothåll för densamma (). Styrkort och motorer Styrkortet GE6A kommer från Grohmann Engineering och kontrollerar en 4 Volts likströmsmotor av modell RE4 från Maon Motors. Kortet har ingång för riktningsväljare samt hög eller låg hastighet. Det finns även möjlighet att justera inställningarna för hög respektive låg hastighet på kortet med hjälp av två vridpotentiometrar. Den ovan nämnda vippströmbrytaren påverkar kortets ingång för val av riktning. Kortet matas med 4 Volt från ett ställbart laborationsaggregat. Datablad för motorerna finns bifogat i bilaga 8. Peter Knutsson 6(83) Ted Persson Tobias Strömberg

17 Vision Guided Robot Control 5-6- Arbetsobjekt Det objekt vi valde att plocka och släppa var en rund puck med diametern 8 mm. Denna är konstruerad av hårdplast och på grund av att arbetsytan under banorna inte var helt plan försågs pucken med ett tunt lager dämpande gummi för att inte skada roboten eller dess verktyg. Arbetsobjektet markerades även med den röda fyrkanten som vårt kameraprogram letar efter enligt figur.8. Figur.8. Arbetsobjektet för Projekt. Pucken sedd från sidan. Kamera Kameran som användes heter Marlin F-33C och tillverkas av Allied Vision Technologies. Det är en kamera avsedd industribruk. Ett datablad för denna finns bifogat i bilaga 6. Peter Knutsson 7(83) Ted Persson Tobias Strömberg

18 Vision Guided Robot Control 5-6- CamCap För att bearbeta den data som kameran förmedlar använde vi oss av ett program vid namn CamCap. Programmet är framtaget vid AASS och skrivet i.net för att fungera under Windows XP. Programmet är uppbyggt av ett huvudprogram med importerbara uppgifter, tasks. Följande beskriver de två huvudsakliga delarna av programmet CamCap. - Huvudprogrammet fungerar som ett skal där man väljer in de kameror och tasks som man vill att programmet skall arbeta med. I bakgrunden har huvudprogrammet en inbyggd TCP/IP-server. Detta ger användaren möjlighet att erhålla data som programmet beräknat via vilken enkel TCP/IP-klient som helst. I vårt fall har vi implementerat en klient i VGRC som kopplar upp sig mot CamCap och tar emot dessa data. Samtliga data som programmet skickar via sitt TCP/IP-gränssnitt är kodat med XML-kod. Detta gör att alla värden måste avkodas ur XML-koden hos mottagaren innan den kan användas för beräkningar. - Uppgifterna som kan köras i CamCap består av filtreringar, skanningar och beräkningar av olika typer för att ta fram de data man önskar ur bilderna från en eller flera kameror. Vi har i detta projekt använt en uppsättning med filter som spårar en röd färg och positionsbestämmer dess masscentrum. Detta utförs genom att fyra uppgifter läggs efter varandra enligt nedan. Figur.9 visar en bild från kameran där objektet är märkt med ett fyrkantigt rött märke för att kunna spåras. Figur.9. Objektet som skall spåras är markerat med en röd fyrkant. Peter Knutsson 8(83) Ted Persson Tobias Strömberg

19 Vision Guided Robot Control Först skannas bilden efter den färg som vi söker och en ny bild skapas där den sökta färgen markeras med vitt och resterande färger som svart enligt figur.. Figur.. Den sökta färgen i bilden ersätts med vitt och resterande färger med svart.. Svaret från den första uppgiften genomgår sedan en binärskanning för att göra om bilden till en binär endimensionell vektor. Dessa är enklare för datorn att arbeta med, vilket gör att det går snabbare att bearbeta. 3. Vektorn från föregående uppgift går sedan igenom den tredje uppgiften som bestämmer centrum av den spårade färgens yta med avseende på bildens koordinatsystem enligt figur.. Figur.. Ett histogram bestämmer centrum av den spårade färgen i - respektive y- led. Peter Knutsson 9(83) Ted Persson Tobias Strömberg

20 Vision Guided Robot Control Koordinaterna samt eventuell annan information sänds ut över TCP/IP till de klienter som lyssnar. Dessa data kan även avläsas i CamCap enligt figur.. Figur.. Sökningen av en bild genomförd. Ett objekt med storleken 6 pilar har hittats vid = 475, y = 84 enligt Histogram Ma i bilden. Operationen tog cirka,8 sekunder. Peter Knutsson (83) Ted Persson Tobias Strömberg

21 Vision Guided Robot Control 5-6- Teori Att spåra ett objekt i linjär rörelse Vår arbetsstation har en kamera placerad i taket vars arbetsyta således blir delar av bordet under och omkring roboten enligt figur.3. I bilden kan man se en kraftig distorsion. För att kompensera detta användes en distorsionsmodell. Mer om detta i kapitlen Tester och resultat samt Begränsningar. Detta gör att kamerans bild av bordet får koordinater beroende på kamerans upplösning och placering. I vårt projekt har kameran alltid varit monterad på samma position i taket, dock har vi gjort försök med olika upplösningar för att erhålla maimal prestanda från systemet. Resultatet av detta kan ses i kapitlet Tester och resultat. Figur.3. Robotcellen sett från kameran monterad i taket. Ett föremål som befinner sig i en tvådimensionell värld kräver två koordinater för att positionsbestämmas. När man som i vårt projekt använder en digital kamera för att upptäcka ett objekt kan man genast positionsbestämma föremålet med hjälp av pilarna i bilden. En bild kan ses som första kvadranten i ett koordinatsystem med en - respektive en y-ael. Kameran som använts i vårt fall ger bilder i upplösningen 6448, detta betyder att bilden Upplösningen av en digital bild syftar på hur många pilar bilden är uppbyggd av. Piel eller bildpunkt är det minsta färgelementet i en digital bild. Peter Knutsson (83) Ted Persson Tobias Strömberg

22 Vision Guided Robot Control 5-6- som kameran visar är 64 pilar bred och 48 pilar hög. Det är därefter helt upp till den som skriver programvaran för kommunikationen mellan kameran och datorn att bestämma vilken av dimensionerna på bilden som skall kallas för respektive y. Hur detta görs beror oftast på hur kameran i fråga skall användas. Om kameran till eempel skall monteras sådant att bredden på bilden ligger i linje med -koordinaten i en tillhörande robots arbetsområde väljs lämpligen -koordinaten för att representera bildens bredd. Att en bilds längsta sida representeras som -ael är det mest förekommande fallet vilket även kan ses i de flesta fall där digitala bilder förekommer såsom t e upplösningar på bildskärmar, digitalkameror, tvapparater och projektorer. Om det i något fall skulle förekomma att det program som valts att användas mot kameran bestämmer - respektive y-aelns placering fel kan detta självklart konverteras om senare. I det program som skall använda data från kameraprogrammet döper man enkelt om de inkommande -värdena till y-värden och vice versa. Ett föremål som rör sig linjärt i en tvådimensionell värld kräver två positioner för att kunna ge en estimerad position beroende av tiden. Detta förutsätter då även att föremålets hastighet är konstant och att tiden mellan observationen av de två positionerna kan bestämmas. Antag att vi kan se två bilder av ett objekt som färdas linjärt med konstant hastighet genom en tvådimensionell värld och samtidigt vet hur lång tid som passerat mellan det att bilderna togs. Ur dessa bilder kan vi då bestämma utifrån bildens koordinatsystem vart objektet befunnit sig tidigare vid samtliga tidpunkter men även vart det kommer att befinna sig i framtiden. Alltså kan vi estimera en position för objektet i den tvådimensionella värld som beskrivs av bildens koordinatsystem. Den estimerade positionen behöver inte befinna sig inom de gränser som bilden från kameran är bunden till. Bilden utgör således bara det 64 första positiva -värdena samt 48 första positiva y-värdena av den tvådimensionella värld som kameran arbetar med. I detta projekt var kameran placerad på ett sådant sätt att vagnarnas vändpunkter befann sig inom kamerans synfält enligt bild.3. Utgångspunkten för att estimera en lämplig position och tidpunkt för plockning eller placering av objektet utgår i vår modell av att man initialt kontinuerligt kontrollerar om föremålet befinner sig efter vändläget. Detta är enkelt att kontrollera eftersom det spårade objektets -koordinat blir större och större till dess att vagnen vänder i sitt ändläge. Om man hela tiden jämför -koordinaten från föregående bild och plötsligt inser att den minskat kan man utgå ifrån att vagnen just vänt och är på väg in mot robotens arbetsområde. VGRC arbetar betydligt snabbare än CamCap och detta gör att flera värden från samma bild ofta jämförs med varandra. Detta utesluter att man skulle kunna leta efter de bilder där -koordinaten stämmer med föregående bilds och dra slutsatsen att vagnen under en kort stund stannat i vändläget. När vi nu har kommit så långt att vi konstaterat att vårt föremål, i detta fall en puck eller en vagn, har passerat vändpunkten i kamerans synfält och således befinner sig i en linjär rörelse mot robotens arbetsområde med konstant hastighet kan vi gå vidare på två sätt. Peter Knutsson (83) Ted Persson Tobias Strömberg

23 Vision Guided Robot Control 5-6- Att estimera en position för plockning eller placering av föremål med roboten Vi hade två olika sätt i åtanke för att lösa problemet med vart roboten skall plocka och placera föremålet. Det första är att låta tiden vara variabel och därför plocka objektet på en redan innan bestämd position när föremålet beräknas befinna sig där. Detta skulle i så fall lösas genom att man väljer t e en -koordinat som korsar robotens hela arbetsområde enligt figur.4 och bestämmer att föremålet skall plockas då det befinner sig någonstans längs denna linje. För att lösa ett sådant fall skulle krävas att man estimerar riktning för att bestämma vart på linjen föremålet skall plockas samt hur lång tid det kommer att ta innan föremålet befinner sig där. Fördelen med denna lösning är att plockpositionen kan bestämmas sådant att roboten alltid har minimalt avstånd mellan sin utgångsposition och platsen där objektet skall plockas eller placeras. Detta kan ha positiv inverkan på systemet om roboten inte är snabb eller om hastigheten på objektet som skall plockas är hög. Dock kräver denna lösning lite mer komplicerad programmering för att kunna arbeta med noggranna tidtagningar. Figur.4. Ett alternativ är att plocka objektet när det beräknas passera ett bestämt -värde t e enligt den gröna linjen i bilden. Peter Knutsson 3(83) Ted Persson Tobias Strömberg

24 Vision Guided Robot Control 5-6- Det andra sättet att arbeta på och det som vi valde till vår lösning är att låta positionen där objektet skall plockas eller placeras vara variabel i båda dimensionerna och endast bestämma innan vid vilken tidpunkt som plockningen skulle ske. Detta genomfördes på ett sådant sätt att vi lät tiden till dess att plockning eller placering skulle ske vara lika lång som tiden var mellan kamerans två bilder. Nedanstående figur.5 visar hur två punkter i ett koordinatsystem enligt kamerans pielbaserade kan ge en estimerad position. Figur.5. Två punkter i kamerans synfält ger möjlighet att estimera den tredje. För att estimera den tredje punkten kan man säga följande: Om vi kallar tiden mellan observationerna av punkt p och p för t pp samt tiden från observationen av punkt p tills objektet beräknats befinna sig i punkten p3 för t p p3 fås: A = = vid konstant hastighet. A t p p t p p3 p3 p3 X Y = = p p Y X + ( p + ( p Y X p X ) p ) Y, om A = A. Med ovanstående formler kan vi alltså bestämma en position för plockning eller placering av ett objekt enligt den modell vi valt att arbeta med. Detta fungerar oavsett hur banorna är vinklade samt hastigheten på vagnarna. Peter Knutsson 4(83) Ted Persson Tobias Strömberg

25 Vision Guided Robot Control 5-6- Kamerans värld möter robotens Ett problem som måste lösas för alla typer av visuellt kontrollerade system är frågan om hur kamerans värld stämmer överens med manipulatorns. I vårt fall har kameran ett synfält från sin placering som gör att allt i dess arbetsområde positionsbestäms med hjälp av pilar. Detta resulterar i att ett föremål som kameran ser alltid befinner sig på en position med X-värde mellan och 64 samt ett Y-värde mellan och 48 enligt kameran. När vi skall bestämma en position för plockning eller placering utifrån de koordinater som kameran ger oss blir resultatet självklart beskrivet i samma koordinatsystem och detta medför att resultatet måste konverteras för att roboten skall erhålla korrekt position. Industrirobotarna från ABB arbetar som de flesta andra industrirobotar med koordinatsystem baserade på vanliga storheter som millimeter eller inches. Dessa koordinatsystem använder vanligen - och y-koordinater för att beskriva planets positioner samt z-koordinater för höjdled. Robotarna kan kalibreras sådant att nollpunkten i dess koordinatsystem befinner sig vart som helst innanför dess arbetsområde. I detta fall har vi valt att placera nollpunkten i mitten av robotens arbetsområde. Roboten har i vårt projekt ett arbetsområde som sträcker sig mellan -39 och 39 mm i -led samt mellan -39 och 39 mm i y-led. För att konvertera de beräknade koordinaterna enligt kamerans koordinatsystem till koordinaterna i robotens koordinatsystem kom vi fram till följande formler: Robot Robot X Y = ( Offset X ( Camera X FactorX )) ( ( Offset ( Camera ))) Factor = Y Y Y Offset = Två konstanter för att korrigera förskjutningen mellan robotens och kamerans koordinatsystem. Factor = Faktorer för att omvandla pilar till millimeter. Camera = Koordinater i pilar från kameran. Robot = Robotkoordinater i millimeter. Formlerna visar hur vi konverterade kamerans koordinater och således även de estimerade plockpositionerna till robotens koordinatsystem. Peter Knutsson 5(83) Ted Persson Tobias Strömberg

26 Vision Guided Robot Control 5-6- Programmering VGRC (Vision Guided Robot Control) Vårt program är uppbyggt av i huvudsak tre generella delar enligt:. Kommunikation och funktioner för robot via RAP över TCP/IP.. Kommunikation och funktioner för CamCap över TCP/IP. 3. Beräkningar och rutiner för kontrollering av det totala systemet. Vi valde att bygga upp programmet med tre flikar för att få en bekvämare och mera lätthanterlig bild över programmet. För att kontrollera roboten valde vi att konstruera ett gränssnitt som kunde hämta intressant information och åskådliggöra denna på ett bra sätt för användaren. Det vi ansåg mest intressant var: Ansluta eller koppla ner kommunikationen mellan VGRC och roboten. Ge användaren upplysning om robotens aktuella position. Flytta roboten till önskad position. Ge användaren upplysning om robotens hastighetsinställningar. Ändra robotens hastighetsinställningar. Kontrollera gripdonet på roboten. Nedan visas i figur.6 fliken som ger användaren kontroll över roboten. Figur.6. Fliken Jog ger användaren kontroll över roboten. Peter Knutsson 6(83) Ted Persson Tobias Strömberg

27 Vision Guided Robot Control 5-6- Den andra kommunikationen som vi önskade få separat kontroll över var det data som kunde skickas till och tas emot från kameraprogrammet CamCap. För att sköta detta skapade vi ett enkelt gränssnitt som skulle klara följande: Ansluta eller koppla ner kommunikationen mellan VGRC och CamCap. Skicka standardkommandon som valdes ur en lista. Skicka egenskrivna kommandon. Ta emot och visa den information som CamCap svarade med när programmen var anslutna. Nedan visas fliken för kommunikation med CamCap i figur.7. Figur.7. Under dropplisten Commands finns föreinställda kommandon. Huvudprogrammet som kopplar ihop samtliga funktioner och genomför hela processen med en plockning och en placering av objektet med hjälp av roboten startas och övervakas från fliken Pick & Place. Följande krav ställde vi på detta gränssnitt: Processen skall kunna startas och stoppas med alternativ om repeterad körning. Användaren skall kunna ta del av så mycket som möjligt av processens aktuella status. Inställningar för tidtagningen skall kunna kontrolleras. Aktuella positioner för plockning och placering skall åskådliggöras efter avslutad process. Vi valde att ge användaren så mycket information som möjligt på ett överskådligt sätt genom att använda kryssrutor som programmet fyllde i under processens gång. Programmet utför många uppgifter under korta tider, speciellt om objektet som skall plockas har hög hastighet. Därför ger alternativet med kryssrutor användaren möjlighet att hinna följa med när operationerna går fort. Tidtagningarna syftar till den tid som man önskar mellan kamerans bilder samt mellan kamerans andra bild och den tidpunkt då objektet skall plockas. På grund av gripdonets Peter Knutsson 7(83) Ted Persson Tobias Strömberg

28 Vision Guided Robot Control 5-6- fördröjning och några andra mindre faktorer visade det sig nödvändigt att kunna variera dessa tider. Nedan visas hur fliken för huvudprogrammet ser ut enlig figur.8. Figur.8. Kryssrutan Continously ger användaren möjlighet att köra programmet kontinuerligt. Längst ner i programmet valde vi att placera ett statusfält. Fältet visar samma information som kryssrutorna i tet under programmets gång. Fördelen med fältet är att mera specifik information om eventuella delprocesser eller felmeddelanden visas i klartet för användaren här. Under programmets gång när de första två kryssrutorna för robotens och kamerans anslutning blivit ikryssad berättar statusfältet t e att programmet väntar på att vagnen skall passera vändläget eller att objektets första position har registrerats. När man använder de andra flikarna i programmet visas eventuella felmeddelanden av mindre vikt i statusfältet t e om man försöker flytta roboten utanför dess arbetsområde eller om man försöker skicka ett kommando till CamCap utan att först ha anslutit till det. Peter Knutsson 8(83) Ted Persson Tobias Strömberg

29 Vision Guided Robot Control 5-6- Programmeringsmetodik VGRC har en huvuddel som anropar ett stort antal funktioner. Ett urval av dessa visas nedan: private void Connect_rob() private void Disconnect_rob() private void Jog() private void Set_speed(float s) private float Get_speed() private Rapper.Structs.pose Get_pose() private void set_pose(rapper.structs.pose coord) public void cart_turn() public void pick(rapper.structs.pose coordinates) public void place(rapper.structs.pose coordinates) private void Connect_cam() private void Disconnect_cam() Funktionerna är till för att dela upp programmet i mindre delar. Tanken är att i så stor grad som möjligt återanvända kod och därigenom inte göra programmet större än nödvändigt. Funktionerna utför olika uppgifter som t e att ändra robotens hastighet eller att hämta robotens aktuella position. I huvuddelen (main) görs alla uppkopplingar till både visiondatorn och robotens styrskåp. En del grundläggande inställningar görs innan programmet startar. Vi börjar med att kontrollera om vagnen har vänt efter vändläget. Därefter skickar CamCap två positioner med en bestämd tid emellan. Denna tid har man som användare ställt in innan man startat huvudprogrammet. En plockposition beräknas och roboten flyttas dit och plockar arbetsobjektet. Sedan går roboten tillbaka till startpositionen. Detta upprepas sedan för att släppa arbetsobjektet tillbaka på vagnen. Beroende på om användaren vill att detta ska köras kontinuerligt så fortsätter programmet med ovanstående procedur, annars avslutas programmet. För komplett programkod för VGRC, se bilaga. Peter Knutsson 9(83) Ted Persson Tobias Strömberg

30 Vision Guided Robot Control 5-6- Flödesschema Flödesschemat i figur.9 nedan visar hur en cykel för plockning samt placering löper enligt vår slutliga modell. Nej Start Eventuella inställningar kan justeras innan körning. Kör kontinuerligt? Ja Ja Både plockat och placerat? Nej Hämta :a värdena från CamCap. Vagnen efter vändläget? Nej Ja Vänta T (ms). Hämta :a värdena från CamCap. Vänta T (ms). Beräkna position för plockning eller placering. Flytta roboten till den beräknade positionen. Låt roboten plocka eller placera objektet. Flytta roboten till startposition. Figur.9. Ovanstående flödesschema visar hur vårt program VGRC arbetar. Peter Knutsson 3(83) Ted Persson Tobias Strömberg

31 Vision Guided Robot Control 5-6- RAPID-program Själva flödet av data i styrskåpet sköts med ABB:s egna programspråk RAPID. Det påminner ganska mycket om C-språket i den mening att variabler deklareras i början av programmet och programmeringsflödet är sekventiellt. Även kända funktioner, datatyper och villkorssatser känns igen. Den mest användbara datatypen för oss kallas PERS. Det är en förkortning för engelskans persistent. I praktiken betyder det helt enkelt att det är en global variabel som vi kan komma åt från en annan dator via ett protokoll (RAP i detta fall). Vi hade flera stycken PERSvariabler i vårt program. En som är en struct innehållandes -, y- och z-position för nästa position som roboten ska gå till. En annan som är en boolesk variabel som vi ändrar i huvudprogrammet när vi vill utföra en rörelse med roboten. Så förkortat fungerar det så här: ) Huvudprogrammet har räknat ut nästa position för roboten. ) Positionen skickas till RAPID-programmet. 3) Huvudprogrammet sätter en flagga som skickas till RAPID-programmet. 4) RAPID-programmet märker av en ändring på flaggan. 5) Roboten går till den beräknade positionen. I RAPID-programmet finns även en variabel som bestämmer när vi ska slå på eller av vakuumet för antingen upplockning eller placering av föremålet. För komplett kod se bilaga 4. RobotStudio och ProgramMaker ABB tillhandahåller även ett offline-programmeringsverktyg vid namn RobotStudio. Det är avancerat program som erbjuder en grafisk programmering av valfri ABB-robot. Det går till så att man laddar in ett bibliotek innehållandes en robot. Till denna kan man även koppla på färdiga eller egenprogrammerade verktyg. Sedan kan man göra det mesta som man kan göra med en handenhet (TeachPendant) t e teacha positioner, jogga, sätta digitala signaler mm. Den största fördelen med RobotStudio för vår del är att man kan eportera det grafiska programmet till ett applikationsprogram vid namn ProgramMaker. Det som händer är att när man laddar in programmet man gjort i RobotStudio så får man ut RAPID-koden, dvs. den kod som skall laddas in i styrskåpet. Så för att slippa skriva en massa kod kan man istället göra den grafiskt och låta ProgramMaker skriva koden åt dig. Vi använde mest RobotStudio och ProgramMaker i början av projektet för att få fram råkoden, t e storlek på verktyget, dess vikt samt hur programmeringskoden såg ut i allmänhet. En struct är en egenskapad datatyp oftast bestående av flera olika datatyper. Teacha fr. eng Teach Sv Lära. Roboten flyttas till en punkt och denna sparas i programmet. Peter Knutsson 3(83) Ted Persson Tobias Strömberg

32 Vision Guided Robot Control 5-6- RAP För att kunna redigera och påverka de tidigare nämnda PERS-variablerna i programkoden som styr roboten under tiden som programmet eekveras använde vi en funktion som ABB kan erbjuda nämligen RAP. Detta står för Remote Access Protocol och kan användas via både RS3 (seriell anslutning) samt TCP/IP (LAN ). Vi använde oss av det sistnämnda. För att skriva till de variabler som RAP-protokollet möjliggör använde vi två äldre dll-filer som skapats under tidigare projekt vid AASS. Dessa var dock skrivna för att anropas med C++ eller Visual Basic vilket inte passade oss eftersom vi valt att skapa våra program med hjälp av C# för nya.net. För att kunna använda de tidigare kommunikationsfilerna skapade vi en ny dll-fil i.net miljön som vi kunde anropa i våra program. Detta bibliotek arbetade i sin tur med de äldre filerna. För komplett programkod, se bilaga 3. Local Area Network Lokalt nätverk Dynamic Link Library ett bibliotek med specifika drivrutiner. Peter Knutsson 3(83) Ted Persson Tobias Strömberg

33 Vision Guided Robot Control 5-6- Tester och resultat Vårt program VGRC testades väl och med mycket lyckade resultat. När de ingående komponenterna i systemet arbetade väl med varandra fungerade systemet bra. Den biten som i detta projekt av arbetet visade sig vara det största problemet var den visuella delen av systemet. Vi gjorde åtskilliga tester för att erhålla så stor stabilitet från CamCap och kameror som möjligt. Ljusförhållanden och val av färger som skulle spåras visade sig vara av största vikt då minsta variation i något av dessa resulterade i dålig precision eller helt misslyckade försök till plock. Kamerans stora avstånd till bordet och val av lins med avseende på upplösningen gjorde att små fel i kameran gav stora felutfall i verkligheten. Figur.. Kamerans arbetsområde kan varieras beroende på vilken lins som används. Enligt bild. ovan kan man beräkna utifrån att kameran har en upplösning av 6448 pilar och att måtten av arbetsområdet i verkligheten är ungefär 35 cm att en piel motsvarar ungefär,5 cm i verkligheten. Om det spårade objektets färg avläses i en mindre bra bild från kameran på grund av t e dåliga ljusförhållanden kan detta resultera i att objektets centrum misstolkas med låt säga 5 pilar. Detta är inte mycket från kameran sett men med tanke på det verkliga arbetsområdet så skulle roboten försöka att plocka objektet på ett avstånd av 5,5 =,5cm från dess riktiga mittpunkt och detta skulle leda till att försöket misslyckades. Peter Knutsson 33(83) Ted Persson Tobias Strömberg

34 Vision Guided Robot Control 5-6- Då försök gjordes med halverad upplösning på kameran (34) visade sig att den om möjligt ökande bildhastigheten i filtreringarna blev ointressant eftersom precisionen försämrades radikalt. Detta enligt samma princip som ovan. Alltså motsvarar en piel cirka en cm vid den lägre upplösningen mot de tidigare,5 cm. Tester med att flytta kameran utfördes aldrig då vi ansåg att om kameran placerades närmare arbetsytan skulle distorsionen bli mer påtaglig. Detta då banorna skulle hamna längre ut i kamerans periferi. Problemet skulle hellre lösas med att byta lins eller använda sig av en bättre distorsionsmodell. Men då vi inte hade tid eller resurser så gjorde vi istället det bästa av situationen. Vi utförde även tester som innefattade variationer i hastigheten hos banorna. Detta för att se hur snabbt systemet klarade av att beräkna och agera. När något rör sig med hög hastighet framför kamerorna tenderar bilderna att bli suddiga och utdragna. Detta resulterar i att de sökta färgerna blir mindre intensiva i bilderna samt att de får utdragna och felvisande former. Det visade sig att så länge korrekt data erhölls från CamCap klarade systemet av förvånansvärt höga hastigheter, fördelen med att kunna kontrollera tiderna mellan bilderna och tiden till dess att objektet skulle plockas var mycket användbart när hastigheterna ökade. Den tid som det tog för roboten att gå ner och plocka objektet fick plötsligt större betydelse och detta kunde hjälpas genom att förkorta tiden mellan tidpunkten då den andra bilden togs och den tidpunkt då roboten aktiverades för att gå ner och plocka eller placera objektet. Vid tester med mycket långsamma hastigheter på vagnarna visades tydligt att hastigheten står i direkt koppling till plocksäkerheten hos systemet. En långsam vagn ger bättre bilder till den visuella delen av systemet vilket i sin tur ger positioner med högre noggrannhet till huvudprogrammet. Att plocka eller placera ett objekt från eller på en vagn med låg hastighet är mycket enklare med avseende på de annars kritiska tidpunkterna. Testerna gav oss ett klart besked vad gällde systemet. Så länge den visuella delen av systemet bidrog med korrekta värden så klarar de övriga delarna att hinna med oavsett hastighet. Vårt program VGRC var snabbt nog med marginal och ABB:s FlePicker hade aldrig några svårigheter hastighetsmässigt. Peter Knutsson 34(83) Ted Persson Tobias Strömberg

35 Vision Guided Robot Control 5-6- Begränsningar Den aktuella linsen som användes till kameran var av typen vidvinkel. I CamCap användes en distortionsmodell eftersom linsen förvrängde bildens periferi. Denna var konstruerad vid AASS under ett tidigare projekt då kameran varit placerad på liknande sätt. Det som dock skiljde sig var att vårt projekt hade ett arbetsområde som befann sig längre ifrån kameran i höjdled och därför stämde inte distorsionsmodellen fullt ut. Detta resulterade i vissa svårigheter att ta fram överföringsfunktionerna för att översätta kamerans koordinatsystem mot robotens koordinatsystem. Rakt under kameran i de centrala delarna av bilden stämde överföringsfunktionerna bra men då erhölls sämre resultat längre ut i bilden. Den slutliga överföringsfunktionen kom att bli en kompromiss mellan noggrannhet mitt i bilden och längre ut i periferin. En matematisk modell som gör om den sfäriska bilden kameran ger (se figur.) till en platt referensbild. Peter Knutsson 35(83) Ted Persson Tobias Strömberg

36 Vision Guided Robot Control 5-6- Förbättringar För att kunna gå vidare med detta projekt och erhålla ännu högre hastighet och precision av systemet skulle den visuella delen behöva justeras i fråga om framförallt precision. I de tester vi genomfört har hastigheten sällan eller aldrig varit något av ett problem. För att öka precisionen i systemet skulle kameran framför allt förses med en annan lins. För detta projekt skulle en vanlig lins passa bättre eftersom det spårade objektet endast är intressant inom ett mindre område. Ett annat problem som framstod tydligt relativt sent i projektets gång var banorna. Tröghetsmomentet vid start av vagnarna som transporterar arbetsobjekten i kombination med att motorerna inte var så starka vid låga hastigheter gjorde att hastigheten på banorna inte var helt linjär direkt efter vändlägena. För att förbättra detta skulle med fördel starkare motorer monteras för att driva banorna med vagnar. Peter Knutsson 36(83) Ted Persson Tobias Strömberg

37 Vision Guided Robot Control 5-6- Slutsatser Vi anser att projektet var lyckat. Det gav oss mycket lärdom om delar som vi inte kommit i kontakt med tidigare. Framförallt programmering i C#, kommunikation med program för PC över TCP/IP, kontroll av robot med PC via RAP och bildbehandling i strömmande bildformat. Det har gett oss bra insikt i grunderna för hur kamerastyrda robotprogram kan skapas från grunden. Vilka viktiga grundelement som måste finnas. Vi har upptäckt var de kritiska flaskhalsarna i systemet vanligtvis uppträder och gjort framgångsrika försök för att optimera systemets totala funktionalitet. Dessutom gav detta projekt oss bra grunder och idéer för utvecklingen av de kommande projekten. Vi kunde använda delar av de program vi skapat här längre fram. Vi fick kunskap om hur flera för oss från början komplicerade problem nu kunde lösas. Peter Knutsson 37(83) Ted Persson Tobias Strömberg

38 Vision Guided Robot Control 5-6- Projekt Generell beskrivning Grundidén med detta projekt är att balansera en inverterad pendel med hjälp av en robot. All information om pendelns position skall tas in med hjälp av visionkameror. Två kameror kommer att användas. Dessa kommer inledningsvis att stå placerade med 9 graders vinkel mot varandra. Teorin gällande att ha en annan vinkel mellan kamerorna kommer även att behandlas. Val av robot När denna del av projektet inleddes hade vi planerat att arbeta med den nyinköpta IRB4 vilken vi tyckte skulle lämpa sig bäst för att utföra den tänkta uppgiften. Därför skapade vi ett verktygsfäste samt en pendel som skulle fungera under teststadiet av projektet. Pendeln ledades i underkant så att den ej skulle ramla av under testerna och på så vis ta onödig tid av arbetet. Hur denna ser ut går att se på bild.. Figur.. IRB4 med verktyg monterat. Peter Knutsson 38(83) Ted Persson Tobias Strömberg

39 Vision Guided Robot Control 5-6- Vi hade en senare leverans än beräknat av roboten samt önskad mjukvara som är nödvändig för att kunna styra roboten från en separat dator. Därför valde vi att genomföra våra tester på samma robot som använts i det första projektet, alltså en IRB34. Denna har både sina föroch nackdelar. På den positiva sidan kan man lägga dess snabbhet och i sammanhanget bra precision. Dock har den en uppenbar nackdel i dess fysiska uppbyggnad. En Flepicker, som den även kallas, är skapad för att takmonteras eller monteras i överkant av en robotcell. Detta innebär att den endast kan påverka sin miljö ovanifrån och för vårt projekt behöver vi naturligtvis hålla i pendeln underifrån. För att lösa detta problem byggde vi en horisontell arm från robotens verktygsfäste. På denna arm kunde vi sedan placera vår inverterade pendel. Även här skapades en slags ledkula, på vilken vår pendel kunde röra sig utan att ramla av helt. Denna kan ses på bild.. Figur.. Robotcellen med robot, verktyg och pendel. Peter Knutsson 39(83) Ted Persson Tobias Strömberg

40 Vision Guided Robot Control 5-6- Systemets uppkoppling Figur.3. Systemets uppkoppling. Den mjukvara vi använde till visiondelen är ett program som heter CamCap. Med detta kunde vi bestämma den inverterade pendelns lutning och position. Mer om detta program i kapitlet CamCap. Bildbehandling och beräkningar som görs i detta program är tunga och kräver en kraftfull dator. Vi bestämde också tidigt att vi skulle lägga stor vikt vid att detta skulle ske i så snabb hastighet som möjligt. Målet är att få pendelns lutning och koordinater i något som är så likt realtid som möjligt. Vi antog och såg sedan att våra farhågor blev bekräftade att detta kan vara en av de flaskhalsar som kan slöa ner systemet och få roboten att reagera för sent vilket kan ge motsatt effekt. Med detta i åtanke valde vi att använda vår kraftfullaste dator till den här delen. Datorn som användes har dubbla processorer med en hastighet av 6 MHz vardera. Dessutom har den ett RAM-minne på 3,5 GB. Man kan se att när programmet körs så används en stor del av dess processorkapacitet och med en långsammare dator hade detta troligtvis inte fungerat tillfredställande. Datorn har även ett kort med två stycken firewire-portar. Dessa användes till att koppla in de två visionkameror som användes. Firewire är ett snabbt alternativ till dataöverföring för att ge en så kort fördröjning som möjligt. VGIP (Vision Guided Inverted Pendulum) är en mjukvara som vi skapade och designade själva till den här uppgiften. Det är programmerat i Visual studio.net vilket är ett kraftfullt Peter Knutsson 4(83) Ted Persson Tobias Strömberg

41 Vision Guided Robot Control 5-6- program som gör det enkelt att skapa Windows-applikationer för en användarvänlig arbetsmiljö. Språket som användes var C# vilket för oss kändes lämpligast till uppgiften. Ingen av oss hade tidigare någon större erfarenhet av detta språk men vi kände ändå att detta inte skulle skapa några problem då dess likheter med C och C++ är stora. Vi har alla tidigare programmerat mycket i C. Den största fördelen med C# är dess minneshantering som är enklare och bättre än i tidigare nämnda språk. Även för denna uppgift hade vi en kraftfull dator. Med två processorer med en hastighet på 7 MHz vardera och ett RAM-minne på 5 MB räckte den till för att klara uppgiften. Denna dator fick fungera som något av en huvuddator. På den här enheten sköttes alla uträkningar och omvandlingar av data. Genom en router kopplades den samman med visiondatorn och robotens styrskåp. Från CamCap erhålls här data om pendelns positioner. För att ta emot dessa värden så inkluderades en TCP/IP-klient i programmet som läste av den ständiga strömmen som skickades från CamCap. Två stycken kameror kopplades in till vår visiondator. Kamerorna är av märket Marlin och modellen heter F-33C. Tillverkaren heter Allied Vision Technologies. Dessa kopplades via firewire. Program skapade för att användas under operativsystemet Windows. Peter Knutsson 4(83) Ted Persson Tobias Strömberg

42 Vision Guided Robot Control 5-6- IRB34 FlePicker IRB34 är en robot från ABB som även är känd som FlePicker. Det är en robot som monteras upp och ner i en robust robotcell och har därför arbetsytan under sig. Den absolut största fördelen med FlePicker är dess snabbhet. Enligt ABB så kan den hantera mer än 5 plockningar per sekund. För vidare information se referens. Den stora nackdelen är att robotens armar är väldigt klena och kan därför inte orka med så stora laster. Runt ett kilo är mavikt. Detta är enligt ABB och alltså inget som vi testat oss fram till då vår last vägde långt under mavikt. Figur.4. IRB34 FlePicker. IRB34 är en robot med fyra alar. Ael, och 3 styr roboten i X-, Y- och Z-led. Genom olika kombinationer av dessa alar kan man röra roboten i tre dimensioner. Ael 4 sköter rotationen av verktyget som kan vara t e en gripklo, sugpropp mm. Roboten levereras också med ett vakuumsystem så att den ska kunna plocka upp olika föremål med ovan nämnda eempel på verktyg. Eftersom längden på ael 4 varierar är denna av teleskopmodell. Figur.5. Alarna för en IRB34. TCP (Tool Center Point) utmärker verktygsfästet. Peter Knutsson 4(83) Ted Persson Tobias Strömberg

43 Vision Guided Robot Control 5-6- Kontrollsystem För att kunna styra roboten och skicka kommandon till den så måste det finnas ett kontrollsystem. Det är den stora gråa lådan som står intill nästan alla ABB-robotar (se figur.6). För att styra vår FlePicker så används ett system som kallas S4Cplus. Systemet innehåller följande viktiga byggstenar: Handenhet Programmeringsspråket RAPID Två Ethernet-kanaler RAP Handenheten gör så att man kan styra (även kallat jogga) roboten med en liten joystick placerad på enhetens ovansida. På handenheten finns också knappar samt en display som visar inställda värden. I handenheten, eller rättare sagt i S4Cplus, finns dessutom ett Windowsliknande grafiskt gränssnitt med rullister och andra menyval. RAPID är ett högnivåspråk och är ganska lätt att ta till sig. ABB erbjuder ett program vid namn RobotStudio som genom grafisk programmering kan skapa färdiga RAPID-program. Mer om detta kan ses i avsnittet RAPID-program under kapitlet Programmering. S4Cplus kan kopplas ihop med ett nätverk av t e switchar och datorer genom Ethernet /Mbit, detta gör att man kan sitta i en helt annan del av världen och styra roboten. RAP är ett robotprotokoll som gör att man kan styra roboten från t e en PC. En mycket bra och användbar implementering i vårt fall. Mer om detta i kapitlet Programmering under avsnittet RAP. Figur.6.. Kontrollsystem S4CPlus från ABB med handenhet (TeachPendant). Peter Knutsson 43(83) Ted Persson Tobias Strömberg

44 Vision Guided Robot Control 5-6- Verktyg för IRB34 FlePicker För att kunna använda denna typ av robot vid detta projekt valde vi att bygga ett nytt verktyg som skulle uppfylla följande tre kriterier:. Det skulle möjliggöra för pendeln att stå på verktyget utan att kollidera med robotens armar.. Det skulle hålla så låg vikt som möjligt. 3. Det skulle klara av att förmedla de snabba accelerationer som roboten kunde komma att utsätta det för. Vi började med att leta reda på ett så lätt material som möjligt. Så småningom hittades ett fyrkantsrör i aluminium som verkade kunna vara idealt för den här uppgiften i och med dess vikt och materiella styrka. För att pendeln inte skulle krocka med robotkroppen eller dess armar så var vi tvungna att få bort den en bit från roboten. För att göra detta möjligt så gjordes staget vinkelformat som sedan pendeln placerades längst ut på. Detta visade sig bli ganska instabilt och sladdrigt när roboten väl började röra på sig och därför lade vi till ett snedstag som stabiliserade upp konstruktionen avsevärt. För att kunna balansera en inverterad pendel så måste den till att börja med kunna röra sig i tre dimensioner obehindrat. För att lösa detta satte vi därför en kula på aluminiumstaget där pendeln, som är rörformad, hade sin bas på (se figur.7). Vi låste även pendeln lite lätt med ståltråd vid basen för att den inte skulle ramla av verktyget varje gång vi testade. Ståltråden var dock så slappt spänd så att det inte inverkade på pendelns beteende. Efter lite testande genom att jogga roboten till olika positioner för att kolla så att pendeln inte krockade med roboten kom vi fram till att arbetsområdet blev på cirka 84 cm. En area som duger gott och väl då vi enbart jobbar med små rörelser och korrigeringar. Nedan visas verktyget i figur.7. Figur.7. Verktyget för att hålla pendeln. Peter Knutsson 44(83) Ted Persson Tobias Strömberg

45 Vision Guided Robot Control 5-6- På grund av senare problem med systemets hastighet (se avsnittet Tider i kapitlet Teori) så infördes en gummisnodd vars ena ände satt fast i ovandelen på pendeln och dess andra ände i buren. Detta för att staven inte kunde stå helt upprätt för sig själv vid testkörning. Detta gjorde att roboten fick en chans att rädda pendeln från att falla då den fick en reducerad fallande kraft tack vare gummisnodden. Buren Roboten som normalt är takplacerad sitter monterad i en bur från ABB. Detta gjorde med vårt eget verktyg monterat att roboten fick ett arbetsområde som motsvarade en horisontell rektangel av storleken 84 cm. Belysning De två armaturer med lysrör som sitter monterade i buren användes inte för detta projekt. Detta eftersom kamerorna bländades och detta fick till följd att färger i bilderna urskiljdes sämre. Som ersättning riktades ljus från taket för att ge kamerorna nödvändigt ljus. Arbetsobjekt Pendeln konstruerades av ett plaströr. Längden på pendeln är 8 mm dess diameter 5 mm. Färgmarkeringen på pendeln för kamerorna består av två färgband runt pendeln med ett avstånd av 6 mm mellan varandra. Både röd och grön färg användes vid test. Kameror Kamerorna som användes heter Marlin F-33C och är tillverkade av Allied Vision Technologies. Det är en kamera avsedd industribruk. För mer information om kamerorna, se bilaga 6. Två kameror monterades på varsitt stativ enligt figur.8 och placerades på golvet utanför buren. En kamera framifrån för att kontrollera pendeln i -led samt en kamera från sidan på buren för att kontrollera pendeln i y-led. Peter Knutsson 45(83) Ted Persson Tobias Strömberg

46 Vision Guided Robot Control 5-6- Figur.8. Kameran av modell Marlin F-33C monterad på stativ. Peter Knutsson 46(83) Ted Persson Tobias Strömberg

47 Vision Guided Robot Control 5-6- CamCap För att bearbeta den data som kamerorna förmedlar använde vi oss av ett program vid namn CamCap. Programmet är framtaget vid AASS och skrivet i.net för att fungera under Windows XP. Programmet är uppbyggt av ett huvudprogram med importerbara uppgifter tasks, följande beskriver de två delarna av programmet. - Huvudprogrammet fungerar som ett skal där man väljer in de kameror och tasks som man vill att programmet skall arbeta med. I bakgrunden har huvudprogrammet en inbyggd TCP/IP-server. Detta ger användaren möjlighet att erhålla data som programmet beräknat via vilken enkel TCP/IP-klient som helst. I vårt fall har vi implementerat en klient i VGIP som kopplar upp sig mot CamCap och tar emot dess data. Samtliga data som programmet skickar via sitt TCP/IP-gränssnitt är kodat med XML-kod. Detta gör att samtliga värden måste avkodas ur XML-koden hos mottagaren innan den kan användas för beräkningar. - Uppgifterna som kan köras i CamCap består av filtreringar, skanningar och beräkningar av olika typer för att ta fram de data man önskar ur bilderna från en eller flera kameror. I detta projekt använde vi ett filter som konstruerats speciellt för den givna uppgiften. Anledningen till detta var att vi vid försök med de vanliga filtrena erhöll mycket långa beräkningstider på grund av onödigt mycket filterberäkningar. Nedan förklaras hur pendelns lutning i -led kontrolleras med en kamera, pendelns lutning i y-led kontrolleras på samma sätt med ytterligare en kamera. Figur.9. Bilden visar hur kameran ser pendeln. De två röda banden på pendeln syns tydligt. Peter Knutsson 47(83) Ted Persson Tobias Strömberg

48 Vision Guided Robot Control Först skannar vårt filter bilden efter den färg som vi valt genom en av oss modifierad binär skanningsprocess och markerar denna med vit färg. Sedan skannas resterande del av bilden efter nästa färg vi söker och markerar även denna med vit färg. Anledningen till detta var att vi först gjorde försök med olika färger för topp och botten på pendeln. Det visade sig senare att processen fungerade lika väl när samma färg användes på bägge markeringarna. Resterande delar av bilden som inte innehåller den sökta färgen görs svart. Figur.. Den vita färgen i de blå boarna markerar vart den sökta färgen befinner sig i bilden. Slutligen beräknas de två vita fältens centrum i bilden och dess positioner med avseende på bildens koordinatsystem. Svaret skickas sedan ut kodat i XML över TCP/IP. Ett svar från beräkningen av en bild visas i programmet enligt figur.. Den första punkten befinner sig på = 78, y = 365. Den andra punkten hittades på = 3, y = 49. Hela operationen tog,9 sekunder. Figur.. En bild har tagits och den sökta färgen har hittats. Peter Knutsson 48(83) Ted Persson Tobias Strömberg

49 Vision Guided Robot Control 5-6- Teori Detta projekt ska använda sig av en robot som i två, alternativt tre, dimensioner ska röra sig för att hålla en inverterad pendel stående. Denna kommer att hela tiden ramla åt totalt olika håll och därför måste vårt system hela tiden uppdateras om dess position och lutning. Det lättaste sättet att lösa detta är med två potentiometrar monterade i pendelns bas. Dessa uppdateras kontinuerligt och gör det lätt att motarbeta rörelserna. Men i vårt fall ska vi använda oss uteslutande av vision. Vision För att avgöra pendelns lutning så placerade vi ett rödfärgat papper högst upp och ett längst ner på pendeln. Bilderna som vi erhöll från kameran i vårt visionprogram CamCap kunde vi sedan med ett befintligt filter maska ut de färger vi eftersökte. Detta kan ses på figur.. När detta var gjort fick vi en svart bild med vit färg där de eftersökta färgerna hade hittats. Sedan utfördes en binärscan av bilden och en masscenteruträkning. Från denna operation kunde vi som svar få en position för varje av våra två färgmarkeringar. Dessa positioner, som består av ett värde i - och ett i y-led, är inget egentligt svar på vart vår pendel befinner sig. Detta är egentligen bara ett värde på hur många pilar från bildens origo vår markering befinner sig. Men oavsett position, som i sammanhanget är av mindre betydelse, så kan vi jämföra de båda positionernas -värden och därmed se hur långt pielavståndet är mellan de båda markeringarna. Detta ger oss en uppfattning om hur mycket lutning vi har och även åt vilket håll det lutar. Detta speglar sig i positiv respektive negativ lutning. Hittills har vi endast behandlat ett tvådimensionellt system, alltså en pendel som endast kan falla i ett led. Men i vårt system skulle vi alltså använda oss av en fri pendel som ska kunna falla i alla riktningar. För att skapa en tredimensionell bild av pendeln och dess fallriktning kopplades ytterligare en kamera in. Denna kamera placerades vinkelrätt mot den andra kameran. Med detta arrangemang kunde vi få pendelns lutning i både - och y-led. Dessa båda alar bildar kateterna i en rätvinklig triangel. Sedan kunde vi med hjälp av Pythagoras sats bestämma hypotenusan som är pendelns lutning. Vi räknade även ut dess vinkel med Sinussatsen. Båda kamerorna kunde avläsas i samma program (CamCap) och skicka ett paket med de koordinater vi behövde via LAN. Se figur.. Ett objekt som kodats binärt genomsöks efter kodkombinationer, i vårt fall ettor. Peter Knutsson 49(83) Ted Persson Tobias Strömberg

50 Vision Guided Robot Control 5-6- Avstånd Som tidigare har förklarats är det inte verkliga avstånd (i t e centimeter) vi räknar ut utan endast ett avstånd räknat i pilar. Detta kommer att variera beroende på avståndet till kameran och upplösning på bilden. För att omvandla detta till verkliga avstånd var vi tvungna att införa en faktor för att multiplicera med vår vektor eller välja olika fasta avstånd för roboten att röra sig. Vi valde det senare alternativet och för att få en mer eakt förflyttning av robotens arm införde vi fuzzy logic. Det innebär att vi har fyra stycken fasta avstånd som armen ska röra sig, i detta fall zero, small, medium och big. Sedan görs en bedömning på längden på den vektor vi har. Till eempel att den är 4 % small och 6 % medium. Fuzzy förklaras mer ingående i avsnittet Fuzzy Logic i kapitlet Teori. När det gäller rörelser i tre dimensioner så tyckte vi att det nog var det mest lämpliga sättet att göra en bedömning på den redan uträknade vektorn och dess vinkel än att göra det på de båda alarna var för sig. Om man skulle göra det, d v s - och y-alarna var för sig skulle det bli mer komplicerade räkningar med fuzzy för - och för y-aeln. Om man då skulle få bedömning för en liten rörelse på -aeln men med en stor rörelse på y-aeln behöver en till räkning göras för att få en medellång rörelse i rätt vinkel. Ett annat sätt att gå tillväga är att göra först en liten rörelse i en riktning och sen en längre i en annan riktning. Detta förkastade vi då det skulle bli mer tidskrävande. Dessutom om man skulle göra den korta rörelsen först så skulle kanske den långa och mer akuta rörelsen utföras för sent och därmed skulle vi inte uppnå lyckat resultat. Detta ger en annan möjlighet, nämligen att alltid utföra den mest akuta rörelsen först. Om pendeln lutar mer i -led än i y-led så kan man röra sig i -led först och sedan göra en ny jämförelse och se vart det är mest akut att röra sig. Men detta var alltså inget som vi gick in på utan vi rörde oss direkt i den vertikala riktningen mellan de två kateterna. Hastighet Förutom avstånd och riktning behövdes en inställning för hastighet göras innan roboten kunde få kommandot att röra på sig. Vi bestämde att på mindre rörelser var det inte nödvändigt att röra sig i full hastighet då det bara gjorde pendeln ostadigare och gav en motsatt rörelse åt andra hållet. Därför fick även hastigheten vara ett varierande värde beroende på vår uträknade resultatvektor. Vi valde att också ha den som en del i vår fuzzy logic. Tider Vad gäller hur ofta vi vill göra en korrigering av robotens position upptäckte vi tidigt att vårt största problem kommer att ligga vid ett för långsamt system. Därför bestämde vi att vi aldrig kommer att kunna vara för snabba och behöver därför inget bestämt tidsmellanrum mellan våra rörelser utan korrigerar så fort det bara är möjligt. Dock kan inte roboten ges en ny instruktion medan den redan är i rörelse utan måste först göra klart den operation som startats. Det ger oss det utgångsläge att vi vid ett optimalt system startar en ny rörelse direkt när den Peter Knutsson 5(83) Ted Persson Tobias Strömberg

51 Vision Guided Robot Control 5-6- förra är avklarad. Ett problem vi tidigt upptäckte var att roboten fick instruktioner att röra sig nog ofta men att den rörde sig till samma position ett flertal gånger och därmed såg ut att stå stilla ett längre tag. Inte helt överraskande var det alltså behandlingen av bilder som tog den längsta tiden och var den viktigaste delen att snabba upp. Vi valde alltså att lägga stor vikt vid att försöka optimera det filter vi använde. Det mest resultatgivande eperimentet var när vi bestämde oss för att skräddarsy vårt eget filter för att endast utföra de operationer vi behövde i just detta fall. Mer om hur detta gick till i avsnittet Filteroptimering i kapitlet Programmering. Fuzzy Logic Fuzzy Logic är en matematisk formalisering för att utföra bedömningar av värden med hjälp överlappande logik och ge en möjlighet till rätt aktion. Inom fuzzy delar man upp resultatet i olika grupper t e stor, mellan och liten. Vi valde att sätta upp fyra olika grupper med hastighet och längd för förflyttning. Bedömningen vi gjorde var på den inverterade pendelns lutning. Vid bedömningen stor lutning så skulle vi röra oss snabbt och långt. Motsvarande för liten lutning så rörde vi oss kort och lite långsammare. Det som gör det hela intressant med fuzzy logic är att bedömningen kan bli lite mer varierande. Man kan ha en lutning som är inom kriterierna för både stor och mellan och därmed gör en motaktion som är delvis stor och delvis mellan. Som bild.9 visar så kan alltså de olika grupperna korsa varandra och dela på värden. Fuzzy logic kan delas upp i tre stycken steg: Fuzzify Fuzzy control Defuzzify Fuzzify är det steg där man bestämmer vilken/vilka grupper som insignalen uppfyller kraven för, d v s i vårt fall hur stor lutningen är på pendeln mätt i pilar. Det andra steget i processen är fuzzy control där man med hjälp av sina fuzzy-regler sätter storleken på utsignalen. Slutligen görs defuzzify där utsignalen omvandlas till önskade storheter som i vårt fall var avstånd i millimeter och hastighet i millimeter per sekund. Fuzzy är i många fall ett användbart system. Framförallt i de fall systemet har en sämre modell. Man behöver då inte vara så eakt med sina faktorer. I vissa fall kan det vara svårt att överhuvudtaget få ut en modell, då man får väldigt varierande resultat vid tester och eperiment. En annan stor fördel är att man med lätthet kan ändra sina gränser för var de olika grupperna börjar och slutar och därigenom lätt ändra beteendet. Den andra delen som kan ändras är uppenbarligen de olika fuzzy-sets man har i grupperna. De inställningar man har där är de avgörande och dessa bör noggrant anpassas. Med detta i åtanke inser man att fuzzy logic är ett system som är mycket lämpligt för den så kallade trial-and-error tanken. Man testar sig alltså fram och med ett flertal försök och Peter Knutsson 5(83) Ted Persson Tobias Strömberg

52 Vision Guided Robot Control 5-6- eperiment fram till de värden man behöver. Med tanke på detta bör man med enkelhet kunna ändra de värden man behöver utan att det ska vara tidskrävande. I vårt fall gjorde vi en speciell flik i vår Windows-applikation för att kunna ställa in våra fuzzy-sets. Figur.9. Fuzzy-nivåer för VGIP. Peter Knutsson 5(83) Ted Persson Tobias Strömberg

53 Vision Guided Robot Control 5-6- Tredimensionella visionsystem En kamera avbildar världen i två dimensioner. Origo av rummets tre synliga dimensioner kan bestämmas med avseende på vad som passar bäst. När en robot placeras i dessa tre dimensioner väljer man att koordinatsystemets alar passar mot robotens. Världens origo befinner sig då i robotens origo. Figur.. Två kameror riktade mot punkten P. För att skapa en tredimensionell bild krävs således två kameror. Dessa kan monteras på många olika sätt för att ge olika fördelar rent bildmässigt då ingen kamera är optimal. Med kameror monterade vinkelrätt mot varandra erhåller man mycket enkelt ett djupseende hos systemet (se figur.). Den första kameran som vi i detta avsnitt låter kalla kamera A väljer vi sådant att den alltid avbildar -planet. Denna kamera används som referenskamera för den andra och placeras sådant att dess bild motsvarar delar av -planet i världen. En kamera anger positioner ur bilden med hjälp av de pilar som bilden delas in i. Vi väljer att benämna kamerans bildbredd u och dess bildhöjd v, båda i måttet pilar. Dessa pilar har i sig ingen anknytning till koordinatsystemet för världen utan detta måste beräknas om. En punkt P som befinner sig i ett koordinatsystem ses från en kamera. Punkten har en bestämd position i rummet med avseende på dess -, y- och z-koordinat. Kameran som även den befinner sig på en bestämd position i rummet ser punkten P enligt följande. De sökta positionerna i kamerans bild u P och v P kan räknas fram med hjälp av: Peter Knutsson 53(83) Ted Persson Tobias Strömberg

54 Vision Guided Robot Control 5-6- Peter Knutsson 54(83) Ted Persson Tobias Strömberg = R R R R C P P Z Y X M P v u s s är en konstant och systemspecifik faktor och den första matrisen är pielkoordinater från kameran. C P är en kameraspecifik matris enligt nedan. Vidare så är R M kamerans orientering med avseende på referensrummet och den sista matrisen är positionen P:s koordinater i referensrummet. = = H M P R C Kamerans kalibreringsmatris. = v Dy f u D f P C X C C, där C f syftar till kamerans brännvidd. X D respektive y D är pielstorleken enligt följande formler: tan(θ ) = u f D C X tan(θ ) = v f D C y Där θ står för kamerans öppningsvinkel. [ ] [ ] = = cos sin sin cos Z Y X Translation Rotation M r α α α α Rotationsmatrisen ovan avser rotation runt z-aeln, d v s förflyttning av kamera B till position B enligt figur.3. För att skapa ett binokulärt system skall vinkeln mellan kamerorna minskas. Vid lägre vinkel blir djupseendet svårare. Man får alltså prova sig fram hur liten vinkel som är möjlig. Detta ställer högre krav på kamerornas prestanda.

55 Vision Guided Robot Control 5-6- Figur.3. Förflyttning av kamera B mot ett binokulärt seende. Z-aeln pekar rakt ut ur bilden. Kamera B flyttas enligt figur.3 till punkten B. Man får då vinkeln α mellan kamerorna och en rotation motsvarande 9-α av kamera B. Med hjälp av enkel trigonometri kan vi beräkna avstånden a och b. Dessa motsvarar translationen för kamera B. Rotationen blir enligt tidigare diskussion 9-α. Y = r sin(9 α) trans X = r ( cos(9 α)) rot = 9 α Med dessa värden kan vi nu räkna ut M R enligt formeln: Peter Knutsson 55(83) Ted Persson Tobias Strömberg

56 Vision Guided Robot Control 5-6- Peter Knutsson 56(83) Ted Persson Tobias Strömberg [ ] [ ] = = cos sin sin cos Z Y X Translation Rotation M R α α α α X Y, och Z är translationerna på respektive alar. Translationen på Z-aeln är i detta fallet. Därmed kan omvandlingar göras mellan kamerans koordinatsystem och vårt referenssystem enligt: = R R R R c c c Z Y X M Z Y X Matematiken i detta avsnitt är hämtat ur boken Fundamentals of Robotics Linking perception to action, se referens.

57 Vision Guided Robot Control 5-6- Programmering VGIP (Vision Guided Inverted Pendulum) VGIP är den mjukvara vi använde för att styra och försöka balansera vår inverterade pendel. Vi programmerade detta själva i Visual Studio dotnet. Programspråket är C#. Här följer en förklaring på hur man använder sig av programmet. På figur.4 ser vi hur programmet ser ut när man startar det. Det första man bör lägga märke till är den rad med flikar som finns överst i programmet. Där kan man välja den som man för tillfället vill arbeta med. Den första fliken som heter Robot är en enkel flik för att kunna göra enklare robotkonfigurationer. Man kan här kontrollera vilken hastighet roboten är inställd på och dessutom ställa in den hastighet man vill ha. Högst upp till höger finns en flik för att jogga roboten och man kan även kontrollera vilken position man för tillfället är på. Det finns även en knapp för att återgå till startpositionen. Figur.4. Fliken Robot där man kan ställa in hastighet och jogga roboten. På figur.5 kan vi se den andra fliken som heter VGIP. Detta är den flik där man kör själva programmet och försöker att balansera den inverterade pendeln. Man kan här se lite om hur roboten arbetar, vilken hastighet den går med och hur stor förflyttning den gör både i - och i y-led. Dessutom finns en del information om pendelns lutning. Mätaren längst ner på sidan är för att se vilken fuzzyinställning programmet för tillfället använder. Zero, small, medium och big är de fyra fuzzygrupper vi har. Mer om fuzzy i avsnittet Fuzzy Logic i kapitlet Teori. Peter Knutsson 57(83) Ted Persson Tobias Strömberg

58 Vision Guided Robot Control 5-6- Figur.5. Fliken VGIP där man startar själva balanseringsprogrammet. Den tredje fliken som kan ses på bild.6 är till för att styra kamerorna. Man kan här både koppla upp och koppla ner en anslutning till kameraprogrammet CamCap. Man kan även uppdatera och få den aktuella positionen för de färgmarkeringar vi har på den inverterade pendeln. Dessa positioner är räknat i pielavstånd. Figur.6. Fliken Camera där man kan koppla upp sig mot CamCap. Peter Knutsson 58(83) Ted Persson Tobias Strömberg

59 Vision Guided Robot Control 5-6- Nästa flik heter Fuzzysets och är till för att man ska kunna göra sina inställningar vad gäller fuzzy logic. Bild.7 nedan visar hur den ser ut. Här kan man ställa in hur stora utslag programmet ska ge vad gäller hastighet och distans för förflyttning. Man kan om man vill kalla det för att ställa in systemets känslighet. Man kan även ställa in hur mycket man tycker att pendeln ska få luta innan man kallar det för t e en mellan eller en stor lutning. Den sista fliken är en infoflik där man kan läsa om vilka som skapat programmet. Figur.7. Fliken Fuzzysets där man ställer in sina fuzzy-värden. Peter Knutsson 59(83) Ted Persson Tobias Strömberg

60 Vision Guided Robot Control 5-6- Programmeringsmetodik VGIP har en huvuddel som anropar ett stort antal funktioner. Ett urval av dessa visas nedan: private void Connect_rob() private void Disconnect_rob() private void Jog() private void Set_speed(float s) private float Get_speed() private Rapper.Structs.pose Get_pose() private void set_pose(rapper.structs.pose coord) private Structs.Move_data Calc_move() private Structs.Fuzzy_sets fuzzify(float W_vec) private void Connect_cam() private void Disconnect_cam() Funktionerna är till för att dela upp programmet i mindre delar. Tanken är att i så stor grad som möjligt återanvända kod och därigenom inte göra programmet större än nödvändigt. Funktionerna utför olika uppgifter som t e att ändra robotens hastighet eller att hämta robotens aktuella position. I huvuddelen main görs alla uppkopplingar till både visiondatorn och robotens styrskåp. En del grundläggande inställningar görs innan programmet startar en evighetsloop. I denna loop börjar vi med att läsa av vår nuvarande position för att ha ett utgångsläge. Vidare uppdaterar vi pendelns lutning som förklarats ovan och får fram ett avstånd som vi vill förflytta roboten och även en vinkel till den önskade positionen. Med dessa uppgifter kunde vi på ett enkelt sätt räkna ut var vi vill att roboten skall gå och även utföra denna rörelse. Loopen är därmed klar och proceduren upprepas från början. För komplett programkod för VGIP, se bilaga. Peter Knutsson 6(83) Ted Persson Tobias Strömberg

61 Vision Guided Robot Control 5-6- Flödesschema Efter att programmeringen hade fullbordats kom följande flödesschema att beskriva dess arbetsgång. Figur.8. Flödesschema över VGIP. Peter Knutsson 6(83) Ted Persson Tobias Strömberg

62 Vision Guided Robot Control 5-6- RAPID-program Själva flödet av data i styrskåpet sköts med ABB:s egna programspråk RAPID. Det påminner ganska mycket om C-språket i den mening att variabler deklareras i början av programmet och programmeringsflödet är sekventiellt. Även kända funktioner, datatyper och villkorssatser känns igen. Den mest användbara datatypen för oss kallas PERS. Det är en förkortning för engelskans persistent. I praktiken betyder det helt enkelt att det är en global variabel, som vi kan komma åt från en annan dator, via ett protokoll (RAP i detta fall). Vi hade flera stycken PERSvariabler i vårt program. En som är en struct innehållandes -, y- och z-värden för nästa position, som roboten ska gå till. Ytterligare en variabel, boolesk variabel, sätts i huvudprogrammet när vi önskar en rörelse från roboten. Så förkortat fungerar det så här: ) Huvudprogrammet har räknat ut nästa position för roboten. ) Positionen skickas till RAPID-programmet. 3) Huvudprogrammet sätter en flagga som skickas till RAPID-programmet. 4) RAPID-programmet märker av en ändring på flaggan. 5) Roboten går till den beräknade positionen. Den enda skillnaden mellan detta projekt och det första projektets RAPID-program, är att för denna uppgift behövs inget vakuum för att gripa pendeln. Den sitter redan fast på verktyget. Detta medförde att vi kunde ta bort en I/O-signal i programmet. För komplett kod se bilaga 5. RobotStudio och ProgramMaker ABB tillhandahåller även ett offline-programmeringsverktyg vid namn RobotStudio. Det är avancerat program som erbjuder en grafisk programmering av valfri ABB-robot. Det går till så att man laddar in ett bibliotek innehållandes en robot. Till denna kan man även koppla på färdiga eller egenprogrammerade verktyg. Sedan kan man göra det mesta som man kan göra med en handenhet (TeachPendant) t e teacha positioner, jogga, sätta digitala signaler mm. Den största fördelen med RobotStudio för vår del är att man kan eportera det grafiska programmet till ett applikationsprogram vid namn ProgramMaker. Det som händer är att när man laddar in programmet man gjort i RobotStudio så får man ut RAPID-koden, dvs. den kod som skall laddas in i styrskåpet. Så för att slippa skriva en massa kod kan man istället göra den grafiskt och låta ProgramMaker skriva koden åt dig. Vi använde mest RobotStudio och ProgramMaker i början av projektet för att få fram råkoden, t e storlek på verktyget, dess vikt samt hur programmeringskoden såg ut i allmänhet. En struct är en egenskapad datatyp oftast bestående av flera olika datatyper. Teacha fr. eng Teach Sv Lära. Roboten flyttas till en punkt och denna sparas i programmet. Peter Knutsson 6(83) Ted Persson Tobias Strömberg

63 Vision Guided Robot Control 5-6- Precis som i första projektet så används även här mest RobotStudio och ProgramMaker i början av projektet, för att få fram råkoden. Skillnaden var att nu hade vi större kunskap om programspråket och använde därför programmet i mindre utsträckning. RAP För att kunna redigera och påverka de tidigare nämnda pers-variablerna i programkoden samtidigt som programmet eekveras, använde vi en funktion som ABB kan erbjuda, nämligen RAP. Detta står för Remote Access Protocol och kan användas via både RS3 (seriell anslutning) samt TCP/IP (LAN ).Vi använde oss av det senare. För att skriva till de variabler som RAP-protokollet möjliggör använde vi två äldre dll-filer som skapats vid tidigare projekt. Dessa var dock skrivna för att anropas med C++ eller Basic vilket inte passade oss, eftersom vi valt att skapa våra program med hjälp av C# för nya.net. För att kunna använda de tidigare kommunikationsfilerna skapade vi en ny dll-fil i.net miljön som kunde anropas i våra program. Detta bibliotek anropade i sin tur de äldre filerna. För komplett kod se bilaga 3. Filteroptimering Under inledningen av vår period för tester och försök, med det delvis färdiga systemet, kom vi fram till att en stor del av arbetet skulle läggas vid att optimera det filter vi använde för att känna igen färger i bilderna. Det första steget vi tog var att istället för som tidigare söka efter en röd samt en grön markering istället söka efter två röda. Med några enkla justeringar av mjukvaran kunde vi ändå skilja på den övre och den undre och därmed ändå erhålla önskat resultat. Den färgkodning som används är en additiv teknik som kallas för RGB. Namnet kommer sig av de tre färger som används nämligen röd grön och blå. Vi valde alltså att endast lägga vikt vid det röda färglagret. Med denna förändring fanns möjligheten att ignorera två av tre uträkningar och endast kontrollera om en piel är röd eller inte. Detta gav oss en stor förbättring vad gäller tiden för vårt filter men gav oss också ett par nya problem. Bilden blev oklarare och vi fick in markeringar för rött som inte borde ha funnits. Vid efterforskning kom vi fram till att det vita även markerades, då vitt inom RGB-tekniken är markerat som ma rött, ma grönt och ma blått. När de gröna och blå färgerna ignorerades blev allt som hade ma rött markerat, därmed även vit färg. Denna idé lades för tillfället undan och vi provade vår nästa teori med att de invecklade uträkningarna var den tunga och tidskrävande delarna. Vi noterade att filtret bland annat använde sig av funktioner för att räkna ut absoluta belopp. För varje piel skapades tre stycken åtta bitars tal för att avgöra hur hög intensitet som fanns inom varje färg. Vi antog att vi med endast olika bitoperationer skulle kontrollera dessa och genom att se hur röda våra pilar var skulle vi få en enklare och för datorn snabbare räkning. Local Area Network Lokalt nätverk Dynamic Link Library ett bibliotek med specifika drivrutiner. Peter Knutsson 63(83) Ted Persson Tobias Strömberg

64 Vision Guided Robot Control 5-6- Enligt vår nya teori skulle vi endast behöva koncentrera oss på de två eller tre mest signifikanta bitarna i våra tal. En ny byte skapades där vi konkatenerade de tre mest signifikanta från den röda byten med motsvarande tre från den blåa och två från den gröna. Vi utgick från att om en piel skulle vara så röd som vi ville så skulle detta nya tal ge oss en byte med antingen två eller tre ettor för det röda och endast nollor för det gröna och det blå. De tre mest signifikanta bitarna ger ett värde av vilket är 4, de två mest signifikanta bitarna ger ett värde av 9. Alltså var det nu enkelt att med en jämförelsefunktion kontrollera om talet var eakt 9 eller 4. Detta gav oss ett resultat över förväntan med klara konturer och med en bra driftsäkerhet. Det som dock var den största fördelen var den minskade tiden vad gäller vårt filter. Se kapitlet Tester och resultat. Som tidigare nämnts så ska ett väldigt stort antal pilar kontrolleras nämligen 6448=37 st. Detta är ett väldigt stort antal operationer. Vi utgick ifrån att inte alla pilar måste kontrolleras för att vi ska få ett acceptabelt resultat. Vi valde därför att endast titta på varannan piel. Detta gav precis som antaget ett lika bra resultat men förkortade tiden. Resultat av detta kan läsas om i kapitlet Tester och resultat. För komplett kod av filter, se bilaga 9. Peter Knutsson 64(83) Ted Persson Tobias Strömberg

65 Vision Guided Robot Control 5-6- Tester och resultat Vid våra tester märktes tydligt att tiden för filteroperationer behövde minimeras. Varje cykeltid för kameraprogrammet innehåller två filteroperationer. I inledningsfasen låg våra filtertider mellan 9 ms och 4 ms och den totala cykeltiden mellan ms och 3 ms. Alltså beror största delen av cykeltiden på filtret, andra delar så som kamerans idle time kan bortses från. Detta gav oss inledningsvis en uppdateringsfrekvens på drygt 3 Hz. Efter vår optimering (se avsnittet Filteroptimering i kapitlet Programmering) med bitoperationer pressades tiderna ner till mellan 8 ms och ms för filtrering och den totala cykeltiden på 7- ms. Nu fick vi en uppdateringsfrekvens på cirka 5 Hz. Efter ytterligare optimering av tiden med att endast göra beräkningar på varannan piel blev tiderna ytterligare lite lägre. En filtreringstid tog nu 5-7 ms och en total cykeltid ca 3 ms. Detta gav oss en uppdateringsfrekvens på cirka 8 Hz. Vi ändrade även den dödtid som programmet väntar innan den ber kameran om en ny bild. Denna fanns för att ge processorn en möjlighet att utföra andra viktiga operationer och på så vis förhindra en hängning av systemet. En iakttagelse vi gjorde med detta nya filter var att tiderna blev stabilare och varierade inte lika mycket mellan körningarna. Detta berodde troligtvis på sänkningen av dödtiden. Peter Knutsson 65(83) Ted Persson Tobias Strömberg

66 Vision Guided Robot Control 5-6- Begränsningar Den största begränsningen under arbetet har varit tiden. Vi har förlorat viktig tid på en fördröjd leverans av den nya roboten IRB4 och dess installation. Vi tror att resultatet hade kunnat blivit ännu bättre om vi hade fått fortsätta med arbetet ytterligare några veckor. Mycket av det arbete vi har gjort bygger på att man ska utföra tester och på så vis kunna optimera de inställningar vi har. De inställningar vi har för fuzzy logic är avgörande för ett lyckat resultat. Åtskilliga tester har utförts men vi tror alltså att ytterligare tester hade kunnat gjorts. En robot är kanske inte det optimala verktyget för en sådan här uppgift. I alla fall inte den robot vi har använt då dess servomotorer ofta ger ryckiga rörelser, vilket ger utslag i en skakig pendel som är svår att göra beräkningar på. Detta kan till viss del åtgärdas mjukvarumässigt men inte till den grad vi skulle vilja. Peter Knutsson 66(83) Ted Persson Tobias Strömberg

67 Vision Guided Robot Control 5-6- Förbättringar Andra mer rent tekniska begränsningar som haft inverkan på vårt resultat är visiondelen av systemet. Eftersom de grafiska operationerna har varit det största hindret för ett snabbare system, så tror vi att om den hade kunnat läggas på ett mer hårdvarumässigt plan hade vi fått ett bättre resultat. En annan tanke är att man skulle kunna sätta upp en modell för hur man tror pendeln ska reagera. Därigenom kan sedan förutsäga hur man bör agera. Att alltså korrigera under tiden problemet uppstår och inte när det redan är befintligt. Detta kan göras för att komma bort från fuzzy logic. Den inverterade har en relativt trivial fysikalisk modell och är kanske inget idealiskt fuzzy logic eempel. Vår beställare önskade dock att det inkluderades i projektet. Peter Knutsson 67(83) Ted Persson Tobias Strömberg

68 Vision Guided Robot Control 5-6- Slutsatser En tråkig del av detta arbete är att vi kommit fram till att materialet, eller den tillgängliga tekniken är det begränsande. Visst hade man med mer tid kunnat göra ytterligare optimeringar men för att lyckas fullt ut med detta hade man nog behövt en helt annan teknik. För att kunna balansera pendeln under en längre tid, så bör uppdateringsfrekvensen från kameran och kameraprogrammet ökas markant. Den roligare delen var att vi tydligt kunde se att vår teori fungerade och att roboten verkligen försökte men att det gick lite för långsamt. Med andra ord så gick uppgiften att lösa i teorin men att få det att fungera i verkligheten, är ett helt annat kapitel. Peter Knutsson 68(83) Ted Persson Tobias Strömberg

69 Vision Guided Robot Control 5-6- Projekt 3 Generell beskrivning Det sista och svåraste projektet innebär att en människa kastar ett föremål mot en robot som med hjälp av visionkameror ska försöka möta föremålet eller i bästa fall fånga det i en tredimensionell värld. En tuff uppgift då systemet är väldigt tidskritiskt p g a den korta tid det tar från att föremålet lämnat handen till dess att det är inom räckhåll för roboten. Då det tredje och sista projektet hade lägst prioritet och tillsammans med andra faktorer gjorde att vi fick fokusera mest på teorin omkring projektet. Vi kom fram till att för att genomföra detta projekt så skulle initialt två kameror användas. En för att titta på kastet från sidan medan den andra kameran såg kastet uppifrån. Efter erfarenheter från projektdel två angående tidskritiska system så kunde vi tänka oss att utesluta den andra kameran. Detta skulle kunna gå bra om man i verkligheten kastade ett rakt kast mot roboten. Vi behandlar dock teorin för båda kamerorna i rapporten. Detta kan ses i kapitlet Teori. Peter Knutsson 69(83) Ted Persson Tobias Strömberg

70 Vision Guided Robot Control 5-6- Teori Kastet sett från sidan För att visa hur teorin bakom projektet fungerar så är det lättast med ett eempel på hur vi hade gått tillväga om vi skulle fullgjort uppgiften. Vi ser nedan en serie bilder på hur kameran uppfattar ett kast med en boll som är vårt flygande föremål. Figur 3.. Första bilden av bollkastet. Figur 3.. Andra bilden av bollkastet. Figur 3.3. Tredje bilden av bollkastet. Figur 3.4. Fjärde bilden av bollkastet. Som vi ser så blir bollen suddig. Detta kan korrigeras med kortare slutartid. Peter Knutsson 7(83) Ted Persson Tobias Strömberg

71 Vision Guided Robot Control 5-6- Om vi nu filtrerar bort alla färger utom den röda som bollen har så får vi följande serie bilder med respektive koordinater: Figur 3.5. = 65, y =. Figur 3.6. = 46, y = 4. Figur 3.7. = 94, y = 55. Figur 3.8. =, y = 65. Filtrering är gjord i CamCap med ett tröskelvärde på 5. Bilderna som filtrerats är figurerna Upplösningen är 6448 pilar. Om man skulle lägga figur över varandra och sedan dra en linje genom alla punkter så skulle det se ut enligt figur 3.9. Peter Knutsson 7(83) Ted Persson Tobias Strömberg

72 Vision Guided Robot Control 5-6- Figur 3.9. Vi ser hur figur är lagda över varandra och bildar en parabel. Ett koordinatsystem är också inlagt. Om vi antar att vi har en luftstilla lokal samt inga andra omständigheter som påverkar bollen så kan vi säga att kastparabeln ovan är en andragradsekvation på formen: y = + p + q ekv. Eller som vi föredrar: y = a + ekv. + a a Där a = p och a = q Det är de tre variablerna a, a och a som vi ska bestämma. Det är dessa som bestämmer hur kurvan ser ut. Om vi antar att den sista bilden i serien (figur 3.8) är en position som vi ännu inte vet, så kan vi ta reda på den genom att använda oss av följande beräkningar: För dom tre första bilderna (figur ) så har vi koordinaterna och y. Vi erhåller då följande ekvationssystem: Peter Knutsson 7(83) Ted Persson Tobias Strömberg

73 Vision Guided Robot Control 5-6- Peter Knutsson 73(83) Ted Persson Tobias Strömberg + + = + + = + + = (3) () () a a a y a a a y a a a y () motsvarar figur 3.5, () motsvarar figur 3.6 och (3) motsvarar figur 3.7. () skrivs om till: (4) a a y a = (4) insatt i () ger: y a a y a a = + + och vi får ) ( ) ( y y a a = + och till slut (5) ) ( y y a a + = (4) och (5) insatt i (3) ger: ) ( ) ( y y y a a y y y a a = y y y a a y y y a a = Vi får ) ( y y y y y y a + = + ) ( y y y y y y a + + = Detta resultat sätts in tillsammans med (4) i (): y a a y a a = + +

74 Vision Guided Robot Control 5-6- Vi får ( ) a = y y ( ) a a = y y ( ( ) a ) Vi sätter in a och a i (4): a = y a a När vi nu erhållit a, a och a så sätter vi in dom i ekv. och får: y = a + + a a Eempel på ett kast För dom tre första bilderna (figur ) så har vi koordinaterna och y. Vi erhåller då följande ekvationssystem om vi sätter in koordinaterna och y i ekv. : 4 55 = 3785 a = a = a + 65 a + 46 a + 94 a + a + a + a () (3) () () skrivs om till: a = 3785a 65 a (4) (4) insatt i () ger: 64836a + 46a a 65a = 4 och vi får 3389a + 9a = 3 och till slut a = a,6 (5) (4) och (5) insatt i (3) ger: 37636a + 94 ( a,6) a 65 ( a,6) = 55 Peter Knutsson 74(83) Ted Persson Tobias Strömberg

75 Vision Guided Robot Control a 9874a, a a + 38,536 = 55 Vi får 895a = 6,866 a =,3 Detta resultat sätts in tillsammans med (4) i (): (,3) + 46a (,3) 65a = 4 4, a Vi får ,695 65a = 4 9a = 47,457 a =,753 Vi sätter in a och a i (4): a = 3785 (,3) 65,753 a = 67,933 När vi nu erhållit a, a och a så sätter vi in dom i ekv. och får: y =,3 +, ,933 som är vår sökta funktion för just detta kast. Minustecknet framför termen indikerar att kurvan är en andragradsfunktion med ett lokalt mavärde vilket är ett gott tecken på att vi har en kastparabel. För att sedan bestämma var vi ska möta bollen så sätter vi =, dvs precis då bollen har försvunnit ur bilden. Vi får då att: y =,3 +, ,933 y 68 Roboten kommer nu att möta bollen vid piel 68. Peter Knutsson 75(83) Ted Persson Tobias Strömberg

76 Vision Guided Robot Control 5-6- Vi ser att y = 68 är ett nära resultat till bollens faktiska position y = 65. Detta resultat får anses ligga inom marginalerna. Tre pilar är ingen stor skillnad. För att beräkna felet i procent så använder vi oss av följande formel: y predicted ymeasured error = [%] y measured Om vi sätter in siffror får vi: error =,8% 65 Man kan även tänka sig att sätta till ett minustal. Detta ger roboten mer tid att möta bollen längs dess parabel. Kastet sett uppifrån I föregående avsnitt såg vi hur roboten möter bollen längs dess kastparabel. Detta garanterar en plockposition i robotens y-led och z-led, d v s höjdled och djupled. För att kunna bestämma en plockposition i -led, d v s sidled, så måste ytterligare en kamera läggas till som ser kastet antingen uppifrån eller nerifrån. Figur 3. visar hur ett sådant kast kan se ut. I figuren så har filtreringar i CamCap gjorts och sedan lagts på varandra: Figur 3.. Kastet sett uppifrån. Det är kamerans värde på y som bestämmer robotens plockposition i -led. Kastet kommer från höger. Peter Knutsson 76(83) Ted Persson Tobias Strömberg

77 Vision Guided Robot Control 5-6- Den vänstra punkten är = 3 och y = 33. Den mittersta punkten är = 8 och y = 5. Den högra punkten är = 58 och y = 73. Om man tittar närmare på figur 3. så ser man att strecket som förenar de tre punkterna är en rät linje. Då kan vi ställa upp följande matematiska formel: Räta linjens ekvation: y = k + m ekv. k = y y = =, Vi sätter in detta resultat tillsammans med koordinaterna för den vänstra punkten i ekv. : 33 =,73*3 + m m = 33-,73*3 = 3 vilket betyder att bollen skär y-aeln vid y = 3. Vi får: y =, Som är vår sökta funktion för just detta kast. För att sedan bestämma var vi ska möta bollen så sätter vi =, d v s precis då bollen har försvunnit ur bilden. Vi får då att: y =,73* + 3 = 3 Roboten kommer nu att möta bollen vid piel 3. Även här kan man tänka sig att sätta till ett minustal. Detta ger roboten mer tid att möta bollen längs den räta linjen. Peter Knutsson 77(83) Ted Persson Tobias Strömberg

78 Vision Guided Robot Control 5-6- Tester och förväntade resultat Då detta projekt inte har hunnits slutföras så har vi inte heller erhållit några praktiska resultat från något komplett system. I enighet med vår handledare, prof. Ivan Kalaykov, har vi kommit fram till att en praktisk lösning på problemet inte behöver framvisas. Detta beror främst på två punkter: De förväntade testresultaten med befintlig utrustning kommer uppenbarligen inte ge ett acceptabelt slutresultat. Tid till testning av projektet har inte funnits. Vi har dock hunnit med att göra några tester och utifrån det kunnat dra slutsatser om ett förväntat resultat baserat på vårt system. Nu till testerna som gjordes. Vi förstod ganska snart att den stora begränsningen låg i CamCap. Med erfarenheter från projektdel två där vi hade problem med uppdateringsfrekvensen hos kamerorna så började vi med att göra ett test på just detta. När vi bestämde hur vi skulle genomföra detta projekt så kom vi fram till att principen var ganska enkel. En människa kastar bollen mot roboten som ska möta den eller i bästa fall fånga den. Vi kastade därför bollen i ett löst underhandskast framför kameran och kollade i CamCap om man kunde skönja bollen. Vi såg att den syntes även vid låga frekvenser (~5 fps ) och såklart även vid högre sådana. När detta genomförs så sker inga större beräkningar förutom att bilden uppdateras på datorskärmen och detta medförde att vi kunde se bollen. Vi lade sedan på en filtrering (binscan) på bilden och utförde nya kast. Det var nu vi fick problem. Bollen kunde inte skönjas på skärmen trots att vi testade olika avstånd framför kameran. Orsaken till detta är att det genomförs så många fler beräkningar än tidigare att uppdateringshastigheten på kameran dras ner automatiskt. Detta i kombination med svårigheten att filtrera en färg i hög fart på långt avstånd gör att vi aldrig hinner se bollen. En lösning på detta skulle vara att göra ett kast närmare kameran. Problemet då är att vi aldrig skulle se bollen p g a den låga uppdateringshastigheten. Som bäst kanske man skulle få två värden men med dessa kan vi i alla fall inte bestämma banan som bollen går i. CamCap:s och kamerornas kapacitet gör det i dagsläget omöjligt att kombinera dessa två kriterier. Vi gjorde därför inga efterforskningar angående kamerornas lägsta uppdateringshastighet för att få med tre bilder av bollen. Det var med dessa resultat i åtanke tillsammans med den knappa tiden som vi ganska snart insåg att detta delprojekt skulle vara omöjligt att slutföra. Vi valde därför att lägga ner det praktiska och skriva lite mer om teorin bakom projektet istället. Teoretiskt är projektet i allra högsta grad genomförbart men praktiskt så skulle man behöva mer state of the art enheter som krävs för systemet. Frames per second Kamerans bilduppdateringshastighet. I avsnittet Kastet sett från sidan i kapitlet Teori så har vi tagit figur med hjälp av programmet Allied Vision Tech genom att helt enkelt tagit stillbilder genom att klicka på musen väldigt snabbt. Dessa är dessa stillbilder som sedan har filtrerats i CamCap (figur ). Peter Knutsson 78(83) Ted Persson Tobias Strömberg

79 Vision Guided Robot Control 5-6- Begränsningar Det finns två faktorer som begränsat vårt arbete med detta projekt. Det första är tiden. P g a allt strul med den andra roboten och vår förväntan att det skulle ordna upp sig så försvann alltför mycket värdefull tid. Tid som hade kunnat utnyttjas till mera tester och optimering av programvara etc. Den andra faktorn är systemets prestanda. Överföringen mellan kameradator, dator-dator samt dator-robot kan idag inte snabbas upp så mycket då vi redan har ett väldigt snabbt överföringsgränssnitt. Den största flaskhalsen ligger idag i CamCap:s kapacitet och kamerornas idle time. För att erhålla ett godtagbart resultat så måste man optimera programmet ännu mera. Peter Knutsson 79(83) Ted Persson Tobias Strömberg

80 Vision Guided Robot Control 5-6- Förbättringar Det är svårt att skriva om vilka förbättringar som kan göras när man inte har några praktiska resultat att gå på. Men det som man kan säga utan tvekan är att man skulle ha haft tillgång till ett snabbare system. Med snabbare datorer, kameror och programvara så hade vi kanske kunnat erhålla ett godtagbart resultat. Trots att vi har haft datorer med dubbla processorer och 3,5 gigabyte RAM-minne så har deras fulla kraft inte utnyttjats. Vi har haft en utnyttjandegrad på cirka 6% på processorerna. En siffra som bland annat beror på Windows XP som inte är optimalt för realtidsbaserade system. En bättre lösning skulle vara att använda sig av Linu istället p g a realtidskravet. Man skulle även kunna tänka sig att göra om hela projektet enligt principerna för Eye-In-Hand tekniken som beskrivs i kapitlet Bakgrund alldeles i början av rapporten. Men detta ligger inte inom avgränsningarna för vårt projekt. Dessutom har det redan gjorts vid MIT i USA, se referens 3. Resultatet i deras fall var mycket lyckat där roboten fångade objektet i sin gripklo utan problem. Peter Knutsson 8(83) Ted Persson Tobias Strömberg

81 Vision Guided Robot Control 5-6- Slutsatser Vad ska man då dra för slutsatser för ett projekt som inte har blivit praktiskt utvärderat? Till att börja med så är det synd att konstatera att det är materiella brister som sätter stopp för vår utveckling. Teorin bakom det hela har ju visat sig fungera och hade bara systemet varit snabbt nog så hade vi nog erhållit ett godtagbart praktiskt resultat. Men så här är det ju i dagens teknik. Utvecklingen går ständigt framåt och i sinom tid så kanske vi har nått fram till de mål människan satt upp gällande idealtider för olika dataoperationer. Och även om tekniken finns så är det ju alltid en fråga om pengar och satsning. Nu har ju forskare vid MIT redan lyckats fånga en boll med hjälp av en robot. Detta är gjort med Eye-In-Hand tekniken som inte är lika tidskritisk som Eye-To-Hand. Sen så är ju MIT bland USA:s största forskaruniversitet vad gäller teknik och har därmed tillgång till bättre resurser. Som sagt, det var tråkigt att vi inte fick en ärlig chans att testa detta projekt till fullo men det har varit lärorikt i alla fall och gett många erfarenheter. Peter Knutsson 8(83) Ted Persson Tobias Strömberg

82 Vision Guided Robot Control 5-6- Referenser. ABB produktblad för IRB34 FlePicker (556): a5e5aa6abc56f5b47ec/$file/datasheet%irb34.pdf. Bild på alar IRB34 FlePicker (556): C56F8C38FA5E/$File/3HAC394-_rev4_de_library.pdf 3. Länk till MIT (556): 4. Motorer till banorna (556): 5. Banorna (556): 6. Lysrör (556): 7. Cd-skiva Robotteknik, Örebro Universitet, vt 8. RAPID Reference Manual, ABB Robotics AB, produktnummer: 3HAC IRB34 User s Guide, ABB Robotics, produktnummer 3HAC Product Manual IRB34, ABB Robotics, produktnummer 3HAC Ming Xie, Fundamentals of Robotics Linking perception to action, New Jersey : World Scientific, cop. 3, ISBN Singh, Nanua, Systems Approach to Computer-Integrated Design and Manufacturing, John Wiley & Sons, 995, ISBN Microsoft dotnet, Officiell hemsida (556): 4. Community för Visual Studio dotnet (556): 5. RAPID Reference Manual RAPID overview, ABB Robotics AB, produktnummer:3hac RAPID Reference Manual RAPID reference part, instructions A-Z, ABB Robotics AB, produktnummer:3hac Peter Knutsson 8(83) Ted Persson Tobias Strömberg

83 Vision Guided Robot Control 5-6- Bilagor. Programkod C# i Projekt.. Programkod C# i Projekt. 3. Källkod C# för RAP. 4. Programkod RAPID i Projekt. 5. Programkod RAPID i Projekt. 6. Datablad Kamera Marlin F-33C. 7. Datablad Skenstyrning THK FBW5R. 8. Datablad Motor Maon RE4. 9. Källkod C# CamCap-filter. Källkod C# Math.dll Peter Knutsson 83(83) Ted Persson Tobias Strömberg

84 Eamensarbete p D-nivå Bilagor Reg.kod: Oru-Te-AUTO67-Mag/5 Peter Knutsson, Ted Persson, Tobias Strömberg Magisterprogrammet i Automatiseringsteknik 6p. Örebro Vårterminen 5 Eaminator: Gion Koch Svedberg Örebro universitet Örebro University Institutionen för teknik Department of technology 7 8 Örebro Örebro, SE-7 8 Sweden

85 . Programkod C# i Projekt

86 Nedanstående visar de övergripande regionerna i koden för VGRC följt av en kort beskrivning. #region Design Kod för det visuella programmet. #region Windows Form Designer generated code Kod skapad av Visual Studio. #region Client code TCP/IP-klienten med parsning av XML-kod. #region Main Huvudprogrammet för Plocka och Placera. #region Functions Diverse små funktioner. #region Cam functions Kameraspecifika funktioner. #region Rob functions Robot och RAP-specifika funktioner. #region Pick and place Funktionerna för att plocka eller placera på. #region Buttons Programmets alla knappar och dess funktioner. #region Global variables Variabler som används globalt i programmet. #region Timer funktioner Trådar för tidtagning.

87 using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Tet.RegularEpressions; using System.Xml; using System.Threading; using System.Net; using System.Net.Sockets; using System.Runtime.Serialization.Formatters.Binary; using System.IO; using Rapper; Våran egen.dll för RAP-kommunikation. namespace VGRC public class VGRC : System.Windows.Forms.Form #region Design Kod för det visuella programmet private System.Windows.Forms.TabControl tabcontrol; private System.Windows.Forms.TabPage tabpage; private System.Windows.Forms.TabPage tabpage; private System.Windows.Forms.TetBo tetbo; private System.Windows.Forms.TetBo tetbo; private System.Windows.Forms.TetBo tetbo3; private System.Windows.Forms.TetBo tetbo4; private System.Windows.Forms.TetBo tetbo5; private System.Windows.Forms.TetBo tetbo6; private System.Windows.Forms.Label label; private System.Windows.Forms.Label label; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label4; private System.Windows.Forms.Label label5; private System.Windows.Forms.Label label6; private System.Windows.Forms.GroupBo groupbo; private System.Windows.Forms.GroupBo groupbo; private System.Windows.Forms.StatusBar statusbar; private System.Windows.Forms.TabPage tabpage4; private System.ComponentModel.IContainer components; private System.Windows.Forms.Button buttonconnect; private System.Windows.Forms.Button buttondisconnect; private byte[] m_buffer; byte[] m_databuffer = new byte []; IAsyncResult m_result; public AsyncCallback m_pfncallback ; private System.Windows.Forms.TetBo richtettmessage; private System.Windows.Forms.GroupBo Server; private System.Windows.Forms.Button uppdatera_jog_pos; private System.Windows.Forms.Button utfor_jog; private System.Windows.Forms.Button start_pick_place; private System.Windows.Forms.Button Connect_jog; private System.Windows.Forms.Button Disconnect_jog; private System.Windows.Forms.TetBo JogRot; private System.Windows.Forms.TetBo JogRot; private System.Windows.Forms.TetBo JogRot3;

88 private System.Windows.Forms.TetBo JogRot4; private System.Windows.Forms.Label label7; private System.Windows.Forms.GroupBo Communication; private System.Windows.Forms.GroupBo groupbo3; private System.Windows.Forms.TetBo setspeed_jog; private System.Windows.Forms.Button button3; private System.Windows.Forms.ComboBo speed_combobo; private System.Windows.Forms.GroupBo groupbo4; private System.Windows.Forms.GroupBo groupbo5; private System.Windows.Forms.PictureBo picturebo; private System.Windows.Forms.Button sendcommand_button; private System.Windows.Forms.ComboBo Commandsbo; private System.Windows.Forms.Button Jog_Jog; private System.Windows.Forms.Button Jog_Speed_set; private System.Windows.Forms.StatusBarPanel statusbarpanel; private System.Windows.Forms.GroupBo groupbo6; private System.Windows.Forms.Button button; private System.Windows.Forms.CheckBo checkbo; private System.Windows.Forms.CheckBo checkbo; private System.Windows.Forms.CheckBo checkbo3; private System.Windows.Forms.CheckBo checkbo4; private System.Windows.Forms.CheckBo checkbo5; private System.Windows.Forms.CheckBo checkbo6; private System.Windows.Forms.CheckBo checkbo8; private System.Windows.Forms.CheckBo checkbo9; private System.Windows.Forms.ImageList imagelist; private System.Windows.Forms.CheckBo checkbo; private System.Windows.Forms.CheckBo checkbo; private System.Windows.Forms.CheckBo checkbo; private System.Windows.Forms.GroupBo Timer_groupbo; private System.Windows.Forms.TetBo tetbo7; private System.Windows.Forms.TetBo tetbo8; private System.Windows.Forms.TetBo tetbo9; private System.Windows.Forms.RadioButton radiobutton; private System.Windows.Forms.RadioButton radiobutton; private System.Windows.Forms.Button Startpos_button; private System.Windows.Forms.TetBo tetbo; private System.Windows.Forms.TetBo tetbo; private System.Windows.Forms.TetBo tetbo; private System.Windows.Forms.GroupBo groupbo7; private System.Windows.Forms.GroupBo groupbo8; private System.Windows.Forms.GroupBo groupbo9; private System.Windows.Forms.TetBo tetbo3; private System.Windows.Forms.Button Delay_button; private System.Windows.Forms.TetBo Delay_tetBo; private System.Windows.Forms.CheckBo runcontinously_checkbo; private System.Windows.Forms.GroupBo groupbo; private System.Windows.Forms.Button clear_button; private System.Windows.Forms.Button PP_stop_button; private System.Windows.Forms.TetBo Delay_tetBo; private System.Windows.Forms.Label Pic; private System.Windows.Forms.Label Action; public Socket m_clientsocket; public VGRC() Required for Windows Form Designer support InitializeComponent();

89 TODO: Add any constructor code after InitializeComponent call / <summary> / Clean up any resources being used. / </summary> protected override void Dispose( bool disposing ) if( disposing ) if (components!= null) components.dispose(); base.dispose( disposing ); #endregion #region Windows Form Designer generated code Kod skapad av Visual Studio / <summary> / Required method for Designer support - do not modify / the contents of this method with the code editor. / </summary> private void InitializeComponent() this.components = new System.ComponentModel.Container(); System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(VGRC)); this.tabcontrol = new System.Windows.Forms.TabControl(); this.tabpage = new System.Windows.Forms.TabPage(); this.groupbo6 = new System.Windows.Forms.GroupBo(); this.radiobutton = new System.Windows.Forms.RadioButton(); this.radiobutton = new System.Windows.Forms.RadioButton(); this.button = new System.Windows.Forms.Button(); this.picturebo = new System.Windows.Forms.PictureBo(); this.groupbo3 = new System.Windows.Forms.GroupBo(); this.speed_combobo = new System.Windows.Forms.ComboBo(); this.setspeed_jog = new System.Windows.Forms.TetBo(); this.jog_speed_set = new System.Windows.Forms.Button(); this.button3 = new System.Windows.Forms.Button(); this.groupbo4 = new System.Windows.Forms.GroupBo(); this.groupbo5 = new System.Windows.Forms.GroupBo(); this.disconnect_jog = new System.Windows.Forms.Button(); this.communication = new System.Windows.Forms.GroupBo(); this.connect_jog = new System.Windows.Forms.Button(); this.label4 = new System.Windows.Forms.Label(); this.groupbo = new System.Windows.Forms.GroupBo(); this.startpos_button = new System.Windows.Forms.Button(); this.tetbo4 = new System.Windows.Forms.TetBo(); this.jog_jog = new System.Windows.Forms.Button(); this.utfor_jog = new System.Windows.Forms.Button(); this.tetbo6 = new System.Windows.Forms.TetBo(); this.tetbo5 = new System.Windows.Forms.TetBo(); this.label5 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label(); this.groupbo = new System.Windows.Forms.GroupBo(); this.jogrot4 = new System.Windows.Forms.TetBo(); this.jogrot3 = new System.Windows.Forms.TetBo();

90 this.jogrot = new System.Windows.Forms.TetBo(); this.jogrot = new System.Windows.Forms.TetBo(); this.uppdatera_jog_pos = new System.Windows.Forms.Button(); this.label7 = new System.Windows.Forms.Label(); this.tetbo = new System.Windows.Forms.TetBo(); this.tetbo = new System.Windows.Forms.TetBo(); this.tetbo3 = new System.Windows.Forms.TetBo(); this.label = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); this.label = new System.Windows.Forms.Label(); this.tabpage = new System.Windows.Forms.TabPage(); this.runcontinously_checkbo = new System.Windows.Forms.CheckBo(); this.delay_button = new System.Windows.Forms.Button(); this.clear_button = new System.Windows.Forms.Button(); this.checkbo = new System.Windows.Forms.CheckBo(); this.checkbo = new System.Windows.Forms.CheckBo(); this.checkbo = new System.Windows.Forms.CheckBo(); this.checkbo9 = new System.Windows.Forms.CheckBo(); this.checkbo6 = new System.Windows.Forms.CheckBo(); this.checkbo5 = new System.Windows.Forms.CheckBo(); this.checkbo4 = new System.Windows.Forms.CheckBo(); this.checkbo3 = new System.Windows.Forms.CheckBo(); this.checkbo = new System.Windows.Forms.CheckBo(); this.checkbo = new System.Windows.Forms.CheckBo(); this.start_pick_place = new System.Windows.Forms.Button(); this.timer_groupbo = new System.Windows.Forms.GroupBo(); this.delay_tetbo = new System.Windows.Forms.TetBo(); this.delay_tetbo = new System.Windows.Forms.TetBo(); this.pic = new System.Windows.Forms.Label(); this.action = new System.Windows.Forms.Label(); this.groupbo7 = new System.Windows.Forms.GroupBo(); this.tetbo9 = new System.Windows.Forms.TetBo(); this.tetbo8 = new System.Windows.Forms.TetBo(); this.tetbo7 = new System.Windows.Forms.TetBo(); this.tetbo = new System.Windows.Forms.TetBo(); this.tetbo = new System.Windows.Forms.TetBo(); this.tetbo = new System.Windows.Forms.TetBo(); this.groupbo8 = new System.Windows.Forms.GroupBo(); this.groupbo9 = new System.Windows.Forms.GroupBo(); this.checkbo8 = new System.Windows.Forms.CheckBo(); this.groupbo = new System.Windows.Forms.GroupBo(); this.pp_stop_button = new System.Windows.Forms.Button(); this.tabpage4 = new System.Windows.Forms.TabPage(); this.tetbo3 = new System.Windows.Forms.TetBo(); this.commandsbo = new System.Windows.Forms.ComboBo(); this.buttondisconnect = new System.Windows.Forms.Button(); this.buttonconnect = new System.Windows.Forms.Button(); this.richtettmessage = new System.Windows.Forms.TetBo(); this.sendcommand_button = new System.Windows.Forms.Button(); this.server = new System.Windows.Forms.GroupBo(); this.statusbar = new System.Windows.Forms.StatusBar(); this.statusbarpanel = new System.Windows.Forms.StatusBarPanel(); this.imagelist = new System.Windows.Forms.ImageList(this.components); this.tabcontrol.suspendlayout(); this.tabpage.suspendlayout(); this.groupbo6.suspendlayout(); this.groupbo3.suspendlayout(); this.communication.suspendlayout(); this.groupbo.suspendlayout(); this.groupbo.suspendlayout();

91 this.tabpage.suspendlayout(); this.timer_groupbo.suspendlayout(); this.groupbo7.suspendlayout(); this.groupbo.suspendlayout(); this.tabpage4.suspendlayout(); ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel)).BeginI nit(); this.suspendlayout(); tabcontrol this.tabcontrol.controls.add(this.tabpage); this.tabcontrol.controls.add(this.tabpage); this.tabcontrol.controls.add(this.tabpage4); this.tabcontrol.location = new System.Drawing.Point(8, 8); this.tabcontrol.name = "tabcontrol"; this.tabcontrol.selectedinde = ; this.tabcontrol.size = new System.Drawing.Size(384, 344); this.tabcontrol.tabinde = ; tabpage this.tabpage.controls.add(this.groupbo6); this.tabpage.controls.add(this.picturebo); this.tabpage.controls.add(this.groupbo3); this.tabpage.controls.add(this.disconnect_jog); this.tabpage.controls.add(this.communication); this.tabpage.controls.add(this.label4); this.tabpage.controls.add(this.groupbo); this.tabpage.controls.add(this.groupbo); this.tabpage.location = new System.Drawing.Point(4, ); this.tabpage.name = "tabpage"; this.tabpage.size = new System.Drawing.Size(376, 38); this.tabpage.tabinde = ; this.tabpage.tet = "Jog"; groupbo6 this.groupbo6.controls.add(this.radiobutton); this.groupbo6.controls.add(this.radiobutton); this.groupbo6.controls.add(this.button); this.groupbo6.location = new System.Drawing.Point(68, 84); this.groupbo6.name = "groupbo6"; this.groupbo6.size = new System.Drawing.Size(7, 8); this.groupbo6.tabinde = 9; this.groupbo6.tabstop = false; this.groupbo6.tet = "Gripper"; radiobutton this.radiobutton.autocheck = false; this.radiobutton.location = new System.Drawing.Point(6, 96); this.radiobutton.name = "radiobutton"; this.radiobutton.size = new System.Drawing.Size(48, 4); this.radiobutton.tabinde = ; this.radiobutton.tet = "OFF"; radiobutton this.radiobutton.autocheck = false;

92 this.radiobutton.location = new System.Drawing.Point(6, 7); this.radiobutton.name = "radiobutton"; this.radiobutton.size = new System.Drawing.Size(48, 4); this.radiobutton.tabinde = ; this.radiobutton.tet = "ON"; button this.button.location = new System.Drawing.Point(8, 3); this.button.name = "button"; this.button.size = new System.Drawing.Size(56, 3); this.button.tabinde = ; this.button.tet = "Grip"; this.button.click += new System.EventHandler(this.button_Click_); picturebo this.picturebo.borderstyle = System.Windows.Forms.BorderStyle.Fied3D; this.picturebo.cursor = System.Windows.Forms.Cursors.No; this.picturebo.image = ((System.Drawing.Image)(resources.GetObject("pictureBo.Image"))); this.picturebo.location = new System.Drawing.Point(48, 9); this.picturebo.name = "picturebo"; this.picturebo.size = new System.Drawing.Size(, ); this.picturebo.tabinde = 8; this.picturebo.tabstop = false; groupbo3 this.groupbo3.controls.add(this.speed_combobo); this.groupbo3.controls.add(this.setspeed_jog); this.groupbo3.controls.add(this.jog_speed_set); this.groupbo3.controls.add(this.button3); this.groupbo3.controls.add(this.groupbo4); this.groupbo3.controls.add(this.groupbo5); this.groupbo3.location = new System.Drawing.Point(8, 96); this.groupbo3.name = "groupbo3"; this.groupbo3.size = new System.Drawing.Size(36, 88); this.groupbo3.tabinde = 7; this.groupbo3.tabstop = false; this.groupbo3.tet = "Speed"; speed_combobo this.speed_combobo.backcolor = System.Drawing.SystemColors.Info; this.speed_combobo.items.addrange(new object[] "5", "", "", "3", "4", "5", "6", "8", "", "5", "", "3", "4", "5",

93 "6", "8", "", "5", "", "5", "3", "4", "5", "6", "7"); this.speed_combobo.location = new System.Drawing.Point(96, 4); this.speed_combobo.name = "speed_combobo"; this.speed_combobo.size = new System.Drawing.Size(56, ); this.speed_combobo.tabinde = 3; this.speed_combobo.tet = "Speed"; setspeed_jog this.setspeed_jog.backcolor = System.Drawing.SystemColors.Info; this.setspeed_jog.location = new System.Drawing.Point(8, 4); this.setspeed_jog.name = "setspeed_jog"; this.setspeed_jog.size = new System.Drawing.Size(56, ); this.setspeed_jog.tabinde = ; this.setspeed_jog.tet = ""; Jog_Speed_set this.jog_speed_set.cursor = System.Windows.Forms.Cursors.Hand; this.jog_speed_set.location = new System.Drawing.Point(4, 4); this.jog_speed_set.name = "Jog_Speed_set"; this.jog_speed_set.size = new System.Drawing.Size(56, 3); this.jog_speed_set.tabinde = ; this.jog_speed_set.tet = "Set"; this.jog_speed_set.click += new System.EventHandler(this.button_Click_); button3 this.button3.cursor = System.Windows.Forms.Cursors.Hand; this.button3.location = new System.Drawing.Point(8, 4); this.button3.name = "button3"; this.button3.size = new System.Drawing.Size(56, 3); this.button3.tabinde = ; this.button3.tet = "Get"; this.button3.click += new System.EventHandler(this.button3_Click_); groupbo4 this.groupbo4.location = new System.Drawing.Point(8, 4); this.groupbo4.name = "groupbo4"; this.groupbo4.size = new System.Drawing.Size(6, 48); this.groupbo4.tabinde = 4; this.groupbo4.tabstop = false; groupbo5 this.groupbo5.location = new System.Drawing.Point(9, 4); this.groupbo5.name = "groupbo5"; this.groupbo5.size = new System.Drawing.Size(6, 48); this.groupbo5.tabinde = 5;

94 this.groupbo5.tabstop = false; Disconnect_jog this.disconnect_jog.cursor = System.Windows.Forms.Cursors.Hand; this.disconnect_jog.location = new System.Drawing.Point(4, 64); this.disconnect_jog.name = "Disconnect_jog"; this.disconnect_jog.tabinde = 5; this.disconnect_jog.tet = "Disconnect"; this.disconnect_jog.click += new System.EventHandler(this.Disconnect_jog_Click); Communication this.communication.controls.add(this.connect_jog); this.communication.location = new System.Drawing.Point(8, 8); this.communication.name = "Communication"; this.communication.size = new System.Drawing.Size(4, 88); this.communication.tabinde = 6; this.communication.tabstop = false; this.communication.tet = "Communication"; Connect_jog this.connect_jog.cursor = System.Windows.Forms.Cursors.Hand; this.connect_jog.location = new System.Drawing.Point(6, 4); this.connect_jog.name = "Connect_jog"; this.connect_jog.tabinde = 4; this.connect_jog.tet = "Connect"; this.connect_jog.click += new System.EventHandler(this.Connect_jog_Click); label4 this.label4.location = new System.Drawing.Point(8, 4); this.label4.name = "label4"; this.label4.size = new System.Drawing.Size(6, 3); this.label4.tabinde = 9; this.label4.tet = "X"; groupbo this.groupbo.controls.add(this.startpos_button); this.groupbo.controls.add(this.tetbo4); this.groupbo.controls.add(this.jog_jog); this.groupbo.controls.add(this.utfor_jog); this.groupbo.controls.add(this.tetbo6); this.groupbo.controls.add(this.tetbo5); this.groupbo.controls.add(this.label5); this.groupbo.controls.add(this.label6); this.groupbo.location = new System.Drawing.Point(, 8); this.groupbo.name = "groupbo"; this.groupbo.size = new System.Drawing.Size(48, 88); this.groupbo.tabinde = 3; this.groupbo.tabstop = false; this.groupbo.tet = "Jog"; Startpos_button this.startpos_button.location = new System.Drawing.Point(68, 48); this.startpos_button.name = "Startpos_button";

95 this.startpos_button.size = new System.Drawing.Size(64, 4); this.startpos_button.tabinde = ; this.startpos_button.tet = "Startpos."; this.startpos_button.click += new System.EventHandler(this.button4_Click); tetbo4 this.tetbo4.backcolor = System.Drawing.SystemColors.Info; this.tetbo4.location = new System.Drawing.Point(4, 6); this.tetbo4.malength = 4; this.tetbo4.name = "tetbo4"; this.tetbo4.size = new System.Drawing.Size(4, ); this.tetbo4.tabinde = 3; this.tetbo4.tet = ""; Jog_Jog this.jog_jog.cursor = System.Windows.Forms.Cursors.Hand; this.jog_jog.location = new System.Drawing.Point(88, 48); this.jog_jog.name = "Jog_Jog"; this.jog_jog.size = new System.Drawing.Size(64, 3); this.jog_jog.tabinde = ; this.jog_jog.tet = "Jog"; this.jog_jog.click += new System.EventHandler(this.button_Click_); utfor_jog this.utfor_jog.cursor = System.Windows.Forms.Cursors.Hand; this.utfor_jog.location = new System.Drawing.Point(8, 48); this.utfor_jog.name = "utfor_jog"; this.utfor_jog.size = new System.Drawing.Size(64, 3); this.utfor_jog.tabinde = ; this.utfor_jog.tet = "Uppdate"; this.utfor_jog.click += new System.EventHandler(this.button_Click); tetbo6 this.tetbo6.backcolor = System.Drawing.SystemColors.Info; this.tetbo6.location = new System.Drawing.Point(, 6); this.tetbo6.malength = 4; this.tetbo6.name = "tetbo6"; this.tetbo6.size = new System.Drawing.Size(4, ); this.tetbo6.tabinde = 5; this.tetbo6.tet = ""; tetbo5 this.tetbo5.backcolor = System.Drawing.SystemColors.Info; this.tetbo5.location = new System.Drawing.Point(, 6); this.tetbo5.malength = 4; this.tetbo5.name = "tetbo5"; this.tetbo5.size = new System.Drawing.Size(4, ); this.tetbo5.tabinde = 4; this.tetbo5.tet = ""; label5 this.label5.location = new System.Drawing.Point(96, 6); this.label5.name = "label5"; this.label5.size = new System.Drawing.Size(6, 3);

96 this.label5.tabinde = ; this.label5.tet = "Y"; label6 this.label6.location = new System.Drawing.Point(84, 6); this.label6.name = "label6"; this.label6.size = new System.Drawing.Size(3, 3); this.label6.tabinde = ; this.label6.tet = "Z"; groupbo this.groupbo.controls.add(this.jogrot4); this.groupbo.controls.add(this.jogrot3); this.groupbo.controls.add(this.jogrot); this.groupbo.controls.add(this.jogrot); this.groupbo.controls.add(this.uppdatera_jog_pos); this.groupbo.controls.add(this.label7); this.groupbo.controls.add(this.tetbo); this.groupbo.controls.add(this.tetbo); this.groupbo.controls.add(this.tetbo3); this.groupbo.controls.add(this.label); this.groupbo.controls.add(this.label3); this.groupbo.controls.add(this.label); this.groupbo.location = new System.Drawing.Point(8, 84); this.groupbo.name = "groupbo"; this.groupbo.size = new System.Drawing.Size(5, 8); this.groupbo.tabinde = ; this.groupbo.tabstop = false; this.groupbo.tet = "Aktuell position"; JogRot4 this.jogrot4.backcolor = System.Drawing.SystemColors.Info; this.jogrot4.location = new System.Drawing.Point(56, 4); this.jogrot4.name = "JogRot4"; this.jogrot4.size = new System.Drawing.Size(6, ); this.jogrot4.tabinde = 4; this.jogrot4.tet = ""; JogRot3 this.jogrot3.backcolor = System.Drawing.SystemColors.Info; this.jogrot3.location = new System.Drawing.Point(4, 4); this.jogrot3.name = "JogRot3"; this.jogrot3.size = new System.Drawing.Size(6, ); this.jogrot3.tabinde = 3; this.jogrot3.tet = ""; JogRot this.jogrot.backcolor = System.Drawing.SystemColors.Info; this.jogrot.location = new System.Drawing.Point(4, 4); this.jogrot.name = "JogRot"; this.jogrot.size = new System.Drawing.Size(6, ); this.jogrot.tabinde = ; this.jogrot.tet = ""; JogRot

97 this.jogrot.backcolor = System.Drawing.SystemColors.Info; this.jogrot.location = new System.Drawing.Point(8, 4); this.jogrot.name = "JogRot"; this.jogrot.size = new System.Drawing.Size(6, ); this.jogrot.tabinde = ; this.jogrot.tet = ""; uppdatera_jog_pos this.uppdatera_jog_pos.cursor = System.Windows.Forms.Cursors.Hand; this.uppdatera_jog_pos.location = new System.Drawing.Point(8, 4); this.uppdatera_jog_pos.name = "uppdatera_jog_pos"; this.uppdatera_jog_pos.size = new System.Drawing.Size(64, 3); this.uppdatera_jog_pos.tabinde = ; this.uppdatera_jog_pos.tet = "Uppdate"; this.uppdatera_jog_pos.click += new System.EventHandler(this.button3_Click); label7 this.label7.location = new System.Drawing.Point(8, 88); this.label7.name = "label7"; this.label7.size = new System.Drawing.Size(48, 3); this.label7.tabinde = 5; this.label7.tet = "Rotation"; tetbo this.tetbo.backcolor = System.Drawing.SystemColors.Info; this.tetbo.location = new System.Drawing.Point(4, 56); this.tetbo.name = "tetbo"; this.tetbo.size = new System.Drawing.Size(4, ); this.tetbo.tabinde = ; this.tetbo.tet = ""; tetbo this.tetbo.backcolor = System.Drawing.SystemColors.Info; this.tetbo.location = new System.Drawing.Point(4, 6); this.tetbo.name = "tetbo"; this.tetbo.size = new System.Drawing.Size(4, ); this.tetbo.tabinde = ; this.tetbo.tet = ""; tetbo3 this.tetbo3.backcolor = System.Drawing.SystemColors.Info; this.tetbo3.location = new System.Drawing.Point(4, 96); this.tetbo3.name = "tetbo3"; this.tetbo3.size = new System.Drawing.Size(4, ); this.tetbo3.tabinde = ; this.tetbo3.tet = ""; label this.label.location = new System.Drawing.Point(88, 6); this.label.name = "label"; this.label.size = new System.Drawing.Size(3, 3); this.label.tabinde = 6; this.label.tet = "X";

98 label3 this.label3.location = new System.Drawing.Point(88, 96); this.label3.name = "label3"; this.label3.size = new System.Drawing.Size(3, 3); this.label3.tabinde = 8; this.label3.tet = "Z"; label this.label.location = new System.Drawing.Point(88, 56); this.label.name = "label"; this.label.size = new System.Drawing.Size(3, 6); this.label.tabinde = 7; this.label.tet = "Y"; tabpage this.tabpage.controls.add(this.runcontinously_checkbo); this.tabpage.controls.add(this.delay_button); this.tabpage.controls.add(this.clear_button); this.tabpage.controls.add(this.checkbo); this.tabpage.controls.add(this.checkbo); this.tabpage.controls.add(this.checkbo); this.tabpage.controls.add(this.checkbo9); this.tabpage.controls.add(this.checkbo6); this.tabpage.controls.add(this.checkbo5); this.tabpage.controls.add(this.checkbo4); this.tabpage.controls.add(this.checkbo3); this.tabpage.controls.add(this.checkbo); this.tabpage.controls.add(this.checkbo); this.tabpage.controls.add(this.start_pick_place); this.tabpage.controls.add(this.timer_groupbo); this.tabpage.controls.add(this.groupbo7); this.tabpage.controls.add(this.checkbo8); this.tabpage.controls.add(this.groupbo); this.tabpage.location = new System.Drawing.Point(4, ); this.tabpage.name = "tabpage"; this.tabpage.size = new System.Drawing.Size(376, 38); this.tabpage.tabinde = ; this.tabpage.tet = "Pick & Place"; runcontinously_checkbo this.runcontinously_checkbo.location = new System.Drawing.Point(96, 6); this.runcontinously_checkbo.name = "runcontinously_checkbo"; this.runcontinously_checkbo.size = new System.Drawing.Size(88, 4); this.runcontinously_checkbo.tabinde = 5; this.runcontinously_checkbo.tet = "Continously"; Delay_button this.delay_button.location = new System.Drawing.Point(8, 96); this.delay_button.name = "Delay_button"; this.delay_button.size = new System.Drawing.Size(75, 4); this.delay_button.tabinde = 3; this.delay_button.tet = "Delay"; this.delay_button.click += new System.EventHandler(this.Delay_button_Click);

99 clear_button this.clear_button.location = new System.Drawing.Point(6, 8); this.clear_button.name = "clear_button"; this.clear_button.tabinde = 8; this.clear_button.tet = "Clear"; this.clear_button.click += new System.EventHandler(this.clear_button_Click); checkbo this.checkbo.autocheck = false; this.checkbo.location = new System.Drawing.Point(8, 7); this.checkbo.name = "checkbo"; this.checkbo.size = new System.Drawing.Size(8, 4); this.checkbo.tabinde = 3; this.checkbo.tet = "Pick/Place"; checkbo this.checkbo.autocheck = false; this.checkbo.location = new System.Drawing.Point(8, 48); this.checkbo.name = "checkbo"; this.checkbo.size = new System.Drawing.Size(64, 4); this.checkbo.tabinde = ; this.checkbo.tet = "Pos "; checkbo this.checkbo.autocheck = false; this.checkbo.location = new System.Drawing.Point(8, 4); this.checkbo.name = "checkbo"; this.checkbo.size = new System.Drawing.Size(7, 4); this.checkbo.tabinde = ; this.checkbo.tet = "Pos "; checkbo9 this.checkbo9.autocheck = false; this.checkbo9.location = new System.Drawing.Point(6, 6); this.checkbo9.name = "checkbo9"; this.checkbo9.tabinde = 9; this.checkbo9.tet = "System done"; checkbo6 this.checkbo6.autocheck = false; this.checkbo6.location = new System.Drawing.Point(6, 68); this.checkbo6.name = "checkbo6"; this.checkbo6.tabinde = 6; this.checkbo6.tet = "Object placed"; checkbo5 this.checkbo5.autocheck = false; this.checkbo5.location = new System.Drawing.Point(6, 44); this.checkbo5.name = "checkbo5"; this.checkbo5.size = new System.Drawing.Size(6, 4); this.checkbo5.tabinde = 5; this.checkbo5.tet = "Placing position estimated";

100 checkbo4 this.checkbo4.autocheck = false; this.checkbo4.location = new System.Drawing.Point(6, ); this.checkbo4.name = "checkbo4"; this.checkbo4.tabinde = 4; this.checkbo4.tet = "Object picked"; checkbo3 this.checkbo3.autocheck = false; this.checkbo3.location = new System.Drawing.Point(6, 96); this.checkbo3.name = "checkbo3"; this.checkbo3.size = new System.Drawing.Size(6, 4); this.checkbo3.tabinde = 3; this.checkbo3.tet = "Picking position estimated"; checkbo this.checkbo.autocheck = false; this.checkbo.location = new System.Drawing.Point(6, 7); this.checkbo.name = "checkbo"; this.checkbo.size = new System.Drawing.Size(, 4); this.checkbo.tabinde = ; this.checkbo.tet = "Camera connected"; checkbo this.checkbo.autocheck = false; this.checkbo.location = new System.Drawing.Point(6, 48); this.checkbo.name = "checkbo"; this.checkbo.size = new System.Drawing.Size(8, 4); this.checkbo.tabinde = ; this.checkbo.tabstop = false; this.checkbo.tet = "Robot connected"; start_pick_place this.start_pick_place.cursor = System.Windows.Forms.Cursors.Hand; this.start_pick_place.location = new System.Drawing.Point(6, 6); this.start_pick_place.name = "start_pick_place"; this.start_pick_place.tabinde = ; this.start_pick_place.tet = "Start"; this.start_pick_place.click += new System.EventHandler(this.start_pick_place_Click); Timer_groupbo this.timer_groupbo.controls.add(this.delay_tetbo); this.timer_groupbo.controls.add(this.delay_tetbo); this.timer_groupbo.controls.add(this.pic); this.timer_groupbo.controls.add(this.action); this.timer_groupbo.location = new System.Drawing.Point(64, 8); this.timer_groupbo.name = "Timer_groupbo"; this.timer_groupbo.size = new System.Drawing.Size(4, 6); this.timer_groupbo.tabinde = 4; this.timer_groupbo.tabstop = false; this.timer_groupbo.tet = "Timer"; Delay_tetBo

101 this.delay_tetbo.location = new System.Drawing.Point(56, 8); this.delay_tetbo.name = "Delay_tetBo"; this.delay_tetbo.size = new System.Drawing.Size(4, ); this.delay_tetbo.tabinde = 4; this.delay_tetbo.tet = "3"; Delay_tetBo this.delay_tetbo.location = new System.Drawing.Point(8, 8); this.delay_tetbo.name = "Delay_tetBo"; this.delay_tetbo.size = new System.Drawing.Size(4, ); this.delay_tetbo.tabinde = ; this.delay_tetbo.tet = "5"; Pic this.pic.location = new System.Drawing.Point(8, ); this.pic.name = "Pic"; this.pic.size = new System.Drawing.Size(4, 6); this.pic.tabinde = 7; this.pic.tet = "Pic"; Action this.action.location = new System.Drawing.Point(56, ); this.action.name = "Action"; this.action.size = new System.Drawing.Size(4, 6); this.action.tabinde = 7; this.action.tet = "Action"; groupbo7 this.groupbo7.controls.add(this.tetbo9); this.groupbo7.controls.add(this.tetbo8); this.groupbo7.controls.add(this.tetbo7); this.groupbo7.controls.add(this.tetbo); this.groupbo7.controls.add(this.tetbo); this.groupbo7.controls.add(this.tetbo); this.groupbo7.controls.add(this.groupbo8); this.groupbo7.controls.add(this.groupbo9); this.groupbo7.location = new System.Drawing.Point(44, 68); this.groupbo7.name = "groupbo7"; this.groupbo7.size = new System.Drawing.Size(4, 44); this.groupbo7.tabinde = ; this.groupbo7.tabstop = false; this.groupbo7.tet = "Positions"; tetbo9 this.tetbo9.location = new System.Drawing.Point(6, 4); this.tetbo9.name = "tetbo9"; this.tetbo9.size = new System.Drawing.Size(8, ); this.tetbo9.tabinde = 7; this.tetbo9.tet = ""; tetbo8 this.tetbo8.location = new System.Drawing.Point(6, 7); this.tetbo8.name = "tetbo8"; this.tetbo8.size = new System.Drawing.Size(8, ); this.tetbo8.tabinde = 6;

102 this.tetbo8.tet = ""; tetbo7 this.tetbo7.location = new System.Drawing.Point(6, 4); this.tetbo7.name = "tetbo7"; this.tetbo7.size = new System.Drawing.Size(8, ); this.tetbo7.tabinde = 5; this.tetbo7.tet = ""; tetbo this.tetbo.location = new System.Drawing.Point(8, 4); this.tetbo.name = "tetbo"; this.tetbo.size = new System.Drawing.Size(8, ); this.tetbo.tabinde = ; this.tetbo.tet = ""; tetbo this.tetbo.location = new System.Drawing.Point(8, 4); this.tetbo.name = "tetbo"; this.tetbo.size = new System.Drawing.Size(8, ); this.tetbo.tabinde = 9; this.tetbo.tet = ""; tetbo this.tetbo.location = new System.Drawing.Point(8, 7); this.tetbo.name = "tetbo"; this.tetbo.size = new System.Drawing.Size(8, ); this.tetbo.tabinde = ; this.tetbo.tet = ""; groupbo8 this.groupbo8.location = new System.Drawing.Point(8, 4); this.groupbo8.name = "groupbo8"; this.groupbo8.size = new System.Drawing.Size(96, ); this.groupbo8.tabinde = ; this.groupbo8.tabstop = false; this.groupbo8.tet = "Pick"; groupbo9 this.groupbo9.location = new System.Drawing.Point(, 4); this.groupbo9.name = "groupbo9"; this.groupbo9.size = new System.Drawing.Size(96, ); this.groupbo9.tabinde = 3; this.groupbo9.tabstop = false; this.groupbo9.tet = "Place"; checkbo8 this.checkbo8.autocheck = false; this.checkbo8.location = new System.Drawing.Point(6, 9); this.checkbo8.name = "checkbo8"; this.checkbo8.size = new System.Drawing.Size(36, 4); this.checkbo8.tabinde = 8; this.checkbo8.tet = "Robot disconnected";

103 groupbo this.groupbo.controls.add(this.pp_stop_button); this.groupbo.location = new System.Drawing.Point(8, ); this.groupbo.name = "groupbo"; this.groupbo.size = new System.Drawing.Size(48, 48); this.groupbo.tabinde = 6; this.groupbo.tabstop = false; PP_stop_button this.pp_stop_button.location = new System.Drawing.Point(76, 6); this.pp_stop_button.name = "PP_stop_button"; this.pp_stop_button.size = new System.Drawing.Size(64, 3); this.pp_stop_button.tabinde = ; this.pp_stop_button.tet = "Stop"; this.pp_stop_button.click += new System.EventHandler(this.PP_stop_button_Click); tabpage4 this.tabpage4.controls.add(this.tetbo3); this.tabpage4.controls.add(this.commandsbo); this.tabpage4.controls.add(this.buttondisconnect); this.tabpage4.controls.add(this.buttonconnect); this.tabpage4.controls.add(this.richtettmessage); this.tabpage4.controls.add(this.sendcommand_button); this.tabpage4.controls.add(this.server); this.tabpage4.location = new System.Drawing.Point(4, ); this.tabpage4.name = "tabpage4"; this.tabpage4.size = new System.Drawing.Size(376, 38); this.tabpage4.tabinde = 3; this.tabpage4.tet = "XML"; tetbo3 this.tetbo3.location = new System.Drawing.Point(96, 3); this.tetbo3.name = "tetbo3"; this.tetbo3.size = new System.Drawing.Size(8, ); this.tetbo3.tabinde = ; this.tetbo3.tet = "tetbo3"; Commandsbo this.commandsbo.items.addrange(new object[] "<REQ><CMD>getprotocolversion</CMD></REQ>", "<REQ><CMD>runtasks</CMD></REQ>", "<REQ><CMD>stoptasks</CMD></REQ>"); this.commandsbo.location = new System.Drawing.Point(8, 5); this.commandsbo.name = "Commandsbo"; this.commandsbo.size = new System.Drawing.Size(36, ); this.commandsbo.tabinde = 9; this.commandsbo.tet = "Commands"; buttondisconnect this.buttondisconnect.location = new System.Drawing.Point(6, 56); this.buttondisconnect.name = "buttondisconnect"; this.buttondisconnect.size = new System.Drawing.Size(4, 4); this.buttondisconnect.tabinde = 5; this.buttondisconnect.tet = "Disconnect";

104 this.buttondisconnect.click += new System.EventHandler(this.buttonDisconnect_Click); buttonconnect this.buttonconnect.location = new System.Drawing.Point(6, 4); this.buttonconnect.name = "buttonconnect"; this.buttonconnect.size = new System.Drawing.Size(4, 4); this.buttonconnect.tabinde = 4; this.buttonconnect.tet = "Connect"; this.buttonconnect.click += new System.EventHandler(this.buttonConnect_Click); richtettmessage this.richtettmessage.location = new System.Drawing.Point(8, 8); this.richtettmessage.name = "richtettmessage"; this.richtettmessage.size = new System.Drawing.Size(36, ); this.richtettmessage.tabinde = ; this.richtettmessage.tet = "<REQ><CMD></CMD></REQ>"; sendcommand_button this.sendcommand_button.location = new System.Drawing.Point(8, 96); this.sendcommand_button.name = "sendcommand_button"; this.sendcommand_button.size = new System.Drawing.Size(96, 3); this.sendcommand_button.tabinde = ; this.sendcommand_button.tet = "Send Command"; this.sendcommand_button.click += new System.EventHandler(this.sendcommand_button_Click); Server this.server.location = new System.Drawing.Point(8, 8); this.server.name = "Server"; this.server.size = new System.Drawing.Size(, 8); this.server.tabinde = 7; this.server.tabstop = false; this.server.tet = "Server"; statusbar this.statusbar.anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top System.Windows.Forms.AnchorStyles.Right))); this.statusbar.dock = System.Windows.Forms.DockStyle.None; this.statusbar.font = new System.Drawing.Font("Lucida Console", 8.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)())); this.statusbar.location = new System.Drawing.Point(, 36); this.statusbar.name = "statusbar"; this.statusbar.panels.addrange(new System.Windows.Forms.StatusBarPanel[] this.statusbarpanel); this.statusbar.size = new System.Drawing.Size(398, 4); this.statusbar.tabinde = ; this.statusbar.tet = "Idle"; statusbarpanel

105 this.statusbarpanel.icon = ((System.Drawing.Icon)(resources.GetObject("statusBarPanel.Icon"))); this.statusbarpanel.tet = "statusbarpanel"; imagelist this.imagelist.imagesize = new System.Drawing.Size(6, 6); this.imagelist.transparentcolor = System.Drawing.Color.Transparent; VGRC this.autoscalebasesize = new System.Drawing.Size(5, 3); this.clientsize = new System.Drawing.Size(398, 379); this.controls.add(this.statusbar); this.controls.add(this.tabcontrol); this.formborderstyle = System.Windows.Forms.FormBorderStyle.Fied3D; this.icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.name = "VGRC"; this.tet = "VGRC"; this.tabcontrol.resumelayout(false); this.tabpage.resumelayout(false); this.groupbo6.resumelayout(false); this.groupbo3.resumelayout(false); this.communication.resumelayout(false); this.groupbo.resumelayout(false); this.groupbo.resumelayout(false); this.tabpage.resumelayout(false); this.timer_groupbo.resumelayout(false); this.groupbo7.resumelayout(false); this.groupbo.resumelayout(false); this.tabpage4.resumelayout(false); ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel)).EndIni t(); this.resumelayout(false); [STAThread] #endregion #region Client code TCP/IP-klienten med parsning av XML-kod static void Main() Application.Run(new VGRC()); public void OnDataReceived(IAsyncResult asyn) if (globala.found ==true) if (globala.count>) globala.found = false; globala.x=globala.tal; globala.y=globala.tal; globala.tal=; globala.tal=; globala.count = ; globala.count = ; globala.div = false; globala.div = false;

106 globala.division = ; globala.division = ; globala.min = false; globala.min = false; else if (globala.szdata == ">\") globala.count++; else if (globala.szdata == "<\") globala.count++; else if ((globala.count==) && (globala.count==)) if (globala.szdata == "-\") globala.min = true; if (globala.min!=true) if (globala.szdata == ",\") globala.div = true; else if (globala.div == true) globala.tal = globala.tal + (Convert.ToInt3(globala.szData)/globala.division); globala.division = globala.division*; else tetbo.tet = tetbo.tet + globala.szdata; globala.tal=globala.tal*; globala.tal = globala.tal+convert.toint3(globala.szdata); else if ((globala.count==) && (globala.count==)) if (globala.szdata == "-\") globala.min = true; if (globala.min!=true) if (globala.szdata == ",\") globala.div = true; else if (globala.div == true) globala.tal = globala.tal + (Convert.ToInt3(globala.szData)/globala.division); globala.division = globala.division*; else globala.tal=globala.tal*; globala.tal = globala.tal+convert.toint3(globala.szdata); if (globala.szdata == "\") globala.found = true;

107 try SocketPacket thesockid = (SocketPacket)asyn.AsyncState ; int ir = thesockid.thissocket.endreceive (asyn); char[] chars = new char[ir + ]; System.Tet.Decoder d = System.Tet.Encoding.UTF8.GetDecoder(); int charlen = d.getchars(thesockid.databuffer,, ir, chars, ); globala.szdata = new System.String(chars); WaitForData(); catch (ObjectDisposedEception ) System.Diagnostics.Debugger.Log(,"","\nOnDataReceived: Socket has been closed\n"); catch(socketeception se) MessageBo.Show (se.message ); public void WaitForData() try if ( m_pfncallback == null ) m_pfncallback = new AsyncCallback (OnDataReceived); SocketPacket thesocpkt = new SocketPacket (); thesocpkt.thissocket = m_clientsocket; Start listening to the data asynchronously m_result = m_clientsocket.beginreceive (thesocpkt.databuffer,, thesocpkt.databuffer.length, SocketFlags.None, m_pfncallback, thesocpkt); catch(socketeception se) MessageBo.Show (se.message ); public class SocketPacket public System.Net.Sockets.Socket thissocket; public byte[] databuffer = new byte[]; private void UpdateControls( bool connected ) buttonconnect.enabled =!connected; buttondisconnect.enabled = connected; string connectstatus = connected? "Connected" : "Connecting..."; tetboconnectstatus.tet = connectstatus; this.statusbar.tet= connectstatus; #endregion #region Main Huvudprogrammet för Plocka och Placera private void MainProgram()

108 globala.klar = false; Thread tid_thread_pick = new Thread(new ThreadStart(Tid.tid_pic)); Thread tid_thread_pick = new Thread(new ThreadStart(Tid.tid_action)); Thread tid_thread_place = new Thread(new ThreadStart(Tid.tid_pic)); Thread tid_thread_place = new Thread(new ThreadStart(Tid.tid_action)); if (globala.camcon == ) Connect_cam(); globala.camcon = ; globala.startpos.trans. = ; globala.startpos.trans.y = ; globala.startpos.trans.z = ; globala.startpos.rot.q = ; globala.startpos.rot.q = ; globala.startpos.rot.q3 = ; globala.startpos.rot.q4 = ; if (globala.connect!= ) Connect_rob(); checkbo.checked = true; set_pose(globala.startpos); Move utgångspos. Rapper.S4.rob_boolSet("klar",false); Rapper.S4.rob_boolSet("flagga", false); Utför Robwait(); while (!m_clientsocket.connected) checkbo.checked = true; this.statusbar.tet="system active"; Rapper.Structs.pose pos = new Rapper.Structs.pose(); Rapper.Structs.pose pos = new Rapper.Structs.pose(); cart_turn(); Rapper.S4.rob_boolSet("flagga", false); tid_thread_pick.start(); pos.trans.=globala.x; pos.trans.y=globala.y; checkbo.checked = true; while(!globala.klar) tid_thread_pick.abort(); pos.trans.=globala.x; pos.trans.y=globala.y; tid_thread_pick.start(); checkbo.checked = true; globala.klar = false; tetbo7.tet = Convert.ToString(pos.trans.); tetbo7.tet = tetbo7.tet + " " + Convert.ToString(pos.trans.y); tetbo8.tet = Convert.ToString(pos.trans.); tetbo8.tet = tetbo8.tet + " " + Convert.ToString(pos.trans.y); pos = MathPP.MathPP.pick(pos, pos);

109 tetbo9.tet = Convert.ToString(pos.trans.); tetbo9.tet = tetbo9.tet + " " + Convert.ToString(pos.trans.y); checkbo3.checked = true; System.Windows.Forms.MessageBo.Show(Convert.ToString(pos.trans.)); pick(pos); this.statusbar.tet="object picked"; tid_thread_pick.abort(); checkbo4.checked = true; checkbo.checked = false; checkbo.checked = false; checkbo.checked = false; globala.klar = false; cart_turn(); tid_thread_place.start(); pos.trans.=globala.x; pos.trans.y=globala.y; checkbo.checked = true; while(!globala.klar) tid_thread_place.abort(); pos.trans.=globala.x; pos.trans.y=globala.y; tid_thread_place.start(); checkbo.checked = true; globala.klar = false; tetbo.tet = Convert.ToString(pos.trans.); tetbo.tet = tetbo.tet + " " + Convert.ToString(pos.trans.y); tetbo.tet = Convert.ToString(pos.trans.); tetbo.tet = tetbo.tet + " " + Convert.ToString(pos.trans.y); pos = MathPP.MathPP.pick(pos, pos); tetbo.tet = Convert.ToString(pos.trans.); tetbo.tet = tetbo.tet + " " + Convert.ToString(pos.trans.y); checkbo5.checked = true; place(pos); this.statusbar.tet="object placed"; tid_thread_place.abort(); checkbo6.checked = true; globala.klar = false; Disconnect_rob(); checkbo8.checked = true; this.statusbar.tet="system Finished"; #endregion #region Functions Diverse små funktioner

110 public bool IsInteger(String strnumber) Rege objnotintpattern=new Rege("[^-9-]"); Rege objintpattern=new Rege("^-[-9]+$ ^[-9]+$"); return!objnotintpattern.ismatch(strnumber) && objintpattern.ismatch(strnumber); public void cart_turn() Rapper.Structs.pose pos = new Rapper.Structs.pose(); Rapper.Structs.pose pos = new Rapper.Structs.pose(); Rapper.S4.rob_poseSet("p", coordinates); pos.trans. = ; pos.trans.y = ; pos.trans. = ; pos.trans.y = ; while (true) if (globala.x > 5 && globala.x < 7) pos.trans.=pos.trans.; pos.trans.y=pos.trans.y; pos.trans.=globala.x; pos.trans.y=globala.y; if (pos.trans. < pos.trans.) break; #endregion #region Cam functions Kameraspecifika funktioner private void Connect_cam() try UpdateControls(false); Create the socket instance m_clientsocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp ); Cet the remote IP address IPHostEntry iphostinfo = Dns.Resolve("9.68.."); IPAddress ip = iphostinfo.addresslist[]; IPAddress ip = IPAddress.Parse ("localhost"); int iportno = 394; Create the end point IPEndPoint ipend = new IPEndPoint (ip,iportno); Connect to the remote host m_clientsocket.connect ( ipend ); if(m_clientsocket.connected) UpdateControls(true); Wait for data asynchronously WaitForData();

111 catch(socketeception se) string str; str = "\nconnection failed, is the server running?\n" + se.message; MessageBo.Show (str); UpdateControls(false); private void Disconnect_cam() if ( m_clientsocket!= null ) m_clientsocket.close(); m_clientsocket = null; UpdateControls(false); public void Send_command(Object objdata) try byte[] bydata = System.Tet.Encoding.ASCII.GetBytes(objData.ToString ()); if(m_clientsocket!= null) m_clientsocket.send (bydata); catch(socketeception se) MessageBo.Show (se.message ); #endregion #region Rob functions Robot och RAP-specifika funktioner private void Connect_rob() if (globala.connect!= ) globala.connect = Rapper.S4.rob_init(" "); Rapper.S4.rob_boolSet("flagga", true); if (globala.connect == ) this.statusbar.tet="robot Connected"; else if (globala.connect == -) this.statusbar.tet="connection failed"; else this.statusbar.tet="robot Not Responding"; else MessageBo.Show("Already connected!","notice",messagebobuttons.ok,messageboicon.information); private void Disconnect_rob() int ok = 7; if (globala.connect == )

112 ok = Rapper.S4.rob_disconnect(); globala.connect = 7; if (ok == ) this.statusbar.tet="robot Disconnect Successful"; else if (ok == -) this.statusbar.tet="disconnection failed"; else this.statusbar.tet="robot Not Responding"; else MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); private void Jog() if (globala.connect == ) Rapper.S4.rob_boolSet("flagga", false); else MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); private void Set_speed(float s) if (globala.connect == ) Rapper.Structs.speeddata speed = new Rapper.Structs.speeddata(); int ok =7; speed.v_tcp = s; speed.v_ori = 5; speed.v_rea = ; speed.v_lea = 5; ok = Rapper.S4.rob_speeddataSet("velocity", speed); if (ok == ) this.statusbar.tet="robotspeed changed"; else if (ok == -) this.statusbar.tet="speedchange failed"; else this.statusbar.tet="robot Not Responding"; else MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); private float Get_speed() if (globala.connect == ) Rapper.Structs.speeddata speed = new Rapper.Structs.speeddata(); Rapper.S4.rob_speeddataGet("velocity", ref speed); return speed.v_tcp; else MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); return -;

113 private Rapper.Structs.pose Get_pose() Rapper.Structs.pose coordinates = new Rapper.Structs.pose(); if (globala.connect == ) int ok = 7; this.statusbar.tet="position Updated"; ok = Rapper.S4.rob_poseGet("p", ref coordinates); if (ok == ) this.statusbar.tet="pose updated"; return coordinates; else if (ok == -) this.statusbar.tet="update Failed"; coordinates.rot.q = 33; return coordinates; else this.statusbar.tet="robot Not Responding"; coordinates.rot.q = 33; return coordinates; else MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); coordinates.rot.q = 33; return coordinates; private void set_pose(rapper.structs.pose coord) if (globala.connect == ) int ok = 7; if (coord.trans.z>74) this.statusbar.tet="z-value is too high"; else if (coord.trans.z<999) this.statusbar.tet="z-value is too low"; else if (coord.trans.>39) this.statusbar.tet="x-value is too high"; else if (coord.trans.<(-39)) this.statusbar.tet="x-value is too low"; else if (coord.trans.y>39) this.statusbar.tet="y-value is too high"; else if (coord.trans.y<(-39)) this.statusbar.tet="y-value is too low";

114 else this.statusbar.tet="correct Values"; Rapper.Structs.pose coordinates = new Rapper.Structs.pose(); coordinates.trans. = coord.trans.; coordinates.trans.y = coord.trans.y; coordinates.trans.z = coord.trans.z; coordinates.rot.q = ; coordinates.rot.q = ; coordinates.rot.q3 = ; coordinates.rot.q4 = ; ok = Rapper.S4.rob_poseSet("p", coordinates); if (ok == ) this.statusbar.tet="pose Updated"; else if (ok == -) this.statusbar.tet="connection failed"; else this.statusbar.tet="robot Not Responding"; else MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); private int Gripper_gripcontrol() int ok = 7; if (globala.connect == ) bool gripper = new bool(); Rapper.S4.rob_boolGet("gripper",ref gripper); if (gripper == true) ok = Rapper.S4.rob_boolSet("gripper",false); if (ok == -) this.statusbar.tet = "Gripper change failed"; return -; else if (ok == ) radiobutton.checked = false; radiobutton.checked = true;; return ; else this.statusbar.tet = "Robot Not Responding"; return -; else

115 ok = Rapper.S4.rob_boolSet("gripper",true); if (ok == -) this.statusbar.tet="gripper change failed"; return -; else if (ok == ) radiobutton.checked = true; radiobutton.checked = false; return ; else this.statusbar.tet="robot Not Responding"; return -; else MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); return -; private void Robwait() bool done = new bool(); done = false; while(done!= true) Rapper.S4.rob_boolGet("klar",ref done); this.statusbar.tet="waiting for robot"; Rapper.S4.rob_boolSet("klar",false); #endregion #region Pick and place Funktionerna för att plocka eller placera på stället. public void pick(rapper.structs.pose coordinates) Rapper.S4.rob_boolSet("klar",false); Rapper.Structs.pose STARTPOS = new Rapper.Structs.pose(); coordinates.trans.z = 65; set_pose(coordinates); ovanför plockpos. Rapper.S4.rob_boolSet("flagga", false); Utför Robwait(); Gripper_gripcontrol(); coordinates.trans.z = 73; coordinates.trans. = coordinates.trans. + ; set_pose(coordinates); Move koordinater ändra Z!! while(!globala.klar) checkbo.checked = true; Rapper.S4.rob_boolSet("flagga", false); Utför

116 Robwait(); globala.klar = false; coordinates.trans.z = ; set_pose(coordinates); ovanför plockpos. ändra Z!! Rapper.S4.rob_boolSet("flagga", false); Utför Robwait(); set_pose(globala.startpos); Move utgångspos. Rapper.S4.rob_boolSet("flagga", false); Utför Robwait(); public void place(rapper.structs.pose coordinates) Rapper.S4.rob_boolSet("klar",false); Rapper.Structs.pose STARTPOS = new Rapper.Structs.pose(); coordinates.trans.z = 7; set_pose(coordinates); Move kordinater ändra Z!! Rapper.S4.rob_boolSet("flagga", false); Utför Robwait(); Gripper_gripcontrol(); Ändrar bool i rapid ej eekverat här coordinates.trans. = coordinates.trans. + ; smidigare släpp coordinates.trans.z = coordinates.trans.z - ; set_pose(coordinates); Set_speed(5); while(!globala.klar) Rapper.S4.rob_boolSet("flagga", false); Utför släppet Robwait(); Set_speed(7); checkbo.checked = true; globala.klar = false; e) set_pose(globala.startpos); Ladda utgångspos. Rapper.S4.rob_boolSet("flagga", false); Utför utg. pos Robwait(); #endregion #region Buttons Programmets alla knappar och dess funktioner private void sendcommand_button_click(object sender, System.EventArgs if (richtettmessage.tet=="<req><cmd></cmd></req>") Send_command(Commandsbo.Tet); else Send_command(richTetTMessage.Tet); private void button5_click_(object sender, System.EventArgs e) try Object objdata = Commandsbo.Tet; byte[] bydata = System.Tet.Encoding.ASCII.GetBytes(objData.ToString ()); if(m_clientsocket!= null)

117 m_clientsocket.send (bydata); catch(socketeception se) MessageBo.Show (se.message ); private void buttonconnect_click(object sender, System.EventArgs e) Connect_cam(); private void buttondisconnect_click(object sender, System.EventArgs e) Disconnect_cam(); private void button_click(object sender, System.EventArgs e) if ((!IsInteger(tetBo4.Tet)) (!IsInteger(tetBo5.Tet)) (!IsInteger(tetBo6.Tet))) this.statusbar.tet="incorrect Values"; else Rapper.Structs.pose coordinates = new Rapper.Structs.pose(); coordinates.trans. = float.parse(tetbo4.tet); coordinates.trans.y = float.parse(tetbo5.tet); coordinates.trans.z = float.parse(tetbo6.tet); set_pose(coordinates); private void button_click_(object sender, System.EventArgs e) Jog(); private void Connect_jog_Click(object sender, System.EventArgs e) Connect_rob(); private void Disconnect_jog_Click(object sender, System.EventArgs e) Disconnect_rob(); private void button_click_(object sender, System.EventArgs e) if (speed_combobo.tet!="speed") Set_speed(Convert.ToSingle(speed_comboBo.Tet)); else this.statusbar.tet="choose speed"; private void button3_click_(object sender, System.EventArgs e) float speed = Get_speed(); if (speed!= -)

118 setspeed_jog.tet = Convert.ToString(speed); private void button3_click(object sender, System.EventArgs e) Rapper.Structs.pose coordinates = Get_pose(); if (coordinates.rot.q!= 33) tetbo.tet = System.Convert.ToString(coordinates.trans.); tetbo.tet = System.Convert.ToString(coordinates.trans.y); tetbo3.tet = System.Convert.ToString(coordinates.trans.z); JogRot.Tet = System.Convert.ToString(coordinates.rot.q); JogRot.Tet = System.Convert.ToString(coordinates.rot.q); JogRot3.Tet = System.Convert.ToString(coordinates.rot.q3); JogRot4.Tet = System.Convert.ToString(coordinates.rot.q4); private void button_click_(object sender, System.EventArgs e) Gripper_gripcontrol(); private void clear() checkbo.checked = false; checkbo.checked = false; checkbo3.checked = false; checkbo4.checked = false; checkbo5.checked = false; checkbo6.checked = false; checkbo8.checked = false; checkbo9.checked = false; checkbo.checked = false; checkbo.checked = false; checkbo.checked = false; tetbo7.tet = ""; tetbo8.tet = ""; tetbo9.tet = ""; tetbo.tet = ""; tetbo.tet = ""; tetbo.tet = ""; private void button4_click(object sender, System.EventArgs e) if (globala.connect == ) Rapper.Structs.pose coordinates = new Rapper.Structs.pose(); coordinates.trans. = ; coordinates.trans.y = ; coordinates.trans.z = ; set_pose(coordinates); Rapper.S4.rob_boolSet("flagga", false); else

119 MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); private void Delay_button_Click(object sender, System.EventArgs e) globala.time_action = Convert.ToInt3(Delay_tetBo.Tet); globala.time_pic = Convert.ToInt3(Delay_tetBo.Tet); private void start_pick_place_click(object sender, System.EventArgs e) if(runcontinously_checkbo.checked == true) while(!globala.stop) clear(); MainProgram(); else MainProgram(); checkbo9.checked = true; private void clear_button_click(object sender, System.EventArgs e) clear(); private void PP_stop_button_Click(object sender, System.EventArgs e) globala.stop = true; #endregion #region Global variables Variabler som används globalt i prorgammet public class globala public static Rapper.Structs.pose STARTPOS = new Rapper.Structs.pose(); public static System.String szdata; public static int connect = 7; public static bool found = false; public static int tal=; public static int tal=; public static int count = ; public static int count = ; public static int X; public static int Y; public static int time_pic = 5; public static int time_action = 3; public static bool div = false; public static bool div = false; public static int division = ; public static int division = ; public static bool min = false; public static bool min = false;

120 public static bool klar = false; public static int Camcon = ; public static bool stop = false; #endregion #region Timer funktioner Trådar för tidtagning. public class Tid public static void tid_pic() while(true) Thread.Sleep(globala.time_pic); globala.klar = true; public static void tid_action() while(true) Thread.Sleep(globala.time_action); globala.klar = true; #endregion

121 . Programkod C# i Projekt

122 Nedanstående visar de övergripande regionerna i koden för VGIP följt av en kort beskrivning. #region Windows Form Designer generated code Kod skapad av Visual Studio. #region Main Huvudprogrammet för att balansera pendeln. #region Client code TCP/IP-klienten med parsning av XML-kod. #region Functions Diverse små funktioner. #region Cam functions Kameraspecifika funktioner. #region Buttons Programmets alla knappar och dess funktioner. #region Global variables Variabler som används globalt i programmet.

123 using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Tet.RegularEpressions; using System.Xml; using System.Threading; using System.Net; using System.Net.Sockets; using System.Runtime.Serialization.Formatters.Binary; using System.IO; namespace VGIP public class VGIP_form : System.Windows.Forms.Form private System.Windows.Forms.TabControl tab_form; private System.Windows.Forms.TabPage robot_tab; private System.Windows.Forms.TabPage Camera_tab; private System.Windows.Forms.TabPage VGIP_tab; private System.Windows.Forms.StatusBar statusbar; private System.Windows.Forms.GroupBo Communication_groupBo; private System.Windows.Forms.GroupBo jog_groupbo; private System.Windows.Forms.GroupBo speed_groupbo; private System.Windows.Forms.GroupBo position_groupbo; private System.Windows.Forms.Button robotconnect_button; private System.Windows.Forms.Button robotdisconnect_button; private System.Windows.Forms.Button robotjog_button; private System.Windows.Forms.Button robotstartpos_button; private System.Windows.Forms.TetBo robotjog_tetbo; private System.Windows.Forms.TetBo robotjogy_tetbo; private System.Windows.Forms.TetBo robotjogz_tetbo; private System.Windows.Forms.PictureBo robot_picturebo; private System.Windows.Forms.Button speed_button; private System.Windows.Forms.TetBo robotspeed_tetbo; private System.Windows.Forms.Button robotposition_button; private System.Windows.Forms.RichTetBo robotgetposition_richtetbo; private byte[] m_buffer; byte[] m_databuffer = new byte []; IAsyncResult m_result; public AsyncCallback m_pfncallback ; public Socket m_clientsocket; private System.Windows.Forms.Button connect_camera; private System.Windows.Forms.TetBo CRX; private System.Windows.Forms.TetBo CGX; private System.Windows.Forms.TetBo CRX; private System.Windows.Forms.TetBo CGX; private System.Windows.Forms.Button startvgip_button; private System.Windows.Forms.TetBo movedata_speed_tetbo; private System.Windows.Forms.TetBo movedata_distance_tetbo; private System.Windows.Forms.TabPage fuzzysets_tabpage; private System.Windows.Forms.TetBo fuzzy_ss_tetbo; private System.Windows.Forms.TetBo fuzzy_sd_tetbo; private System.Windows.Forms.TetBo fuzzy_ms_tetbo; private System.Windows.Forms.TetBo fuzzy_md_tetbo;

124 private System.Windows.Forms.TetBo fuzzy_bs_tetbo; private System.Windows.Forms.TetBo fuzzy_bd_tetbo; private System.Windows.Forms.Label fuzzy_small_label; private System.Windows.Forms.Label fuzzy_medium_label; private System.Windows.Forms.Label fuzzy_big_label; private System.Windows.Forms.Label fuzzy_speed_label; private System.Windows.Forms.Label fuzzy_distance_label; private System.Windows.Forms.GroupBo fuzzysettings_groupbo; private System.Windows.Forms.Button fuzzysets_fuzzysettings_set_button; private System.Windows.Forms.Button fuzzysets_fuzzysettings_get_button; private System.Windows.Forms.TetBo move_data tetbo; private System.Windows.Forms.TetBo move_data_y_tetbo; private System.Windows.Forms.GroupBo fuzzy_levels_groupbo; private System.Windows.Forms.Button fuzzysets_fuzzylevels_set_button; private System.Windows.Forms.TetBo fuzzy_small_tetbo; private System.Windows.Forms.TetBo fuzzy_medium_tetbo; private System.Windows.Forms.TetBo fuzzy_big_tetbo; private System.Windows.Forms.Button fuzzysets_fuzzylevels_get_button; private System.Windows.Forms.Label VGIP_speed_label; private System.Windows.Forms.Label VGIP_distance_label; private System.Windows.Forms.Label VGIP_X_label; private System.Windows.Forms.Label VGIP_Y_label; private System.Windows.Forms.Label Camera_CGX_label; private System.Windows.Forms.Label Camera_CRX_label; private System.Windows.Forms.Label Camera_CGX_label; private System.Windows.Forms.Label Camera_CRX_label; private System.Windows.Forms.TetBo VGIP_ang_tetBo; private System.Windows.Forms.Label VGIP_angle_label; private System.Windows.Forms.TrackBar VGIP_fuzzy_trackBar; private System.Windows.Forms.Label VGIP_fuzzybar_small_label; private System.Windows.Forms.Label VGIP_fuzzybar_medium_label; private System.Windows.Forms.Label VGIP_fuzzybar_big_label; private System.Windows.Forms.Label VGIP_fuzzybar_zero_label; private System.Windows.Forms.TabPage info_tabpage; private System.Windows.Forms.Button update_button; private System.Windows.Forms.GroupBo VGIP_groupBo; private System.Windows.Forms.GroupBo VGIP_groupBo; private System.Windows.Forms.Button camera_update_button; private System.Windows.Forms.GroupBo groupbo; private System.Windows.Forms.Button disconnect_camera; private System.Windows.Forms.GroupBo camera_communication_groupbo; private System.Windows.Forms.PictureBo picturebo; private System.Windows.Forms.PictureBo picturebo; private System.Windows.Forms.Label fuzzy_lvl_small_label; private System.Windows.Forms.Label fuzzy_lvl_medium_label; private System.Windows.Forms.Label fuzzy_lvl_big_label; private System.Windows.Forms.GroupBo groupboinfo; private System.Windows.Forms.RichTetBo Info_richTetBo; private System.ComponentModel.Container components = null; public VGIP_form() InitializeComponent(); protected override void Dispose( bool disposing ) if( disposing ) if (components!= null)

125 components.dispose(); base.dispose( disposing ); #region Windows Form Designer generated code / <summary> / Required method for Designer support - do not modify / the contents of this method with the code editor. / </summary> private void InitializeComponent() System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(VGIP_form)); this.tab_form = new System.Windows.Forms.TabControl(); this.robot_tab = new System.Windows.Forms.TabPage(); this.robot_picturebo = new System.Windows.Forms.PictureBo(); this.position_groupbo = new System.Windows.Forms.GroupBo(); this.robotgetposition_richtetbo = new System.Windows.Forms.RichTetBo(); this.robotposition_button = new System.Windows.Forms.Button(); this.speed_groupbo = new System.Windows.Forms.GroupBo(); this.robotspeed_tetbo = new System.Windows.Forms.TetBo(); this.speed_button = new System.Windows.Forms.Button(); this.jog_groupbo = new System.Windows.Forms.GroupBo(); this.robotjogz_tetbo = new System.Windows.Forms.TetBo(); this.robotjogy_tetbo = new System.Windows.Forms.TetBo(); this.robotjog_tetbo = new System.Windows.Forms.TetBo(); this.robotstartpos_button = new System.Windows.Forms.Button(); this.robotjog_button = new System.Windows.Forms.Button(); this.communication_groupbo = new System.Windows.Forms.GroupBo(); this.robotdisconnect_button = new System.Windows.Forms.Button(); this.robotconnect_button = new System.Windows.Forms.Button(); this.vgip_tab = new System.Windows.Forms.TabPage(); this.vgip_fuzzybar_zero_label = new System.Windows.Forms.Label(); this.vgip_fuzzybar_big_label = new System.Windows.Forms.Label(); this.vgip_fuzzybar_medium_label = new System.Windows.Forms.Label(); this.vgip_fuzzybar_small_label = new System.Windows.Forms.Label(); this.vgip_fuzzy_trackbar = new System.Windows.Forms.TrackBar(); this.vgip_ang_tetbo = new System.Windows.Forms.TetBo(); this.movedata_distance_tetbo = new System.Windows.Forms.TetBo(); this.startvgip_button = new System.Windows.Forms.Button(); this.vgip_distance_label = new System.Windows.Forms.Label(); this.vgip_angle_label = new System.Windows.Forms.Label(); this.vgip_groupbo = new System.Windows.Forms.GroupBo(); this.movedata_speed_tetbo = new System.Windows.Forms.TetBo(); this.vgip_speed_label = new System.Windows.Forms.Label(); this.move_data_y_tetbo = new System.Windows.Forms.TetBo(); this.move_data tetbo = new System.Windows.Forms.TetBo(); this.vgip_y_label = new System.Windows.Forms.Label(); this.vgip_x_label = new System.Windows.Forms.Label(); this.vgip_groupbo = new System.Windows.Forms.GroupBo(); this.camera_tab = new System.Windows.Forms.TabPage(); this.disconnect_camera = new System.Windows.Forms.Button(); this.camera_update_button = new System.Windows.Forms.Button(); this.cgx = new System.Windows.Forms.TetBo(); this.crx = new System.Windows.Forms.TetBo(); this.cgx = new System.Windows.Forms.TetBo(); this.crx = new System.Windows.Forms.TetBo(); this.connect_camera = new System.Windows.Forms.Button();

126 this.camera_cgx_label = new System.Windows.Forms.Label(); this.camera_crx_label = new System.Windows.Forms.Label(); this.camera_cgx_label = new System.Windows.Forms.Label(); this.camera_crx_label = new System.Windows.Forms.Label(); this.camera_communication_groupbo = new System.Windows.Forms.GroupBo(); this.picturebo = new System.Windows.Forms.PictureBo(); this.picturebo = new System.Windows.Forms.PictureBo(); this.groupbo = new System.Windows.Forms.GroupBo(); this.fuzzysets_tabpage = new System.Windows.Forms.TabPage(); this.fuzzy_levels_groupbo = new System.Windows.Forms.GroupBo(); this.fuzzy_lvl_big_label = new System.Windows.Forms.Label(); this.fuzzy_lvl_small_label = new System.Windows.Forms.Label(); this.fuzzy_big_tetbo = new System.Windows.Forms.TetBo(); this.fuzzy_medium_tetbo = new System.Windows.Forms.TetBo(); this.fuzzy_small_tetbo = new System.Windows.Forms.TetBo(); this.fuzzysets_fuzzylevels_get_button = new System.Windows.Forms.Button(); this.fuzzysets_fuzzylevels_set_button = new System.Windows.Forms.Button(); this.fuzzy_lvl_medium_label = new System.Windows.Forms.Label(); this.fuzzysettings_groupbo = new System.Windows.Forms.GroupBo(); this.fuzzysets_fuzzysettings_get_button = new System.Windows.Forms.Button(); this.fuzzysets_fuzzysettings_set_button = new System.Windows.Forms.Button(); this.fuzzy_big_label = new System.Windows.Forms.Label(); this.fuzzy_bs_tetbo = new System.Windows.Forms.TetBo(); this.fuzzy_bd_tetbo = new System.Windows.Forms.TetBo(); this.fuzzy_small_label = new System.Windows.Forms.Label(); this.fuzzy_sd_tetbo = new System.Windows.Forms.TetBo(); this.fuzzy_ss_tetbo = new System.Windows.Forms.TetBo(); this.fuzzy_speed_label = new System.Windows.Forms.Label(); this.fuzzy_md_tetbo = new System.Windows.Forms.TetBo(); this.fuzzy_medium_label = new System.Windows.Forms.Label(); this.fuzzy_ms_tetbo = new System.Windows.Forms.TetBo(); this.fuzzy_distance_label = new System.Windows.Forms.Label(); this.info_tabpage = new System.Windows.Forms.TabPage(); this.groupboinfo = new System.Windows.Forms.GroupBo(); this.info_richtetbo = new System.Windows.Forms.RichTetBo(); this.update_button = new System.Windows.Forms.Button(); this.statusbar = new System.Windows.Forms.StatusBar(); this.tab_form.suspendlayout(); this.robot_tab.suspendlayout(); this.position_groupbo.suspendlayout(); this.speed_groupbo.suspendlayout(); this.jog_groupbo.suspendlayout(); this.communication_groupbo.suspendlayout(); this.vgip_tab.suspendlayout(); ((System.ComponentModel.ISupportInitialize)(this.VGIP_fuzzy_trackBar)).Be gininit(); this.vgip_groupbo.suspendlayout(); this.camera_tab.suspendlayout(); this.fuzzysets_tabpage.suspendlayout(); this.fuzzy_levels_groupbo.suspendlayout(); this.fuzzysettings_groupbo.suspendlayout(); this.info_tabpage.suspendlayout(); this.groupboinfo.suspendlayout(); this.suspendlayout();

127 tab_form this.tab_form.controls.add(this.robot_tab); this.tab_form.controls.add(this.vgip_tab); this.tab_form.controls.add(this.camera_tab); this.tab_form.controls.add(this.fuzzysets_tabpage); this.tab_form.controls.add(this.info_tabpage); this.tab_form.location = new System.Drawing.Point(, ); this.tab_form.name = "tab_form"; this.tab_form.selectedinde = ; this.tab_form.size = new System.Drawing.Size(44, 46); this.tab_form.tabinde = ; robot_tab this.robot_tab.controls.add(this.robot_picturebo); this.robot_tab.controls.add(this.position_groupbo); this.robot_tab.controls.add(this.speed_groupbo); this.robot_tab.controls.add(this.jog_groupbo); this.robot_tab.controls.add(this.communication_groupbo); this.robot_tab.location = new System.Drawing.Point(4, ); this.robot_tab.name = "robot_tab"; this.robot_tab.size = new System.Drawing.Size(46, 39); this.robot_tab.tabinde = ; this.robot_tab.tet = "Robot"; robot_picturebo this.robot_picturebo.borderstyle = System.Windows.Forms.BorderStyle.Fied3D; this.robot_picturebo.image = ((System.Drawing.Image)(resources.GetObject("robot_pictureBo.Image"))); this.robot_picturebo.location = new System.Drawing.Point(, 8); this.robot_picturebo.name = "robot_picturebo"; this.robot_picturebo.size = new System.Drawing.Size(8, 56); this.robot_picturebo.tabinde = 4; this.robot_picturebo.tabstop = false; position_groupbo this.position_groupbo.controls.add(this.robotgetposition_richtetbo); this.position_groupbo.controls.add(this.robotposition_button); this.position_groupbo.location = new System.Drawing.Point(8, 8); this.position_groupbo.name = "position_groupbo"; this.position_groupbo.size = new System.Drawing.Size(84, 76); this.position_groupbo.tabinde = 3; this.position_groupbo.tabstop = false; this.position_groupbo.tet = "Position"; robotgetposition_richtetbo this.robotgetposition_richtetbo.location = new System.Drawing.Point(6, 64); this.robotgetposition_richtetbo.name = "robotgetposition_richtetbo"; this.robotgetposition_richtetbo.size = new System.Drawing.Size(5, 96); this.robotgetposition_richtetbo.tabinde = ; this.robotgetposition_richtetbo.tet = "";

128 robotposition_button this.robotposition_button.location = new System.Drawing.Point(6, 4); this.robotposition_button.name = "robotposition_button"; this.robotposition_button.size = new System.Drawing.Size(88, 3); this.robotposition_button.tabinde = ; this.robotposition_button.tet = "Get position"; this.robotposition_button.click += new System.EventHandler(this.robotposition_button_Click); speed_groupbo this.speed_groupbo.controls.add(this.robotspeed_tetbo); this.speed_groupbo.controls.add(this.speed_button); this.speed_groupbo.location = new System.Drawing.Point(8, 8); this.speed_groupbo.name = "speed_groupbo"; this.speed_groupbo.size = new System.Drawing.Size(84, 7); this.speed_groupbo.tabinde = ; this.speed_groupbo.tabstop = false; this.speed_groupbo.tet = "Speed"; robotspeed_tetbo this.robotspeed_tetbo.location = new System.Drawing.Point(, 3); this.robotspeed_tetbo.name = "robotspeed_tetbo"; this.robotspeed_tetbo.size = new System.Drawing.Size(56, ); this.robotspeed_tetbo.tabinde = ; this.robotspeed_tetbo.tet = ""; speed_button this.speed_button.location = new System.Drawing.Point(6, 4); this.speed_button.name = "speed_button"; this.speed_button.size = new System.Drawing.Size(8, 3); this.speed_button.tabinde = ; this.speed_button.tet = "Speed"; this.speed_button.click += new System.EventHandler(this.speed_button_Click); jog_groupbo this.jog_groupbo.controls.add(this.robotjogz_tetbo); this.jog_groupbo.controls.add(this.robotjogy_tetbo); this.jog_groupbo.controls.add(this.robotjog_tetbo); this.jog_groupbo.controls.add(this.robotstartpos_button); this.jog_groupbo.controls.add(this.robotjog_button); this.jog_groupbo.location = new System.Drawing.Point(68, 8); this.jog_groupbo.name = "jog_groupbo"; this.jog_groupbo.size = new System.Drawing.Size(4, ); this.jog_groupbo.tabinde = ; this.jog_groupbo.tabstop = false; this.jog_groupbo.tet = "Jog"; robotjogz_tetbo this.robotjogz_tetbo.location = new System.Drawing.Point(68, 4); this.robotjogz_tetbo.name = "robotjogz_tetbo"; this.robotjogz_tetbo.size = new System.Drawing.Size(48, ); this.robotjogz_tetbo.tabinde = 4; this.robotjogz_tetbo.tet = "";

129 robotjogy_tetbo this.robotjogy_tetbo.location = new System.Drawing.Point(96, 4); this.robotjogy_tetbo.name = "robotjogy_tetbo"; this.robotjogy_tetbo.size = new System.Drawing.Size(48, ); this.robotjogy_tetbo.tabinde = 3; this.robotjogy_tetbo.tet = ""; robotjog_tetbo this.robotjog_tetbo.location = new System.Drawing.Point(4, 4); this.robotjog_tetbo.name = "robotjog_tetbo"; this.robotjog_tetbo.size = new System.Drawing.Size(48, ); this.robotjog_tetbo.tabinde = ; this.robotjog_tetbo.tet = ""; robotstartpos_button this.robotstartpos_button.location = new System.Drawing.Point(8, 64); this.robotstartpos_button.name = "robotstartpos_button"; this.robotstartpos_button.size = new System.Drawing.Size(96, 3); this.robotstartpos_button.tabinde = ; this.robotstartpos_button.tet = "Startposition"; this.robotstartpos_button.click += new System.EventHandler(this.robotstartpos_button_Click); robotjog_button this.robotjog_button.location = new System.Drawing.Point(6, 64); this.robotjog_button.name = "robotjog_button"; this.robotjog_button.size = new System.Drawing.Size(96, 3); this.robotjog_button.tabinde = ; this.robotjog_button.tet = "Jog"; this.robotjog_button.click += new System.EventHandler(this.robotjog_button_Click); Communication_groupBo this.communication_groupbo.controls.add(this.robotdisconnect_button); this.communication_groupbo.controls.add(this.robotconnect_button); this.communication_groupbo.location = new System.Drawing.Point(8, 8); this.communication_groupbo.name = "Communication_groupBo"; this.communication_groupbo.size = new System.Drawing.Size(5, ); this.communication_groupbo.tabinde = ; this.communication_groupbo.tabstop = false; this.communication_groupbo.tet = "Robot Communication"; robotdisconnect_button this.robotdisconnect_button.location = new System.Drawing.Point(6, 64); this.robotdisconnect_button.name = "robotdisconnect_button"; this.robotdisconnect_button.size = new System.Drawing.Size(, 3); this.robotdisconnect_button.tabinde = ; this.robotdisconnect_button.tet = "Disconnect"; this.robotdisconnect_button.click += new System.EventHandler(this.robotdisconnect_button_Click);

130 robotconnect_button this.robotconnect_button.location = new System.Drawing.Point(6, 4); this.robotconnect_button.name = "robotconnect_button"; this.robotconnect_button.size = new System.Drawing.Size(, 3); this.robotconnect_button.tabinde = ; this.robotconnect_button.tet = "Connect"; this.robotconnect_button.click += new System.EventHandler(this.robotconnect_button_Click); VGIP_tab this.vgip_tab.controls.add(this.vgip_fuzzybar_zero_label); this.vgip_tab.controls.add(this.vgip_fuzzybar_big_label); this.vgip_tab.controls.add(this.vgip_fuzzybar_medium_label); this.vgip_tab.controls.add(this.vgip_fuzzybar_small_label); this.vgip_tab.controls.add(this.vgip_fuzzy_trackbar); this.vgip_tab.controls.add(this.vgip_ang_tetbo); this.vgip_tab.controls.add(this.movedata_distance_tetbo); this.vgip_tab.controls.add(this.startvgip_button); this.vgip_tab.controls.add(this.vgip_distance_label); this.vgip_tab.controls.add(this.vgip_angle_label); this.vgip_tab.controls.add(this.vgip_groupbo); this.vgip_tab.controls.add(this.vgip_groupbo); this.vgip_tab.location = new System.Drawing.Point(4, ); this.vgip_tab.name = "VGIP_tab"; this.vgip_tab.size = new System.Drawing.Size(46, 39); this.vgip_tab.tabinde = ; this.vgip_tab.tet = "VGIP"; VGIP_fuzzybar_zero_label this.vgip_fuzzybar_zero_label.location = new System.Drawing.Point(6, 34); this.vgip_fuzzybar_zero_label.name = "VGIP_fuzzybar_zero_label"; this.vgip_fuzzybar_zero_label.size = new System.Drawing.Size(3, 3); this.vgip_fuzzybar_zero_label.tabinde = 7; this.vgip_fuzzybar_zero_label.tet = "Zero"; VGIP_fuzzybar_big_label this.vgip_fuzzybar_big_label.location = new System.Drawing.Point(384, 34); this.vgip_fuzzybar_big_label.name = "VGIP_fuzzybar_big_label"; this.vgip_fuzzybar_big_label.size = new System.Drawing.Size(4, 3); this.vgip_fuzzybar_big_label.tabinde = 6; this.vgip_fuzzybar_big_label.tet = "Big"; VGIP_fuzzybar_medium_label this.vgip_fuzzybar_medium_label.location = new System.Drawing.Point(, 34); this.vgip_fuzzybar_medium_label.name = "VGIP_fuzzybar_medium_label"; this.vgip_fuzzybar_medium_label.size = new System.Drawing.Size(48, 3); this.vgip_fuzzybar_medium_label.tabinde = 5; this.vgip_fuzzybar_medium_label.tet = "Medium"; VGIP_fuzzybar_small_label

131 this.vgip_fuzzybar_small_label.location = new System.Drawing.Point(7, 34); this.vgip_fuzzybar_small_label.name = "VGIP_fuzzybar_small_label"; this.vgip_fuzzybar_small_label.size = new System.Drawing.Size(48, 3); this.vgip_fuzzybar_small_label.tabinde = 4; this.vgip_fuzzybar_small_label.tet = "Small"; VGIP_fuzzy_trackBar this.vgip_fuzzy_trackbar.enabled = false; this.vgip_fuzzy_trackbar.location = new System.Drawing.Point(6, 38); this.vgip_fuzzy_trackbar.maimum = 3; this.vgip_fuzzy_trackbar.name = "VGIP_fuzzy_trackBar"; this.vgip_fuzzy_trackbar.size = new System.Drawing.Size(39, 4); this.vgip_fuzzy_trackbar.tabinde = 3; this.vgip_fuzzy_trackbar.tickfrequency = ; VGIP_ang_tetBo this.vgip_ang_tetbo.location = new System.Drawing.Point(76, 6); this.vgip_ang_tetbo.name = "VGIP_ang_tetBo"; this.vgip_ang_tetbo.tabinde = 6; this.vgip_ang_tetbo.tet = ""; movedata_distance_tetbo this.movedata_distance_tetbo.location = new System.Drawing.Point(76, 76); this.movedata_distance_tetbo.name = "movedata_distance_tetbo"; this.movedata_distance_tetbo.tabinde = 5; this.movedata_distance_tetbo.tet = ""; startvgip_button this.startvgip_button.location = new System.Drawing.Point(6, 4); this.startvgip_button.name = "startvgip_button"; this.startvgip_button.size = new System.Drawing.Size(, 3); this.startvgip_button.tabinde = ; this.startvgip_button.tet = "Start"; this.startvgip_button.click += new System.EventHandler(this.startVGIP_button_Click); VGIP_distance_label this.vgip_distance_label.location = new System.Drawing.Point(76, 6); this.vgip_distance_label.name = "VGIP_distance_label"; this.vgip_distance_label.tabinde = 6; this.vgip_distance_label.tet = "Distance"; VGIP_angle_label this.vgip_angle_label.location = new System.Drawing.Point(76, ); this.vgip_angle_label.name = "VGIP_angle_label"; this.vgip_angle_label.tabinde = ; this.vgip_angle_label.tet = "Angle"; VGIP_groupBo

132 this.vgip_groupbo.controls.add(this.movedata_speed_tetbo); this.vgip_groupbo.controls.add(this.vgip_speed_label); this.vgip_groupbo.controls.add(this.move_data_y_tetbo); this.vgip_groupbo.controls.add(this.move_data tetbo); this.vgip_groupbo.controls.add(this.vgip_y_label); this.vgip_groupbo.controls.add(this.vgip_x_label); this.vgip_groupbo.location = new System.Drawing.Point(6, 36); this.vgip_groupbo.name = "VGIP_groupBo"; this.vgip_groupbo.size = new System.Drawing.Size(36, 6); this.vgip_groupbo.tabinde = 9; this.vgip_groupbo.tabstop = false; this.vgip_groupbo.tet = "Robot action"; movedata_speed_tetbo this.movedata_speed_tetbo.location = new System.Drawing.Point(6, 4); this.movedata_speed_tetbo.name = "movedata_speed_tetbo"; this.movedata_speed_tetbo.tabinde = ; this.movedata_speed_tetbo.tet = ""; VGIP_speed_label this.vgip_speed_label.location = new System.Drawing.Point(6, 4); this.vgip_speed_label.name = "VGIP_speed_label"; this.vgip_speed_label.tabinde = 5; this.vgip_speed_label.tet = "Speed"; move_data_y_tetbo this.move_data_y_tetbo.location = new System.Drawing.Point(6, ); this.move_data_y_tetbo.name = "move_data_y_tetbo"; this.move_data_y_tetbo.tabinde = 4; this.move_data_y_tetbo.tet = ""; move_data tetbo this.move_data tetbo.location = new System.Drawing.Point(6, 8); this.move_data tetbo.name = "move_data tetbo"; this.move_data tetbo.tabinde = 3; this.move_data tetbo.tet = ""; VGIP_Y_label this.vgip_y_label.location = new System.Drawing.Point(6, 4); this.vgip_y_label.name = "VGIP_Y_label"; this.vgip_y_label.tabinde = 8; this.vgip_y_label.tet = "Y"; VGIP_X_label this.vgip_x_label.location = new System.Drawing.Point(6, 64); this.vgip_x_label.name = "VGIP_X_label"; this.vgip_x_label.size = new System.Drawing.Size(, 4); this.vgip_x_label.tabinde = 7; this.vgip_x_label.tet = "X"; VGIP_groupBo this.vgip_groupbo.location = new System.Drawing.Point(6, 36);

133 this.vgip_groupbo.name = "VGIP_groupBo"; this.vgip_groupbo.size = new System.Drawing.Size(36, 6); this.vgip_groupbo.tabinde = 8; this.vgip_groupbo.tabstop = false; this.vgip_groupbo.tet = "Pole"; Camera_tab this.camera_tab.controls.add(this.disconnect_camera); this.camera_tab.controls.add(this.camera_update_button); this.camera_tab.controls.add(this.cgx); this.camera_tab.controls.add(this.crx); this.camera_tab.controls.add(this.cgx); this.camera_tab.controls.add(this.crx); this.camera_tab.controls.add(this.connect_camera); this.camera_tab.controls.add(this.camera_cgx_label); this.camera_tab.controls.add(this.camera_crx_label); this.camera_tab.controls.add(this.camera_cgx_label); this.camera_tab.controls.add(this.camera_crx_label); this.camera_tab.controls.add(this.camera_communication_groupbo); this.camera_tab.controls.add(this.picturebo); this.camera_tab.controls.add(this.picturebo); this.camera_tab.controls.add(this.groupbo); this.camera_tab.location = new System.Drawing.Point(4, ); this.camera_tab.name = "Camera_tab"; this.camera_tab.size = new System.Drawing.Size(46, 39); this.camera_tab.tabinde = ; this.camera_tab.tet = "Camera"; disconnect_camera this.disconnect_camera.location = new System.Drawing.Point(4, 7); this.disconnect_camera.name = "disconnect_camera"; this.disconnect_camera.size = new System.Drawing.Size(, 3); this.disconnect_camera.tabinde = ; this.disconnect_camera.tet = "Disconnect"; this.disconnect_camera.click += new System.EventHandler(this.disconnect_camera_Click); camera_update_button this.camera_update_button.location = new System.Drawing.Point(4, 44); this.camera_update_button.name = "camera_update_button"; this.camera_update_button.size = new System.Drawing.Size(, 3); this.camera_update_button.tabinde = 3; this.camera_update_button.tet = "Update"; this.camera_update_button.click += new System.EventHandler(this.camera_update_button_Click); CGX this.cgx.location = new System.Drawing.Point(4, 4); this.cgx.name = "CGX"; this.cgx.tabinde = 6; this.cgx.tet = ""; CRX this.crx.location = new System.Drawing.Point(6, 4); this.crx.name = "CRX";

134 this.crx.tabinde = 7; this.crx.tet = ""; CGX this.cgx.location = new System.Drawing.Point(4, ); this.cgx.name = "CGX"; this.cgx.tabinde = 4; this.cgx.tet = ""; CRX this.crx.location = new System.Drawing.Point(6, ); this.crx.name = "CRX"; this.crx.tabinde = 5; this.crx.tet = ""; connect_camera this.connect_camera.location = new System.Drawing.Point(4, 3); this.connect_camera.name = "connect_camera"; this.connect_camera.size = new System.Drawing.Size(, 3); this.connect_camera.tabinde = ; this.connect_camera.tet = "Connect"; this.connect_camera.click += new System.EventHandler(this.connect_camera_Click); Camera_CGX_label this.camera_cgx_label.location = new System.Drawing.Point(4, 84); this.camera_cgx_label.name = "Camera_CGX_label"; this.camera_cgx_label.tabinde = 7; this.camera_cgx_label.tet = "Cam Green"; Camera_CRX_label this.camera_crx_label.location = new System.Drawing.Point(6, 84); this.camera_crx_label.name = "Camera_CRX_label"; this.camera_crx_label.tabinde = 8; this.camera_crx_label.tet = "Cam Red"; Camera_CGX_label this.camera_cgx_label.location = new System.Drawing.Point(4, 4); this.camera_cgx_label.name = "Camera_CGX_label"; this.camera_cgx_label.tabinde = 9; this.camera_cgx_label.tet = "Cam Green"; Camera_CRX_label this.camera_crx_label.location = new System.Drawing.Point(6, 4); this.camera_crx_label.name = "Camera_CRX_label"; this.camera_crx_label.tabinde = ; this.camera_crx_label.tet = "Cam Red"; camera_communication_groupbo this.camera_communication_groupbo.location = new System.Drawing.Point(8, 8); this.camera_communication_groupbo.name = "camera_communication_groupbo";

135 this.camera_communication_groupbo.size = new System.Drawing.Size(5, ); this.camera_communication_groupbo.tabinde = 4; this.camera_communication_groupbo.tabstop = false; this.camera_communication_groupbo.tet = "Camera Communication"; picturebo this.picturebo.image = ((System.Drawing.Image)(resources.GetObject("pictureBo.Image"))); this.picturebo.location = new System.Drawing.Point(6, 8); this.picturebo.name = "picturebo"; this.picturebo.size = new System.Drawing.Size(9, 9); this.picturebo.tabinde = 5; this.picturebo.tabstop = false; picturebo this.picturebo.image = ((System.Drawing.Image)(resources.GetObject("pictureBo.Image"))); this.picturebo.location = new System.Drawing.Point(8, 8); this.picturebo.name = "picturebo"; this.picturebo.size = new System.Drawing.Size(9, 9); this.picturebo.tabinde = 6; this.picturebo.tabstop = false; groupbo this.groupbo.location = new System.Drawing.Point(8, ); this.groupbo.name = "groupbo"; this.groupbo.size = new System.Drawing.Size(7, 6); this.groupbo.tabinde = ; this.groupbo.tabstop = false; this.groupbo.tet = "Pendulum position"; fuzzysets_tabpage this.fuzzysets_tabpage.controls.add(this.fuzzy_levels_groupbo); this.fuzzysets_tabpage.controls.add(this.fuzzysettings_groupbo); this.fuzzysets_tabpage.location = new System.Drawing.Point(4, ); this.fuzzysets_tabpage.name = "fuzzysets_tabpage"; this.fuzzysets_tabpage.size = new System.Drawing.Size(46, 39); this.fuzzysets_tabpage.tabinde = 3; this.fuzzysets_tabpage.tet = "Fuzzysets"; fuzzy_levels_groupbo this.fuzzy_levels_groupbo.controls.add(this.fuzzy_lvl_big_label); this.fuzzy_levels_groupbo.controls.add(this.fuzzy_lvl_small_label); this.fuzzy_levels_groupbo.controls.add(this.fuzzy_big_tetbo); this.fuzzy_levels_groupbo.controls.add(this.fuzzy_medium_tetbo); this.fuzzy_levels_groupbo.controls.add(this.fuzzy_small_tetbo); this.fuzzy_levels_groupbo.controls.add(this.fuzzysets_fuzzylevels_get_bu tton); this.fuzzy_levels_groupbo.controls.add(this.fuzzysets_fuzzylevels_set_bu tton); this.fuzzy_levels_groupbo.controls.add(this.fuzzy_lvl_medium_label); this.fuzzy_levels_groupbo.location = new System.Drawing.Point(8, );

136 8); 6); 48); this.fuzzy_levels_groupbo.name = "fuzzy_levels_groupbo"; this.fuzzy_levels_groupbo.size = new System.Drawing.Size(4, ); this.fuzzy_levels_groupbo.tabinde = ; this.fuzzy_levels_groupbo.tabstop = false; this.fuzzy_levels_groupbo.tet = "Fuzzy levels"; fuzzy_lvl_big_label this.fuzzy_lvl_big_label.location = new System.Drawing.Point(4, this.fuzzy_lvl_big_label.name = "fuzzy_lvl_big_label"; this.fuzzy_lvl_big_label.size = new System.Drawing.Size(4, 3); this.fuzzy_lvl_big_label.tabinde = 7; this.fuzzy_lvl_big_label.tet = "Big"; fuzzy_lvl_small_label this.fuzzy_lvl_small_label.location = new System.Drawing.Point(4, this.fuzzy_lvl_small_label.name = "fuzzy_lvl_small_label"; this.fuzzy_lvl_small_label.size = new System.Drawing.Size(4, 3); this.fuzzy_lvl_small_label.tabinde = 5; this.fuzzy_lvl_small_label.tet = "Small"; fuzzy_big_tetbo this.fuzzy_big_tetbo.location = new System.Drawing.Point(88, 8); this.fuzzy_big_tetbo.name = "fuzzy_big_tetbo"; this.fuzzy_big_tetbo.tabinde = 3; this.fuzzy_big_tetbo.tet = ""; fuzzy_medium_tetbo this.fuzzy_medium_tetbo.location = new System.Drawing.Point(88, this.fuzzy_medium_tetbo.name = "fuzzy_medium_tetbo"; this.fuzzy_medium_tetbo.tabinde = ; this.fuzzy_medium_tetbo.tet = ""; fuzzy_small_tetbo this.fuzzy_small_tetbo.location = new System.Drawing.Point(88, 6); this.fuzzy_small_tetbo.name = "fuzzy_small_tetbo"; this.fuzzy_small_tetbo.tabinde = ; this.fuzzy_small_tetbo.tet = ""; fuzzysets_fuzzylevels_get_button this.fuzzysets_fuzzylevels_get_button.location = new System.Drawing.Point(6, 64); this.fuzzysets_fuzzylevels_get_button.name = "fuzzysets_fuzzylevels_get_button"; this.fuzzysets_fuzzylevels_get_button.size = new System.Drawing.Size(, 3); this.fuzzysets_fuzzylevels_get_button.tabinde = ; this.fuzzysets_fuzzylevels_get_button.tet = "Get"; this.fuzzysets_fuzzylevels_get_button.click += new System.EventHandler(this.fuzzysets_fuzzylevels_button_Click); fuzzysets_fuzzylevels_set_button

137 this.fuzzysets_fuzzylevels_set_button.location = new System.Drawing.Point(6, 4); this.fuzzysets_fuzzylevels_set_button.name = "fuzzysets_fuzzylevels_set_button"; this.fuzzysets_fuzzylevels_set_button.size = new System.Drawing.Size(, 3); this.fuzzysets_fuzzylevels_set_button.tabinde = 9; this.fuzzysets_fuzzylevels_set_button.tet = "Set"; this.fuzzysets_fuzzylevels_set_button.click += new System.EventHandler(this.fuzzysets_fuzzylevels_set_button_Click); fuzzy_lvl_medium_label this.fuzzy_lvl_medium_label.location = new System.Drawing.Point(4, 48); this.fuzzy_lvl_medium_label.name = "fuzzy_lvl_medium_label"; this.fuzzy_lvl_medium_label.size = new System.Drawing.Size(48, 3); this.fuzzy_lvl_medium_label.tabinde = 6; this.fuzzy_lvl_medium_label.tet = "Medium"; fuzzysettings_groupbo this.fuzzysettings_groupbo.controls.add(this.fuzzysets_fuzzysettings_get _button); this.fuzzysettings_groupbo.controls.add(this.fuzzysets_fuzzysettings_set _button); this.fuzzysettings_groupbo.controls.add(this.fuzzy_big_label); this.fuzzysettings_groupbo.controls.add(this.fuzzy_bs_tetbo); this.fuzzysettings_groupbo.controls.add(this.fuzzy_bd_tetbo); this.fuzzysettings_groupbo.controls.add(this.fuzzy_small_label); this.fuzzysettings_groupbo.controls.add(this.fuzzy_sd_tetbo); this.fuzzysettings_groupbo.controls.add(this.fuzzy_ss_tetbo); this.fuzzysettings_groupbo.controls.add(this.fuzzy_speed_label); this.fuzzysettings_groupbo.controls.add(this.fuzzy_md_tetbo); this.fuzzysettings_groupbo.controls.add(this.fuzzy_medium_label); this.fuzzysettings_groupbo.controls.add(this.fuzzy_ms_tetbo); this.fuzzysettings_groupbo.controls.add(this.fuzzy_distance_label); this.fuzzysettings_groupbo.location = new System.Drawing.Point(8, 8); this.fuzzysettings_groupbo.name = "fuzzysettings_groupbo"; this.fuzzysettings_groupbo.size = new System.Drawing.Size(4, ); this.fuzzysettings_groupbo.tabinde = ; this.fuzzysettings_groupbo.tabstop = false; this.fuzzysettings_groupbo.tet = "Fuzzy settings"; fuzzysets_fuzzysettings_get_button this.fuzzysets_fuzzysettings_get_button.location = new System.Drawing.Point(6, 64); this.fuzzysets_fuzzysettings_get_button.name = "fuzzysets_fuzzysettings_get_button"; this.fuzzysets_fuzzysettings_get_button.size = new System.Drawing.Size(, 3); this.fuzzysets_fuzzysettings_get_button.tabinde = ; this.fuzzysets_fuzzysettings_get_button.tet = "Get"; this.fuzzysets_fuzzysettings_get_button.click += new System.EventHandler(this.fuzzysets_fuzzysettings_get_button_Click);

138 fuzzysets_fuzzysettings_set_button this.fuzzysets_fuzzysettings_set_button.location = new System.Drawing.Point(6, 4); this.fuzzysets_fuzzysettings_set_button.name = "fuzzysets_fuzzysettings_set_button"; this.fuzzysets_fuzzysettings_set_button.size = new System.Drawing.Size(, 3); this.fuzzysets_fuzzysettings_set_button.tabinde = ; this.fuzzysets_fuzzysettings_set_button.tet = "Set"; this.fuzzysets_fuzzysettings_set_button.click += new System.EventHandler(this.fuzzysets_fuzzysettings_set_button_Click); fuzzy_big_label this.fuzzy_big_label.location = new System.Drawing.Point(344, 6); this.fuzzy_big_label.name = "fuzzy_big_label"; this.fuzzy_big_label.size = new System.Drawing.Size(4, 3); this.fuzzy_big_label.tabinde = 8; this.fuzzy_big_label.tet = "Big"; fuzzy_bs_tetbo this.fuzzy_bs_tetbo.location = new System.Drawing.Point(38, 4); this.fuzzy_bs_tetbo.name = "fuzzy_bs_tetbo"; this.fuzzy_bs_tetbo.size = new System.Drawing.Size(56, ); this.fuzzy_bs_tetbo.tabinde = 5; this.fuzzy_bs_tetbo.tet = ""; fuzzy_bd_tetbo this.fuzzy_bd_tetbo.location = new System.Drawing.Point(38, 7); this.fuzzy_bd_tetbo.name = "fuzzy_bd_tetbo"; this.fuzzy_bd_tetbo.size = new System.Drawing.Size(56, ); this.fuzzy_bd_tetbo.tabinde = 8; this.fuzzy_bd_tetbo.tet = ""; fuzzy_small_label this.fuzzy_small_label.location = new System.Drawing.Point(8, 6); this.fuzzy_small_label.name = "fuzzy_small_label"; this.fuzzy_small_label.size = new System.Drawing.Size(4, 3); this.fuzzy_small_label.tabinde = 6; this.fuzzy_small_label.tet = "Small"; fuzzy_sd_tetbo this.fuzzy_sd_tetbo.location = new System.Drawing.Point(, 7); this.fuzzy_sd_tetbo.name = "fuzzy_sd_tetbo"; this.fuzzy_sd_tetbo.size = new System.Drawing.Size(56, ); this.fuzzy_sd_tetbo.tabinde = 6; this.fuzzy_sd_tetbo.tet = ""; fuzzy_ss_tetbo this.fuzzy_ss_tetbo.location = new System.Drawing.Point(, 4); this.fuzzy_ss_tetbo.name = "fuzzy_ss_tetbo"; this.fuzzy_ss_tetbo.size = new System.Drawing.Size(56, ); this.fuzzy_ss_tetbo.tabinde = 3; this.fuzzy_ss_tetbo.tet = "";

139 7); fuzzy_speed_label this.fuzzy_speed_label.location = new System.Drawing.Point(5, 4); this.fuzzy_speed_label.name = "fuzzy_speed_label"; this.fuzzy_speed_label.size = new System.Drawing.Size(4, 3); this.fuzzy_speed_label.tabinde = 9; this.fuzzy_speed_label.tet = "Speed"; fuzzy_md_tetbo this.fuzzy_md_tetbo.location = new System.Drawing.Point(64, 7); this.fuzzy_md_tetbo.name = "fuzzy_md_tetbo"; this.fuzzy_md_tetbo.size = new System.Drawing.Size(56, ); this.fuzzy_md_tetbo.tabinde = 7; this.fuzzy_md_tetbo.tet = ""; fuzzy_medium_label this.fuzzy_medium_label.location = new System.Drawing.Point(7, 6); this.fuzzy_medium_label.name = "fuzzy_medium_label"; this.fuzzy_medium_label.size = new System.Drawing.Size(64, 3); this.fuzzy_medium_label.tabinde = 7; this.fuzzy_medium_label.tet = "Medium"; fuzzy_ms_tetbo this.fuzzy_ms_tetbo.location = new System.Drawing.Point(64, 4); this.fuzzy_ms_tetbo.name = "fuzzy_ms_tetbo"; this.fuzzy_ms_tetbo.size = new System.Drawing.Size(56, ); this.fuzzy_ms_tetbo.tabinde = 4; this.fuzzy_ms_tetbo.tet = ""; fuzzy_distance_label this.fuzzy_distance_label.location = new System.Drawing.Point(5, this.fuzzy_distance_label.name = "fuzzy_distance_label"; this.fuzzy_distance_label.size = new System.Drawing.Size(48, 3); this.fuzzy_distance_label.tabinde = ; this.fuzzy_distance_label.tet = "Distance"; info_tabpage this.info_tabpage.controls.add(this.groupboinfo); this.info_tabpage.controls.add(this.update_button); this.info_tabpage.location = new System.Drawing.Point(4, ); this.info_tabpage.name = "info_tabpage"; this.info_tabpage.size = new System.Drawing.Size(46, 39); this.info_tabpage.tabinde = 4; this.info_tabpage.tet = "Info"; groupboinfo this.groupboinfo.controls.add(this.info_richtetbo); this.groupboinfo.location = new System.Drawing.Point(3, 96); this.groupboinfo.name = "groupboinfo"; this.groupboinfo.size = new System.Drawing.Size(35, 56); this.groupboinfo.tabinde = ; this.groupboinfo.tabstop = false; this.groupboinfo.tet = "Info";

140 Info_richTetBo this.info_richtetbo.backcolor = System.Drawing.SystemColors.Control; this.info_richtetbo.borderstyle = System.Windows.Forms.BorderStyle.None; this.info_richtetbo.cursor = System.Windows.Forms.Cursors.Default; this.info_richtetbo.location = new System.Drawing.Point(8, 6); this.info_richtetbo.name = "Info_richTetBo"; this.info_richtetbo.size = new System.Drawing.Size(336, 3); this.info_richtetbo.tabinde = ; this.info_richtetbo.tet = "VGIP V. \n\nauthor: Peter Knutsson, Ted Persson, Tobias Strömberg.\n\nFinal Projec" + "t for TekMag at AASS Orebro University spring -5"; update_button this.update_button.location = new System.Drawing.Point(4, 4); this.update_button.name = "update_button"; this.update_button.size = new System.Drawing.Size(, 3); this.update_button.tabinde = ; this.update_button.tet = "Update"; statusbar this.statusbar.location = new System.Drawing.Point(, 45); this.statusbar.name = "statusbar"; this.statusbar.size = new System.Drawing.Size(46, ); this.statusbar.tabinde = ; VGIP_form this.autoscalebasesize = new System.Drawing.Size(5, 3); this.clientsize = new System.Drawing.Size(46, 437); this.controls.add(this.statusbar); this.controls.add(this.tab_form); this.formborderstyle = System.Windows.Forms.FormBorderStyle.Fied3D; this.icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.name = "VGIP_form"; this.tet = "VGIP"; this.tab_form.resumelayout(false); this.robot_tab.resumelayout(false); this.position_groupbo.resumelayout(false); this.speed_groupbo.resumelayout(false); this.jog_groupbo.resumelayout(false); this.communication_groupbo.resumelayout(false); this.vgip_tab.resumelayout(false); ((System.ComponentModel.ISupportInitialize)(this.VGIP_fuzzy_trackBar)).En dinit(); this.vgip_groupbo.resumelayout(false); this.camera_tab.resumelayout(false); this.fuzzysets_tabpage.resumelayout(false); this.fuzzy_levels_groupbo.resumelayout(false); this.fuzzysettings_groupbo.resumelayout(false); this.info_tabpage.resumelayout(false); this.groupboinfo.resumelayout(false); this.resumelayout(false);

141 #endregion [STAThread] static void Main() Application.Run(new VGIP_form()); #region Main private void startvgip_button_click(object sender, System.EventArgs e) float temp = new float(); Rapper.Structs.pose robpos = new Rapper.Structs.pose(); Structs.Move_data Move_data = new VGIP.Structs.Move_data(); Connect cameras if (globala.camcon == ) Connect_cam(); this.statusbar.tet="camera connecting..."; while (!m_clientsocket.connected) this.statusbar.tet="camera connected"; Connect robot if (globala.connect!= ) Connect_rob(); this.statusbar.tet="robot connected"; while(true) robpos = Get_pose(); this.statusbar.tet="running..."; Move_data = Calc_move(); if (globala.tal == globala.tal3 == ) temp+=; if (Move_data.pose.trans.!= temp) robpos.trans. += Move_data.pose.trans.; robpos.trans.y += Move_data.pose.trans.y; robpos.trans.z = Move_data.pose.trans.z; temp = Move_data.pose.trans.; Set_speed(Move_data.Speed); set_pose(robpos); Jog(); #endregion #region Client code public void OnDataReceived(IAsyncResult asyn) if (globala.found ==true) if (globala.count>35) globala.found = false; globala.cgx=globala.tal; globala.crx=globala.tal; globala.cgx=globala.tal3; globala.crx=globala.tal4; globala.tal=;

142 globala.tal=; globala.tal3=; globala.tal4=; globala.count = ; globala.count = ; globala.div = false; globala.div = false; globala.div3 = false; globala.div4 = false; globala.division = ; globala.division = ; globala.division3 = ; globala.division4 = ; else if (globala.szdata == ">\") globala.count++; else if (globala.szdata == "<\") globala.count++; else if ((globala.count==) && (globala.count==)) if (globala.szdata == ",\") globala.div = true; else if (globala.div == true) globala.tal = globala.tal + (Convert.ToSingle(globala.szData)/globala.division); globala.division = globala.division*; else globala.tal=globala.tal*; globala.tal = globala.tal+convert.tosingle(globala.szdata); else if ((globala.count==5) && (globala.count==4)) if (globala.szdata == ",\") globala.div = true; else if (globala.div == true) globala.tal = globala.tal + (Convert.ToSingle(globala.szData)/globala.division); globala.division = globala.division*; else globala.tal=globala.tal*; globala.tal = globala.tal+convert.tosingle(globala.szdata); else if ((globala.count==) && (globala.count==)) if (globala.szdata == ",\")

143 globala.div3 = true; else if (globala.div3 == true) globala.tal3 = globala.tal3 + (Convert.ToSingle(globala.szData)/globala.division3); globala.division3 = globala.division3*; else globala.tal3=globala.tal3*; globala.tal3 = globala.tal3+convert.tosingle(globala.szdata); else if ((globala.count==5) && (globala.count==4)) if (globala.szdata == ",\") globala.div4 = true; else if (globala.div4 == true) globala.tal4 = globala.tal4 + (Convert.ToSingle(globala.szData)/globala.division4); globala.division4 = globala.division4*; else globala.tal4=globala.tal4*; globala.tal4 = globala.tal4+convert.tosingle(globala.szdata); if (globala.szdata == "U\") globala.found = true; Response_camera.Tet = Response_camera.Tet + globala.szdata; try SocketPacket thesockid = (SocketPacket)asyn.AsyncState ; int ir = thesockid.thissocket.endreceive (asyn); char[] chars = new char[ir + ]; System.Tet.Decoder d = System.Tet.Encoding.UTF8.GetDecoder(); int charlen = d.getchars(thesockid.databuffer,, ir, chars, ); globala.szdata = new System.String(chars); WaitForData(); catch (ObjectDisposedEception ) System.Diagnostics.Debugger.Log(,"","\nOnDataReceived: Socket has been closed\n"); catch(socketeception se) MessageBo.Show (se.message ); public void WaitForData()

144 try if ( m_pfncallback == null ) m_pfncallback = new AsyncCallback (OnDataReceived); SocketPacket thesocpkt = new SocketPacket (); thesocpkt.thissocket = m_clientsocket; Start listening to the data asynchronously m_result = m_clientsocket.beginreceive (thesocpkt.databuffer,, thesocpkt.databuffer.length, SocketFlags.None, m_pfncallback, thesocpkt); catch(socketeception se) MessageBo.Show (se.message ); public class SocketPacket public System.Net.Sockets.Socket thissocket; public byte[] databuffer = new byte[]; public bool IsInteger(String strnumber) Rege objnotintpattern=new Rege("[^-9-]"); Rege objintpattern=new Rege("^-[-9]+$ ^[-9]+$"); return!objnotintpattern.ismatch(strnumber) && objintpattern.ismatch(strnumber); /*private void UpdateControls( bool connected ) buttonconnect.enabled =!connected; buttondisconnect.enabled = connected; string connectstatus = connected? "Connected" : "Connecting..."; tetboconnectstatus.tet = connectstatus; this.statusbar.tet= connectstatus; */ #endregion #region Functions private void Connect_rob() if (globala.connect!= ) globala.connect = Rapper.S4.rob_init("9.68.."); Rapper.S4.rob_boolSet("flagga", true); if (globala.connect == ) this.statusbar.tet="robot Connected"; else if (globala.connect == -) this.statusbar.tet="connection failed"; else this.statusbar.tet="robot Not Responding"; else MessageBo.Show("Already connected!","notice",messagebobuttons.ok,messageboicon.information); private void Disconnect_rob()

145 int ok = 7; if (globala.connect == ) ok = Rapper.S4.rob_disconnect(); globala.connect = 7; if (ok == ) this.statusbar.tet="robot Disconnect Successful"; else if (ok == -) this.statusbar.tet="disconnection failed"; else this.statusbar.tet="robot Not Responding"; else MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); private void Jog() if (globala.connect == ) Rapper.S4.rob_boolSet("flagga", false); else MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); private void Set_speed(float s) if (globala.connect == ) Rapper.Structs.speeddata speed = new Rapper.Structs.speeddata(); int ok =7; if (s<5) s = 5; speed.v_tcp = s; speed.v_ori = 5; speed.v_rea = ; speed.v_lea = 5; ok = Rapper.S4.rob_speeddataSet("velocity", speed); if (ok == ) this.statusbar.tet="robotspeed changed"; else if (ok == -) this.statusbar.tet="speedchange failed"; else this.statusbar.tet="robot Not Responding"; else MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); private float Get_speed() if (globala.connect == ) Rapper.Structs.speeddata speed = new Rapper.Structs.speeddata(); Rapper.S4.rob_speeddataGet("velocity", ref speed); return speed.v_tcp; else

146 MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); return -; private Rapper.Structs.pose Get_pose() Rapper.Structs.pose coordinates = new Rapper.Structs.pose(); if (globala.connect == ) int ok = 7; this.statusbar.tet="position Updated"; ok = Rapper.S4.rob_poseGet("p", ref coordinates); if (ok == ) this.statusbar.tet="pose updated"; return coordinates; else if (ok == -) this.statusbar.tet="update Failed"; coordinates.rot.q = 33; return coordinates; else this.statusbar.tet="robot Not Responding"; coordinates.rot.q = 33; return coordinates; else MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); coordinates.rot.q = 33; return coordinates; private void set_pose(rapper.structs.pose coord) if (globala.connect == ) int ok = 7; if (coord.trans.z>) this.statusbar.tet="z-value is too high"; else if (coord.trans.z<) this.statusbar.tet="z-value is too low"; else if (coord.trans.>) this.statusbar.tet="x-value is too high"; else if (coord.trans.<-38) this.statusbar.tet="x-value is too low"; else if (coord.trans.y>34) this.statusbar.tet="y-value is too high";

147 else if (coord.trans.y<(-34)) this.statusbar.tet="y-value is too low"; else this.statusbar.tet="correct Values"; Rapper.Structs.pose coordinates = new Rapper.Structs.pose(); coordinates.trans. = coord.trans.; coordinates.trans.y = coord.trans.y; coordinates.trans.z = coord.trans.z; coordinates.rot.q = ; coordinates.rot.q = ; coordinates.rot.q3 = ; coordinates.rot.q4 = ; ok = Rapper.S4.rob_poseSet("p", coordinates); if (ok == ) this.statusbar.tet="pose Updated"; else if (ok == -) this.statusbar.tet="connection failed"; else this.statusbar.tet="robot Not Responding"; else MessageBo.Show("Robot Not connected!","warning",messagebobuttons.ok,messageboicon.warning); private Structs.Move_data Calc_move() Structs.Move_data Move_data = new VGIP.Structs.Move_data(); float CDX = globala.crx - globala.cgx; float CDX = globala.crx - globala.cgx; if (CDX == ) CDX = Convert.ToSingle(.); float W_vec = Convert.ToSingle(System.Math.Sqrt(CDX*CDX + CDX*CDX)); float W_ang = Convert.ToSingle(System.Math.Atan(CDX/CDX)); if (CDX < ) W_ang = Convert.ToSingle((System.Math.PI) + W_ang); else if (CDX >= && CDX < ) W_ang = Convert.ToSingle((*System.Math.PI) + W_ang); else W_ang = W_ang; Structs.Fuzzy_sets fuzzysets = fuzzify(w_vec); Move_data.Speed = fuzzysets.speed; Move_data.pose.trans. = Convert.ToSingle(fuzzysets.Distance*System.Math.Cos(W_ang)); Move_data.pose.trans.y = Convert.ToSingle(fuzzysets.Distance*System.Math.Sin(W_ang)); Move_data.pose.trans.z = globala.rob_z; if (W_vec < 3) VGIP_fuzzy_trackBar.Value = Convert.ToInt6(W_vec);

148 movedata_speed_tetbo.tet = fuzzysets.speed.tostring(); movedata_distance_tetbo.tet = fuzzysets.distance.tostring(); move_data tetbo.tet = Move_data.pose.trans..ToString(); move_data_y_tetbo.tet = Move_data.pose.trans.y.ToString(); VGIP_ang_tetBo.Tet = Convert.ToString((8*W_ang)/System.Math.PI); return Move_data; private Structs.Fuzzy_sets fuzzify(float W_vec) Structs.Fuzzy_sets fuzzysets = new VGIP.Structs.Fuzzy_sets(); if (W_vec <= fuzzy.small) fuzzysets.speed = (W_vec/(fuzzy.Smallfuzzy.Zero))*fuzzy.Small_Speed; fuzzysets.distance = (W_vec/(fuzzy.Smallfuzzy.Zero))*fuzzy.Small_Distance; else if (W_vec > fuzzy.small && W_vec <= fuzzy.medium) fuzzysets.speed = ((((fuzzy.medium-fuzzy.small)-(w_vecfuzzy.small))/(fuzzy.medium-fuzzy.small))*fuzzy.small_speed) + ((W_vec-fuzzy.Small)/(fuzzy.Mediumfuzzy.Small))*fuzzy.Medium_Speed; fuzzysets.distance =((((fuzzy.medium-fuzzy.small)-(w_vecfuzzy.small))/(fuzzy.medium-fuzzy.small))*fuzzy.small_distance) + ((W_vec-fuzzy.Small)/(fuzzy.Mediumfuzzy.Small))*fuzzy.Medium_Distance; else if (W_vec > fuzzy.medium && W_vec <= fuzzy.big) fuzzysets.speed = ((((fuzzy.big-fuzzy.medium)-(w_vecfuzzy.medium))/(fuzzy.big-fuzzy.medium))*fuzzy.medium_speed) + ((W_vec-fuzzy.Medium)/(fuzzy.Big-fuzzy.Medium))*fuzzy.Big_Speed; fuzzysets.distance =((((fuzzy.big-fuzzy.medium)-(w_vecfuzzy.medium))/(fuzzy.big-fuzzy.medium))*fuzzy.medium_distance) + ((W_vec-fuzzy.Medium)/(fuzzy.Bigfuzzy.Medium))*fuzzy.Big_Distance; else if (W_vec > fuzzy.big) MessageBo.Show("Påken luter som fan"); return fuzzysets; #endregion #region Cam functions private void Connect_cam() try UpdateControls(false); Create the socket instance m_clientsocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp ); Cet the remote IP address IPHostEntry iphostinfo = Dns.Resolve("9.68..");

149 IPAddress ip = iphostinfo.addresslist[]; IPAddress ip = IPAddress.Parse ("localhost"); int iportno = 394; Create the end point IPEndPoint ipend = new IPEndPoint (ip,iportno); Connect to the remote host m_clientsocket.connect ( ipend ); if(m_clientsocket.connected) UpdateControls(true); Wait for data asynchronously globala.camcon = ; WaitForData(); catch(socketeception se) string str; str = "\nconnection failed, is the server running?\n" + se.message; MessageBo.Show (str); UpdateControls(false); private void Disconnect_cam() if ( m_clientsocket!= null ) m_clientsocket.close(); m_clientsocket = null; UpdateControls(false); #endregion #region Buttons private void speed_button_click(object sender, System.EventArgs e) if (robotspeed_tetbo.tet!="") Set_speed(Convert.ToSingle(robotspeed_tetBo.Tet)); else float speed = Get_speed(); if (speed!= -) robotspeed_tetbo.tet = Convert.ToString(speed); private void robotdisconnect_button_click(object sender, System.EventArgs e) Disconnect_rob(); e) private void robotconnect_button_click(object sender, System.EventArgs Connect_rob();

150 e) private void robotposition_button_click(object sender, System.EventArgs Rapper.Structs.pose coordinates = Get_pose(); if (coordinates.rot.q!= 33) robotgetposition_richtetbo.tet = "Coordinates:\nX: " + System.Convert.ToString(coordinates.trans.) + "\ny: " + System.Convert.ToString(coordinates.trans.y) + "\nz: " + System.Convert.ToString(coordinates.trans.z) + "\n\nrotation:\n" + coordinates.rot.q + " " + coordinates.rot.q + " " + coordinates.rot.q3 + " " + coordinates.rot.q4; private void connect_camera_click(object sender, System.EventArgs e) Connect_cam(); private void fuzzysets_fuzzysettings_set_button_click(object sender, System.EventArgs e) fuzzy.small_speed = Convert.ToSingle(fuzzy_SS_tetBo.Tet); fuzzy.small_distance = Convert.ToSingle(fuzzy_SD_tetBo.Tet); fuzzy.medium_speed = Convert.ToSingle(fuzzy_MS_tetBo.Tet); fuzzy.medium_distance = Convert.ToSingle(fuzzy_MD_tetBo.Tet); fuzzy.big_speed = Convert.ToSingle(fuzzy_BS_tetBo.Tet); fuzzy.big_distance = Convert.ToSingle(fuzzy_BD_tetBo.Tet); private void fuzzysets_fuzzysettings_get_button_click(object sender, System.EventArgs e) fuzzy_ss_tetbo.tet = Convert.ToString(fuzzy.Small_Speed); fuzzy_sd_tetbo.tet = Convert.ToString(fuzzy.Small_Distance); fuzzy_ms_tetbo.tet = Convert.ToString(fuzzy.Medium_Speed); fuzzy_md_tetbo.tet = Convert.ToString(fuzzy.Medium_Distance); fuzzy_bs_tetbo.tet = Convert.ToString(fuzzy.Big_Speed); fuzzy_bd_tetbo.tet = Convert.ToString(fuzzy.Big_Distance); private void fuzzysets_fuzzylevels_set_button_click(object sender, System.EventArgs e) fuzzy.small = Convert.ToInt6(fuzzy_SMALL_tetBo.Tet); fuzzy.medium = Convert.ToInt6(fuzzy_MEDIUM_tetBo.Tet); fuzzy.big = Convert.ToInt6(fuzzy_BIG_tetBo.Tet); private void fuzzysets_fuzzylevels_button_click(object sender, System.EventArgs e)

151 fuzzy_small_tetbo.tet = fuzzy.small.tostring(); fuzzy_medium_tetbo.tet = fuzzy.medium.tostring(); fuzzy_big_tetbo.tet = fuzzy.big.tostring(); private void disconnect_camera_click(object sender, System.EventArgs e) Disconnect_cam(); private void robotjog_button_click(object sender, System.EventArgs e) if ((!IsInteger(robotjog_tetBo.Tet)) (!IsInteger(robotjogy_tetBo.Tet)) (!IsInteger(robotjogz_tetBo.Tet))) this.statusbar.tet="incorrect Values"; else Rapper.Structs.pose coordinates = new Rapper.Structs.pose(); coordinates.trans. = float.parse(robotjog_tetbo.tet); coordinates.trans.y = float.parse(robotjogy_tetbo.tet); coordinates.trans.z = float.parse(robotjogz_tetbo.tet); set_pose(coordinates); Jog(); e) private void robotstartpos_button_click(object sender, System.EventArgs Rapper.Structs.pose coordinates = new Rapper.Structs.pose(); coordinates.trans. = -; coordinates.trans.y = ; coordinates.trans.z = ; set_pose(coordinates); Jog(); #endregion private void camera_update_button_click(object sender, System.EventArgs e) CRX.Tet = Convert.ToString(globala.CRX); CGX.Tet = Convert.ToString(globala.CGX); CRX.Tet = Convert.ToString(globala.CRX); CGX.Tet = Convert.ToString(globala.CGX); #region Global variables public class globala public static int connect = 7; public static Rapper.Structs.pose STARTPOS = new Rapper.Structs.pose(); public static System.String szdata; public static bool found = false; public static float tal=;

152 public static float tal=; public static float tal3=; public static float tal4=; public static int count = ; public static int count = ; public static float CGX; public static float CRX; public static float CGX; public static float CRX; public static float Rob_Z = ; public static bool div = false; public static bool div = false; public static bool div3 = false; public static bool div4 = false; public static int division = ; public static int division = ; public static int division3 = ; public static int division4 = ; public static bool klar = false; public static int Camcon = ; public static bool stop = false; public static string Info = "VGIP V. \n\nauthor: Peter Knutsson, Ted Persson, Tobias Strömberg.\n\nFinal Project for TekMag at AASS Orebro University spring -5"; public class fuzzy public static float Small_Distance = 4; public static float Small_Speed = ; public static float Medium_Distance = 4; public static float Medium_Speed = 4; public static float Big_Distance = 6; public static float Big_Speed = 7; public static int Zero = ; public static int Small = ; public static int Medium = 7; public static int Big = 3; public class Structs public struct Fuzzy_sets public float Speed; public float Distance; public struct Move_data public Rapper.Structs.pose pose; public float Speed; #endregion

153 3. Källkod C# för RAP

154 using System; using System.Runtime.InteropServices; using System.Threading; namespace Rapper public class S4 [DllImport("BcbAccess.dll", EntryPoint="rap_init",CharSet = CharSet.Auto)] public static etern int rob_init([marshalas(unmanagedtype.ansibstr)]string address); [DllImport("BcbAccess.dll", EntryPoint="rap_disconnect",CharSet = CharSet.Auto)] public static etern int rob_disconnect(); [DllImport("BcbAccess.dll", EntryPoint="rap_boolGet", CharSet = CharSet.Auto)] public static etern int rob_boolget([marshalas(unmanagedtype.ansibstr)]string varname, ref bool pvalue); [DllImport("BcbAccess.dll", EntryPoint="rap_boolSet", CharSet = CharSet.Auto)] public static etern int rob_boolset([marshalas(unmanagedtype.ansibstr)]string varname, bool pvalue); [DllImport("BcbAccess.dll", EntryPoint="rap_numGet", CharSet = CharSet.Auto)] public static etern int rob_numget([marshalas(unmanagedtype.ansibstr)]string varname, ref float pvalue); [DllImport("BcbAccess.dll", EntryPoint="rap_numSet", CharSet = CharSet.Auto)] public static etern int rob_numset([marshalas(unmanagedtype.ansibstr)]string varname, float pvalue); [DllImport("BcbAccess.dll", EntryPoint="rap_posGet", CharSet = CharSet.Auto)] public static etern int rob_posget([marshalas(unmanagedtype.ansibstr)]string varname, ref Structs.pos pvalue); [DllImport("BcbAccess.dll", EntryPoint="rap_posSet", CharSet = CharSet.Auto)] public static etern int rob_posset([marshalas(unmanagedtype.ansibstr)]string varname, Structs.pos pvalue); [DllImport("BcbAccess.dll", EntryPoint="rap_poseGet", CharSet = CharSet.Auto)] public static etern int rob_poseget([marshalas(unmanagedtype.ansibstr)]string varname, ref Structs.pose pvalue);

155 [DllImport("BcbAccess.dll", EntryPoint="rap_poseSet", CharSet = CharSet.Auto)] public static etern int rob_poseset([marshalas(unmanagedtype.ansibstr)]string varname, Structs.pose pvalue); [DllImport("BcbAccess.dll", EntryPoint="rap_speeddataGet", CharSet = CharSet.Auto)] public static etern int rob_speeddataget([marshalas(unmanagedtype.ansibstr)]string varname, ref Structs.speeddata pvalue); [DllImport("BcbAccess.dll", EntryPoint="rap_speeddataSet", CharSet = CharSet.Auto)] public static etern int rob_speeddataset([marshalas(unmanagedtype.ansibstr)]string varname, Structs.speeddata pvalue); [DllImport("BcbAccess.dll", EntryPoint="rap_robtargetGet", CharSet = CharSet.Auto)] public static etern int rob_robtargetget([marshalas(unmanagedtype.ansibstr)]string varname, ref Structs.robtarget pvalue); [DllImport("BcbAccess.dll", EntryPoint="rap_robtargetSet", CharSet = CharSet.Auto)] public static etern int rob_robtargetset([marshalas(unmanagedtype.ansibstr)]string varname, Structs.robtarget pvalue);

156 public class Structs public struct robtarget public Structs.pos trans; public Structs.orient rot; public Structs.confdata robconf; public Structs.etjoint eta; public struct pos public float ; public float y; public float z; public struct orient public float q; public float q; public float q3; public float q4; public struct pose public Structs.pos trans; public Structs.orient rot; public struct confdata public float cf; public float cf4; public float cf6; public float cf; public struct etjoint public float ea_a; public float ea_b; public float ea_c; public float ea_d; public float ea_e; public float ea_f; public struct speeddata public float v_tcp; public float v_ori; public float v_lea; public float v_rea; public class MYSessionEception : System.ApplicationEception public MYSessionEception(string message) : base (message) public class MYSession

157 private string robot_defaultaddress = "9.68.."; private System.Threading.Thread robot_thread; private string robot_remaddr; public string RemoteAddress getreturn robot_remaddr; setrobot_remaddr = value; private bool robot_isconnected; public bool RobotConnected getreturn robot_isconnected; setrobot_isconnected = value; private float robot_walddepth =.f; /what for?! public MYSession() robot_remaddr = ""; public MYSession(string robot_remaddr) robot_remaddr = RemoteAddress; public int SetupRobotCom() string addr = robot_remaddr.length >? robot_remaddr : robot_defaultaddress; return Rapper.S4.rob_init( addr ); public void SetupThread() if(robot_thread == null) robot_thread = new Thread(new ThreadStart( RobotCallBack )); else throw new MYSessionEception("Unable to start session since already running."); public bool StartThread() if(robot_thread!= null) robot_thread.start(); return true; else return false; public bool AbortThread() if(robot_thread!= null)

158 robot_thread.abort(); return true; else return false; public bool SuspendThread() if(robot_thread!= null) robot_thread.suspend(); return true; else return false; public bool ResumeThread() if(robot_thread!= null) robot_thread.resume(); return true; else return false; public static void RobotCallBack() float test =.f; Rapper.S4.rob_numGet("nDepth",ref test); /System.Windows.MessageBo.Show(test.ToString()); Thread.Sleep();

159 4. Programkod RAPID i Projekt

160 %%% VERSION: LANGUAGE:ENGLISH %%% MODULE projekt VAR signaldo DO_; PERS speeddata velocity:=[5,5,5,]; PERS bool flagga:=true; PERS bool kor:=true; PERS bool gripper:=false; PERS bool klar:=false; PERS robtarget robp:=[[,,],[,,,],[,,,],[9e+9,9e+9,9e+9,9e+9,9e+9,9e+9]]; PERS tooldata tgripper:=[true,[[,,],[,,,]],[.3,[,,.],[,,,],,,]]; PERS pose p:=[[,,],[,,,]]; PROC main() WHILE kor DO klar:=false; WHILE flagga DO ENDWHILE IF gripper=true THEN Set DO_; ELSE Reset DO_; ENDIF robp.trans:=p.trans; IF robp.trans.z<6 THEN MoveL robp,velocity,fine,tgripper\wobj:=wobj; klar:=true; ENDIF flagga:=true; ENDWHILE ENDPROC ENDMODULE

161 5. Programkod RAPID i Projekt

162 %%% VERSION: LANGUAGE:ENGLISH %%% MODULE hast_utan_gri PERS speeddata velocity:=[5,5,5,]; PERS bool flagga:=true; PERS bool kor:=true; PERS bool Gripper:=FALSE; PERS bool klar:=false; PERS robtarget robp:=[[-,,],[,,,],[,,,],[9e+9,9e+9,9e+9,9e+9,9e+9,9e+9]]; PERS tooldata tgripper:=[true,[[,,],[,,,]],[.3,[,,.],[,,,],,,]]; PERS pose p:=[[-,,],[,,,]]; PROC main() WHILE kor DO klar:=false; WHILE flagga DO ENDWHILE robp.trans:=p.trans; IF robp.trans.z= THEN MoveL robp,velocity,z5,tgripper\wobj:=wobj; klar:=true; ENDIF flagga:=true; ENDWHILE ENDPROC

163 6. Datablad Kamera Marlin F-33C

164

165

ISAC. Tel. 08/ 544 404 00 styrlogic@styrlogic.se

ISAC. Tel. 08/ 544 404 00 styrlogic@styrlogic.se 1 2 ISAC är en väl beprövad produkt som har utvecklats av Styrlogic AB. ISAC grundar sig på många års erfarenhet under ett flertal installationer. Den första ISAC-applikationen levererades 1990. ISAC betyder

Läs mer

Konstruktion av en radiostyrd legobil. Digitala projekt av Arbon Vata Leonardo Vukmanovic Amid Bhatia

Konstruktion av en radiostyrd legobil. Digitala projekt av Arbon Vata Leonardo Vukmanovic Amid Bhatia Konstruktion av en radiostyrd legobil Digitala projekt av Arbon Vata Leonardo Vukmanovic Amid Bhatia 1 1.Innehållsförtäckning Rapport Radiostyrd LEGO bil...1 1. Innehållsförtäckning...2 2.0 Inledning...3

Läs mer

Stackning av bilder JAN NILSSON

Stackning av bilder JAN NILSSON Svensk Mykologisk Tidskrift 30 (3): 51 55, 2009 Stackning av bilder TEKNIK JAN NILSSON Abstract Image stacking. A short presentation of the software "CombineZP" which is designed to process stacks of digital

Läs mer

LiTH. WalkCAM 2007/05/15. Testplan. Mitun Dey Version 1.0. Status. Granskad. Godkänd. Reglerteknisk projektkurs WalkCAM LIPs

LiTH. WalkCAM 2007/05/15. Testplan. Mitun Dey Version 1.0. Status. Granskad. Godkänd. Reglerteknisk projektkurs WalkCAM LIPs Testplan Mitun Dey Version 1.0 Status Granskad Godkänd 1 PROJEKTIDENTITET Reglerteknisk projektkurs, WalkCAM, 2007/VT Linköpings tekniska högskola, ISY Namn Ansvar Telefon E-post Henrik Johansson Projektledare

Läs mer

produktöversikt OptiMaster III

produktöversikt OptiMaster III produktöversikt III Vision-teknologi på en ny nivå III är en vision-mjukvara som är lika avancerad som användarvänlig. Allt för att hjälpa dig att reducera tiden från projektstart till fullskalig produktion.

Läs mer

Robotfotboll med Arduino

Robotfotboll med Arduino Robotfotboll med Arduino Av Staffan Melin och Martin Blom Bild & form-skolan, Masthugget, Göteborg 2015 Staffan Melin, staffan.melin@oscillator.se Martin Blom, martinblomblom@hotmail.com Detta verk är

Läs mer

Vanliga frågor för VoiceXpress

Vanliga frågor för VoiceXpress Vanliga frågor för VoiceXpress 1) Hur stort ordförråd (vokabulär) innehåller VoiceXpress? VoiceXpress innehåller ett mycket omfattande ordförråd, och svaret på frågan varierar en aning beroende på hur

Läs mer

Installationsanvisning För dig som har valt fast IP-Adress

Installationsanvisning För dig som har valt fast IP-Adress Installationsanvisning För dig som har valt fast IP-Adress Inomhusnod Comega FTTH-TVMC... 2 Inomhusnod Allied Telesyn img616... 4 Inomhusnod CTS HET-3109... 5 Nätverkskort... 6 Kontakter och kablar...

Läs mer

Innehåll i detta dokument

Innehåll i detta dokument Läs igenom hela dokumentet innan du startar. Kopiera över allt på CD-skivan till din hårddisk. Din dator kommer behöva startas om en gång vid installationen av CodeSys. Du måste ha rättigheter att installera

Läs mer

Ingående delar. I ditt paket av IDEA-SOLO ingår följande delar. Kamerasystem. Väska för att transportera IDEA-SOLO

Ingående delar. I ditt paket av IDEA-SOLO ingår följande delar. Kamerasystem. Väska för att transportera IDEA-SOLO Ingående delar I ditt paket av IDEA-SOLO ingår följande delar. Kamerasystem Väska för att transportera IDEA-SOLO Handkontroll, ett alternativ för zoomning istället för tangentbord, eller då kameran används

Läs mer

PROGRAMMERING. Ämnets syfte. Kurser i ämnet

PROGRAMMERING. Ämnets syfte. Kurser i ämnet PROGRAMMERING Ämnet programmering behandlar programmeringens roll i informationstekniska sammanhang som datorsimulering, animerad grafik, praktisk datoriserad problemlösning och användaranpassad konfiguration

Läs mer

Stiftelsen MHS-Bostäder Instruktioner och felsökningsguide för Internetanslutning

Stiftelsen MHS-Bostäder Instruktioner och felsökningsguide för Internetanslutning Stiftelsen MHS-Bostäder Instruktioner och felsökningsguide för Internetanslutning VANLIGA FRÅGOR 1 NÄTVERKSINSTÄLLNINGAR, WINDOWS 2000/XP 2 Hastighet/duplex-inställningar för nätverkskort 3 Inställningar

Läs mer

Programmering B med Visual C++ 2008

Programmering B med Visual C++ 2008 Programmering B med Visual C++ 2008 Innehållsförteckning 1 Repetition och lite nytt...5 I detta kapitel... 5 Programexekvering... 5 Loop... 5 Källkod... 6 Verktyg... 6 Säkerhetskopiera... 6 Öppna, kompilera,

Läs mer

Skapa ett eget programnu! NU! Komplett med programvara och konkreta exempel! Patrice Pelland. Swedish Language Edition published by Docendo Sverige AB

Skapa ett eget programnu! NU! Komplett med programvara och konkreta exempel! Patrice Pelland. Swedish Language Edition published by Docendo Sverige AB NU! Skapa ett eget programnu! Patrice Pelland Komplett med programvara och konkreta exempel! Swedish Language Edition published by Docendo Sverige AB Kapitel 2 Installera Visual Basic 2005 Express Edition

Läs mer

Hype Smart Gyro Competition

Hype Smart Gyro Competition Hype Smart Gyro Competition Version C. 2004 05-04 Hype Smart Gyro Competition är ett mycket modernt gyro som kan växlas mellan två olika lägen Mode:r där mode 1 är en standard inställning där gyrot hela

Läs mer

n-abler STYRKULA Handbok Underhåll Avfallshantering Förbrukad produkt ska hanteras som elektronikavfall

n-abler STYRKULA Handbok Underhåll Avfallshantering Förbrukad produkt ska hanteras som elektronikavfall Underhåll n-abler STYRKULA n-abler styrkula har inga utbytbara eller reparerbara delar. Om reparation blir nödvändig var vänlig kontakta er leverantör. För ytterligare information eller frågor, kontakta

Läs mer

Programmering av. PADDY mini

Programmering av. PADDY mini multimedia Programmering av PADDY mini art. nr: CCS037 PRODUKTER SOM ANVÄNDS I DETTA EXEMPEL: PADDY mini CCS037 PADDY mini CCS012 PADDY mini CCS500 VSCOM USB TILL SERIELL DB9 LAPTOP MED WINDOWS 7 QUICKPAD

Läs mer

Tentamen i Robotteknik MPR160 och MPR210, 20 oktober 1997

Tentamen i Robotteknik MPR160 och MPR210, 20 oktober 1997 www.pe.chalmers.se/student/robot Tenta i Robotteknik 1997-10-20 1/5 Tentamen i Robotteknik MPR160 och MPR210, 20 oktober 1997 Lärare: Rolf Berlin, 070-799 24 89 Anders Boström ank 1526 Tillåtna hjälpmedel:

Läs mer

Installationsguide / Användarmanual

Installationsguide / Användarmanual (Ver. 2.6.0) Installationsguide / Användarmanual Innehåll 1. Välkommen Sid 1 Välkommen som Internet kund hos Seth s Bredband Kontrollera att din Internetlåda innehåller: 2. Anslutningsguide Sid 2 Koppla

Läs mer

PROGRAMMERING. Ämnets syfte. Kurser i ämnet

PROGRAMMERING. Ämnets syfte. Kurser i ämnet PROGRAMMERING Ämnet programmering behandlar programmeringens roll i informationstekniska sammanhang som datorsimulering, animerad grafik, praktisk datoriserad problemlösning och användaranpassad konfiguration

Läs mer

Inledande programmering med C# (1DV402) Introduktion till C#

Inledande programmering med C# (1DV402) Introduktion till C# Introduktion till C# Upphovsrätt för detta verk Detta verk är framtaget i anslutning till kursen Inledande programmering med C# vid Linnéuniversitetet. Du får använda detta verk så här: Allt innehåll i

Läs mer

Lär dig programmera! Prova på programmering med enkla exempel! Björn Regnell www.bjornregnell.se

Lär dig programmera! Prova på programmering med enkla exempel! Björn Regnell www.bjornregnell.se Lär dig programmera! Prova på programmering med enkla exempel! Björn Regnell www.bjornregnell.se Mål Så enkelt som möjligt: låg tröskel Ett riktigt programmeringsspråk: inget tak Roliga uppgifter som går

Läs mer

Laboration i Fourieroptik

Laboration i Fourieroptik Laboration i Fourieroptik David Winge Uppdaterad 30 januari 2015 1 Introduktion I detta experiment ska vi titta på en verklig avbildning av Fouriertransformen. Detta ska ske med hjälp av en bild som projiceras

Läs mer

Sirius II Installation och Bruksanvisning

Sirius II Installation och Bruksanvisning Sirius II Installation och Bruksanvisning Innehåll 1. Introduktion... 2. Installation av Sirius II programvara... 3. Anslutning Data Linker interface.... 4. Sirius II funktioner.... 5. Bruksanvisning....

Läs mer

Institutionen för matematik och datavetenskap Karlstads universitet. GeoGebra. ett digitalt verktyg för framtidens matematikundervisning

Institutionen för matematik och datavetenskap Karlstads universitet. GeoGebra. ett digitalt verktyg för framtidens matematikundervisning Karlstads GeoGebrainstitut Institutionen för matematik och datavetenskap Karlstads universitet Mats Brunström Maria Fahlgren GeoGebra ett digitalt verktyg för framtidens matematikundervisning Invigning

Läs mer

Kapitel 1: Komma igång...3

Kapitel 1: Komma igång...3 F-Secure Anti-Virus for Mac 2014 Innehåll 2 Innehåll Kapitel 1: Komma igång...3 1.1 Vad gör jag efter installationen...4 1.1.1 Hantera prenumeration...4 1.1.2 Öppna produkten...4 1.2 Så här kontrollerar

Läs mer

Instruktioner för uppdatering av enheter med ISP

Instruktioner för uppdatering av enheter med ISP För AP produkter som använder ISP måste flashuppdateringen göras med hjälp av den medföljande MPC Manager. För att utföra en firmware uppdatering, följ dessa instruktioner: 1. Ladda ner och installera

Läs mer

Laboration 4: Digitala bilder

Laboration 4: Digitala bilder Objektorienterad programmering, Z : Digitala bilder Syfte I denna laboration skall vi återigen behandla transformering av data, denna gång avseende digitala bilder. Syftet med laborationen är att få förståelse

Läs mer

Installationsanvisning För dig som har dynamisk IP-Adress

Installationsanvisning För dig som har dynamisk IP-Adress Installationsanvisning För dig som har dynamisk IP-Adress Inomhusnod Comega FTTH-TVMC... 2 Inomhusnod Allied Telesyn img616... 4 Inomhusnod CTS HET-3109... 5 Nätverkskort... 6 Kontakter och kablar... 6

Läs mer

Förbered och planera bildmanuset

Förbered och planera bildmanuset Del av Kapitel 4: Förbered och planera bildmanuset I detta kapitel kommer du att: Omvandla ditt manus till ett bildmanus Lägga till bildmanusguider Planera för de bilder som ska visas på skärmen Skriva

Läs mer

Systemskiss. LiTH Autonom bandvagn med stereokamera 2010-09-24. Gustav Hanning Version 1.0. Status. TSRT10 8Yare LIPs. Granskad

Systemskiss. LiTH Autonom bandvagn med stereokamera 2010-09-24. Gustav Hanning Version 1.0. Status. TSRT10 8Yare LIPs. Granskad Gustav Hanning Version 1.0 Status Granskad Godkänd Jonas Callmer 2010-09-24 1 PROJEKTIDENTITET 2010/HT, 8Yare Linköpings tekniska högskola, institutionen för systemteknik (ISY) Namn Ansvar Telefon E-post

Läs mer

Industriell Datakommunikation. Allt du behöver veta om RS-232

Industriell Datakommunikation. Allt du behöver veta om RS-232 Industriell Datakommunikation Allt du behöver veta om RS-232 Email info@foxcomputer.se, Website http://www.foxcomputer.se Ulf Rääf Datakommunikation och Industriell IT enligt standard RS-232 Teori och

Läs mer

Introduktion till programmering, hösten 2011

Introduktion till programmering, hösten 2011 Föreläsning 1 Programmering är ett hantverk. Det betyder att man inte kan läsa sig till den förmågan, man måste träna och man tränar genom att skriva mer och mer avancerade program. Programmering förutsätter

Läs mer

HEMISSON. Webots-Botstudio laborationsbok. Sida1

HEMISSON. Webots-Botstudio laborationsbok. Sida1 HEMISSON Webots-Botstudio laborationsbok Sida1 Allmänt om Hemisson Hemisson är en mobil minirobot för utbildning. Liknande enheter förekommer i en mängd sammanhang i dagens samhälle. Det kan vara i form

Läs mer

Lab1 Introduktion. 1 Syfte. 2 Innehåll Win32API Skapa trådar Kritiska sektioner Mailslothantering. 3 Förberedelse & Tips

Lab1 Introduktion. 1 Syfte. 2 Innehåll Win32API Skapa trådar Kritiska sektioner Mailslothantering. 3 Förberedelse & Tips Lab1 Introduktion Förberedelse för planetlabben genom att kapsla in (skapa wrappers) systemanrop. 1 Syfte Få en känsla av hur Win32API fungerar, dvs programmerarens interface gentemot Windows. Känsla för

Läs mer

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic Inledning Starta Microsoft Visual Studio 2005. Välj create Project Välj VB + Vindows Application och välj ett nytt

Läs mer

Geometrisk optik. Syfte och mål. Innehåll. Utrustning. Institutionen för Fysik 2006-04-25

Geometrisk optik. Syfte och mål. Innehåll. Utrustning. Institutionen för Fysik 2006-04-25 Geometrisk optik Syfte och mål Laborationens syfte är att du ska lära dig att: Förstå allmänna principen för geometrisk optik, (tunna linsformeln) Rita strålgångar Ställa upp enkla optiska komponenter

Läs mer

INNEHÅLLSFÖRTECKNING... 2 FÖRORD... 3 INLEDNING... 4 ATT ANVÄNDA MOTORERNA... 9 LOOP (UPPREPANDE) FUNKTIONEN... 10 SKAPA EN EGEN KLOSS...

INNEHÅLLSFÖRTECKNING... 2 FÖRORD... 3 INLEDNING... 4 ATT ANVÄNDA MOTORERNA... 9 LOOP (UPPREPANDE) FUNKTIONEN... 10 SKAPA EN EGEN KLOSS... GRUNDKURS INNEHÅLLSFÖRTECKNING INNEHÅLLSFÖRTECKNING... 2 FÖRORD... 3 INLEDNING... 4 SKÄRMUPPBYGGNAD... 4 ROBOT EDUCATOR... 5 PROGRAMMERINGSRUTAN... 5 KNAPPARNA OCH KLOSSARNA... 6 UPPGIFTER... 8 ATT ANVÄNDA

Läs mer

Skärmbilden i Netscape Navigator

Skärmbilden i Netscape Navigator Extratexter till kapitel Internet Skärmbilden i Netscape Navigator Netscape är uppbyggt på liknande sätt som i de flesta program. Under menyraden, tillsammans med verktygsfältet finns ett adressfält. I

Läs mer

Linjär algebra med tillämpningar, lab 1

Linjär algebra med tillämpningar, lab 1 Linjär algebra med tillämpningar, lab 1 Innehåll Per Jönsson Fakulteten för Teknik och Samhälle, 2013 Uppgifterna i denna laboration täcker kapitel 1-3 i läroboken. Läs igenom motsvarande kapitel. Sitt

Läs mer

DISK DRIVE REPLACEMENT

DISK DRIVE REPLACEMENT DDR DISK DRIVE REPLACEMENT TILL ABB ROBOTICS S3 -SYSTEM Swerob Service AB Global Robot Parts AB Beskrivning DDR ersätter alla** gamla diskettstationer. Den monteras på den befintliga platsen för diskettstationen.

Läs mer

Förpackningens innehåll. Ordlista. Powerline Adapter

Förpackningens innehåll. Ordlista. Powerline Adapter Powerline Adapter OBS! Utsätt inte Powerline Adapter för extrema temperaturer. Placera inte enheten i direkt solljus eller i närheten av värmeelement. Använd inte Powerline Adapter i extremt fuktiga eller

Läs mer

Installera SoS2000. Kapitel 2 Installation Innehåll

Installera SoS2000. Kapitel 2 Installation Innehåll Kapitel 2 Installation Innehåll INSTALLATION MDAC och ODBC...2 Installera SoS2000 i arbetsplatsen...2 SoS2000 serverprogramvara...2 SoS2000 och övriga Office program...3 Avinstallera SoS2000...3 Brandväggar...3

Läs mer

OBS: Alla mätningar och beräknade värden ska anges i SI-enheter med korrekt antal värdesiffror. Felanalys behövs endast om det anges i texten.

OBS: Alla mätningar och beräknade värden ska anges i SI-enheter med korrekt antal värdesiffror. Felanalys behövs endast om det anges i texten. Speed of light OBS: Alla mätningar och beräknade värden ska anges i SI-enheter med korrekt antal värdesiffror. Felanalys behövs endast om det anges i texten. 1.0 Inledning Experiment med en laseravståndsmätare

Läs mer

Monitor Pro V7.x SCADA. Förstå och skapa symboler 2002-06-18

Monitor Pro V7.x SCADA. Förstå och skapa symboler 2002-06-18 Monitor Pro V7.x SCADA Förstå och skapa symboler 00-06-8 INNEHÅLLSFÖRTECKNING INTRODUKTION TILL SYMBOLER... 3. VÄLJ BILDFIL... 3. LÄGG TILL BILDFIL I MIMICEN... 4.3 LÄGG TILL OBJEKT I MIMICEN... 4.4 ANIMERA

Läs mer

Användardokumentation för Rullande Resultatskärmar i lokalt nätverk

Användardokumentation för Rullande Resultatskärmar i lokalt nätverk Användardokumentation för Rullande Resultatskärmar i lokalt nätverk Cup- och Matchplaneringssystem för PC Efkon AB 2008-2014 Innehållsförteckning: 1 INLEDNING... 1 2 FÖRBEREDELSE OCH PLANERING AV NÄTVERKET...

Läs mer

Bildskärmar och synergonomi

Bildskärmar och synergonomi OptoNordic 2009 Bildskärmar och synergonomi Föreläsare: Niclas Rydell Email: rydell.niclas@gmail.com Syftet med föreläsningen En hjälp till er i arbetet men även privat Bildskärmen är länken mellan människa

Läs mer

Administrivia. hh.se/db2004. 1 Verónica Gaspes (Kursansvarig) 2 Mattias Enervall (Övningsassistent) Examination. 1 Skriftlig tentamen (betyg)

Administrivia. hh.se/db2004. 1 Verónica Gaspes (Kursansvarig) 2 Mattias Enervall (Övningsassistent) Examination. 1 Skriftlig tentamen (betyg) Programmering hh.se/db2004 Föreläsning 1 Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Välkomna till en kurs i programmering! Att programmera är att få datorn att bete sig på

Läs mer

Handbok för skrivarprogramvara

Handbok för skrivarprogramvara Handbok för skrivarprogramvara (För Canon Compact Photo Printer Solution Disk Version 6) Windows 1 Innehåll Säkerhetsföreskrifter...3 Läs det här först...4 Handboken...4 Flödesdiagram för utskrift...5

Läs mer

Cargolog Impact Recorder System

Cargolog Impact Recorder System Cargolog Impact Recorder System MOBITRON Mobitron AB Box 241 561 23 Huskvarna, Sweden Tel +46 (0)36 512 25 Fax +46 (0)36 511 25 Att mäta är att veta Vi hjälper dig och dina kunder minska skador och underhållskostnader

Läs mer

Din leverantör av hissautomater, pallställ, grenställ och utdragsenheter.

Din leverantör av hissautomater, pallställ, grenställ och utdragsenheter. PLOCKHJÄLPMEDEL PloCkhjälPmEdEl Compact Hissautomater arbetar med stor precision och hög hastighet. Rätt utnyttjade bidrar hissautomaterna till effektiv och rationell lagerhantering. För att operatören

Läs mer

Förpackningens innehåll. Ordlista. Powerline Adapter

Förpackningens innehåll. Ordlista. Powerline Adapter Powerline Adapter OBS! Utsätt inte Powerline Adapter för extrema temperaturer. Placera inte enheten i direkt solljus eller i närheten av värmeelement. Använd inte Powerline Adapter i extremt fuktiga eller

Läs mer

MaxxECU MDash Android App

MaxxECU MDash Android App MaxxECU MDash Android App 2015-04-27 Viktig information! (bör läsas innan installation) Maxxtuning AB - info@maxxtuning.se 1 - Förord MaxxECU MDash är en Android app som kommunicerar trådlöst via blåtand

Läs mer

Vad behöver eleverna kunna för a0 förstå programmeringsstruktur?

Vad behöver eleverna kunna för a0 förstå programmeringsstruktur? Vad behöver eleverna kunna för a0 förstå programmeringsstruktur? En pågående Lerning Study av Per Selin Johan Larsson Varför programmering? Är det mindre viktigt att förstå digitala byggstenar i den digitala

Läs mer

Manuell SMARTCD.G2 02.2015

Manuell SMARTCD.G2 02.2015 02.2015 2 / 14 1 Avsedd användning... 3 2 Säkerhetsanvisningar... 4 3 Ingår i leveransen... 5 4 Anslutning till en dator/bärbar dator... 6 5 Ladda batterierna... 7 6 Driftsättning... 8 7 Konfigurering

Läs mer

RÖRELSE. - Mätningar och mätinstrument och hur de kan kombineras för att mäta storheter, till exempel fart, tryck och effekt.

RÖRELSE. - Mätningar och mätinstrument och hur de kan kombineras för att mäta storheter, till exempel fart, tryck och effekt. RÖRELSE Inledning När vi går, springer, cyklar etc. förflyttar vi oss en viss sträcka på en viss tid. Ibland, speciellt när vi har bråttom, tänker vi på hur fort det går. I det här experimentet undersöker

Läs mer

Så avancerad att vi blev tvungna att skapa en ny kategori

Så avancerad att vi blev tvungna att skapa en ny kategori Vi presenterar Fluke VT02 Visual IR Thermometer Så avancerad att vi blev tvungna att skapa en ny kategori Visuell inspektion Inga fel kan identifieras med blotta ögat Traditionell IR-termometer Optimerad

Läs mer

Skapa ett paket av TI-Nspire programvara med Microsoft SMS 2003

Skapa ett paket av TI-Nspire programvara med Microsoft SMS 2003 Skapa ett paket av TI-Nspire programvara med Microsoft SMS 2003 Detta dokument ger steg för steg-instruktioner för att skapa och implementera ett TI-Nspire nätverkspaket via plattformen Microsoft SMS 2003.

Läs mer

For more information please visit www.rollermouse.com

For more information please visit www.rollermouse.com For more information please visit www.rollermouse.com Contour Design, Inc. 10 Industrial Drive Windham New Hampshire, 03087, USA Phone: 800-462-6678 E-mail: ergoinfo@contourdesign.com Contour Design Europe

Läs mer

Administrivia. hh.se/db2004. 1 Verónica Gaspes (Kursansvarig) 2 Daniel Petersson (Labassistent) Examination. 1 Skriftlig tentamen (betyg)

Administrivia. hh.se/db2004. 1 Verónica Gaspes (Kursansvarig) 2 Daniel Petersson (Labassistent) Examination. 1 Skriftlig tentamen (betyg) Programmering hh.se/db2004 Föreläsning 1 Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Välkomna till en kurs i programmering! Att programmera är att få datorn att bete sig på

Läs mer

Passersystem VAKA 10

Passersystem VAKA 10 Driftsättning & Snabbstart Passersystem VAKA 10 20003-1 Vaka snabbstart axema Sida 1 Copyright Axema Access Control AB, Stockholm 2011. 20003-sv Vaka quick guide Axema Access Control AB är ett svenskt

Läs mer

Mätning av fokallängd hos okänd lins

Mätning av fokallängd hos okänd lins Mätning av fokallängd hos okänd lins Syfte Labbens syfte är i första hand att lära sig hantera mätfel och uppnå god noggrannhet, även med systematiska fel. I andra hand är syftet att hantera linser och

Läs mer

LiTH. WalkCAM 2007/05/15. Användarhandledning. Mitun Dey Version 1.0. Status. Granskad. Godkänd. Reglerteknisk projektkurs WalkCAM LIPs

LiTH. WalkCAM 2007/05/15. Användarhandledning. Mitun Dey Version 1.0. Status. Granskad. Godkänd. Reglerteknisk projektkurs WalkCAM LIPs Användarhandledning Mitun Dey Version 1.0 Status Granskad Godkänd 1 PROJEKTIDENTITET Reglerteknisk projektkurs, WalkCAM, 2007/VT Linköpings tekniska högskola, ISY Namn Ansvar Telefon E-post Henrik Johansson

Läs mer

I den tidigare filen Manual Editor belystes grunderna för enkel uppdatering samt editorns utformning.

I den tidigare filen Manual Editor belystes grunderna för enkel uppdatering samt editorns utformning. Sida 1 av 23 Editor, Avancerad I den tidigare filen Manual Editor belystes grunderna för enkel uppdatering samt editorns utformning. Detta dokument syftar till att hjälpa dig som vill jobba mer aktivt

Läs mer

Bruksanvisning Bläckfisken USB

Bruksanvisning Bläckfisken USB Bruksanvisning Bläckfisken USB Kontaktanslutning till datorer och pekplattor Tel/Fax.: 013-712 70 Östra Harg Torpängen 585 91 Linköping E-post: info@hargdata.se Hemsida: www.hargdata.se Innehållsförteckning:

Läs mer

Kurskatalog 2010 INNEHÅLLSFÖRTECKNING

Kurskatalog 2010 INNEHÅLLSFÖRTECKNING SFÖRTECKNING 1. RFID-Kurser... 2 1.1. RFID Grundkurs... 2 1.2. RFID Fortsättningskurs... 3 1.3. RFID dator programmering... 4 1.4. RFID Systemadministration... 5 1.5. RFID Aktiv Systemadministration...

Läs mer

F-Secure Anti-Virus for Mac 2015

F-Secure Anti-Virus for Mac 2015 F-Secure Anti-Virus for Mac 2015 2 Innehåll F-Secure Anti-Virus for Mac 2015 Innehåll Kapitel 1: Komma igång...3 1.1 Hantera prenumeration...4 1.2 Så här kontrollerar du att datorn är skyddad...4 1.2.1

Läs mer

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Laboration 1. kompilera-ikonen exekvera-ikonen Programmerade system I1 Syfte Laboration 1. Syftet med denna laboration är dels att göra dej bekant med de verktyg som kan vara aktuella i programmeringsarbetet, dels ge en första inblick i att skriva

Läs mer

Användarmanual Onepix MDX Installer 1.1 SVENSK

Användarmanual Onepix MDX Installer 1.1 SVENSK Användarmanual Onepix MDX Installer 1.1 SVENSK 2 Onepix1 1_IFU_MDX Installer 1 0_SE_003 Viktig information... 3 Systemkrav... 3 Om Onepix MDX Installer... 3 Installation av MDX-3 sensordrivrutin... 3 Installation

Läs mer

MBIT BREDBAND VI ÄGS AV INVÅNARNA I KARLSHAMN REGISTRERA DIG IDAG. Din lokala elleverantör. Starka på hemmaplan. Din guide till Karlshamnsporten

MBIT BREDBAND VI ÄGS AV INVÅNARNA I KARLSHAMN REGISTRERA DIG IDAG. Din lokala elleverantör. Starka på hemmaplan. Din guide till Karlshamnsporten 1000 MBIT BREDBAND VI ÄGS AV INVÅNARNA I KARLSHAMN REGISTRERA DIG IDAG Din guide till Karlshamnsporten Din lokala elleverantör Starka på hemmaplan Hej, Karlshamnsporten är en tjänstevalsportal där du själv

Läs mer

IT-kurser Office IT-Partner Våren 2015

IT-kurser Office IT-Partner Våren 2015 IT-kurser Office IT-Partner Våren 2015 Office datautbildningar Innehåll Anmälan, avbokning och garanti... 3 IT-kurser våren 2015... 4 Microsoft Word grund... 5 Microsoft PowerPoint... 5 SharePoint 2013

Läs mer

DIGITALA RESURSER MANUAL FÖR

DIGITALA RESURSER MANUAL FÖR DIGITALA RESURSER MANUAL FÖR Skapa presentationer med Prezi 1 Introduktion Prezi är ett verktyg för att skapa presentationer, precis som Power Point. Skillnaden är att man i Prezi jobbar med en stor arbetsyta,

Läs mer

M-Bus Fjärravläsningssystem M-Bus master, GSM/GPRS, TCP/IP

M-Bus Fjärravläsningssystem M-Bus master, GSM/GPRS, TCP/IP M-Bus Utgåva produktkatalog master, 3, 2015-06-02 GSM/GPRS, TCP/IP Sidhuvud1 produktkatalog M-Bus Fjärravläsningssystem produktkatalog produktkatalog Användningsområde Serien består av flexibla och kostnadseffektiva

Läs mer

Hjälp! Det fungerar inte.

Hjälp! Det fungerar inte. Hjälp! Det fungerar inte. Prova först att dra ur elsladden på telefonidosan och elsladden till ditt bredbandsmodem/bredbandsrouter (om du har en) och vänta ca 30 min. Koppla därefter först in strömsladden

Läs mer

Användarmanual. SMS Fjärrkontroll för Värmepump / Air Condition. Modell: GARD

Användarmanual. SMS Fjärrkontroll för Värmepump / Air Condition. Modell: GARD Användarmanual SMS Fjärrkontroll för Värmepump / Air Condition Modell: GARD Läs igenom bruksanvisningen innan du använder din produkt och behåll den för framtida bruk. Bilderna som används i denna manual

Läs mer

SW3674. Snabbguide. Eee PC 900 Serierna 15G06Q0136D0

SW3674. Snabbguide. Eee PC 900 Serierna 15G06Q0136D0 SW3674 Snabbguide Eee PC 900 Serierna 15G06Q0136D0 Starta din Eee PC Dessa är endast snabbinstruktioner för användning av din Eee PC. Läs hela manualen för detaljerad information. 1 1. Installera batteripaketet

Läs mer

Paneler - VCPXX.2. Programmeringsmanual för VCP-paneler. Revision 2

Paneler - VCPXX.2. Programmeringsmanual för VCP-paneler. Revision 2 Paneler - VCPXX.2 Programmeringsmanual för VCP-paneler Revision 2 Innehållsförteckning Innehållsförteckning... 2 1 Symbolfiler för kommunikation via IndraLogic... 3 2 Uppsättning i IndraWorks... 6 3 Programmering

Läs mer

OPTIK läran om ljuset

OPTIK läran om ljuset OPTIK läran om ljuset Vad är ljus Ljuset är en form av energi Ljus är elektromagnetisk strålning som färdas med en hastighet av 300 000 km/s. Ljuset kan ta sig igenom vakuum som är ett utrymme som inte

Läs mer

VÄLKOMMEN TILL OWNIT!

VÄLKOMMEN TILL OWNIT! INSTALLATIONSMANUAL Bästa VÄLKOMMEN bredbandskund! TILL OWNIT! VÄLKOMMEN TILL OWNIT! Du har nu mottagit dina uppgifter från Ownit som är är nödvändiga för för dig dig för för att att du du skall skall

Läs mer

Instruktion Programmeringsapp och gränssnitt

Instruktion Programmeringsapp och gränssnitt Instruktion BT och Programmerings-app v. 0. Sida 1 av 5 Instruktion Programmeringsapp och gränssnitt Observera, instruktionen bearbetas och uppdateras fortfarande. Kolla då och då www.mollehem.se/doc/instuktion/instruktion_programmering.pdf

Läs mer

En introduktion till WeavePoint 7 demo version. Att använda ett vävprogram

En introduktion till WeavePoint 7 demo version. Att använda ett vävprogram En introduktion till WeavePoint 7 demo version Demoversionen är det fullständiga WeavePoint med undantag för att det inte går att spara egna mönster. Det går att testa olika sätt att skriva ut de exempel

Läs mer

Grundläggande datorkunskap

Grundläggande datorkunskap Grundläggande datorkunskap Vissa nybörjare känner sig väldigt osäkra Man kan förstora texten på skärmen genom att trycka på Ctrl + SeniorNet Lidingö 2014-11-10 Mamma får en gammal dator av sin son men

Läs mer

Gemensamt projekt: Matematik, Beräkningsvetenskap, Elektromagnetism. Inledning. Fysikalisk bakgrund

Gemensamt projekt: Matematik, Beräkningsvetenskap, Elektromagnetism. Inledning. Fysikalisk bakgrund Gemensamt projekt: Matematik, Beräkningsvetenskap, Elektromagnetism En civilingenjör ska kunna idealisera ett givet verkligt problem, göra en adekvat fysikalisk modell och behandla modellen med matematiska

Läs mer

Snabbguide Starter System 3.2

Snabbguide Starter System 3.2 3.2 Innehållsförteckning ii / 12 Innehållsförteckning 1 Ingår i leveransen... 3 2 Förutsättningar... 4 3 De första stegen... 5 4 Information och hjälp... 12 1 Ingår i leveransen 3 / 12 1 Ingår i leveransen

Läs mer

Ögonstyrning tillsammans med The Grid 2

Ögonstyrning tillsammans med The Grid 2 Ögonstyrning tillsammans med The Grid 2 Ögonstyrning används alltmer av personer med mycket begränsad eller otillförlitlig rörlighet. Både för kommunikation och som styrsätt till dator. Integration med

Läs mer

Vad händer egentligen före en krasch? Svarta lådor och tidsmaskiner sparar pengar för företag

Vad händer egentligen före en krasch? Svarta lådor och tidsmaskiner sparar pengar för företag PRESSRELEASE 2003-02-07 Vad händer egentligen före en krasch? Res bakåt i tiden och se hur och varför programmet uppförde sig fel! Svarta lådor och tidsmaskiner sparar pengar för företag Svarta lådor och

Läs mer

Ikot steg 4. Grupp F5

Ikot steg 4. Grupp F5 Ikot steg 4 Grupp F5 Innehållsförteckning 4.1 INVERTERA KÄNDA KONCEPT OCH IDÉER... 3 4.1.1 KONKURRENTERS LÖSNINGAR... 3 Alternativ 1- Luddlåda... 3 Alternativ 2 Dike golvbrunn... 3 Alternativ 3 Filter...

Läs mer

Datorövning 1 Calc i OpenOffice 1

Datorövning 1 Calc i OpenOffice 1 Datorövning 1 Calc i OpenOffice 1 1 OpenOffice Calc Till förmån för de som följer kursen Fysikexperiment för lärare skall vi här gå igenom några få exempel på hur OO Calc (motsvarar MS Excel) kan användas

Läs mer

Linjär Algebra, Föreläsning 2

Linjär Algebra, Föreläsning 2 Linjär Algebra, Föreläsning 2 Tomas Sjödin Linköpings Universitet Riktade sträckor och Geometriska vektorer En (geometrisk) vektor är ett objekt som har storlek och riktning, men inte någon naturlig startpunkt.

Läs mer

Instruktion till. PigWin PocketPigs. Del 1 - Installation 2008-07-10

Instruktion till. PigWin PocketPigs. Del 1 - Installation 2008-07-10 Instruktion till PigWin PocketPigs Del 1 - Installation 2008-07-10 INNEHÅLL Installation...3 Förberedelser - pocket...3 Förberedelser - PC...3 PocketPigs...4 Pocket PC nr. 2...5 Installation av AgroSync...6

Läs mer

Umgås på nätet KAPITEL 6. Chatta via webbläsaren

Umgås på nätet KAPITEL 6. Chatta via webbläsaren KAPITEL 6 Umgås på nätet Internet håller alltmer på att utvecklas till en parallellvärld med vår vanliga tillvaro. Man spelar spel över nätet, bygger upp virtuella världar med virtuella prylar och virtuella

Läs mer

Modbus över Ethernet. WAGO Contact SA TSS STR 2011 1

Modbus över Ethernet. WAGO Contact SA TSS STR 2011 1 Modbus över Ethernet WAGO Contact SA TSS STR 2011 1 Modbus över Ethernet En enorm mängd produkter stöder modbus. Modbus kallas ibland för automationens minsta gemensamma nämnare. Kanske är det för att

Läs mer

Flerfunktionell Digitalkamera

Flerfunktionell Digitalkamera Svenska Flerfunktionell Digitalkamera Användarhandledning ii Svenska Användarhandledning för digitalkamera INNEHÅLLSFÖRTECKNING IDENTIFIERA KOMPONENTERNA... 1 IKONER PÅ LCD-DISPLAY... 2 FÖRBEREDELSER...

Läs mer

System 800xA Smart Client

System 800xA Smart Client System 800xA Smart Client Med Smart Client kan du ägna dig åt att analysera data istället för spendera tid på att samla in den Visst skulle fler inom ditt företag ha nytta av den produktions- och processinformation

Läs mer

n-abler är lämplig för alla åldersgrupper med motoriska svårigheter och för dem som arbetar långa perioder vid datorn.

n-abler är lämplig för alla åldersgrupper med motoriska svårigheter och för dem som arbetar långa perioder vid datorn. n-abler Trackball Produktbeskrivning n-abler Trackball är särskilt utformad för datoranvändare med begränsad handkontroll, motoriska svårigheter, dålig hand-öga-koordination, begränsad fingerfärdighet,

Läs mer

Fröken Ur - En mångfacetterad dam Kenneth Jaldehag SP Sveriges Provnings- och Forskningsinstitut, Borås www.sp.se Anders Karlsson och Jan Smith Cendio Systems AB, Linköping www.cendio.se UppLYSning Linköpings

Läs mer

Liten handledning i Excel och StarOffice Calc i anslutning till Datorövning 1

Liten handledning i Excel och StarOffice Calc i anslutning till Datorövning 1 STOCKHOLMS UNIVERSITET 2004-11-04 MATEMATISK STATISTIK Sannolikhetslära och statistik för lärare Liten handledning i Excel och StarOffice Calc i anslutning till Datorövning 1 Programmet StarOffice Calc

Läs mer

RadioFrekvensIdentifiering (RFID)

RadioFrekvensIdentifiering (RFID) SIS/TK446 Automatisk Identifiering och Datafångst En teknik för automatisk identifiering och datafångst Resumé Detta dokument ger en kort överblick av, vad det är, systemet, frekvenser, en jämförelse med

Läs mer

Installationsguide Huawei E367

Installationsguide Huawei E367 TA 00 000 Installationsguide Huawei E367 Med vårt mobila bredband ansluter du dig mycket enkelt till internet. Sätt in ditt SIM-kort i modemet Huawei E367 och anslut det till datorns USB-port. Installationsprogrammet

Läs mer

Datorlaboration :: 1 Problembeskrivning ::

Datorlaboration :: 1 Problembeskrivning :: Datorlaboration :: Ett hyrbilsföretags problem Laborationen går ut på att lösa Labbuppgift 1 till 5. Laborationen redovisas individuellt genom att skicka laborationens Mathematicafil till Mikael Forsberg

Läs mer