institutionen för datavetenskap - diva portal293685/fulltext01.pdf · 1.6 struktur rapporten har...

106
Institutionen för datavetenskap Department of Computer and Information Science Examensarbete Operatörpanel för ett flexibelt monteringssystem av Daniel Karlsson LIU-IDA/LITH-EX-A--09/048--SE 2009-11-10 Linköpings universitet SE-581 83 Linköping, Sweden Linköpings universitet 581 83 Linköping

Upload: others

Post on 21-Aug-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Institutionen för datavetenskapDepartment of Computer and Information Science

Examensarbete

Operatörpanel för ett flexibelt monteringssystem

av

Daniel Karlsson

LIU-IDA/LITH-EX-A--09/048--SE

2009-11-10

Linköpings universitetSE-581 83 Linköping, Sweden

Linköpings universitet581 83 Linköping

Page 2: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Linköpings universitetInstitutionen för datavetenskap

Examensarbete

Operatörpanel för ett flexibelt monteringssystem

av

Daniel Karlsson

LIU-IDA/LITH-EX-A--09/048--SE

2009-11-10

Handledare: Henrik KihlmanExaminator: Jonas Wallgren

Page 3: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

SammanfattningFixturer är vanliga i tillverkningsindustrin för att hålla detaljer på plats under tiden de monteras samman. Det vanliga är att fixturerna konstrueras för varje specifik uppsättning av detaljer som ska fixeras. Ibland uppstår behovet att kunna justera fixturer så att de kan återanvändas. Den typ av flexibel fixtur som används i detta arbete har fått namnet flexapod.

Arbetets resultat är ett grafiskt användargränssnitt, en operatörspanel, som hjälper operatören med justeringen av flexapoderna. Målet för operatören är att justera längden på flexapodens sex ben så att flexapoden hamnar i önskat läge. Operatörspanelen vägleder operatören med två vyer, en flexapodvy och en översiktsvy, och ett diagram som förmedlar felet mellan benens egentliga och önskade längder. En lasermätare ger data om flexapodens egentliga inställning till operatörspanelen.

Applikationen har utvecklats i Visual Basic 6. Ett antal komponenter från tredje part används också. Rapporten behandlar även paketeringen av mjukvaran och tillhörande komponenter med Nullsoft Script Install System.

Page 4: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Innehållsförteckning Sammanfattning.................................................................................................................................11 Inledning..........................................................................................................................................4

1.1 Bakgrund..................................................................................................................................41.2 Syfte.........................................................................................................................................51.3 Avgränsningar..........................................................................................................................51.4 Metod.......................................................................................................................................51.5 Källor.......................................................................................................................................51.6 Struktur....................................................................................................................................6

2 Koordinatsystem..............................................................................................................................72.1 Position och riktning................................................................................................................72.2 Transformation av ramar..........................................................................................................72.3 Rotationer.................................................................................................................................8

3 Flexapod - flexibel fixtur...............................................................................................................103.1 Översikt..................................................................................................................................103.2 Matematisk modell................................................................................................................123.3 Beräkning av benlängdsfel.....................................................................................................133.4 Känslighetsanalys..................................................................................................................14

4 Grafiskt användargränssnitt...........................................................................................................154.1 Krav.......................................................................................................................................154.2 Det ursprungliga användargränssnittet..................................................................................16

4.2.1 Operatörspanel...............................................................................................................164.2.2 Emulator.........................................................................................................................17

4.3 Benlängdsfel..........................................................................................................................184.4 Flexapodvy.............................................................................................................................204.5 Översiktsvy............................................................................................................................214.6 Operatörspanelens utseende efter avslutat arbete..................................................................22

5 Frame-klassen................................................................................................................................256 Kommunikation med mätutrustning..............................................................................................267 Paketering......................................................................................................................................288 Analys av resultat..........................................................................................................................31 Referenser........................................................................................................................................32 Bilaga A – Arkitekturbild av mjukvaran..........................................................................................33 Bilaga B - Källkod...........................................................................................................................34

OPERATÖRSPANELEN (PROJEKTET).vbp...........................................................................34 Flexapod Control Panel.frm........................................................................................................36 Constants.bas..............................................................................................................................73 emScon.bas.................................................................................................................................75 Graphics3D.bas...........................................................................................................................77 OpenFileDialog.bas....................................................................................................................84 Public_Objects.bas......................................................................................................................86 V5lib.bas.....................................................................................................................................87 cMathlib.cls.................................................................................................................................89 FlexapodManager.cls..................................................................................................................99 Frame.cls...................................................................................................................................100 PickupManager.cls....................................................................................................................103

2

Page 5: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

IllustrationsförteckningIllustration 1: En komplett uppställning: BoxJoint, flexapoder, mätsystem, operatör och operatörspanel.......................................................................................................................................4Illustration 2: Opertörpanelens utseende i prototypen........................................................................16Illustration 3: Emulatorns utseende i prototypen................................................................................17Illustration 4: Stapeldiagrammet när det fortfarande ritades med egen kod......................................18Illustration 5: Stapeldiagrammets utseende med komponenten MSChart.........................................19Illustration 6: Flexapodvyns utseende i prototypen............................................................................20Illustration 7: Den förbättrade flexapodvyn.......................................................................................21Illustration 8: Översiktsvyn implementerad med Cortona VRML Viewer.........................................22Illustration 9: Användargränssnitt - Koordinatsystem i vanliga textrutor..........................................23Illustration 10: Användargränssnitt - Viktiga parametrar i stort format.............................................24Illustration 11: Mätutrustningen - en Leicatracker.............................................................................26

TabellförteckningTabell 1: Namn på och beskrivning av matriser som ingår i flexapodens matematiska modell........12Tabell 2: Gränser för skalning av benlängdsfel..................................................................................20Tabell 3: Beskrivning av metoder i klassen Frame.............................................................................25

3

Page 6: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

1 InledningSyftet med detta kapitel är att ge en introduktion till arbetet och att beskriva rapportens uppbyggnad.

Arbetet beställdes och handleddes av Henrik Kihlman, forskarassistent på IEI / Avdelningen för monteringsteknik. Examinator för arbetet var Jonas Wallgren, IDA / Avdelningen för programvara och system (SaS). Arbetet utfördes inledningsvis på IEI / Avdelningen för monteringsteknik och i slutskedet på SAAB i Linköping.

1.1 BakgrundSAAB Aerostructures i Linköping utvecklar ett förarlöst flygplan som bär namnet Neuron, ungefär så stort som deras nuvarande JAS 39 Gripen. Endast ett plan ska tillverkas och detta ställer stora krav på produktionen för att hålla kostnaderna nere. Ett flygplan består av många detaljer som måste fogas samman med svetsning och andra tekniker. Delarnas tyngd och de toleranskrav som ställs på fogarna gör det nödvändigt att använda fixturer som håller delarna på sin rätta plats under sammanfogningen. Tillsammans med SAAB Aerostructures har Linköpings Universitet under många år forskat kring hur montering kan effektiviseras. Resultatet är framtagandet av ett nytt koncept för utformningen av fixturer. Det speciella med dessa fixturer är att de är omställbara med hjälp av justerbara ben. Justeringen av benens längder utförs manuellt av en operatör, som till sin hjälp har en dator med programvara (kallad operatörspanel) som vägleder operatören att ställa in fixturen så att den erhåller en önskad konfiguration. Operatörspanelen kommunicerar med ett mätsystem för att erhålla den flexibla fixturens egentliga konfiguration. De flexibla fixturerna monteras på ett BoxJoint-system, ett mekaniskt ramverk.

Fördelen med detta fixturkoncept är möjligheten att använda en fixtur till flera monteringssteg,

4

Illustration 1: En komplett uppställning: BoxJoint, flexapoder, mätsystem, operatör och operatörspanel

Page 7: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

eftersom varje fixtur är flexibel och inte är tillverkad för ett enskilt monteringssteg. Tillverkningen av unika fixturer för varje monteringssteg är då inte längre nödvändig och det är både kostnadseffektivt och tidsbesparande i ett projekt likt Neuron. Den extra tid som krävs för att justera de flexibla fixturerna påverkar inte projektets tidsåtgång nämnvärt eftersom endast ett flygplan ska byggas. Uppskattningsvis kan det behövas omkring 40 stycken flexibla fixturer i tillverkningen av Neuron.

1.2 SyfteKraven på noggrannhet är mycket höga när fixturen ska justeras. Utan noggrann mätning och vägledning är det inte möjligt för operatören att kunna genomföra en inställning av en fixtur. Det ställs alltså krav på att mätningen är tillräckligt noggrann och att operatörspanelen tydligt kan presentera den information som operatören behöver. I examensarbetet ingår det att ta fram en sådan operatörspanel. Vid arbetets början fanns det redan en prototyp framtagen som hade en del grundläggande funktionalitet och som det var möjligt att utgå ifrån i den fortsatta utvecklingen, men det var också många funktioner som saknades i prototypen.

Det ska även göras en enkel känslighetsanalys, vars syfte är att erhålla en grov uppskattning av hur stora fel som får finnas i den flexibla fixturens ingående delar.

En viktig följdfråga är den som rör inställningens konvergens, att operatören med hjälp av operatörspanelens information alltid kommer närmre och närmre den önskade konfigurationen med ett tillräckligt litet fel.

1.3 AvgränsningarEtt sådant här projekt kan växa sig mycket stort men tiden är begränsad och det måste göras vissa avgränsningar. Två viktiga sådana avgränsningar är dels valet att behålla så mycket av den ursprungliga koden som möjligt och dels att inte göra en känslighetsanalys av hemmalägesfel. Båda dessa val sparar givetvis en del tid som kan läggas på annat. Svårigheten att bestämma det sistnämnda beskrivs i avsnittet Känslighetsanalys.

1.4 MetodExamensarbetet inleddes med en litteraturstudie. Därefter undersöktes den mjukvaruprototyp som fanns tillgänglig. Dels undersöktes hur prototypen användes, dels studerades källkodens uppbyggnad. Efter det kunde programmeringen påbörjas. Många beslut om operatörspanelens funktion och utseende togs under arbetets gång. Detta arbetssätt brukar benämnas lättrörlig (engelska agile) utveckling.

1.5 KällorHär presenteras några av de källor som har använts i detta arbete, den fullständiga förteckningen är tillgänglig under rubriken Referenser. Teorin om ramar och transformationer erhölls från en lärobok i ämnet, Introduction to robotics av John J. Craig. I denna bok var det några inledande kapitel om koordinatsystem som var av intresse för arbetet. Information om programmering i Visual Basic 6 har hämtats från Microsofts webbportal MSDN Library, företagets officiella källa på Internet för produktdokumentation. Information har också hämtats från många andra källor på Internet. Det rör framför allt information om komponenter och kod som har utvärderats och eventuellt använts i operatörspanelen.

5

Page 8: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

1.6 StrukturRapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som har varit viktiga i arbetet. Dessa är koordinatsystem och ramar och manipuleringen av dem. I avsnittet Flexapod - Flexibel fixtur beskrivs vad en flexapod är och hur den beskrivs matematiskt följt av en känslighetsanalys. Därefter sker en genomgång av viktiga delar av operatörspanelens användargränssnitt i kapitlet Grafiskt användargränssnitt. Målet med detta kapitel är att ge en bild av vad som har hänt med de olika delarna i användargränssnittet under arbetets gång. I kapitlet Frame-klassen beskrivs en viktig klass som har skapats för hantering av ramar. Kommunikation med mätutrustningen beskrivs i kapitlet Kommunikation med mätutrustning. Rapporten avslutas med en analys av arbetets resultat.

I bilaga A återfinns en bild av mjukvarans arkitektur i syfte att synliggöra dess struktur.

I bilaga B listas all källkod som tillhör operatörspanelen.

6

Page 9: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

2 KoordinatsystemDetta kapitel introducerar läsaren till den matematiska teorin som ligger till grund för kommande kapitel. Kapitlet inleds med ett avsnitt om hur position och riktning respresenteras och på det följer ett avsnitt om transformation av ramar. Därefter avslutas kapitlet med ett avsnitt som behandlar rotation av ramar.

2.1 Position och riktningTerminologi och faktauppgifter i detta stycke är tagna från Thompson & Martinsson (1991). Ett koordinatsystem används för att kunna representera punkter med koordinatvärden. Fortsättningsvis antas alla koordinatsystem vara ortonormerade. Det som bestämmer ett ortonormerat koordinatsystem är ett origo och tre vektorer som är inbördes ortogonala och normerade (har längden ett). En punkt beskrivs med en ortsvektor som kan tolkas som en linjärkombination av koordinatsystemets vektorer som spänner upp rummet. Dessa tre vektorer utgör tillsammans en bas för ett vektorrum. Om en riktning ska representeras i rummet kan det ske med en riktningsvektor som består av tre riktningstal - ett för varje basvektor.

Position och riktning är tillräckligt för att beskriva en fast kropps placering i rymden, t.ex. en led på en robot, relativt en godtycklig punkt. Denna punkt är origo i ett koordinatsystem A. Position och riktning för ett objekt kan då beskrivas som en förflyttning respektive en rotation av A. Det ger upphov till ett nytt koordinatsystem B i koordinatsystem A. Detta sätt att beskriva ett koordinatsystem uttryckt i ett annat koordinatsystem kommer från och med nu att kallas för en ram. Ramarna implementeras som matriser i programvaran.

2.2 Transformation av ramarInformationen i detta avsnitt är baserad på uppgifter ur Craig (1986).

En viktig funktion i operatörspanelen är möjligheten att beskriva en ram uttryckt i en annan ram. Det problemet kan hanteras med koordinattransformationer.

Låt säga att det finns två ramar, A och B, och en punkt Q. Koordinaterna för Q är angivna i ramen B, som i sin tur befinner sig i det rum som definieras av ramen A.

Hur bestäms PA ? Med en rotationsmatris RBA (mer om den i nästa avsnitt) kan ekvationen

PA = RBA PB PBORG

A ställas upp. PBORGA är ortsvektorn i ram A för origo i ramen B. Med

matrisalgebraiska manipulationer kan PA lösas ut ur nyss nämnda ekvation. Genom att behandla rotationen och ortsvektorn som en matris kan ekvationen förenklas till PA = TB

A PB , där T är en

7

A

B

Q

APBORG

BP

AP

Page 10: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

homogen transform. Ekvationen har i matrisform följande utseende

2.3 RotationerFör att hantera rotationer med den homogena transformen behövs rotationsmatrisen RB

A . Ett problem med rotationsmatriser är att de är en abstrakt konstruktion. Vad som behövs är en mer intuitiv representation av rotationer så att det blir enklare att specificera dem. Det finns många sådana representationer. I det här avsnittet kommer två representationer att nämnas, de två som används i detta projekt.

Den ena representationen är eulervinklar och beskriver en godtycklig rotation med tre stycken vinklar. Den variant av eulervinklar som har använts i projektet är den som först roterar kring z-axeln och sedan kring det roterade koordinatsystemets y-axel och slutligen kring det roterade koordinatsystemets x-axel. Med denna rotationsordning är rotationsmatrisen lika med den matris som följer.

Det är minst lika viktigt att kunna beräkna vinklarna från en given rotationsmatris. Här är formler för detta.

Atan2(y, x) är en variant av funktionen arcustangens. Den har till skillnad från arcustangens två argument. Atan2 beräknar vinkeln i radianer motsols mellan x-axeln och punkten (x,y). Resultatet ligger i intervallet ]-pi,pi]. Metoden atan2 kan implementeras som så att den beräknar vinkeln arctan ∣y / x∣ och att den sedan manipuleras med hänsyn till den kvadrant punkten (x,y) tillhör.

Ett problem med eulervinklar är att en del rotationer inte har en unik uppsättning eulervinklar (Craig 1986), men det skapar inga problem i detta arbete.

8

[ PA

⋯1]=[ ⋮

RBA ⋮ P BORG

A

⋮⋯ ⋯ ⋯ ⋯ ⋯0 0 0 ⋮ 1

][ PB

⋯1]

Rot y=arctan2−R31 ,R112 R21

2

Rot x=arctan2R32 /cos Rot y , R33/cos Rot y

Rot y=arctan2R21 /cos Rot y ,R11 /cos Rot y

atan2 y , x=arctan yx

[ cos K cos −sin K cos sinsin K coscos K sinsin cos K cos−sin K sinsin −cos sinsin K sin−cos K sincos cos K sinsin K sincos cos cos ]

Page 11: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Den andra representationen som används är kvaternioner och består av fyra tal, q0 till q3, som entydigt bestämmer en rotation i rummet. Från dessa fyra parametrar erhålls nedanstående rotationsmatris.

9

[q02q1

2−q22−q3

2 2 q1 q2−q0 q3 2 q1 q3q0 q22q1 q2q0 q3 q0

2−q12q2

2−q32 2 q2 q3−q0 q1

2q1 q3−q0 q2 2 q3 q2q0 q1 q02−q1

2−q22q3

2]

Page 12: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

3 Flexapod - flexibel fixturI detta kapitel beskrivs ges en översiktlig beskrivning av den flexibla fixturens konstruktion, hur den behandlas matematiskt i operatörspanelen och hur benlängdsfelen beräknas. Kapitlet avslutas med en analys av det inställningsfel av flexapoden som uppkommer på grund av en inkorrekt bestämning av hemmaläget.

3.1 ÖversiktKonceptet med flexibla fixturer har fått namnet flexapod. Teckning 1 visar hur en Flexapod ser ut och namnet på ingående komponenter.

En flexapod består i grova drag av en bottenplatta, en topplatta och sex stycken ben. Bottenplattan monteras på ett ramverk som kallas för BoxJoint. Benens längder kan justeras så att topplattan kan röra sig i förhållande till bottenplattan. Detta är möjligt tack vare leder i infästningspunkterna i benens ändar. Det som ska hållas av flexapoden monteras inte direkt på verktygshållaren utan på en led (pickup). Under tiden inställningen pågår sitter en mätprob monterad på flexapoden, på verktygshållaren eller på pickupen.

Inställningen av en flexapod går till så här:

1. Topplattan trycks ned så långt det är möjligt. Flexapoden ska vara så noggrant konstruerad att detta läge är väl definierat. Flexapoden befinner sig nu i det s.k. hemmaläget.

2. Nu utförs en grovinställning av flexapodens topplatta genom att dra i denna. Grovinställningen pågår tills inställningsfelet är mindre än 1 cm.

3. Verktyg för finjustering monteras på alla sex ben. Klämmor på verktyget fäster verktyget upptill och nertill på benen.

4. Finjusteringen utförs med dessa specialverktyg. På verktygen finns det en skruv som gör det möjligt att justera benlängden mycket exakt.

5. När avståndet till den önskade punkten är nära 0,1 mm fixeras benen med hydraullås.

10

Page 13: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

11Teckning 1: Namn på flexapodens detaljer.

Bottenplatta

Ben

Hydraullås

Topplatta

PickupMätprob

Verktygshållare

Page 14: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

3.2 Matematisk modellFör att göra en korrekt inställning av flexapoden måste det finnas en mjukvara som instruerar operatören hur den ska manipulera topplattan och benen så att flexapodens verktygshållare hamnar i rätt position och riktning. För detta krävs det en modell av flexapoden som kan ge sambandet mellan verktygshållarens ram och längden på benen.

De variabler som behövs för den matematiska modellen är uppställda i tabell 1.

Teckning 2 visar hur ramarna (Origo, Botten, Verktyg, Mät och Prob) och transformationerna är definierade på flexapoden. Ramarna visas som cirklar och transformationer som pilar. Pilens riktning har betydelse. Om pilen är riktad från ram A till ram B så betyder det att transformationen beskriver ram B relativt (i koordinatsystemet för) ramen A.

Namn Beskrivning

PBottenOrigo Botten i koordinatsystemet för Origo.

P MålVerktygBotten Verktyg uttryckt i koordinatsystemet för Botten (det önskade värdet).

P NuVerktygBotten Verktyg uttryckt i koordinatsystemet för Botten (det nuvarande värdet).

P HemmaVerktygBotten Verktyg uttryckt i koordinatsystemet för Botten i flexapodens hemmaläge.

PMätVerktyg Mät uttryckt i koordinatsystemet för Verktyg.

PProbMät Prob uttryckt i koordinatsystemet för Mät.

BBotten Sex ortsvektorer med benens fästpunkter på bottenplattan uttryck i Botten.

BTopp Sex ortsvektorer med benens fästpunkter på topplattan uttryck i Verktyg.

BLängd , nu Benens längder i den nuvarande konfigurationen.

BLängd , mål Benens längder i den önskade konfigurationen.

Tabell 1: Namn på och beskrivning av matriser som ingår i flexapodens matematiska modell.

12

Page 15: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

3.3 Beräkning av benlängdsfelEn viktig information som operatören behöver få veta är hur benen ska justeras så att den önskade konfigurationen uppnås. I operatörspanelen visas därför benlängdsfelet, BLängd , nu−BLängd , mål , för alla sex ben. Notera att det inte är fråga om ett absolutbelopp eftersom operatören måste få veta om benet är för långt eller för kort. Ett positivt värde anger att benet är för långt och ett negativt värde att benet är kort.

Beräkningen av benlängdsfel kan delas upp i sex delar.

1. Bestäm hemmaläget: PBottenOrigo

2. Beräkna topplattans nuvarande ram uttryckt i bottenplattans ram: P NuVerktygBotten

3. Beräkna nuvarande benlängder: BLängd , nu

4. Flexapodens önskade inställning, som är lika med topplattans önskade ram uttryckt i bottenplattans ram P MålVerktyg

Botten , är given på förhand.

13

Teckning 2: Ramarnas placeringar i den matematiska modellen för en flexapod.

Origo

Botten

Verktyg

Mät

Prob

Page 16: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

5. Beräkna önskade benlängder: BLängd , mål

6. Beräkna benlängdsfelen: BLängd , nu−BLängd , mål

Här följer en mer noggrann beskrivning av hur benlängdsfelen beräknas.

Ekvation 1 uttrycker sambanden mellan flexapodens ramar.

PProbOrigo = PBotten

Origo ⋅ PVerktygBotten ⋅ PMät

Verktyg ⋅ PProbMät (1)

Löses PBottenOrigo ut ur ekvation 1 erhålls, om flexapoden befinner sig i hemmaläget, ekvation 2 som ger

hemmalägets ram uttryckt i mätutrustningens origo.

PBottenOrigo = PProb

Origo ⋅ P−1ProbMät ⋅ P−1

MätVerktyg ⋅ PHemma

−1Verktyg

Botten (2)

P HemmaVerktygBotten i ekvation 2 uttrycker verktygshållarens position relativt bottenplattans

koordinatsystem när flexapoden är ställd i hemmaläget.

Därefter beräknas de nuvarande benlängderna. Först måste P NuVerktygBotten bestämmas vilket är möjligt

med ekvation 1.Då erhålls ekvation 3.

P NuVerktygBotten = P−1

BottenOrigo ⋅ PProb

Origo ⋅ P−1ProbMät ⋅ P−1

MätVerktyg (3)

De nuvarande benlängderna beräknas med ekvation 4.

BLängd , nu= PNuVerktygBotten ⋅BTopp−BBotten (4)

De önskade benlängderna beräknas med ekvation 5.

BLängd , mål= PMålVerktygBotten ⋅BTopp−BBotten (5)

Slutligen beräknas benlängdsfelet med uttryck 6.BLängd , nu−BLängd , mål (6)

3.4 KänslighetsanalysEn önskan av handledaren var att göra en analys av det fel i den slutgiltiga inställningen av flexapoden som uppkommer av ett fel i bestämmandet av hemmalägets position och riktning.

Om det finns ett fel i hemmalägets bestämning så innebär det att benlängdsfelen inte alla kan bli noll samtidigt. Justeras ett ben så kommer det att påverka de andra benlängderna i flexapodmodellen, de som förmedlas av operatörspanelen. Resultatet blir att inställningen av flexapoden inte konvergerar.

Benlängdsfelen som uppkommer av fel i bestämmandet av hemmaläget kan beräknas med formel (7), där ΔP beskriver hemmalägets positions- och orienteringsfel.

BLängd=P−1⋅ PProbOrigo ⋅ P−1

ProbMät ⋅ P−1

MätVerktyg ⋅BTopp (7)

Av högerledet i (7) kan uttydas att benlängdsfelet som uppkommer beror av flexapodens konfiguration och pickup.

14

Page 17: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

4 Grafiskt användargränssnittI detta kapitel beskrivs operatörspanelens grafiska gränssnitt. Kapitlet inleds med de krav som ställdes på operatörspanelen. Därefter behandlas den prototyp som låg till grund för detta arbete. Resten av kapitlet beskriver de förbättringar som har genomförts i operatörspanelens olika grafiska komponenter. Ett avsnitt ägnas till varsin komponent. Kapitlet avslutas med ett avsnitt som visar operatörspanelens utseende i arbetets slutskede.

4.1 KravKihlman ställde dessa krav på operatörspanelen.

● Operatörspanelen ska ha ett användarvänligt användargränssnitt.

● Operatörspanelen ska kommunicera med mätutrustning för bl.a. konfigurering och inhämtning av mätvärden.

● Operatörspanelen ska visa relevanta koordinatsystem.

● Operatören ska ha möjlighet att välja vilken, bland flera flexapoder, som ska justeras för tillfället..

● Operatören ska kunna välja vilken pickup som är monterad på flexapodens verktygshållare.

● En översiktsvy i användargränssnittet ska visa alla flexapoder i en uppställning och upplysa operatören vilken flexapod som är vald för tillfället.

● En flexapodvy i användargränssnittet ska tredimensionellt visa topplattans nuvarande och önskade position för den valda flexapoden.

● Operatörspanelen ska förmedla benlängdsfelen på ett sätt som tydligt visar operatören hur flexapodens ben ska justeras.

● Operatörspanelen måste kunna beräkna hemmaläget för en flexapod.

● Operatörspanelen ska kunna hämta önskade positioner och annan relevant information från fil.

Ett av de ursprungliga kraven var att göra användargränssnittet mer användarvänligt och att lägga till de funktioner som saknades i prototypen.. Prototypen behövde bli mer tilltalande för operatören.

Någon styrning av mätutrustning fanns inte. Prototypen använde sig av emulator som simulerade mätningar på en flexapod. Användaren angav hur benlängderna skulle justeras i ett emulatorfönster. Dessa justeringar skickades till CATIA, ett CAD-system, som hade en enkel modell av en flexapod inladdad. Benlängderna och modellens geometri uppdaterades och den nya positionen för topplattan kunde hämtas av emulatorn som sedan skickade detta vidare till operatörspanelen. På detta sätt kunde prototypens korrekthet verifieras.

Kravet på att visa koordinatsystem var till viss del redan implementerat. Position och riktning visades med sex värden för några ramar. Med den fortsatta utvecklingen skulle det bli aktuellt att visa fler ramar. Dessutom fanns önskemål om att visa ramarna grafiskt i flexapodvyn, något som inte blev implementerat under arbetets gång.

Att kunna hantera pickuper på flexapoderna kräver att en transformation kan läsas in från fil. Transformationen anger hur pickupen, som är en led, är beskaffad.

En översiktsvy fanns redan i prototypen men den kunde göras betydligt mer tilltalande och det saknades möjligheter att manipulera vyns utsiktspunkt med knappar. Det ansågs också behövas en

15

Page 18: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

översiktsvy som visar alla flexapoder i en uppställning och vilken flexapod som är vald för tillfället.

Benlängdsfelen visades med staplar i prototypen men det fanns en önskan om att den skulle utökas med olika färger beroende på felets storlek. En skala som anpassar sig efter staplarnas längder visade sig också vara nödvändigt.

Inställningen av hemmaläge och läsning av data från fil, t.ex. transformationer för pickuper och önskade inställningar för varje flexapod, behövde implementeras.

4.2 Det ursprungliga användargränssnittetPrototypen bestod av två delar - en operatörspanel och en emulator. Här följer två avsnitt som visar hur dessa såg ut och hur de fungerade.

4.2.1 OperatörspanelIllustration 2 visar hur operatörspanelen såg ut i prototypen.

Längst upp till vänster kunde användaren välja vilken flexapod som skulle justeras och vilken pickup som var monterad på flexapoden, men funktionaliteten för dessa var ännu inte implementerad. Under detta är två knappar placerade. Den ena med texten 'Rough' var tänkt att användas för grovjusteringen och knappen med texten 'Fine' när användaren påbörjade finjusteringen. Det var tänkt att operatörspanelen skulle ha två lägen för respektive typ av justering men det övergavs senare. Den enda skillnaden mellan grov- och finjustering är att operatören använder sig av olika data och dessa kan presenteras samtidigt i operatörspanelen. Den tredje knappen med texten 'Home Position Preset' memorerade flexapodens hemmaläge förutsatt att

16

Illustration 2: Opertörpanelens utseende i prototypen

Page 19: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

flexapoden befann sig i hemmaläget. Nere i vänstra hörnet visades benlängdsfelen med staplar. Själva staplarna syns inte i illustration 2. Uppe till höger syns flexapodvyn med tillhörande rullningslister för att kunna rotera vyn. Under denna vy kunde användaren se position och riktning för några utvalda ramar.

4.2.2 EmulatorIllustration 3 visar hur emulatorfönstret såg ut i prototypen.

I prototypen var emulatorfönstret applikationens huvudfönster och för att visa operatörspanelen tryckte användaren på knappen 'Control Panel' nere till höger. De viktigaste elementen i fönstret var knapparna + och - för respektive ben. Mellan dessa knappar visades benens längder. Uppe till

17

Illustration 3: Emulatorns utseende i prototypen.

Page 20: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

vänster fanns en ruta i vilken användaren kunde ange hur mycket han eller hon ville förändra benlängden med ett tryck på + eller - knapparna. Upp till höger syns ramen för verktygshållaren. Ville användaren återgå till hemmaläget tryckte han eller hon på knappen 'Go to Home Position'.

4.3 BenlängdsfelRedan i prototypen användes ett stapeldiagram för att visa benlängdsfel. Detta sätt att förmedla benlängdsfel har fungerat bra i tester så det bibehölls under arbetets gång. Den ursprungliga lösningen hade dock vissa problem. Ett av problemen var att hela fönstret ritades om efter varje uppdatering, vilket skedde tio gånger i sekunden. Resultatet blev att allt i fönstret flimrade på ett irriterande sätt. Upphovet till detta flimrande fanns i denna programkod som är tagen från prototypen.FillColor = vbRedFillStyle = vbSolid

Refresh

ShapeHeight = CInt(B1diff * k)originY = 7440Line (originX, originY) - (originX + ShapeWidth, originY -

ShapeHeight), vbRed, BProgramkoden visar hur uppdateringen sker av stapeln för ben ett. De andra staplarna uppdateras på exakt samma sätt. De första två raderna tilldelar värden till två variabler som styr utseendet på kommande ritningar. I detta fall ska det som ritas fyllas med en solid röd färg. Därefter anropas Refresh som uppdaterar hela fönstret, det anges nämligen i fönstrets kontext. Detta är anledningen till att fönstret flimrar. Efterkommande kod ritar stapeln för ben ett. Syntaxen för metoden Line är ovanlig. Det första argumentet ska bestå av två koordinater separerade med ett minustecken. Trots att metoden har namnet Line så kan den användas för att rita rektanglar. Ett B som tredje argument anger att en rektangel ska ritas.

För att bli av med flimret krävdes en lösning som inte behövde rita om hela fönstret. Visual Basic

18

Illustration 4: Stapeldiagrammet när det fortfarande ritades med egen kod.

Page 21: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

har ett antal grafiska element som kan placeras ut i ett formulär, ett annat ord för fönster. Ett av dessa element är 'Shape' och det ritar ut en geometrisk form där elementet har placerats ut i formuläret. Vad för typ av form som ska ritas bestäms med elementets egenskaper. Lösningen blev att använda en rektangulär 'Shape' och att placera ut sex stycken sådana i formuläret. Deras höjd sattes till noll och placerades på nollstrecket. För varje ny omgång benlängder så manipulerades rektanglarnas utsträckning dynamiskt under körning. Denna implementation löste problemet med flimret eftersom endast det nödvändiga ritades om, dvs. rektanglarna själv och eventuell bakgrund som behövde ritas om med nytt innehåll.

Det visade sig emellertid att implementationen hade flera brister. Bland annat så förändrades inte staplarnas färger beroende på benlängdsfelens storlek, men det var en enkel sak att rätta till. Ett allvarligare problem var att skalan i stapeldiagrammet inte anpassade sig efter benlängdsfelens storlek. Med en fix skala blev staplarna för små vid den slutliga finjusteringen, eller för stora vid de första grovjusteringarna. Att implementera en skala skulle ha tagit mycket värdefull tid av arbetet. Istället undersöktes ifall det fanns någon färdig komponent som hade den funktionalitet som krävdes. Valet föll på komponenten MSChart därför att den medföljer Visual Basic och har just den funktionalitet som krävdes. MSChart är en komponent som ritar olika former av diagram. Den kan liknas vid diagramfunktionen i ett kalkylprogram. Tyvärr fanns det ingen officiell dokumentation av MSChart att tillgå, men det visade sig att komponentens programmeringsgränssnitt, bestående av både variabler och funktioner, hade intuitiva namn som erhölls via Intellisense i Visual Basic. De grundläggande uppgifterna om programmeringen av MSChart erhölls från Krishnaswamy (2006). Med MSChart fick stapeldiagrammet nu en skala som anpassade sig efter benlängdsfelen och staplarna fick nu också olika färg beroende på felens storlek.

Anpassningen av skalan var i början gjord så att det största och minsta värdet bland alla sex staplars värden bestämda övre och undre gräns på skalan. Det skulle få den konsekvensen att operatören, trots att benlängdsfelen minskar, inte får en tillräckligt tydlig signal om att benlängdsfelen faktiskt har blivit mindre. Lösningen blev att låta stapeldiagrammets skala förändras i fasta steg när alla benlängdsfel har passerat en undre gräns. Skalningen implementerades som en tillståndsmaskin där skalorna utgör tillstånden. Två tabeller anger när skalningen ska ändras. Den ena anger den undre gräns som måste passeras av alla benlängdsfel för att en mindre skala ska visas. Den andra anger

19

Illustration 5: Stapeldiagrammets utseende med komponenten MSChart.

Page 22: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

den övre gräns som måste passeras av alla benlängdsfel för att en större skala ska visas. De övre och undre gränserna sattes på så sätt att det finns en hysteres i omslagen annars skulle mätbruset ge upphov till snabba byten av skalor om ett benlängdsfel fluktuerar kring ett av gränsvärdena. Tabell 2 är en uppställning av de gränser som gäller i operatörspanelen.

Tillstånd Skalans intervall Undre gräns (mm) Övre gräns (mm)0 Varierar 1 -1 0,5 1,252 0,25 0,6253 0,1 0,31254 0,05 0,1255 0,025 0,06256 - 0,03125

Tabell 2: Gränser för skalning av benlängdsfel.

4.4 Flexapodvy

Redan i prototypen fanns en flexapodvy i användargränssnittet. Vyn hanterades då av en komponenten KernelCAD från DInsight. Den har fungerat tillfredsställande under hela arbetet och det har inte funnits någon anledning av ersätta den med något annat. Den funktionalitet som flexapodvyn har blivit utökad med under arbetets gång är möjligheten att rotera vyn med rullister och att zooma. Det fanns också önskemål om att ramarna som hanteras i operatörspanelen skulle kunna visas i flexapodvyn på begäran men det blev aldrig implementerat.

KernelCAD används på följande sätt. Först designas en modell av en topplatta i CATIA och sedan exporteras den till en VRML-fil. Sedan infogas två kopior av denna modell i en GLM-fil med programmet Model Studio som ingår i KernelCAD. GLM-filen kan sedan laddas in med komponenten i operatörspanelen. De två modellerna som finns i GLM-filen kan manipuleras individuellt.

20

Illustration 6: Flexapodvyns utseende i prototypen.

Page 23: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

I den förbättrade versionen är den ena modellen orangefärgad och visar den önskade positionen. Den är alltid placerad i mitten av vyn och rör sig aldrig. Den andra modellen är gråfärgad och visar flexapodens nuvarande position för topplattan. Runt omkring vyn finns en vertikal och en horisontell rullningslist. Dessa används för att navigera i vyn, närmare bestämt för att rotera kring vyns origo där den grå modellen är placerad. Dessutom finns två knappar för att kunna zooma in och ut i vyn.

Under grovinställningen så ska operatören titta på flexapodvyn. Målet för grovinställningen är att få den orange och den gråa topplattan att överlappa varandra så mycket som möjligt. För att hjälpa operatören ytterligare finns det även tillgång till siffror som anger hur stort felet är i X, Y och Z utöver positionsfelet.

4.5 ÖversiktsvySyftet med översiktsvyn är att få en överblick över alla flexapoder som är uppställda och att se vilken av dem operatören har valt att justera. Den valda flexapoden ska utmärka sig med en speciell färg och eller något liknande kännetecken. När operatören har valt en flexapod att justera i operatörspanelen ska översiktsvyn uppdateras så att den valda flexapoden utmärker sig. Möjligheten att kunna navigera i vyn ska också finnas. Översiktsvyn fanns inte med i prototypen utan var något som Kihlman, examensarbetets handledare, tyckte behövdes läggas till.

Kihlman föreslog att översiktsvyn skulle implementeras med 3DXML Player från Dassault Systemes, samma företag som producerar CAD-systemet CATIA. 3D XML Player är ett program för att visa modeller i filformatet 3DXML. 3DXML är ett XML-format för representation av tredimensionella objekt. Filformatet är skapat av Dassault Systemes. Fördelen med att välja 3D XML Player var att CATIA kan exportera sina CAD-ritningar till 3DXML. I 3D XML Player medföljer en komponent som försökte placeras i operatörspanelens formulär men den var inte kompatibel med Visual Basic så detta spår fick överges.

Istället provades KernelCAD. Den komponenten användes redan för flexpodvyn och var mycket enkel att implementera. För att erhålla en fil som KernelCAD kunde läsa så exporterades modellen i CATIA till en VRML-fil. Den laddades in i Modeling Studio som ingår i KernelCAD och sparade modellen som en GLM-fil. Denna fil användes sedan av översiktsvyn i operatörspanelen.

21

Illustration 7: Den förbättrade flexapodvyn.

Page 24: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Problemen var dock flera. Den modell som skulle visas i översiktsvyn var stor och komplex. Den innehöll väldigt mycket geometri. GLM-formatet var inte lämpligt för så stora modeller med tanke på att filen blev omkring 140 MiB stor. Det ska jämföras med VRML-filens 3 MiB. Dessutom var prestandan mycket låg. Det tog 8 sekunder för översiktsvyn att uppdatera sin grafik efter en ändring av utsiktspunkten. En annan lösning med högre prestanda behövdes.

Eftersom VRML-filer exporterades från CATIA undersöktes möjligheten att använda detta format direkt i operatörspanelen. Det som efterfrågades var en komponenter som fungerar i Visual Basic 6 och som var fri från licenskostnader. Den enda komponent som kunde uppbringas var Cortona VRML Client. Prestandan med Cortona var låg men betydligt bättre än KernelCAD. Uppdateringar skedde på omkring sekunden. Eftersom inget bättre alternativ uppkom så behölls Cortona fram till arbetets slutskede, då en ny lösning upptäcktes. Det var Kihlman som kläckte idén att placera 3D XML Player på en webbsida som lades in i operatörspanelens användargränssnitt med en internetkomponent. Med den lösningen höjdes prestandan betydligt jämfört med Cortona. Ett kvarvarande problem med den här lösningen var att komponenten inte alltid startade som den skulle. Orsaken till detta problem var inte känt vid arbetets avslutande.

4.6 Operatörspanelens utseende efter avslutat arbeteKoordinatsystem kan visas på två sätt i operatörspanelen. Det ena sättet är detsamma som i prototypen. Då visas koordinatsystemens parametrar i vanliga textrutor. Varje textruta upptar en liten plats i panelen och det innebär att fler värden kan visas samtidigt. Om operatören befinner sig på ett större avstånd från, vilket ofta är fallet när operatören justerar flexapoden, så blir siffrorna för små för att synas. Operatören kan därför låta panelen visa de viktigaste parametrarna i ett större format.

22

Illustration 8: Översiktsvyn implementerad med Cortona VRML Viewer.

Page 25: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Illustration 9 visar operatörspanelens utsseende när värden visas i vanliga textrutor.

23

Illustration 9: Användargränssnitt - Koordinatsystem i vanliga textrutor

Page 26: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Illustration 10 visar operatörspanelens utseende när värden visas i stort format.

24

Illustration 10: Användargränssnitt - Viktiga parametrar i stort format

Page 27: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

5 Frame-klassenHanteringen av ramar är en mycket stor del av programvaran. Det är många ramar och transformationer som hanteras. Koordinatsystemet måste också presenteras på olika format till användaren. I prototypen utfördes transformationer med en funktion för matrismultiplikation från ett kodbibliotek för matriser. Varje gång en ram skulle representeras numeriskt för användaren så skrevs samma kod om och om igen.

För att abstrahera bort ramarnas matrishantering och förenkla hanteringen av ramar skapades Frame-klassen. Det görs ingen skillnad på transformationer och ramar i koden, båda hanteras likvärdigt av Frame-klassen. Namnet Frame (översätts till ram) är möjligen lite otydligt eftersom klassen även hanterar transformationer.

En ram hanteras som en 4x4 matris internt, d.v.s. en homogen transform. Klassens metoder och dess funktion förklaras kortfattat i tabell 3.

Namn Beskrivningcopy Returnerar en djup kopia av objektet.getMatrix Returnerar en djup kopia av objektets interna matris.setMatrix Tilldelar objektets matris samma värden som den medskickade matrisen.getX Returnerar transformationens förflyttning längs x-axeln.getY Returnerar transformationens förflyttning längs y-axeln.getZ Returnerar transformationens förflyttning längs z-axeln.setOrientation Bestämmer transformationens rotation med hjälp av eulervinklar.getRotationX/Y/Z Bestämmer transformationens eulervinklar.setIdentity Ger transformationen en obefintlig rotation och ingen förflyttning.setTranslation Bestäm transformationens förflyttning längs de tre axlarna.inverse Returnera inversen av transformationen.transform Transformera denna och en annan transformation med varandra

(matrismultiplikation).multiply Multiplicera transformationens matris med en 4x1 vektor.

Tabell 3: Beskrivning av metoder i klassen Frame.

25

Page 28: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

6 Kommunikation med mätutrustningI det här kapitlet beskrivs mätutrustningens funktion och kommunikationen med den.

Flexapodens position mäts kontinuerligt under inställningsförfarandet. Mätningen sker mot den mätprob som monterats på flexapoden, men det är en typ av lasermätare som utför mätningen. Mätutrustningen går under namnet Leicatracker.

Mätsystemet är laserbaserat. Mätpunktens relativa position mäts med interferens. Denna mätprincip ger en mycket låg onoggrannhet men det behövs en referenspunkt att utgå från. Leicatrackern har en funktion som gör denna referenspunkt överflödig. Den har ett system som möjliggör absolut mätning av avståndet till mätpunkten.

Punktens position beräknas tack vare mätinstrumentets riktningsbara laserstråle. Den kan roteras både horisontellt och vertikalt. Mätinstrumentet ser hela tiden till att laserstrålen följer prismat i mätproben och genom att mätinstrumentet mäter laserstrålens riktning kan den med hjälp av avståndet beräkna prismats position. Om riktningen behöver bestämmas, vilket behövs med flexapoderna, så mäts den med en kamera på mätinstrumentet. Kameran fotograferar ett antal IR-dioder på mätproben och kan med hjälp av dessa bestämma mätprobens riktning.

Att programmera mätutrustningen är relativt enkelt tack vare ett COM-gränssnitt som är mycket lämpligt att använda i Visual Basic. Följande steg krävs för att använda mätinstrumentet.

1. Anslut till mätutrustningens datorsystem med IP-adress och portnummer.ObjConnect.ConnectEmbeddedSystem("192.168.0.1", 700)

2. Meddelanden från mätdatorn ska komma som händelser.ObjConnect.SelectNotificationMethod(LTC_NM_Event, 0, 0)

3. Hämta en referens till det synkrona gränssnittet.Set ObjSync = ObjConnect.ILTCommandSync

4. Bestäm vilka enheter som ska rapporteras från mätutrustningen.ObjSync.SetUnits(ES_LU_Millimeter, ES_AU_Radian, ES_TU_Celsius, ES_PU_KPascal, ES_HU_RH)

5. Välj att mäta kontinuerligt i sex frihetsgrader.ObjSync.SetMeasurementMode(ES_MM_6DContinuousTime)

6. Ange att mätvärden ska komma kontinuerligt var tionde millisekund tills mätningarna avbryts.ObjSync.SetContinuousTimeModeParams(10, 0, False, ES_RT_Box)

7. Starta mätningen.ObjSync.StartContinuousProbeMeasurement

8. Mätvärdena inkommer asynkront till programmet och när sådana finns tillgängliga signaleras en händelse - ObjSync_ContinuousProbeMeasDataReady. I den funktionen kan de mottagna mätvärdena erhållas. Detta åstadkoms med tre funktionerObjConnect.GetData

26

Illustration 11: Mätutrustningen - en Leicatracker.

Page 29: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

ObjConnect.ContinuousProbeDataGetHeaderInfoObjConnect.ContinuousProbeDataGetAt

9. Diverse andra händelser och fel som kan uppkomma asynkront hanteras med andra återanropsfunktioner.

10. När mätningarna ska upphöra, avbryts mätningarna och anslutningen till mätutrustningen kan brytas.Flexapod_Control_Panel.ObjSync.StopContinuousMeasurementSet Flexapod_Control_Panel.ObjSync = NothingFlexapod_Control_Panel.ObjConnect.DisconnectEmbeddedSystemSet Flexapod_Control_Panel.ObjConnect = Nothing

27

Page 30: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

7 PaketeringMot slutet av arbetet ville Kihlman ha operatörspanelen paketerad som en körbar fil så att han kunde installera programmet på en godtycklig dator. Med installationen av Visual Basic 6 medföljer programmet 'Package and Deployment Wizard' (här förkortat PDW) som är framtaget för att automatisera paketering av program skrivna i Visual Basic. Rätt snabbt så visar det sig att programmet är föråldrat och omständligt att arbeta med. Den främsta anledningen till att inte använda PDW är att paketeringen inte fungerar med KernelCAD. Komponentens DLL-filer inkluderas inte i installationspaketet. För att lösa det problemet krävs speciella filer som inte tillhandahålls av KernelCADs utvecklare. PDW är upplagt som en grafisk flerstegsguide med grundläggande konfigurationsalternativ men utöver dessa krävs redigering av den genererade skriptfilen.

Ett modernare och mer lättanvänt paketeringssystem behövdes. Helst skulle det vara kostnadsfritt. 'Nullsoft Scriptable Install System' (NSIS) uppfyller dessa krav. Källkoden är öppen och NSIS är fritt tillgängligt och gratis. Dessutom har det använts i många mjukvaruprojekt (Users - NSIS, 2008). Tillvägagångssättet för att paketera något i NSIS är att skriva ett installationsskript med kommandon som beskriver hur paketeringen ska gå till. Sedan kompileras skriptfilen. Under kompileringen samlar NSIS ihop alla filer och genererar en körbar fil. Denna fil innehåller allt som behövs för installationen.

För att ge en inblick i hur ett paketeringssystem fungerar och hur det har använts i detta arbete följer här en kortfattad beskrivning av det väsentligaste i skriptfilen för operatörspanelen.

Till att börja med måste namnet på den genererade filen anges.OutFile install.exeInstallationen får ett namn och den förinställda installationssökvägen anges.Name "Flexapod Control Panel"InstallDir "$PROGRAMFILES\Flexapod Control Panel"Vad som ska visas under installation och avinstallation avgörs härnäst. Användaren ska kunna välja installationssökväg och bevittna vad som installeras. Under avinstallationen ska användaren ha möjlighet att bekräfta avinstallationen. Om avinstallationen godkänns ska användaren kunna se vad som sker när avinstallationen pågår.Page directoryPage instfilesUninstPage uninstConfirmUninstPage instfilesSedan kan själva installationen beskrivas. Det sker i en sektion. Filer kopieras med kommandot File och den destination som ska gälla för kopieringen bestäms med kommandot SetOutPath. Med växeln /r kan filer kopieras rekursivt.Section

SetOutPath $INSTDIRFile "OPERATÖRSPANELEN (PROJEKTET).exe"File "Flexapod Default.txt"File "Pickups.txt"SetOutPath $INSTDIR\modelsFile "models\Overview.3dxml"File "models\test.glm"

28

Page 31: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

SetOutPath $INSTDIR\redistFile /r redist\*.*Ett speciellt kommando finns för att installera ett avinstallationsprogram.WriteUninstaller $INSTDIR\uninstaller.exeNågra av de filer som installeras är komponenter som måste registreras i systemet. Detta har hanterats på lite olika sätt för komponenterna. Först ut är MSChart. Filen som tillhör komponenten kopieras till systemkatalogen (vanligen C:\Windows\System32\) eftersom MSChart kanske används eller kommer att användas av något annat program.!insertmacro InstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED

redist\mschrt20.ocx $SYSDIR\mschrt20.ocx $SYSDIR /* MSChart */De två andra komponenterna som behöver registreras är knutna till just den här applikationen och därför installeras de i applikationskatalogen. Nu används kommandot RegDLL.SetOutPath $INSTDIR\redistRegDLL KerCADe.ocx /* KernelCAD */RegDLL LTControl.dll /* Lecia interface */Det sista som sker under installationen är att skapa genvägar i startmenyn. Sedan kan installationssektionen avslutas.SetOutPath $INSTDIR CreateDirectory "$SMPROGRAMS\Flexapod Control Panel"CreateShortCut "$SMPROGRAMS\Flexapod Control Panel\Flexapod

Control Panel.lnk" "$INSTDIR\OPERATÖRSPANELEN (PROJEKTET).exe"CreateShortCut "$SMPROGRAMS\Flexapod Control Panel\Uninstall.lnk"

"$INSTDIR\uninstaller.exe"

SectionEndAvinstallationen behandlas på samma sätt. En sektion med namnet Uninstall blir automatiskt en avinstallationssektion. Några vanliga kommandon i en avinstallationssektion är Delete som raderar filer och RMDir som tar bort tomma kataloger (eller raderar dess rekursivt med växeln /r). Operatörspanelens avinstallationssektion är skriven så här.Section "Uninstall"

UnRegDLL $INSTDIR\redist\KerCADe.ocxUnRegDLL $INSTDIR\redist\LTControl.dllRMDir /r "$SMPROGRAMS\Flexapod Control Panel"Delete "$INSTDIR\OPERATÖRSPANELEN (PROJEKTET).exe"Delete "$INSTDIR\Flexapod Default.txt"Delete "$INSTDIR\Pickups.txt"Delete $INSTDIR\uninstaller.exeRMDir /r $INSTDIR\redistRMDir /r $INSTDIR\modelsRMDir $INSTDIR

SectionEndApplikationer programmerade i Visual Basic 6 behöver ett antal exekveringsfiler för att applikationen ska kunna exekveras. Dessa exekveringsfiler måste installeras på värddatorn av installationsprogrammet om de inte redan är installerade. Som tur är behöver användaren av NSIS

29

Page 32: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

inte bry sig särskilt mycket om detta eftersom det finns ett färdigt skript som hanterar installation och avinstallation av exekveringsfilerna för Visual Basic 6. Allt som behövs i skriptfilen för detta är ett par rader kod tagna direkt från manualen. Funktionen är implementerad av två stycken makron - VB6RunTimeInstall och VB6RunTimeUnInstall.

30

Page 33: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

8 Analys av resultatMed tanke på de förutsättningar som har gällt under arbetets gång har det fallit väl ut. Det har t.ex. inte funnits någon utomstående användare tillgänglig för att ge synpunkter på användargränssnittet. Istället har arbetet fått gå på en magkänsla för hur användargränssnittet bör utformas. En del krav uppkom under arbetets gång och var inte noggrant angivna i arbetets startskede. Paketeringen och översiktsvyn kan nämnas som två exempel på detta.

Användargränssnittet har utvecklats och blivit informativt och fyller sin funktion. En möjlig förbättring av användargränssnittet skulle vara att göra det mer konfigurerbart. Speciellt vad och när uppgifter ska visas i operatörspanelen. Det nuvarande stapeldiagrammet som visar benlängdsfelen fungerar mycket bra vid finjusteringen med sin skalningsfunktion. Även flexapodvyn har visats sig fungera bra vid grovjustering när riktiga tester har utförts. Översiktsvyn, nu implementerad av 3D XML Player i en internetkomponent, fungerar fortfarande inte klockrent och behöver mer utveckling.

Kihlman uppskattade speciellt Frameklassen som hanterar transformationer. Den har gjort koden mer lättläst och har bidragit till att centralisera hanteringen av ramar.

När detta skrivs är det inte beslutat om och i vilken utsträckning flexapoderna ska användas i Neuronprojektet.

31

Page 34: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

ReferenserCraig, John J. (1986). Introduction to robotics. Addison-Wesley Publishing Company

Krishnaswamy, Jayaram (2006). The Basics of Charting with the MS Chart Control [www] <http://www.aspfree.com/c/a/Code-Examples/The-Basics-of-Charting-with-the-MS-Chart-Control/> Hämtat 2008-01-11

Thompson, Jan & Martinsson, Thomas (1991). Wahlström & Widstrands Matematiklexikon. Wahlström & Widstrand

Users - NSIS (2008). Users - NSIS [www] <http://nsis.sourceforge.net/Users> Hämtat 2008-03-28

32

Page 35: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Bilaga A – Arkitekturbild av mjukvaran

33

Anvä

ndar

grän

ssni

ttFl

exap

od C

ontro

l Pan

el.fr

mM

ätut

rust

ning

emS

con.

bas

Tran

sfor

mat

ions

-ha

nter

ing

Fram

e.cl

s

Mat

ris-

man

ipul

atio

ncM

athL

ib.c

ls

Dia

logr

uta

”Öpp

na fi

l”O

penF

ileD

ialo

g.ba

s

Flex

apod

vyG

raph

ics3

D.b

as

Flex

apod

hant

erin

gFl

exap

odM

anag

er.c

ls

Pic

kuph

ante

ring

Pic

kupM

anag

er.c

ls

Def

initi

on a

vko

nsta

nter

Con

stan

ts.b

as

Page 36: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Bilaga B - Källkod

OPERATÖRSPANELEN (PROJEKTET).vbpType=ExeReference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\WINDOWS\system32\STDOLE2.TLB#OLE

AutomationReference=*\G{58DB560B-0186-11D5-BBB6-00508B35B332}#2.4#0#Leica\LTControl.dll#LTControl Type LibraryReference=*\G{420B2830-E718-11CF-893D-

00A0C9054228}#1.0#0#..\..\WINDOWS\system32\scrrun.dll#Microsoft Scripting RuntimeReference=*\G{73130905-462A-11D1-A26A-0000F87546A1}#0.0#0#..\..\Program Files\Dassault

Systemes\B17\intel_a\code\bin\DraftingTypeLib.tlb#CATIA V5 DraftingInterfaces Object Library

Reference=*\G{87EE735C-DF70-11D1-8556-0060941979CE}#0.0#0#..\..\Program Files\Dassault Systemes\B17\intel_a\code\bin\CATGitTypeLib.tlb#CATIA V5 GSMInterfaces Object Library

Reference=*\G{14F197B2-0771-11D1-A5B1-00A0C9575177}#0.0#0#..\..\Program Files\Dassault Systemes\B17\intel_a\code\bin\InfTypeLib.tlb#CATIA V5 InfInterfaces Object Library

Reference=*\G{0770412C-722E-11D2-8378-0060941974FF}#0.0#0#..\..\Program Files\Dassault Systemes\B17\intel_a\code\bin\KweTypeLib.tlb#CATIA V5 KnowledgeInterfaces Object Library

Reference=*\G{0D90A5C9-3B08-11D1-A26C-0000F87546FD}#0.0#0#..\..\Program Files\Dassault Systemes\B17\intel_a\code\bin\MecModTypeLib.tlb#CATIA V5 MecModInterfaces Object Library

Reference=*\G{E6BCB304-3260-11D4-9465-006094EB3826}#0.0#0#..\..\Program Files\Dassault Systemes\B17\intel_a\code\bin\NavigatorTypeLib.tlb#CATIA V5 NavigatorInterfaces Object Library

Reference=*\G{D8431606-E4B5-11D1-A5D3-00A0C95752ED}#0.0#0#..\..\Program Files\Dassault Systemes\B17\intel_a\code\bin\PartTypeLib.tlb#CATIA V5 PartInterfaces Object Library

Reference=*\G{5065F8B6-61BB-11D1-9D85-0000F8759F82}#0.0#0#..\..\Program Files\Dassault Systemes\B17\intel_a\code\bin\PSTypeLib.tlb#CATIA V5 ProductStructureInterfaces Object Library

Object={7D868ACD-1A5D-4A47-A247-F39741353012}#1.0#0; INKOBJ.DLLReference=*\G{EAB22AC0-30C1-11CF-A7EB-

0000C05BAE0B}#1.1#0#..\..\WINDOWS\system32\ieframe.dll#Microsoft Internet ControlsObject={11B9E887-5331-431E-9348-BA3F6C1CB487}#1.3#0; KerCADe.ocxObject={65E121D4-0C60-11D2-A9FC-0000F8754DA1}#2.0#0; MSCHRT20.OCXObject={EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}#1.1#0; ieframe.dllForm=MainWindow.frmForm=Flexapod Control Panel.frmModule=Public_Objects; Public_Objects.basClass=cMathLib; cMathLib.clsModule=Graphics3D; Graphics3D.basModule=ComProtocol; ComProtocol.basModule=V5lib; V5lib.basClass=PickupManager; PickupManager.clsClass=Frame; Frame.clsClass=cInifile; CINIFILE.CLSClass=FlexapodManager; FlexapodManager.clsModule=emScon; emScon.basModule=Constants; Constants.basModule=OpenFileDialog; OpenFileDialog.basIconForm="MainWindow"Startup="Flexapod_Control_Panel"HelpFile=""Title="OPERATÖRSPANELEN (PROJEKTET)"ExeName32="OPERATÖRSPANELEN (PROJEKTET).exe"Command32=""Name="Emulatorn"HelpContextID="0"CompatibleMode="0"MajorVer=1MinorVer=0RevisionVer=0AutoIncrementVer=0ServerSupportFiles=0VersionCompanyName="DELFOi"CompilationType=0OptimizationType=0FavorPentiumPro(tm)=0CodeViewDebugInfo=0NoAliasing=0BoundsCheck=0OverflowCheck=0FlPointCheck=0FDIVCheck=0

34

Page 37: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

UnroundedFP=0StartMode=0Unattended=0Retained=0ThreadPerObject=0MaxNumberOfThreads=1DebugStartupOption=0

[MS Transaction Server]AutoRefresh=1

35

Page 38: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Flexapod Control Panel.frmVERSION 5.00Object = "{11B9E887-5331-431E-9348-BA3F6C1CB487}#1.3#0"; "KerCADe.ocx"Object = "{65E121D4-0C60-11D2-A9FC-0000F8754DA1}#2.0#0"; "mschrt20.ocx"Object = "{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}#1.1#0"; "ieframe.dll"Begin VB.Form Flexapod_Control_Panel Caption = "Flexapod Control Panel" ClientHeight = 11010 ClientLeft = 165 ClientTop = 450 ClientWidth = 15240 LinkTopic = "Form2" ScaleHeight = 11010 ScaleWidth = 15240 Begin VB.Frame FrameCartesianError BackColor = &H80000001& Caption = "Leg Error" ForeColor = &H0000FF00& Height = 105 Left = 150 TabIndex = 63 Top = 5670 Width = 7815 Visible = 0 'False Begin VB.Label DeltaLeg6 Alignment = 1 'Right Justify BackColor = &H00000000& Caption = "-0000.0000" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 3780 TabIndex = 132 Top = 3780 Width = 3735 End Begin VB.Label Label45 BackColor = &H00000000& Caption = "Leg 6 (+/-)" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 150 TabIndex = 131 Top = 3780 Width = 3495 End Begin VB.Label DeltaLeg1 Alignment = 1 'Right Justify BackColor = &H00000000& Caption = "-0000.0000" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False

36

Page 39: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 3750 TabIndex = 130 Top = 180 Width = 3735 End Begin VB.Label DeltaLeg2 Alignment = 1 'Right Justify BackColor = &H00000000& Caption = "-0000.0000" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 3750 TabIndex = 129 Top = 900 Width = 3735 End Begin VB.Label DeltaLeg3 Alignment = 1 'Right Justify BackColor = &H00000000& Caption = "-0000.0000" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 3750 TabIndex = 128 Top = 1620 Width = 3735 End Begin VB.Label DeltaLeg4 Alignment = 1 'Right Justify BackColor = &H00000000& Caption = "-0000.0000" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 3750 TabIndex = 127 Top = 2340 Width = 3735 End Begin VB.Label DeltaLeg5 Alignment = 1 'Right Justify BackColor = &H00000000& Caption = "-0000.0000" BeginProperty Font Name = "Arial" Size = 36 Charset = 0

37

Page 40: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 3750 TabIndex = 126 Top = 3060 Width = 3735 End Begin VB.Label Labelxx BackColor = &H00000000& Caption = "Leg 1 (+/-)" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 150 TabIndex = 125 Top = 180 Width = 3495 End Begin VB.Label Label54 BackColor = &H00000000& Caption = "Leg 2 (+/-)" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 150 TabIndex = 124 Top = 900 Width = 3495 End Begin VB.Label Label55 BackColor = &H00000000& Caption = "Leg 3 (+/-)" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 150 TabIndex = 123 Top = 1620 Width = 3495 End Begin VB.Label Label56 BackColor = &H00000000& Caption = "Leg 4 (+/-)" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400

38

Page 41: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 150 TabIndex = 122 Top = 2340 Width = 3495 End Begin VB.Label Label57 BackColor = &H00000000& Caption = "Leg 5 (+/-)" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 150 TabIndex = 121 Top = 3060 Width = 3495 End End Begin VB.Frame FrameCartesianActual BackColor = &H80000001& Caption = "Cartesian Error" ForeColor = &H0000FF00& Height = 45 Left = 120 TabIndex = 60 Top = 0 Width = 7815 Visible = 0 'False Begin VB.Label Label8 BackColor = &H00000000& Caption = "Error Rz" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 60 TabIndex = 120 Top = 4440 Width = 3495 End Begin VB.Label Label31 BackColor = &H00000000& Caption = "Error Ry" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 60 TabIndex = 119 Top = 3720

39

Page 42: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Width = 3495 End Begin VB.Label Label32 BackColor = &H00000000& Caption = "Error Rx" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 60 TabIndex = 118 Top = 3000 Width = 3495 End Begin VB.Label Label33 BackColor = &H00000000& Caption = "Error Z" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 60 TabIndex = 117 Top = 2280 Width = 3495 End Begin VB.Label Label34 BackColor = &H00000000& Caption = "Error Y" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 60 TabIndex = 116 Top = 1560 Width = 3495 End Begin VB.Label measurementData6 Alignment = 1 'Right Justify BackColor = &H00000000& Caption = "-0000.0000" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 3660 TabIndex = 115 Top = 4440

40

Page 43: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Width = 3735 End Begin VB.Label measurementData5 Alignment = 1 'Right Justify BackColor = &H00000000& Caption = "-0000.0000" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 3660 TabIndex = 114 Top = 3720 Width = 3735 End Begin VB.Label measurementData4 Alignment = 1 'Right Justify BackColor = &H00000000& Caption = "-0000.0000" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 3660 TabIndex = 113 Top = 3000 Width = 3735 End Begin VB.Label measurementData3 Alignment = 1 'Right Justify BackColor = &H00000000& Caption = "-0000.0000" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 3660 TabIndex = 112 Top = 2280 Width = 3735 End Begin VB.Label measurementData2 Alignment = 1 'Right Justify BackColor = &H00000000& Caption = "-0000.0000" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735

41

Page 44: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Left = 3660 TabIndex = 111 Top = 1560 Width = 3735 End Begin VB.Label Label40 BackColor = &H00000000& Caption = "Error X" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 60 TabIndex = 110 Top = 840 Width = 3495 End Begin VB.Label measurementData1 Alignment = 1 'Right Justify BackColor = &H00000000& Caption = "-0000.0000" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 3660 TabIndex = 109 Top = 840 Width = 3735 End Begin VB.Label Label47 BackColor = &H00000000& Caption = "Total Err." BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00& Height = 735 Left = 60 TabIndex = 62 Top = 180 Width = 3495 End Begin VB.Label TotalError Alignment = 1 'Right Justify BackColor = &H00000000& Caption = "-0000.0000" BeginProperty Font Name = "Arial" Size = 36 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty ForeColor = &H0000FF00&

42

Page 45: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Height = 735 Left = 3660 TabIndex = 61 Top = 180 Width = 3735 End End Begin VB.Frame Frame11 Caption = "Coordiante System" Height = 2385 Left = 60 TabIndex = 90 Top = 5820 Width = 3585 Begin VB.Frame Frame5 Caption = "Current Position" Height = 1365 Left = 90 TabIndex = 94 Top = 210 Width = 3435 Begin VB.TextBox ActualCoordViewRZ Height = 285 Left = 2010 TabIndex = 100 Text = "n/a" Top = 960 Width = 1335 End Begin VB.TextBox ActualCoordViewRY Height = 285 Left = 2010 TabIndex = 99 Text = "n/a" Top = 630 Width = 1335 End Begin VB.TextBox ActualCoordViewRX Height = 285 Left = 2010 TabIndex = 98 Text = "n/a" Top = 300 Width = 1335 End Begin VB.TextBox ActualCoordViewZ Height = 285 Left = 360 TabIndex = 97 Text = "n/a" Top = 990 Width = 1215 End Begin VB.TextBox ActualCoordViewY Height = 285 Left = 360 TabIndex = 96 Text = "n/a" Top = 630 Width = 1215 End Begin VB.TextBox ActualCoordViewX Height = 285 Left = 360 TabIndex = 95 Text = "n/a" Top = 270 Width = 1215 End Begin VB.Label Label6 Alignment = 1 'Right Justify Caption = "Ry:" Height = 255 Left = 1470 TabIndex = 106 Top = 660 Width = 495

43

Page 46: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

End Begin VB.Label Label14 Alignment = 1 'Right Justify Caption = "Rz:" Height = 255 Left = 1470 TabIndex = 105 Top = 1020 Width = 495 End Begin VB.Label Label15 Alignment = 1 'Right Justify Caption = "Rx:" Height = 255 Left = 1470 TabIndex = 104 Top = 300 Width = 495 End Begin VB.Label Label16 Caption = "Z:" Height = 255 Left = 120 TabIndex = 103 Top = 1005 Width = 255 End Begin VB.Label Label17 Caption = "Y:" Height = 255 Left = 120 TabIndex = 102 Top = 645 Width = 255 End Begin VB.Label Label18 Caption = "X:" Height = 255 Left = 120 TabIndex = 101 Top = 300 Width = 255 End End Begin VB.Frame Frame7 Height = 765 Left = 90 TabIndex = 91 Top = 1500 Width = 3435 Begin VB.OptionButton OptionGlobal Caption = "Global" Height = 315 Left = 240 TabIndex = 93 Top = 180 Width = 1455 End Begin VB.OptionButton OptionLocal Caption = "Local" Height = 315 Left = 240 TabIndex = 92 Top = 420 Value = -1 'True Width = 1455 End End End Begin VB.Frame Frame10 Caption = "Goal Data" Height = 2385 Left = 3630 TabIndex = 73 Top = 5820 Width = 3825 Begin VB.CommandButton cmdGetCADPosition

44

Page 47: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Caption = "Get CAD Position" Height = 285 Left = 840 TabIndex = 89 Top = 1620 Width = 2625 End Begin VB.CheckBox CheckEditTarget Caption = "Edit Target" Height = 285 Left = 840 TabIndex = 88 Top = 1920 Width = 1425 End Begin VB.CommandButton cmdUpdateTarget Caption = "Update" Height = 345 Left = 2340 TabIndex = 87 Top = 1920 Width = 1065 End Begin VB.Frame Frame4 Caption = "Goal Position" Height = 1365 Left = 60 TabIndex = 74 Top = 210 Width = 3735 Begin VB.TextBox TargetCoordViewX Height = 285 Left = 360 TabIndex = 80 Text = "n/a" Top = 270 Width = 1335 End Begin VB.TextBox TargetCoordViewY Height = 285 Left = 360 TabIndex = 79 Text = "n/a" Top = 630 Width = 1335 End Begin VB.TextBox TargetCoordViewZ Height = 285 Left = 360 TabIndex = 78 Text = "n/a" Top = 990 Width = 1335 End Begin VB.TextBox TargetCoordViewRX Height = 285 Left = 2190 TabIndex = 77 Text = "n/a" Top = 270 Width = 1455 End Begin VB.TextBox TargetCoordViewRY Height = 285 Left = 2190 TabIndex = 76 Text = "n/a" Top = 630 Width = 1455 End Begin VB.TextBox TargetCoordViewRZ Height = 285 Left = 2190 TabIndex = 75 Text = "n/a" Top = 990 Width = 1455

45

Page 48: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

End Begin VB.Label Label7 Caption = "X:" Height = 255 Left = 120 TabIndex = 86 Top = 300 Width = 255 End Begin VB.Label Label9 Caption = "Y:" Height = 255 Left = 120 TabIndex = 85 Top = 645 Width = 255 End Begin VB.Label Label10 Caption = "Z:" Height = 255 Left = 120 TabIndex = 84 Top = 1005 Width = 255 End Begin VB.Label Label11 Alignment = 1 'Right Justify Caption = "Rx:" Height = 255 Left = 1620 TabIndex = 83 Top = 315 Width = 495 End Begin VB.Label Label12 Alignment = 1 'Right Justify Caption = "Rz:" Height = 255 Left = 1620 TabIndex = 82 Top = 1005 Width = 495 End Begin VB.Label Label13 Alignment = 1 'Right Justify Caption = "Ry:" Height = 255 Left = 1620 TabIndex = 81 Top = 675 Width = 495 End End End Begin VB.Frame Frame9 Caption = "Flexapod Control" Height = 1605 Left = 120 TabIndex = 69 Top = 3690 Width = 3195 Begin VB.CommandButton cmdRecovery Caption = "Recover Home and Target" Height = 405 Left = 120 TabIndex = 72 Top = 1170 Width = 3015 End Begin VB.CommandButton ButtonSetHomePosition Caption = "Set Home Position" Height = 375 Left = 120 TabIndex = 71 Top = 240 Width = 3015 End

46

Page 49: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Begin VB.CommandButton buttonSetCurrentPosition Caption = "Set Current Position" Height = 405 Left = 120 TabIndex = 70 Top = 690 Width = 3015 End End Begin VB.Frame Frame8 Caption = "3DXML" Height = 5475 Left = 3270 TabIndex = 65 Top = 30 Width = 5475 Begin VB.CommandButton cmdOpen3D Caption = "Open 3D" Height = 315 Index = 0 Left = 930 TabIndex = 68 Top = 5130 Width = 975 End Begin VB.CommandButton cmdOpen3DNewWindow Caption = "Open 3D Separate Window" Height = 315 Index = 1 Left = 1980 TabIndex = 67 Top = 5130 Width = 2625 End Begin SHDocVwCtl.WebBrowser WebBrowser1 Height = 4935 Left = 30 TabIndex = 66 Top = 180 Width = 5445 ExtentX = 9604 ExtentY = 8705 ViewMode = 0 Offline = 0 Silent = 0 RegisterAsBrowser= 0 RegisterAsDropTarget= 1 AutoArrange = 0 'False NoClientEdge = 0 'False AlignLeft = 0 'False NoWebView = 0 'False HideFileNames = 0 'False SingleClick = 0 'False SingleSelection = 0 'False NoFolders = 0 'False Transparent = 0 'False ViewID = "{0057D0E0-3573-11CF-AE69-08002B2E1262}" Location = "http:///" End End Begin VB.Timer TimerInterfaceCATIA Enabled = 0 'False Interval = 500 Left = 4560 Top = 10560 End Begin VB.CheckBox CheckCATIA Caption = "Interface CATIA" Height = 285 Left = 1680 TabIndex = 59 Top = 5340 Width = 1485 End Begin VB.Timer TimerEmulateLaser Enabled = 0 'False Interval = 100

47

Page 50: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Left = 3900 Top = 10560 End Begin VB.Timer TimerShowHTMLOnFormOpen Interval = 2 Left = 3030 Top = 11310 End Begin VB.ComboBox comboMeasurementSelection Height = 315 Left = 720 TabIndex = 49 Text = "Combo1" Top = 11400 Width = 1785 End Begin VB.CheckBox checkLargeDigits Caption = "Large Digits" Height = 255 Left = 210 TabIndex = 48 Top = 5340 Width = 1215 End Begin VB.CommandButton buttonZoomIn Caption = "+" BeginProperty Font Name = "MS Sans Serif" Size = 12 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 8760 TabIndex = 44 Top = 4800 Width = 375 End Begin VB.CommandButton buttonZoomOut Caption = "-" BeginProperty Font Name = "MS Sans Serif" Size = 12 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 9120 TabIndex = 43 Top = 4800 Width = 375 End Begin VB.CommandButton cmdWriteToFile Caption = "Write to file" Height = 345 Left = 5280 TabIndex = 42 Top = 11430 Width = 1425 End Begin VB.CommandButton buttonNullDistance Caption = "Null" Height = 255 Left = 2760 TabIndex = 40 Top = 9615 Width = 615 End Begin VB.TextBox distanceErrorValue Height = 285 Left = 1200

48

Page 51: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

TabIndex = 38 Text = "n/a" Top = 9600 Width = 1455 End Begin VB.Frame Frame2 Caption = "Error Position" Height = 1365 Left = 3630 TabIndex = 27 Top = 8190 Width = 3825 Begin VB.TextBox ErrorCoordViewRX Height = 285 Left = 2250 TabIndex = 45 Text = "n/a" Top = 270 Width = 1485 End Begin VB.TextBox ErrorCoordViewRZ Height = 285 Left = 2250 TabIndex = 32 Text = "n/a" Top = 990 Width = 1485 End Begin VB.TextBox ErrorCoordViewRY Height = 285 Left = 2250 TabIndex = 31 Text = "n/a" Top = 630 Width = 1485 End Begin VB.TextBox ErrorCoordViewZ Height = 285 Left = 390 TabIndex = 30 Text = "n/a" Top = 990 Width = 1365 End Begin VB.TextBox ErrorCoordViewY Height = 285 Left = 360 TabIndex = 29 Text = "n/a" Top = 630 Width = 1365 End Begin VB.TextBox ErrorCoordViewX Height = 285 Left = 360 TabIndex = 28 Text = "n/a" Top = 270 Width = 1365 End Begin VB.Label Label26 Alignment = 1 'Right Justify Caption = "Rx:" Height = 255 Left = 1650 TabIndex = 46 Top = 270 Width = 495 End Begin VB.Label Label28 Alignment = 1 'Right Justify Caption = "Ry:" Height = 255 Left = 1650 TabIndex = 37 Top = 645 Width = 495

49

Page 52: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

End Begin VB.Label Label27 Alignment = 1 'Right Justify Caption = "Rz:" Height = 255 Left = 1650 TabIndex = 36 Top = 1005 Width = 495 End Begin VB.Label Label25 Caption = "Z:" Height = 255 Left = 120 TabIndex = 35 Top = 1005 Width = 255 End Begin VB.Label Label5 Caption = "Y:" Height = 255 Left = 120 TabIndex = 34 Top = 645 Width = 255 End Begin VB.Label Label1 Caption = "X:" Height = 255 Left = 120 TabIndex = 33 Top = 300 Width = 255 End End Begin VB.Frame Frame6 Caption = "Base Position" Height = 1365 Left = 120 TabIndex = 14 Top = 8190 Width = 3495 Begin VB.TextBox BaseCoordViewX Height = 285 Left = 360 TabIndex = 20 Text = "n/a" Top = 270 Width = 1125 End Begin VB.TextBox BaseCoordViewY Height = 285 Left = 360 TabIndex = 19 Text = "n/a" Top = 630 Width = 1125 End Begin VB.TextBox BaseCoordViewZ Height = 285 Left = 360 TabIndex = 18 Text = "n/a" Top = 990 Width = 1125 End Begin VB.TextBox BaseCoordViewRX Height = 285 Left = 2160 TabIndex = 17 Text = "n/a" Top = 270 Width = 1245 End Begin VB.TextBox BaseCoordViewRY Height = 285 Left = 2160

50

Page 53: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

TabIndex = 16 Text = "n/a" Top = 630 Width = 1245 End Begin VB.TextBox BaseCoordViewRZ Height = 285 Left = 2160 TabIndex = 15 Text = "n/a" Top = 990 Width = 1245 End Begin VB.Label Label24 Caption = "X:" Height = 255 Left = 120 TabIndex = 26 Top = 300 Width = 255 End Begin VB.Label Label23 Caption = "Y:" Height = 255 Left = 120 TabIndex = 25 Top = 645 Width = 255 End Begin VB.Label Label22 Caption = "Z:" Height = 255 Left = 120 TabIndex = 24 Top = 1005 Width = 255 End Begin VB.Label Label21 Alignment = 1 'Right Justify Caption = "Rx:" Height = 255 Left = 1560 TabIndex = 23 Top = 285 Width = 495 End Begin VB.Label Label20 Alignment = 1 'Right Justify Caption = "Rz:" Height = 255 Left = 1560 TabIndex = 22 Top = 1005 Width = 495 End Begin VB.Label Label19 Alignment = 1 'Right Justify Caption = "Ry:" Height = 255 Left = 1560 TabIndex = 21 Top = 645 Width = 495 End End Begin VB.Frame Frame3 Caption = "emScon" Height = 1935 Left = 120 TabIndex = 9 Top = 30 Width = 3255 Begin VB.TextBox txtIPAddress Height = 285 Left = 990 TabIndex = 108 Text = "192.168.0.1"

51

Page 54: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Top = 1590 Width = 1395 End Begin VB.CommandButton cmdPark Caption = "Park" Height = 375 Left = 1800 TabIndex = 52 Top = 840 Width = 1215 End Begin VB.CommandButton cmdReleaseMotors Caption = "Release Motors" Height = 375 Left = 120 TabIndex = 51 Top = 840 Width = 1575 End Begin VB.CheckBox CheckUseTransform Caption = "Use Transform" Height = 285 Left = 150 TabIndex = 41 Top = 1290 Value = 1 'Checked Width = 2745 End Begin VB.CommandButton cmdDisconnect Caption = "Disconnect" Height = 495 Left = 2070 TabIndex = 13 Top = 240 Width = 975 End Begin VB.CommandButton cmdInitialize Caption = "Initialize" Height = 495 Left = 1080 TabIndex = 12 Top = 240 Width = 855 End Begin VB.CommandButton cmdConnect Caption = "Connect" Height = 495 Left = 120 TabIndex = 11 Top = 240 Width = 855 End Begin VB.Label Label35 Caption = "IP Adress:" Height = 225 Left = 180 TabIndex = 107 Top = 1650 Width = 855 End End Begin VB.Frame Frame1 Caption = "Flexapod configuration" Height = 1665 Left = 120 TabIndex = 3 Top = 2010 Width = 3135 Begin VB.CommandButton cmdChooseFile Caption = "Choose File" Height = 315 Left = 570 TabIndex = 64 Top = 1230 Width = 2445 End Begin VB.ComboBox ActivePickUp

52

Page 55: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Height = 315 Left = 840 TabIndex = 6 Text = "Combo1" Top = 840 Width = 2175 End Begin VB.ComboBox ActiveFlexapodInList Height = 315 ItemData = "Flexapod Control Panel.frx":0000 Left = 840 List = "Flexapod Control Panel.frx":0002 TabIndex = 5 Text = "Combo1" Top = 330 Width = 2175 End Begin VB.Label Label4 Caption = "Pickup:" Height = 255 Left = 240 TabIndex = 8 Top = 870 Width = 615 End Begin VB.Label Label3 Caption = "Flexapod:" Height = 255 Left = 120 TabIndex = 7 Top = 360 Width = 735 End Begin VB.Label Label2 Caption = "Flexapod:" Height = 255 Left = 480 TabIndex = 4 Top = 2640 Width = 975 End End Begin VB.VScrollBar VScroll1 Height = 5175 Left = 15000 Max = 0 Min = -90 TabIndex = 2 Top = 0 Value = -45 Width = 255 End Begin VB.HScrollBar HScroll1 Height = 255 Left = 8760 Max = 360 TabIndex = 1 Top = 5160 Value = 180 Width = 6255 End Begin KERNELCADLib.KernelCAD KernelCADCtrl Height = 5175 Left = 8760 TabIndex = 0 Top = 0 Width = 6735 _Version = 131072 _ExtentX = 11880 _ExtentY = 9128 _StockProps = 0 ModelPath = "" DIBackColor = 0 PPBagVer = "PropSchema 3" ModelSize = "Flexapod Control Panel.frx":0004 Object.Visible = 0 'False End

53

Page 56: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Begin VB.TextBox ErrorToTarget Height = 285 Left = 1200 TabIndex = 50 Text = "n/a" Top = 9990 Width = 1455 End Begin MSChart20Lib.MSChart MSChart1 Height = 5115 Left = 7740 OleObjectBlob = "Flexapod Control Panel.frx":0030 TabIndex = 10 Top = 5460 Width = 7635 End Begin VB.Label Text_Leg5 Alignment = 2 'Center BorderStyle = 1 'Fixed Single Caption = "n/a" Height = 375 Left = 12540 TabIndex = 58 Top = 10560 Width = 915 End Begin VB.Label Text_Leg6 Alignment = 2 'Center BorderStyle = 1 'Fixed Single Caption = "n/a" Height = 375 Left = 13500 TabIndex = 57 Top = 10560 Width = 915 End Begin VB.Label Text_Leg4 Alignment = 2 'Center BorderStyle = 1 'Fixed Single Caption = "n/a" Height = 375 Left = 11580 TabIndex = 56 Top = 10560 Width = 915 End Begin VB.Label Text_Leg3 Alignment = 2 'Center BorderStyle = 1 'Fixed Single Caption = "n/a" Height = 375 Left = 10620 TabIndex = 55 Top = 10560 Width = 915 End Begin VB.Label Text_Leg2 Alignment = 2 'Center BorderStyle = 1 'Fixed Single Caption = "n/a" Height = 375 Left = 9630 TabIndex = 54 Top = 10560 Width = 915 End Begin VB.Label Text_Leg1 Alignment = 2 'Center BorderStyle = 1 'Fixed Single Caption = "n/a" Height = 375 Left = 8640 TabIndex = 53 Top = 10560 Width = 915 End Begin VB.Label Label30

54

Page 57: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Caption = "Error to Target:" Height = 255 Left = 120 TabIndex = 47 Top = 9990 Width = 1095 End Begin VB.Label Label29 Caption = "Error distance:" Height = 195 Left = 120 TabIndex = 39 Top = 9645 Width = 1065 EndEndAttribute VB_Name = "Flexapod_Control_Panel"Attribute VB_GlobalNameSpace = FalseAttribute VB_Creatable = FalseAttribute VB_PredeclaredId = TrueAttribute VB_Exposed = FalseOption Explicit

Public ObjConnect As New LTConnectPublic WithEvents ObjSync As LTCommandSyncAttribute ObjSync.VB_VarHelpID = -1Public MeasurementsReceived As Boolean

Public ErrX As DoublePublic ErrY As DoublePublic ErrZ As DoublePublic ErrRx As DoublePublic ErrRy As DoublePublic ErrRz As DoubleDim targetLegLength1 As Double, targetLegLength2 As Double, targetLegLength3 As Double,

targetLegLength4 As Double, targetLegLength5 As Double, targetLegLength6 As DoubleDim actualLegLength1 As Double, actualLegLength2 As Double, actualLegLength3 As Double,

actualLegLength4 As Double, actualLegLength5 As Double, actualLegLength6 As Double

Dim B1diff As DoubleDim B2diff As DoubleDim B3diff As DoubleDim B4diff As DoubleDim B5diff As DoubleDim B6diff As Double

'TransformsDim originBaseTransform As New FrameDim targetBaseTopTransform As FrameDim actualBaseTopTransform As FrameDim topTCPTransform As New FrameDim originPrism As New Frame

'FramesDim actualTCPFrame As New FrameDim targetTCPFrame As New Frame ' from Flexapod configuration file

'pickup related variablesDim gPickupManager As New PickupManagerDim selectedPickup As Integer

'Flexapod configuration manager and related variablesDim gFlexapodManager As New FlexapodManagerDim selectedFlexapod As IntegerDim flexapodFilePathDefault As StringDim flexapodFilePath As String

Dim ViewRotationX As Double 'Rotation of 3D view around X axisDim ViewRotationZ As Double 'Rotation of 3D view around Z axis

Dim saveCurrentPosition As Boolean 'DEMO - Save current position?

'distance variablesDim oldDistanceMeasurement As New Frame

Dim currentLimit As Integer ' nuvarande tillstånd för zoomning av staplar

55

Page 58: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Dim isRunningLoop As Boolean

Dim ThreeDXMLPath As StringDim p1 As Object 'ProduktenDim p2 As Product 'PrismatDim p3 As Product 'Aktiv part

Private Sub ActiveFlexapodInList_Click() selectedFlexapod = Me.ActiveFlexapodInList.ListIndex Call getCADPositionEnd Sub

Private Sub TimerEmulateLaser_Timer() Dim measMode As ES_MeasMode Dim temp As Double Dim press As Double Dim hum As Double Dim bTry As Boolean Dim Data As Variant Dim i As Long Dim time1 As Long Dim time2 As Long Dim dVal1 As Double Dim dVal2 As Double Dim dVal3 As Double Dim measStat As ES_ResultStatus Dim triggerStat As ES_TriggerStatus Dim rotationStat As Long Dim probeID As Long Dim tipStatus As ES_MeasurementTipStatus Dim tipID As Long Dim socketNo As Long Dim dmy1 As Double ' dummy variable Dim dmy2 As Double Dim dmy3 As Double Dim dmy4 As Double Dim dmy5 As Double Dim dmy6 As Double Dim dmy7 As Double Dim dmy8 As Double Dim dmy9 As Double Dim dmy10 As Double Dim dmy11 As Double Dim dmy12 As Double Dim dmy13 As Double Dim dmy14 As Double Dim dQuat0 As Double Dim dQuat1 As Double Dim dQuat2 As Double Dim dQuat3 As Double Dim dOmega As Double Dim dPhi As Double Dim dKappa As Double Dim fieldNumber As Long

' Läser från CATIA If Me.CheckCATIA = Checked Then Dim p1 As Object Dim p2 As Product Set p1 = V5.ActiveDocument.Product Set p2 = p1.Products.Item(1) Dim tmpMatrix(3, 3) As Double V5lib.GetProductMatrixPos p2, tmpMatrix(0, 3), tmpMatrix(1, 3), tmpMatrix(2, 3),

tmpMatrix(0, 0), tmpMatrix(1, 0), tmpMatrix(2, 0), tmpMatrix(0, 1), tmpMatrix(1, 1), tmpMatrix(2, 1), tmpMatrix(0, 2), tmpMatrix(1, 2), tmpMatrix(2, 2)

tmpMatrix(3, 3) = 1 'viktig End If Call originPrism.setIdentity Call originPrism.setMatrix(tmpMatrix) Call actualTCPFrame.setIdentity

56

Page 59: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

' TRANSFORM If Me.CheckUseTransform = vbChecked Then Set actualTCPFrame = originPrism.transform(prismTCPTransform) 'originPrism x

prismTCPTransform (Ekv. 4) If Me.CheckCATIA = Checked Then Dim tmpMatrix2() As Double tmpMatrix2 = actualTCPFrame.getMatrix Set p3 = p1.Products.Item(2) V5lib.SetProductMatrixPos p3, tmpMatrix2(0, 3), tmpMatrix2(1, 3), tmpMatrix2(2, 3),

tmpMatrix2(0, 0), tmpMatrix2(1, 0), tmpMatrix2(2, 0), tmpMatrix2(0, 1), tmpMatrix2(1, 1), tmpMatrix2(2, 1), tmpMatrix2(0, 2), tmpMatrix2(1, 2), tmpMatrix2(2, 2)

End If Else Set actualTCPFrame = originPrism.copy() End If MeasurementsReceived = True Call ExecuteOneTimestep

End Sub

Private Sub CheckCATIA_Click()

On Error Resume Next

Set V5 = GetObject(, "CATIA.Application") If V5 Is Nothing Then Set V5 = GetObject(, "DMU.Application") End If If V5 Is Nothing Then Set V5 = GetObject(, "DELMIA.Application") End If If V5 Is Nothing Then MsgBox "V5 Application not found!", , "Error" MsgBox "Run V5 and try again" End End If Set p1 = V5.ActiveDocument.Product If Me.CheckCATIA = Checked Then Me.TimerEmulateLaser.Enabled = True Else Me.TimerEmulateLaser.Enabled = False End If

End Sub

Private Sub cmdGetCADPosition_Click() Call getCADPositionEnd Sub

Private Sub getCADPosition() Me.CheckEditTarget.Value = Checked Dim tmpFrame As Frame Set tmpFrame = gFlexapodManager.getTopPlateFrame(selectedFlexapod) Set targetTCPFrame = gFlexapodManager.getTopPlateFrame(selectedFlexapod) Me.TargetCoordViewX = tmpFrame.getX() Me.TargetCoordViewY = tmpFrame.getY()

57

Page 60: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Me.TargetCoordViewZ = tmpFrame.getZ() Me.TargetCoordViewRX = tmpFrame.getRotationX * 180 / PI Me.TargetCoordViewRY = tmpFrame.getRotationY * 180 / PI Me.TargetCoordViewRZ = tmpFrame.getRotationZ * 180 / PI Call SetNewTCPTargetEnd Sub

Private Sub Form_Load()

'On Error Resume Next flexapodFilePathDefault = "Flexapod Default.txt" ThreeDXMLPath = App.Path & "\Models\Overview.3dxml" KernelCADCtrl.ModelPath = App.Path & "\Models\test.glm" Call Graphics3D.InitGraphics3D 'initierar 3D-motorn editCurKnot = 0 'tillfällig initiering tills kernelcad funkar Dim i ' Fyller listboxen med Flexapoder Call gFlexapodManager.setSourceFile(App.Path & "\" & flexapodFilePathDefault) 'Call gFlexapodManager.setSourceFile("C:\Henrik\VB Scripting2\KONFIGURATOR HEXAPOD" & "\" &

flexapodFilePathDefault) For i = 0 To gFlexapodManager.getAmount() - 1 Call Me.ActiveFlexapodInList.AddItem(gFlexapodManager.getName(i)) Next Me.ActiveFlexapodInList.ListIndex = 0 ' Fyller listboxen med Pick-ups Call gPickupManager.readDataFromFile For i = 0 To gPickupManager.getAmount() - 1 Call ActivePickUp.AddItem(gPickupManager.getName(i)) Next ActivePickUp.ListIndex = 0 Call originBaseTransform.setIdentity Call targetTCPFrame.setIdentity Call oldDistanceMeasurement.setIdentity Call Constants.SetFlexapodData ' Läser in Flexapodens uppbyggnad Call UpdateView 'Orientate view with default scrollbar values 'Configure Chart control 'Call MSChart1.Plot.LocationRect.min.Set(100, 300) 'Call MSChart1.Plot.LocationRect.max.Set(2000, 1800) 'Call MSChart1.Title.Location.Rect.max.Set(100, 100) MSChart1.AllowSelections = False MSChart1.RowCount = 6 For i = 1 To 6 MSChart1.Row = i MSChart1.RowLabel = i Next MeasurementsReceived = False 'Debug.Print "Ny körning!" 'Dim test As Integer 'test = 0 'Me.ActiveFlexapodInList.ListIndex = test Call Constants.InitiateConstants Call Recovery 'Call setFlexapodFileEnd Sub

Private Sub cmdChooseFile_Click() 'Dim fileSelection As String flexapodFilePath = OpenFileDialog.ShowDialog(Me, "Select Flexapod file", App.Path, "") 'flexapodFilePath = OpenFileDialog.ShowDialog(Me, "Select Flexapod file", "C:\Henrik\VB

Scripting2\KONFIGURATOR HEXAPOD", "") Call setFlexapodFile

58

Page 61: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

End Sub

Private Sub setFlexapodFile() Dim fileSelection As String 'fileSelection = App.Path & "\" & flexapodFilePath fileSelection = flexapodFilePath If Not fileSelection = "" Then Call gFlexapodManager.setSourceFile(fileSelection) Dim i As Integer Call Me.ActiveFlexapodInList.Clear For i = 0 To gFlexapodManager.getAmount() - 1 Call ActiveFlexapodInList.AddItem(gFlexapodManager.getName(i)) Next ActiveFlexapodInList.ListIndex = 0 End If Call getCADPositionEnd Sub

Private Sub cmdOpen3D_Click(index As Integer) Dim HTMLString As String Dim FilePath As String HTMLString = "<html>" HTMLString = HTMLString & "<head>" 'HTMLString = HTMLString & "<meta http-equiv=" & Chr(34) & _ ' "Content-Type" & Chr(34) & _ ' " content=" & Chr(34) & _ ' "text/html" & Chr(34) & ">" HTMLString = HTMLString & "</head><body BGCOLOR=black topmargin=0 leftmargin=0>" 'HTMLString = HTMLString & "<div align=left>" 'HTMLString = HTMLString & "<font face='Arial' size='2'>"

HTMLString = HTMLString & "<object classid=CLSID:5ABD296B-F8A0-436C-B2F7-B19170C43D28 id=viewer width=" & CInt(WebBrowser1.Width / 15.5) & " height=" & CInt(WebBrowser1.Height / 15.3) & ">"

'HTMLString = HTMLString & "<object classid=CLSID:5ABD296B-F8A0-436C-B2F7-B19170C43D28 id=viewer width=733 height=413>"

HTMLString = HTMLString & "<param name=_Version value=65536></param>" HTMLString = HTMLString & "<param name=_ExtentX value=13891></param>" HTMLString = HTMLString & "<param name=_ExtentY value=7938></param>" HTMLString = HTMLString & "<param name=_StockProps value=0></param>" 'HTMLString = HTMLString & "<param name=DocumentFile value='C:\Henrik\Dokument\3DXML filer och

dokumentation\3D XML Models\break.3dxml'></param>" 'HTMLString = HTMLString & "<param name=DocumentFile value=" & ThreeDXMLPath & "></param>" 'HTMLString = HTMLString & "<param name=DocumentFile value='C:\Henrik\VB

Scripting2\Emulatorn\UAV Front Section 03.3dxml'></param>" 'HTMLString = HTMLString & "<param name=DocumentFile value='C:\Henrik\VB

Scripting2\Emulatorn\Models\Overview.3dxml'></param>" FilePath = App.Path & "\Models\Overview.3dxml" HTMLString = HTMLString & "<param name=DocumentFile value='" & FilePath & "'></param>" ' Notera

enkelsnuffarna i sökvägen för mellanslag HTMLString = HTMLString & "</object>" HTMLString = HTMLString & "</font>" HTMLString = HTMLString & "</div>" HTMLString = HTMLString & "</body></html>" ' The following statements render the text in the HTMLString ' variable on the WebBrowser control WebBrowser1.Document.Script.Document.Clear WebBrowser1.Document.Script.Document.Write HTMLString WebBrowser1.Document.Script.Document.CloseEnd Sub

Private Sub cmdOpen3DNewWindow_Click(index As Integer) Dim sAppName As String, sAppPath As String sAppName = "3D Overview New Window " sAppPath = "C:\Program\Dassault Systemes\3D XML Player\intel_a\code\bin\3DXMLPlayer.exe

c:\UAV_Front_Section_03.3dxml" 'sAppPath = "C:\Program\Dassault Systemes\3D XML Player\intel_a\code\bin\3DXMLPlayer.exe

C:\Henrik\VB Scripting2\KONFIGURATOR HEXAPOD\UtBox\KONFIGURATOR FLEXAPOD 08-01-31.exe" 'start an application Shell sAppPath, vbNormalFocusEnd Sub

59

Page 62: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Private Sub Form_Unload(Cancel As Integer) Me.TimerEmulateLaser = False Me.TimerInterfaceCATIA = False Me.TimerShowHTMLOnFormOpen = False Call emScon.Disconnect ObjConnect.DisconnectEmbeddedSystemEnd Sub

Private Sub TimerInterfaceCATIA_Timer()

If Me.CheckCATIA = Checked Then Dim tmpMatrix2() As Double ' CaptoHona tmpMatrix2 = actualTCPFrame.getMatrix Set p3 = p1.Products.Item(2) V5lib.SetProductMatrixPos p3, tmpMatrix2(0, 3), tmpMatrix2(1, 3), tmpMatrix2(2, 3),

tmpMatrix2(0, 0), tmpMatrix2(1, 0), tmpMatrix2(2, 0), tmpMatrix2(0, 1), tmpMatrix2(1, 1), tmpMatrix2(2, 1), tmpMatrix2(0, 2), tmpMatrix2(1, 2), tmpMatrix2(2, 2)

' Prisma tmpMatrix2 = originPrism.getMatrix Set p3 = p1.Products.Item(1) V5lib.SetProductMatrixPos p3, tmpMatrix2(0, 3), tmpMatrix2(1, 3), tmpMatrix2(2, 3),

tmpMatrix2(0, 0), tmpMatrix2(1, 0), tmpMatrix2(2, 0), tmpMatrix2(0, 1), tmpMatrix2(1, 1), tmpMatrix2(2, 1), tmpMatrix2(0, 2), tmpMatrix2(1, 2), tmpMatrix2(2, 2)

' Bas tmpMatrix2 = originBaseTransform.getMatrix Set p3 = p1.Products.Item(3) V5lib.SetProductMatrixPos p3, tmpMatrix2(0, 3), tmpMatrix2(1, 3), tmpMatrix2(2, 3),

tmpMatrix2(0, 0), tmpMatrix2(1, 0), tmpMatrix2(2, 0), tmpMatrix2(0, 1), tmpMatrix2(1, 1), tmpMatrix2(2, 1), tmpMatrix2(0, 2), tmpMatrix2(1, 2), tmpMatrix2(2, 2)

End If

End Sub

'Private Sub ActiveFlexapod_Click()' selectedFlexapod = ActiveFlexapod.ListIndex' Call cmdGetCADPosition_Click'End Sub

Private Sub ActivePickUp_Click() selectedPickup = ActivePickUp.ListIndexEnd Sub

Private Sub buttonNullDistance_Click() Set oldDistanceMeasurement = actualTCPFrame.copy()

End Sub

Private Sub buttonSetCurrentPosition_Click() saveCurrentPosition = True If OptionLocal Then Me.TargetCoordViewX = FormatNumber(actualBaseTopTransform.getX(), 4) Me.TargetCoordViewY = FormatNumber(actualBaseTopTransform.getY, 4) Me.TargetCoordViewZ = FormatNumber(actualBaseTopTransform.getZ, 4) Me.TargetCoordViewRX = FormatNumber(actualBaseTopTransform.getRotationX * 180 / PI, 4) Me.TargetCoordViewRY = FormatNumber(actualBaseTopTransform.getRotationY * 180 / PI, 4) Me.TargetCoordViewRZ = FormatNumber(actualBaseTopTransform.getRotationZ * 180 / PI, 4) Else Me.TargetCoordViewX = FormatNumber(actualTCPFrame.getX(), 4) Me.TargetCoordViewY = FormatNumber(actualTCPFrame.getY, 4) Me.TargetCoordViewZ = FormatNumber(actualTCPFrame.getZ, 4) Me.TargetCoordViewRX = FormatNumber(actualTCPFrame.getRotationX * 180 / PI, 4)

60

Page 63: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Me.TargetCoordViewRY = FormatNumber(actualTCPFrame.getRotationY * 180 / PI, 4) Me.TargetCoordViewRZ = FormatNumber(actualTCPFrame.getRotationZ * 180 / PI, 4) End If Call SetNewTCPTarget End Sub

Private Sub ButtonSetHomePosition_Click() 'Set originBaseTransform = actualTCPFrame.transform(homeBaseTransform.inverse) '(Ekv. 5) Set originBaseTransform = actualTCPFrame.transform(homeBaseTransform) '(TESTING) ' Skriver ut basplattans position i CATIA If Me.CheckCATIA = Checked Then Dim tmpMatrix() As Double tmpMatrix = originBaseTransform.getMatrix Set p3 = p1.Products.Item(3) V5lib.SetProductMatrixPos p3, tmpMatrix(0, 3), tmpMatrix(1, 3), tmpMatrix(2, 3),

tmpMatrix(0, 0), tmpMatrix(1, 0), tmpMatrix(2, 0), tmpMatrix(0, 1), tmpMatrix(1, 1), tmpMatrix(2, 1), tmpMatrix(0, 2), tmpMatrix(1, 2), tmpMatrix(2, 2)

End If Call StoreHomePosition End Sub

Private Sub StoreHomePosition()

Dim FileNumber As Integer Dim FileName As String FileName = App.Path & "\Recovery.txt" FileNumber = FreeFile Open FileName For Output As #FileNumber Dim tmpMatrix() As Double ' transformationen från origo till Basplattan tmpMatrix = originBaseTransform.getMatrix Write #FileNumber, tmpMatrix(0, 0), tmpMatrix(0, 1), tmpMatrix(0, 2), tmpMatrix(0, 3),

tmpMatrix(1, 0), tmpMatrix(1, 1), tmpMatrix(1, 2), tmpMatrix(1, 3), tmpMatrix(2, 0), tmpMatrix(2, 1), tmpMatrix(2, 2), tmpMatrix(2, 3)

' Börvärdet 'Write #FileNumber, CDbl(Me.TargetCoordViewX), CDbl(Me.TargetCoordViewY),

CDbl(Me.TargetCoordViewZ), CDbl(Me.TargetCoordViewRX), CDbl(Me.TargetCoordViewRY), CDbl(Me.TargetCoordViewRZ)

' Aktiv Flexapodfil

Write #FileNumber, CStr(flexapodFilePath) Debug.Print flexapodFilePath ' Aktiv Flexapod Write #FileNumber, ActiveFlexapodInList.ListIndex Close FileNumber Call SetNewTCPTarget End Sub

Private Sub cmdRecovery_Click() Call RecoveryEnd Sub

Private Sub Recovery() 'Read top plate frames from file Dim i As Integer Dim dummy As Variant Dim transform() As Double Dim FileName As String Dim xx As Double, yy As Double, ZZ As Double Dim Rx As Double, Ry As Double, Rz As Double

61

Page 64: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

FileName = App.Path & "\Recovery.txt" Open FileName For Input As #1 Dim tmpMatrix(3, 3) As Double Input #1, tmpMatrix(0, 0), tmpMatrix(0, 1), tmpMatrix(0, 2), tmpMatrix(0, 3), tmpMatrix(1, 0),

tmpMatrix(1, 1), tmpMatrix(1, 2), tmpMatrix(1, 3), tmpMatrix(2, 0), tmpMatrix(2, 1), tmpMatrix(2, 2), tmpMatrix(2, 3)

tmpMatrix(3, 0) = 0: tmpMatrix(3, 1) = 0: tmpMatrix(3, 2) = 0: tmpMatrix(3, 3) = 1 Call originBaseTransform.setMatrix(tmpMatrix) 'Input #1, XX, YY, ZZ, Rx, Ry, Rz 'Me.TargetCoordViewX = XX 'Me.TargetCoordViewY = YY 'Me.TargetCoordViewZ = ZZ 'Me.TargetCoordViewRX = Rx 'Me.TargetCoordViewRY = Ry 'Me.TargetCoordViewRZ = Rz

Input #1, flexapodFilePath ' Läser in sökvägen till flexapodfilen 'flexapodFilePath = App.Path & "\" & flexapodFilePath Dim activeListIndex As String Input #1, activeListIndex Close #1 ' Måste stängas innan operationerna nedan görs Call setFlexapodFile ' Lägger in alla flexapoder i listan Me.ActiveFlexapodInList.ListIndex = activeListIndex selectedFlexapod = Me.ActiveFlexapodInList.ListIndex Call getCADPosition

End Sub

Private Sub checkLargeDigits_Click() If checkLargeDigits.Value = Checked Then Me.FrameCartesianError.Height = 5145 Me.FrameCartesianActual.Height = 5295 Me.FrameCartesianActual.Visible = True Me.FrameCartesianError.Visible = True Else Me.FrameCartesianError.Height = 15 Me.FrameCartesianActual.Height = 15 Me.FrameCartesianActual.Visible = False Me.FrameCartesianError.Visible = False End IfEnd Sub

Private Sub cmdConnect_Click() Call emScon.ConnectEnd Sub

Private Sub cmdDisconnect_Click() Call emScon.Disconnect MeasurementsReceived = FalseEnd Sub

Private Sub cmdInitialize_Click() Call emScon.InitializeEnd Sub

Private Sub cmdPark_Click() Call emScon.ParkEnd Sub

Private Sub cmdReleaseMotors_Click() Call emScon.ReleaseMotorsEnd Sub

' Sätter nytt börvärdePrivate Sub cmdUpdateTarget_Click()

62

Page 65: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Call SetNewTCPTarget Call StoreHomePosition End SubPrivate Sub SetNewTCPTarget() Dim m_x As Double, m_y As Double, m_z As Double Dim m_Rx As Double, m_Ry As Double, m_Rz As Double Dim tmpMatrix(3, 3) As Double m_x = Me.TargetCoordViewX m_y = Me.TargetCoordViewY m_z = Me.TargetCoordViewZ m_Rx = Me.TargetCoordViewRX / 180 * PI m_Ry = Me.TargetCoordViewRY / 180 * PI m_Rz = Me.TargetCoordViewRZ / 180 * PI Dim tempFrame As New Frame 'Skapar ett lokalt koordinatsystem Call tempFrame.setIdentity Call tempFrame.setTranslation(m_x, m_y, m_z) Call tempFrame.setOrientation(m_Rx, m_Ry, m_Rz) Set targetTCPFrame = originBaseTransform.transform(tempFrame) 'Ekv. 7 End Sub

Private Sub cmdWriteToFile_Click()

Dim FileNumber As Integer Dim FileName As String FileName = "output.txt" FileNumber = FreeFile Open FileName For Append As FileNumber Write #FileNumber, Me.distanceErrorValue, Me.ActualCoordViewX, Me.ActualCoordViewY,

Me.ActualCoordViewZ, Me.ActualCoordViewRX, Me.ActualCoordViewRY, Me.ActualCoordViewRZ Close FileNumber

End Sub

Private Sub HScroll1_Change() ViewRotationZ = HScroll1.Value Call UpdateViewEnd Sub

Private Sub HScroll1_Scroll() ViewRotationZ = HScroll1.Value Call UpdateViewEnd Sub

Private Sub TimerShowHTMLOnFormOpen_Timer()

Dim HTMLString As String HTMLString = "<html>" HTMLString = HTMLString & "<head>" 'HTMLString = HTMLString & "<meta http-equiv=" & Chr(34) & _ ' "Content-Type" & Chr(34) & _ ' " content=" & Chr(34) & _ ' "text/html" & Chr(34) & ">" HTMLString = HTMLString & "</head><body BGCOLOR=black topmargin=0 leftmargin=0>" 'HTMLString = HTMLString & "<div align=left>" 'HTMLString = HTMLString & "<font face='Arial' size='2'>" HTMLString = HTMLString & "</font>" HTMLString = HTMLString & "</div>" HTMLString = HTMLString & "</body></html>" ' The following statements render the text in the HTMLString ' variable on the WebBrowser control WebBrowser1.Document.Script.Document.Clear WebBrowser1.Document.Script.Document.Write HTMLString

63

Page 66: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

WebBrowser1.Document.Script.Document.Close

' Timern används bara en gång sedan stängs den av TimerShowHTMLOnFormOpen.Enabled = False

End Sub

Private Sub VScroll1_Change() ViewRotationX = 90 - VScroll1.Value Call UpdateViewEnd Sub

Private Sub VScroll1_Scroll() ViewRotationX = 90 - VScroll1.Value Call UpdateViewEnd Sub

Private Sub UpdateView() Dim pArray As IPropertyArray Dim eyeFrame As IFrame Set eyeFrame = KernelCADCtrl.GetView Call eyeFrame.Reset Call eyeFrame.Rotate(HScroll1.Value, 0, 0, 0, 0, 0, 1) Call eyeFrame.Rotate(VScroll1.Value, 0, 0, 0, 1, 0, 0) Call KernelCADCtrl.UpdateView End Sub

Private Sub buttonZoomIn_Click() Dim pLook As ILook Set pLook = KernelCADCtrl.GetView Call pLook.ZoomEx(1.25, 0, 0, 0) Call KernelCADCtrl.UpdateViewEnd Sub

Private Sub buttonZoomOut_Click() Dim pLook As ILook Set pLook = KernelCADCtrl.GetView Call pLook.ZoomEx(0.8, 0, 0, 0) Call KernelCADCtrl.UpdateViewEnd Sub

Private Sub ExecuteOneTimestep() Set topTCPTransform = gPickupManager.getTransform(selectedPickup) ' Hämtar in transformationen

för aktiv pick-up:en If MeasurementsReceived Then Call ComputeTargetValues ' Beräknar benlängder för slutpositionen Call ComputeActualValues ' Beräknar benlängder för nuvarande position Call CalculateLegLengths ' Beräknar skillnaden i benlängd mellan nuvarande position och

slutposition Call CalculateErrors ' Beräknar felvärderna för KernelCAD applet samt uppdaterar den Call UpdateChart ' Uppdaterar staplarna för benlängd Call UpdateMeasurements ' Uppdaterar positionsfälten på operatörspanelen End IfEnd SubSub ComputeTargetValues() 'FIXME For demonstration purposes we set the target by clicking the 'Set Current Position'

button 'FIXME This is wrong. Should it be the transform from origin to TCP? 'Läser in slutposition från fil. 'Set targetTCPFrame = gFlexapodManager.getTopPlateFrame(selectedFlexapod) 'Calculate target base-to-top transform 'Set targetBaseTopTransform = targetTCPFrame.transform(topTCPTransform.inverse()) 'Set targetBaseTopTransform = targetBaseTopTransform.transform(originBaseTransform.inverse()) Set targetBaseTopTransform = originBaseTransform.inverse().transform(targetTCPFrame) '(Ekv. 6) ' Räknar ut benlängdens börvärden i vektorformat (Ekv. 8) Dim B1goal() As Double, B2goal() As Double, B3goal() As Double, B4goal() As Double, B5goal() As

Double, B6goal() As Double B1goal = targetBaseTopTransform.Multiply(topLeg1Pos()) B2goal = targetBaseTopTransform.Multiply(topLeg2Pos()) B3goal = targetBaseTopTransform.Multiply(topLeg3Pos()) B4goal = targetBaseTopTransform.Multiply(topLeg4Pos())

64

Page 67: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

B5goal = targetBaseTopTransform.Multiply(topLeg5Pos()) B6goal = targetBaseTopTransform.Multiply(topLeg6Pos())

' Räknar om benlängden från vektorformat till benlängd (Ekv. 9) targetLegLength1 = Sqr((baseLeg1Pos(0) - B1goal(0, 0)) ^ 2 + (baseLeg1Pos(1) - B1goal(1, 0)) ^ 2

+ (baseLeg1Pos(2) - B1goal(2, 0)) ^ 2) targetLegLength2 = Sqr((baseLeg2Pos(0) - B2goal(0, 0)) ^ 2 + (baseLeg2Pos(1) - B2goal(1, 0)) ^ 2

+ (baseLeg2Pos(2) - B2goal(2, 0)) ^ 2) targetLegLength3 = Sqr((baseLeg3Pos(0) - B3goal(0, 0)) ^ 2 + (baseLeg3Pos(1) - B3goal(1, 0)) ^ 2

+ (baseLeg3Pos(2) - B3goal(2, 0)) ^ 2) targetLegLength4 = Sqr((baseLeg4Pos(0) - B4goal(0, 0)) ^ 2 + (baseLeg4Pos(1) - B4goal(1, 0)) ^ 2

+ (baseLeg4Pos(2) - B4goal(2, 0)) ^ 2) targetLegLength5 = Sqr((baseLeg5Pos(0) - B5goal(0, 0)) ^ 2 + (baseLeg5Pos(1) - B5goal(1, 0)) ^ 2

+ (baseLeg5Pos(2) - B5goal(2, 0)) ^ 2) targetLegLength6 = Sqr((baseLeg6Pos(0) - B6goal(0, 0)) ^ 2 + (baseLeg6Pos(1) - B6goal(1, 0)) ^ 2

+ (baseLeg6Pos(2) - B6goal(2, 0)) ^ 2)

End SubSub ComputeActualValues() 'Calculate actual base-to-top transform Set actualBaseTopTransform = originBaseTransform.inverse().transform(actualTCPFrame) ' (Ekv. 10)

Dim B1a() As Double Dim B2a() As Double Dim B3a() As Double Dim B4a() As Double Dim B5a() As Double Dim B6a() As Double ' Räknar ut Vektorn(Current) bas till ben 1 (Ekv. 11) B1a = actualBaseTopTransform.Multiply(topLeg1Pos) B2a = actualBaseTopTransform.Multiply(topLeg2Pos) B3a = actualBaseTopTransform.Multiply(topLeg3Pos) B4a = actualBaseTopTransform.Multiply(topLeg4Pos) B5a = actualBaseTopTransform.Multiply(topLeg5Pos) B6a = actualBaseTopTransform.Multiply(topLeg6Pos) ' Räknar ut skillnaden i vektorlängden mellan (Ekv. 12) ' Goal och Current är skillnaden i vektorländen ' Längden av en vektor räknas från benfäste bas och benfäste topp actualLegLength1 = Sqr((baseLeg1Pos(0) - B1a(0, 0)) ^ 2 + (baseLeg1Pos(1) - B1a(1, 0)) ^ 2 +

(baseLeg1Pos(2) - B1a(2, 0)) ^ 2) actualLegLength2 = Sqr((baseLeg2Pos(0) - B2a(0, 0)) ^ 2 + (baseLeg2Pos(1) - B2a(1, 0)) ^ 2 +

(baseLeg2Pos(2) - B2a(2, 0)) ^ 2) actualLegLength3 = Sqr((baseLeg3Pos(0) - B3a(0, 0)) ^ 2 + (baseLeg3Pos(1) - B3a(1, 0)) ^ 2 +

(baseLeg3Pos(2) - B3a(2, 0)) ^ 2) actualLegLength4 = Sqr((baseLeg4Pos(0) - B4a(0, 0)) ^ 2 + (baseLeg4Pos(1) - B4a(1, 0)) ^ 2 +

(baseLeg4Pos(2) - B4a(2, 0)) ^ 2) actualLegLength5 = Sqr((baseLeg5Pos(0) - B5a(0, 0)) ^ 2 + (baseLeg5Pos(1) - B5a(1, 0)) ^ 2 +

(baseLeg5Pos(2) - B5a(2, 0)) ^ 2) actualLegLength6 = Sqr((baseLeg6Pos(0) - B6a(0, 0)) ^ 2 + (baseLeg6Pos(1) - B6a(1, 0)) ^ 2 +

(baseLeg6Pos(2) - B6a(2, 0)) ^ 2)

End SubSub CalculateLegLengths()

' Ex. Om benet är för långt mot mål skall det visas som positiv stapel, därför current-goal B1diff = actualLegLength1 - targetLegLength1 B2diff = actualLegLength2 - targetLegLength2 B3diff = actualLegLength3 - targetLegLength3 B4diff = actualLegLength4 - targetLegLength4 B5diff = actualLegLength5 - targetLegLength5 B6diff = actualLegLength6 - targetLegLength6 Me.Text_Leg1 = FormatNumber(B1diff, 2) Me.Text_Leg2 = FormatNumber(B2diff, 2) Me.Text_Leg3 = FormatNumber(B3diff, 2) Me.Text_Leg4 = FormatNumber(B4diff, 2) Me.Text_Leg5 = FormatNumber(B5diff, 2) Me.Text_Leg6 = FormatNumber(B6diff, 2)

End Sub

65

Page 68: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Sub CalculateErrors() ' Felberäkning '1. Mät Current in trackerns baskoordinatsystem '2. Gör felberäkningen i trackerns koordinatsystem '3. För att presentera felet för operatör måste felet (i trackerns koordinatsystem) göras om

till Flexapodens baskoordinatsystem ' Tr_to_TCP = Tr_to_FlexapodBase * FlexapodBase_to_TCP ' FlexapodBase_to_TCP = Tr_to_TCP^-1 * Tr_to_FlexapodBase

ErrX = targetBaseTopTransform.getX() - actualBaseTopTransform.getX() ErrY = targetBaseTopTransform.getY() - actualBaseTopTransform.getY() ErrZ = targetBaseTopTransform.getZ() - actualBaseTopTransform.getZ() ' KernelCAD kör radianer ErrRx = targetBaseTopTransform.getRotationX() - actualBaseTopTransform.getRotationX() ErrRy = targetBaseTopTransform.getRotationY() - actualBaseTopTransform.getRotationY() ErrRz = targetBaseTopTransform.getRotationZ() - actualBaseTopTransform.getRotationZ() 'Debug.Print "ErrX= " & ErrX 'Debug.Print "ErrY= " & ErrY 'Debug.Print "ErrZ= " & ErrZ 'Debug.Print "ErrRx= " & ErrRx 'Debug.Print "ErrRy= " & ErrRy 'Debug.Print "ErrRz= " & ErrRz 'Debug.Print "targetBaseTopTransform.getX= " & targetBaseTopTransform.getX 'Debug.Print "targetBaseTopTransform.gety= " & targetBaseTopTransform.getY 'Debug.Print "targetBaseTopTransform.getz= " & targetBaseTopTransform.getZ 'Debug.Print "targetBaseTopTransform.getRotationX= " & targetBaseTopTransform.getRotationX * 180

/ PI 'Debug.Print "targetBaseTopTransform.getRotationY= " & targetBaseTopTransform.getRotationY * 180

/ PI 'Debug.Print "targetBaseTopTransform.getRotationZ= " & targetBaseTopTransform.getRotationZ * 180

/ PI 'Debug.Print "actualBaseTopTransform.getX = " & actualBaseTopTransform.getX 'Debug.Print "actualBaseTopTransform.getY = " & actualBaseTopTransform.getY 'Debug.Print "actualBaseTopTransform.getZ = " & actualBaseTopTransform.getZ 'Debug.Print "actualBaseTopTransform.getRotationX = " & actualBaseTopTransform.getRotationX *

180 / PI 'Debug.Print "actualBaseTopTransform.getRotationY = " & actualBaseTopTransform.getRotationY *

180 / PI 'Debug.Print "actualBaseTopTransform.getRotationZ = " & actualBaseTopTransform.getRotationZ *

180 / PI 'Debug.Print "targetTCPFrame.getX= " & targetTCPFrame.getX 'Debug.Print "targetTCPFrame.getY= " & targetTCPFrame.getY 'Debug.Print "targetTCPFrame.getZ= " & targetTCPFrame.getZ 'Debug.Print "TRx= " & targetBaseTopTransform.getRotationX() * 180 / PI & " TRy=" &

targetBaseTopTransform.getRotationY() * 180 / PI & " TRz= " & targetBaseTopTransform.getRotationZ() * 180 / PI & _

" ARx= " & actualBaseTopTransform.getRotationX() * 180 / PI & " ARy= " & actualBaseTopTransform.getRotationY() * 180 / PI & " Rz= " & actualBaseTopTransform.getRotationZ() * 180 / PI

'FIXME Why is it neccesary to negate the angles? ErrRx = -ErrRx ErrRy = -ErrRy ErrRz = -ErrRz ' Uppdaterar 3D-grafiken CurrentAxis = 0 Call Graphics3D.UpdatePartSelection(0) Call Graphics3D.MoveCADModel ' depends on Err* variables End Sub

Sub UpdateChart() 'Draw bars in MS Chart control With MSChart1 'Call .Plot.SeriesCollection(1).DataPoints(-1).Brush.FillColor.Set(0, 255, 0) B1diff = Round(B1diff, 3) B2diff = Round(B2diff, 3)

66

Page 69: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

B3diff = Round(B3diff, 3) B4diff = Round(B4diff, 3) B5diff = Round(B5diff, 3) B6diff = Round(B6diff, 3) Dim upperLimit(6) As Double Dim lowerLimit(6) As Double lowerLimit(0) = 1 lowerLimit(1) = 0.5 lowerLimit(2) = 0.25 lowerLimit(3) = 0.1 lowerLimit(4) = 0.05 lowerLimit(5) = 0.025 upperLimit(1) = lowerLimit(0) * 1.25 upperLimit(2) = lowerLimit(1) * 1.25 upperLimit(3) = lowerLimit(2) * 1.25 upperLimit(4) = lowerLimit(3) * 1.25 upperLimit(5) = lowerLimit(4) * 1.25 upperLimit(6) = lowerLimit(5) * 1.25

' ska vi zooma in? If Abs(B1diff) < lowerLimit(currentLimit) And _ Abs(B2diff) < lowerLimit(currentLimit) And _ Abs(B3diff) < lowerLimit(currentLimit) And _ Abs(B4diff) < lowerLimit(currentLimit) And _ Abs(B5diff) < lowerLimit(currentLimit) And _ Abs(B6diff) < lowerLimit(currentLimit) Then If currentLimit < 6 Then currentLimit = currentLimit + 1 End If End If ' ska vi zooma ut? If Abs(B1diff) > upperLimit(currentLimit) And _ Abs(B2diff) > upperLimit(currentLimit) And _ Abs(B3diff) > upperLimit(currentLimit) And _ Abs(B4diff) > upperLimit(currentLimit) And _ Abs(B5diff) > upperLimit(currentLimit) And _ Abs(B6diff) > upperLimit(currentLimit) Then If currentLimit > 0 Then currentLimit = currentLimit - 1 End If End If ' Automatisk justering av Y-axeln vid stora fel på benlängderna If currentLimit = 0 Then .Plot.Axis(VtChAxisIdY).ValueScale.Auto = True Else .Plot.Axis(VtChAxisIdY).ValueScale.Auto = False .Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 10 .Plot.Axis(VtChAxisIdY).ValueScale.Minimum = -upperLimit(currentLimit) .Plot.Axis(VtChAxisIdY).ValueScale.Maximum = upperLimit(currentLimit) End If Call updateBar(1, B1diff) Call updateBar(2, B2diff) Call updateBar(3, B3diff) Call updateBar(4, B4diff) Call updateBar(5, B5diff) Call updateBar(6, B6diff) End With End Sub

Sub updateBar(bar As Integer, Value As Double) 'MSChart1.ColumnCount = 4 MSChart1.Column = 1: MSChart1.Row = bar: MSChart1.Data = 0

67

Page 70: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

MSChart1.Column = 2: MSChart1.Row = bar: MSChart1.Data = 0 MSChart1.Column = 3: MSChart1.Row = bar: MSChart1.Data = 0 MSChart1.Column = 4: MSChart1.Row = bar: MSChart1.Data = 0 ''''TEST'''' Call MSChart1.Plot.SeriesCollection(2).Pen.VtColor.Set(255, 255, 0) ''''TEST'''' If Abs(Value) > 0.2 Then MSChart1.Column = 1 ElseIf Abs(Value) > 0.1 Then MSChart1.Column = 2 ElseIf Abs(Value) > 0.04 Then MSChart1.Column = 3 Else MSChart1.Column = 4 End If MSChart1.Row = bar MSChart1.Data = Value End Sub

Sub UpdateMeasurements() Me.BaseCoordViewX = FormatNumber(originBaseTransform.getX(), 4) Me.BaseCoordViewY = FormatNumber(originBaseTransform.getY(), 4) Me.BaseCoordViewZ = FormatNumber(originBaseTransform.getZ(), 4) Me.BaseCoordViewRX = FormatNumber(originBaseTransform.getRotationX() * 180 / PI, 4) Me.BaseCoordViewRY = FormatNumber(originBaseTransform.getRotationY() * 180 / PI, 4) Me.BaseCoordViewRZ = FormatNumber(originBaseTransform.getRotationZ() * 180 / PI, 4) ' Beräknar och visar felet samt är-värdet lokalt eller globalt If Me.OptionLocal Then Me.ActualCoordViewX = FormatNumber(actualBaseTopTransform.getX(), 4) Me.ActualCoordViewY = FormatNumber(actualBaseTopTransform.getY(), 4) Me.ActualCoordViewZ = FormatNumber(actualBaseTopTransform.getZ(), 4) Me.ActualCoordViewRX = FormatNumber(actualBaseTopTransform.getRotationX() * 180 / PI, 4) Me.ActualCoordViewRY = FormatNumber(actualBaseTopTransform.getRotationY() * 180 / PI, 4) Me.ActualCoordViewRZ = FormatNumber(actualBaseTopTransform.getRotationZ() * 180 / PI, 4) If Me.CheckEditTarget = Unchecked Then Me.TargetCoordViewX = FormatNumber(targetBaseTopTransform.getX(), 4) Me.TargetCoordViewY = FormatNumber(targetBaseTopTransform.getY(), 4) Me.TargetCoordViewZ = FormatNumber(targetBaseTopTransform.getZ(), 4) Me.TargetCoordViewRX = FormatNumber(targetBaseTopTransform.getRotationX(), 4) Me.TargetCoordViewRY = FormatNumber(targetBaseTopTransform.getRotationY(), 4) Me.TargetCoordViewRZ = FormatNumber(targetBaseTopTransform.getRotationZ(), 4) End If Me.ErrorCoordViewX = FormatNumber(actualBaseTopTransform.getX() -

targetBaseTopTransform.getX(), 4) Me.ErrorCoordViewY = FormatNumber(actualBaseTopTransform.getY() -

targetBaseTopTransform.getY(), 4) Me.ErrorCoordViewZ = FormatNumber(actualBaseTopTransform.getZ() -

targetBaseTopTransform.getZ(), 4) Me.ErrorCoordViewRX = FormatNumber((actualBaseTopTransform.getRotationX() -

targetBaseTopTransform.getRotationX()) * 180 / PI, 4) Me.ErrorCoordViewRY = FormatNumber((actualBaseTopTransform.getRotationY() -

targetBaseTopTransform.getRotationY()) * 180 / PI, 4) Me.ErrorCoordViewRZ = FormatNumber((actualBaseTopTransform.getRotationZ() -

targetBaseTopTransform.getRotationZ()) * 180 / PI, 4) Else Me.ActualCoordViewX = FormatNumber(actualTCPFrame.getX(), 4) Me.ActualCoordViewY = FormatNumber(actualTCPFrame.getY(), 4) Me.ActualCoordViewZ = FormatNumber(actualTCPFrame.getZ(), 4) Me.ActualCoordViewRX = FormatNumber(actualTCPFrame.getRotationX() * 180 / PI, 4) Me.ActualCoordViewRY = FormatNumber(actualTCPFrame.getRotationY() * 180 / PI, 4) Me.ActualCoordViewRZ = FormatNumber(actualTCPFrame.getRotationZ() * 180 / PI, 4) If Me.CheckEditTarget = Unchecked Then Me.TargetCoordViewX = FormatNumber(targetTCPFrame.getX(), 4) Me.TargetCoordViewY = FormatNumber(targetTCPFrame.getY(), 4) Me.TargetCoordViewZ = FormatNumber(targetTCPFrame.getZ(), 4) Me.TargetCoordViewRX = FormatNumber(targetTCPFrame.getRotationX(), 4) Me.TargetCoordViewRY = FormatNumber(targetTCPFrame.getRotationY(), 4) Me.TargetCoordViewRZ = FormatNumber(targetTCPFrame.getRotationZ(), 4)

68

Page 71: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

End If Me.ErrorCoordViewX = FormatNumber(actualTCPFrame.getX() - targetTCPFrame.getX(), 4) Me.ErrorCoordViewY = FormatNumber(actualTCPFrame.getY() - targetTCPFrame.getY(), 4) Me.ErrorCoordViewZ = FormatNumber(actualTCPFrame.getZ() - targetTCPFrame.getZ(), 4) Me.ErrorCoordViewRX = FormatNumber((targetTCPFrame.getRotationX() -

actualTCPFrame.getRotationX()) * 180 / PI, 4) Me.ErrorCoordViewRY = FormatNumber((targetTCPFrame.getRotationY() -

actualTCPFrame.getRotationY()) * 180 / PI, 4) Me.ErrorCoordViewRZ = FormatNumber((targetTCPFrame.getRotationZ() -

actualTCPFrame.getRotationZ()) * 180 / PI, 4) End If Me.ErrorToTarget = FormatNumber(Sqr( _ (actualTCPFrame.getX() - targetTCPFrame.getX()) ^ 2 + _ (actualTCPFrame.getY() - targetTCPFrame.getY()) ^ 2 + _ (actualTCPFrame.getZ() - targetTCPFrame.getZ()) ^ 2) _ , 4) Dim temp temp = Sqr( _ (actualTCPFrame.getX() - oldDistanceMeasurement.getX()) ^ 2 + _ (actualTCPFrame.getY() - oldDistanceMeasurement.getY()) ^ 2 + _ (actualTCPFrame.getZ() - oldDistanceMeasurement.getZ()) ^ 2) distanceErrorValue = FormatNumber(temp, 4) 'Large digits Me.measurementData1 = FormatNumber(actualTCPFrame.getX() - targetTCPFrame.getX(), 4) Me.measurementData2 = FormatNumber(actualTCPFrame.getY() - targetTCPFrame.getY(), 4) Me.measurementData3 = FormatNumber(actualTCPFrame.getZ() - targetTCPFrame.getZ(), 4) Me.measurementData4 = FormatNumber((targetTCPFrame.getRotationX() -

actualTCPFrame.getRotationX()) * 180 / PI, 4) Me.measurementData5 = FormatNumber((targetTCPFrame.getRotationY() -

actualTCPFrame.getRotationY()) * 180 / PI, 4) Me.measurementData6 = FormatNumber((targetTCPFrame.getRotationZ() -

actualTCPFrame.getRotationZ()) * 180 / PI, 4) Me.TotalError = FormatNumber(Me.ErrorToTarget, 4) Me.DeltaLeg1 = FormatNumber(-B1diff, 3) Me.DeltaLeg2 = FormatNumber(-B2diff, 3) Me.DeltaLeg3 = FormatNumber(-B3diff, 3) Me.DeltaLeg4 = FormatNumber(-B4diff, 3) Me.DeltaLeg5 = FormatNumber(-B5diff, 3) Me.DeltaLeg6 = FormatNumber(-B6diff, 3)

End Sub

Private Sub ObjSync_ContinuousProbeMeasDataReady(ByVal resultsTotal As Long, ByVal bytesTotal As Long)

On Error GoTo ErrorHandler Dim numRes As Long Dim measMode As ES_MeasMode Dim temp As Double Dim press As Double Dim hum As Double Dim bTry As Boolean Dim Data As Variant Dim i As Long Dim time1 As Long Dim time2 As Long Dim dVal1 As Double Dim dVal2 As Double Dim dVal3 As Double Dim measStat As ES_ResultStatus Dim triggerStat As ES_TriggerStatus Dim rotationStat As Long Dim probeID As Long Dim tipStatus As ES_MeasurementTipStatus Dim tipID As Long Dim socketNo As Long Dim dmy1 As Double ' dummy variable Dim dmy2 As Double

69

Page 72: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Dim dmy3 As Double Dim dmy4 As Double Dim dmy5 As Double Dim dmy6 As Double Dim dmy7 As Double Dim dmy8 As Double Dim dmy9 As Double Dim dmy10 As Double Dim dmy11 As Double Dim dmy12 As Double Dim dmy13 As Double Dim dmy14 As Double Dim dQuat0 As Double Dim dQuat1 As Double Dim dQuat2 As Double Dim dQuat3 As Double Dim dOmega As Double Dim dPhi As Double Dim dKappa As Double Dim fieldNumber As Long Dim averagedData(5) As Double ObjConnect.GetData Data ObjConnect.ContinuousProbeDataGetHeaderInfo Data, numRes, measMode, probeID, fieldNumber,

tipStatus, tipID, socketNo, temp, press, hum, bTry

'ObjConnect.ContinuousProbeDataGetHeaderInfo Data, numRes, measMode, temp, press, hum, bTry For i = 0 To numRes - 1 ObjConnect.ContinuousProbeDataGetAt Data, i, measStat, triggerStat, rotationStat, _ time1, time2, dVal1, dVal2, dVal3, _ dmy1, dmy2, dmy3, dmy4, dmy5, dmy6, dmy7, _ dQuat0, dQuat1, dQuat2, dQuat3, _ dOmega, dPhi, dKappa, _ dmy8, dmy9, dmy10, dmy11, dmy12, dmy13, dmy14 ' 2. line: measure time and probe position ' 3. line: standard deviation and covariance of position (stored in dummy variable dmy) ' 4. line: probe rotation as quaternion ' 5. line: probe rotation as Euler angles ' 6. line: standard deviation and covariance of rotation (stored in dummy variable dmy) 'Debug.Print "measMode= " & measMode 'Debug.Print "numres=" & numRes & " time1= " & time1 & " time2=" & time2 & " measStat=" &

measStat & " rotationStat=" & rotationStat 'Debug.Print "i= " & i & "dval1=" & dVal1 & " dval2=" & dVal2 & " dval3=" & dVal3 & "

dOmega=" & dOmega & " dPhi=" & dPhi & " dKappa=" & dKappa averagedData(0) = averagedData(0) + dVal1 averagedData(1) = averagedData(1) + dVal2 averagedData(2) = averagedData(2) + dVal3 'averagedData(3) = averagedData(3) + dOmega 'averagedData(4) = averagedData(4) + dPhi 'averagedData(5) = averagedData(5) + dKappa Next i 'beräkna medelvärde For i = 0 To 5 averagedData(i) = averagedData(i) / numRes Next i Call originPrism.setIdentity Call originPrism.setTranslation(averagedData(0), averagedData(1), averagedData(2)) Call originPrism.setOrientation(dOmega, dPhi, dKappa) 'Call originPrism.setOrientationByQuaternions(dQuat0, dQuat1, dQuat2, dQuat3) Call actualTCPFrame.setIdentity 'Måste sätta denna If Me.CheckUseTransform = vbChecked Then If selectedPickup = 0 Then Set actualTCPFrame = originPrism.transform(prismTCPTransform) 'originPrism x

prismTCPTransform (Ekv. 4) ElseIf selectedPickup = 1 Then Set actualTCPFrame =

originPrism.transform(prismTCPTransform).transform(tcpRefTransform.inverse)

70

Page 73: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

End If Else Set actualTCPFrame = originPrism.copy() End If MeasurementsReceived = True 'DEMO If saveCurrentPosition Then Set targetTCPFrame = actualTCPFrame.copy() saveCurrentPosition = False End If '/DEMO

Call ExecuteOneTimestep

Exit SubErrorHandler: 'MsgBox (Err.Description)

End Sub

Public Sub ObjSync_ErrorEvent(ByVal command As LTCONTROLLib.ES_Command, ByVal status As LTCONTROLLib.ES_ResultStatus)

'Call MsgBox("emsCon error!!!" & command & " , " & status) 'Commands: ' 64 = ES_C_Unknown 'Status: ' 701 = ???End Sub

Private Sub ObjSync_StatusChangeEvent(ByVal statusChange As LTCONTROLLib.ES_SystemStatusChange) 'Call MsgBox("emsCon status change: " & statusChange) If statusChange = ES_SystemStatusChange.ES_SSC_DistanceSet Then ' Laserstrålen är låst på målet, starta mätning på nytt Call ObjSync.StartContinuousProbeMeasurement Else End If '6 = ES_SSC_UnitsChanged '17 = ES_SSC_MeasurementModeChanged '25 = ES_SSC_MeasStatus_NotReady '26 = ES_SSC_MeasStatus_Busy '27 = ES_SSC_MeasStatus_ReadyEnd Sub

'Code for reading INI files 'Dim m_cIni As New cInifile ' Öppnar INI-fil 'With m_cIni ' .Path = App.Path & "\Flexapod.ini" 'End With 'rootPath = App.Path

' Läser in INI-fil 'Call Delfoilib.ReadIniFile

'With m_cIni ' .Section = "Start Values" ' .Key = "x" ' Me.PosXRel = .Value ' .Key = "y" ' Me.PosYRel = .Value ' .Key = "z" ' Me.PosZRel = .Value ' .Key = "rx" ' Me.EulerXRel = .Value ' .Key = "ry" ' Me.EulerYRel = .Value

71

Page 74: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

' .Key = "rz" ' Me.EulerZRel = .Value 'End With

'Public Sub ReadIniFile()

' Dim sGet As String' Dim sSections() As String' Dim iSectionCount As Long' Dim sKeys() As String' Dim iKeycount As Long' Dim iSection As Long' Dim iKey As Long' Dim lSect As Long

'lstIni.Clear

' With m_cIni

' .EnumerateAllSections sSections(), iSectionCount

' For iSection = 1 To iSectionCount

'lstIni.AddItem "[" & sSections(iSection) & "]" 'lSect = lstIni.NewIndex 'lstIni.ItemData(lSect) = -1' .Section = sSections(iSection)' .EnumerateCurrentSection sKeys(), iKeycount ' For iKey = 1 To iKeycount

' .Key = sKeys(iKey) 'lstIni.AddItem .Key & "=" & .Value 'lstIni.ItemData(lstIni.NewIndex) = lSect ' Next iKey' Next iSection 'If (lstIni.ListCount > 0) Then ' lstIni.ListIndex = lstIni.ListCount - 1 'End If' End With'End Sub

72

Page 75: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Constants.bas'Option Explicit

Public Const PI As Double = 3.14159265358979

' Kalibrering av Capto (60 mm) till laserprismat' Värderna kommer från Leica' Värderna är angivna från Capto hona till PrismaPublic Const cX As Double = -40.401Public Const cY As Double = -0.009Public Const cZ As Double = -36.835Public Const cRx As Double = 170.4361 * PI / 180Public Const cRy As Double = 89.7117 * PI / 180Public Const cRz As Double = -189.5532 * PI / 180

' Probens Transformation enligt följande ordning (rx=0 => ry=90 => rz=-90)Public Const pX As Double = 120Public Const pY As Double = 0Public Const pZ As Double = 177Public Const pRx As Double = 0Public Const pRy As Double = 90 * PI / 180Public Const pRz As Double = -90 * PI / 180

'Public Const cX As Double = 40.401'Public Const cY As Double = 0.009'Public Const cZ As Double = 36.835'Public Const cRx As Double = -170.4361 * PI / 180'Public Const cRy As Double = -89.7117 * PI / 180'Public Const cRz As Double = 189.5532 * PI / 180

' Transformation från prisma till Captohona'Public PC(3, 3) As DoublePublic prismTCPTransform As New FramePublic homeBaseTransform As New FramePublic tcpRefTransform As New Frame

Public topLeg1Pos() As Double, topLeg2Pos() As Double, topLeg3Pos() As Double, topLeg4Pos() As Double, topLeg5Pos() As Double, topLeg6Pos() As Double

Public baseLeg1Pos(3) As Double, baseLeg2Pos(3) As Double, baseLeg3Pos(3) As Double, baseLeg4Pos(3) As Double, baseLeg5Pos(3) As Double, baseLeg6Pos(3) As Double

Public Sub InitiateConstants()

Call prismTCPTransform.setIdentity Call prismTCPTransform.setTranslation(cX, cY, cZ) Call prismTCPTransform.setOrientation(cRx, cRy, cRz) ' Skapar homeBaseTransform Call homeBaseTransform.setIdentity Call homeBaseTransform.setTranslation(0, 0, -645) ' Skapar tcpRefTransform Call tcpRefTransform.setIdentity Call tcpRefTransform.setTranslation(pX, pY, pZ) Call tcpRefTransform.setOrientation(pRx, pRy, pRz) End Sub

Public Sub SetFlexapodData() ' Koordinaterna för benfästen relativt topplattans TCP ' benfästena räknas som vektorpunkten mitt i leden ' Värdena är mätta i CATIA med kompassen ' Craig sid 30, för att få en 4x1 vektor ReDim topLeg1Pos(3), topLeg2Pos(3), topLeg3Pos(3), topLeg4Pos(3), topLeg5Pos(3), topLeg6Pos(3) topLeg1Pos(0) = -48.767 topLeg1Pos(1) = 32.467 topLeg1Pos(2) = -75 topLeg1Pos(3) = 1 topLeg2Pos(0) = -3.733

73

Page 76: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

topLeg2Pos(1) = 58.467 topLeg2Pos(2) = -75 topLeg2Pos(3) = 1 topLeg3Pos(0) = 52.5 topLeg3Pos(1) = 26 topLeg3Pos(2) = -75 topLeg3Pos(3) = 1 topLeg4Pos(0) = 52.5 topLeg4Pos(1) = -26 topLeg4Pos(2) = -75 topLeg4Pos(3) = 1 topLeg5Pos(0) = -3.733 topLeg5Pos(1) = -58.467 topLeg5Pos(2) = -75 topLeg5Pos(3) = 1 topLeg6Pos(0) = -48.767 topLeg6Pos(1) = -32.467 topLeg6Pos(2) = -75 topLeg6Pos(3) = 1 ' Koordinaterna för benfästen relativt basplattans TCP baseLeg1Pos(0) = -190.471 baseLeg1Pos(1) = 26 baseLeg1Pos(2) = 55 baseLeg2Pos(0) = 72.719 baseLeg2Pos(1) = 177.953 baseLeg2Pos(2) = 55 baseLeg3Pos(0) = 117.752 baseLeg3Pos(1) = 151.953 baseLeg3Pos(2) = 55 baseLeg4Pos(0) = 117.752 baseLeg4Pos(1) = -151.953 baseLeg4Pos(2) = 55 baseLeg5Pos(0) = 72.719 baseLeg5Pos(1) = -177.953 baseLeg5Pos(2) = 55 baseLeg6Pos(0) = -190.471 baseLeg6Pos(1) = -26 baseLeg6Pos(2) = 55End Sub

74

Page 77: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

emScon.basOption Explicit

Public IsConnected As BooleanPublic IsMeasuringContinuous As BooleanPublic doDisconnect As Boolean

Public Sub Connect() On Error GoTo ErrorHandler If Not IsConnected Then With Flexapod_Control_Panel .ObjConnect.ConnectEmbeddedSystem "192.168.0.1", 700 'Kopplar upp mig mot mätsystemet IsConnected = True Call .ObjConnect.SelectNotificationMethod(LTC_NM_Event, 0, 0) 'Val av notation för

exceptions Set .ObjSync = Flexapod_Control_Panel.ObjConnect.ILTCommandSync 'Instansierar mitt

object till trackern Call .ObjSync.SetUnits(ES_LU_Millimeter, ES_AU_Radian, ES_TU_Celsius, ES_PU_KPascal,

ES_HU_RH) '.ObjSync.StopContinuousMeasurement ' FIXME: Se till att ingen mätning kommer än 'ObjSync.SetReflector 5 'Vilken reflektortyp som används Call .ObjSync.SetMeasurementMode(ES_MM_6DContinuousTime) ' Set continuous measurement parameters (every 400 ms) Call .ObjSync.SetContinuousTimeModeParams(10, 0, False, ES_RT_Box) Call .ObjSync.StartContinuousProbeMeasurement IsMeasuringContinuous = True End With End If Exit SubErrorHandler: MsgBox (Err.Description)End Sub

Public Sub Disconnect() If Not IsConnected Then Exit Sub End If IsConnected = False Call Flexapod_Control_Panel.ObjSync.StopContinuousMeasurement Set Flexapod_Control_Panel.ObjSync = Nothing Call Flexapod_Control_Panel.ObjConnect.DisconnectEmbeddedSystem Set Flexapod_Control_Panel.ObjConnect = Nothing 'doDisconnect = True End Sub

Public Sub Initialize() On Error GoTo ErrorHandler If Not IsConnected Then Exit Sub End If Flexapod_Control_Panel.ObjSync.Initialize 'Trackern snurrar runt (görs bara när den varit

avstängd) Exit SubErrorHandler: MsgBox (Err.Description)End Sub

Public Sub ReleaseMotors() On Error GoTo ErrorHandler If Not IsConnected Then Exit Sub End If Call Flexapod_Control_Panel.ObjSync.ReleaseMotors 'Stäng av motorstyrningen på trackern Exit Sub

75

Page 78: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

ErrorHandler: MsgBox (Err.Description)End Sub

Public Sub Park() On Error GoTo ErrorHandler If Not IsConnected Then Exit Sub End If Call Flexapod_Control_Panel.ObjSync.Park 'Stäng av motorstyrningen på trackern Exit SubErrorHandler: MsgBox (Err.Description)End Sub

76

Page 79: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Graphics3D.bas' Datat nedan är taget från demon: C:\Program\KernalCAD\KerneLCAD_2_1\Samples\VB\MiniCAD

Public m_iAxiBase As IAxiBasePublic m_iStrip As IStripPublic m_iElemJoint As IElement

Dim m_i3DObject As I3DObjectPublic m_iModel As IModelPublic m_iSection As ISectionDim m_iFrameObject As IFrame 'test

Public m_iElemSegment As IElementPublic m_strSectName As StringPublic m_nSectCount As IntegerPublic m_dZCrossPosn As DoublePublic m_nCurSect As IntegerPublic m_eSectType As IntegerPublic m_strSectType As StringPublic m_nKnotCount As IntegerPublic m_nCurKnot As IntegerPublic m_dZCrossPosnMin As DoublePublic m_dZCrossPosnMax As DoublePublic m_bClosed As BooleanPublic m_nSegmentCount As IntegerPublic m_nCurJoint As IntegerPublic m_strJointParam0Name As StringPublic m_strJointParam1Name As StringPublic m_bKnotPosition As BooleanPublic m_nJointCount As IntegerPublic m_dX As DoublePublic m_dY As DoublePublic m_bHasSegmentParam As BooleanPublic m_strSegmParamName As StringPublic m_dSegmParam As DoublePublic m_strSegmType As StringPublic m_bHasAxiBase As BooleanPublic m_nAxis As IntegerPublic m_dTransl As DoublePublic m_dRotateAng As DoublePublic m_bWorking As BooleanPublic rbx(2) As IntegerPublic editTranslBy As DoublePublic editROtateBy As DoublePublic editSectCount As IntegerPublic editCursect As IntegerPublic editSectname As StringPublic editCurJoint As IntegerPublic editX As DoublePublic editY As DoublePublic editSegmParam As DoublePublic checkKnot As IntegerPublic editCrossPosn As Integer

Public txtSecttype As StringPublic labelSegmParam As StringPublic txtTypename As StringPublic editCurKnot As StringPublic CurrentAxis As Integer

Sub InitGraphics3D() m_nAxis = 0 'Vilken axel som skall flyttas (x:0, y:1, z=2) rbx(m_nAxis) = 1 m_dTransl = 0# m_dRotateAng = 0# Call InitModelInfo Call UpdatePage 'Det som låg i formuläret på demon instansieras här rbx(0) = True rbx(1) = False rbx(2) = False editTranslBy = 0 'Förflyttning, komma är punkt

77

Page 80: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

editROtateBy = 0 'Rotation editSectCount = 1 editCursect = 0 'Vilken CAD-modell som skall flyttas editCurJoint = 0 editX = 0 editY = 0 editSegmParam = 0 checkKnot = 0 editCrossPosn = 0 editSectname = 0 txtSecttype = 0 labelSegmParam = 0 txtTypename = 0 editCurKnot = 0 End Sub

Sub InitModelInfo()

Set m_iModel = Flexapod_Control_Panel.KernelCADCtrl.GetModel m_nSectCount = m_iModel.GetSectionCount If (m_nSectCount < 1) Then m_nCurSect = -1 MsgBox "Something is wrong with the Kernel Cad model" End If m_nCurSect = 0 m_bKnotPosition = False m_bWorking = False UpdateSectInfo End Sub

Sub UpdateSectInfo() Set m_iSection = m_iModel.GetSection(m_nCurSect) 'Find out generic 3D section or SOR Dim szSectType As String szSectType = String(20, " ") m_iSection.GetSectionType (szSectType) If (Left(szSectType, 9) = "3DSection") Then m_eSectType = 0 ElseIf "SORSection" = m_strSectType Then m_eSectType = 1 Else m_eSectType = 2 ' For forward compatibility. Unknown section End If

m_strSectType = szSectType

'Get user defined section name Dim szSectName As String szSectName = String(20, " ") m_iSection.getName (szSectName)

m_strSectName = szSectName Set m_i3DObject = m_iSection Set m_iFrameObject = m_iSection 'kim If (m_eSectType = 0) Then 'Retrieve IAxiBase interface from the section Set m_iAxiBase = m_iSection

m_nKnotCount = m_iAxiBase.GetCount

If (m_nKnotCount < 2) Then Return

78

Page 81: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

If m_bKnotPosition Then m_dZCrossPosn = m_iAxiBase.GetKnotValue(m_nCurKnot) Else m_dZCrossPosnMin = m_iAxiBase.GetKnotValue(0) m_dZCrossPosnMax = m_iAxiBase.GetKnotValue(m_nKnotCount - 1) m_dZCrossPosn = 0.5 * (m_dZCrossPosnMin + m_dZCrossPosnMax) End If m_bHasAxiBase = True Else 'SOR does not have base Set m_iAxiBase = Nothing m_bHasAxiBase = False End If

' Release the previous geometry interfaces If Not m_iStrip Is Nothing Then Set m_iStrip = Nothing End If

If Not m_iElemJoint Is Nothing Then Set m_iElemJoint = Nothing End If

If (m_eSectType <> 2) Then ' Unknown object Set m_iStrip = m_iSection m_nJointCount = m_iStrip.GetJointCount If (m_nJointCount > 0) Then m_nCurJoint = 0 End If m_bClosed = m_iStrip.IsClosed m_nSegmentCount = m_nJointCount - 1 If m_bClosed Then m_nSegmentCount = m_nJointCount End If UpdateJointInfo End IfEnd Sub

Sub UpdateJointInfo() If m_nCurJoint < 0 Or m_nCurJoint > m_nJointCount - 1 Then 'UpdateSegmentInfo 'kim080212 Return End If m_bHasAxiBase = False

If (m_eSectType = 0) Then m_iAxiBase.SetCrossPosition m_dZCrossPosn m_bHasAxiBase = True End If

Set m_iElemJoint = m_iStrip.GetElement(m_nCurJoint, False)

Dim szName As String

szName = String(20, " ") m_iElemJoint.GetElemClassName szName

Dim nParamCount As Integer nParamCount = m_iElemJoint.GetParamCount

m_iElemJoint.GetParamName 0, szName

79

Page 82: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

m_strJointParam0Name = szName

m_iElemJoint.GetParamName 1, szName

m_strJointParam1Name = szName

If m_nCurJoint < m_nSegmentCount Then 'UpdateSegmentInfo 'kim080212 Else Set m_iElemSegment = Nothing m_bHasSegmentParam = False End If End Sub

Sub UpdatePage()

If Not m_bWorking Then 'Prevent infinite recursion If Not m_iElemJoint Is Nothing Then m_dX = m_iElemJoint.GetParam(0) m_dY = m_iElemJoint.GetParam(1) End If If m_bHasSegmentParam Then m_dSegmParam = m_iElemSegment.GetParam(0) End If 'groupSegment.Visible = m_bHasSegmentParam 'labelType.Visible = m_bHasSegmentParam 'editSegmParam.Visible = m_bHasSegmentParam 'labelSegmParam.Visible = m_bHasSegmentParam 'txtTypename.Visible = m_bHasSegmentParam 'checkKnot.Visible = m_bHasAxiBase If m_bHasAxiBase Then 'checkKnot.Value = below will cause call to checkKnot_Click, 'which will call this one again. Prevent infinite recursion m_bWorking = True If m_bKnotPosition Then checkKnot = 1 Else checkKnot = 0 End If m_bWorking = False End If 'labelCrossPosn.Visible = m_bHasAxiBase 'editCrossPosn.Visible = m_bHasAxiBase 'groupCrossPosn.Visible = m_bHasAxiBase 'editCurKnot.Visible = m_bHasAxiBase And m_bKnotPosition editSectCount = m_nSectCount editCurJoint = m_nCurJoint editX = m_dX editY = m_dY editCrossPosn = m_dZCrossPosn labelX = m_strJointParam0Name labelY = m_strJointParam1Name editSectname = m_strSectName txtSecttype = m_strSectType labelSegmParam = m_strSegmParamName editSegmParam = m_dSegmParam txtTypename = m_strSegmType 'EnableJointControls (Not m_iElemJoint Is Nothing) 'commandApply.Enabled = Not m_iElemJoint Is Nothing Or Not m_iElemSegment Is Nothing

80

Page 83: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

'SetTitle 'Användes för att byta ut cad-modellen mot något annat om man ville End IfEnd Sub

Sub UpdatePartSelection(PartID As Integer)

If m_nSectCount > 0 Then Dim nCurSect As Integer nCurSect = Val(PartID) If nCurSect > m_nSectCount - 1 Then nCurSect = m_nSectCount - 1 End If If nCurSect < 0 Then nCurSect = 0 End If m_nCurSect = nCurSect UpdateSectInfo UpdatePage End If

End Sub

Sub UpdateData()

m_nCurJoint = editCurJoint m_dZCrossPosn = editCrossPosn m_dSegmParam = editSegmParam m_strSegmType = txtTypename m_strJointParam0Name = "X:" m_strJointParam1Name = "Y:" 'm_strSectName = editSectname.Text 'Väljer vilken modell som skall flyttas m_nCurKnot = editCurKnot m_dX = editX m_dY = editY m_dRotateAng = editROtateBy m_dTransl = editTranslBy End SubSub MoveCADModel() ' Denna proceduren flyttar CAD-modellen ' Obs denna körs på varje kona var för sig! Call UpdateData

If m_nAxis < 0 Or m_nAxis > 2 Then Return

Dim v(3) As Double Dim i i = 0 'Do While i < 3 ' v(i) = 0# ' i = i + 1 'Loop'kim ' Räknar ut hur mycket ALLA parter skall flyttas v(0) = -Flexapod_Control_Panel.ErrX v(1) = -Flexapod_Control_Panel.ErrY v(2) = -Flexapod_Control_Panel.ErrZ m_dTransl = Sqr(v(0) ^ 2 + v(1) ^ 2 + v(2) ^ 2) 'kollar totalfelet

' Note: Translation with respect to current section axes ' Här flyttas ärvärdesmodellen i x, y och z If Abs(m_dTransl) > 0.0001 Then ' Pick small number for tolerance 'm_i3DObject.Translate v(0), v(1), v(2) 'Flyttar objektet

81

Page 84: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

m_i3DObject.SetOrigin v(0), v(1), v(2) End If

m_dRotateAng = 10 'kim

If Abs(m_dRotateAng) > 0.00001 Then Dim x As Double Dim y As Double Dim z As Double x = 0# y = 0# z = 0# m_i3DObject.GetOrigin x, y, z 'Hämtar punkten där rotationen skall ske kring

v(m_nAxis) = 1# ' To make sure not zero

' Note: can rotate around any line in 3D ' x,y,z är vid vilken punkt i rymden som rotationen skall ske 'm_i3DObject.Rotate m_dRotateAng, x, y, z, v(0), v(1), v(2) 'roterar objektet runt axlarna

v(0):x, v(1):y, v(2):z 'm_iFrameObject.Reset 'm_iFrameObject.Rotate m_dRotateAng, x, y, z, v(0), v(1), v(2) 'm_iFrameObject.Rotate Dim Rx As Double, Ry As Double, Rz As Double Dim pos1(11) 'Rotationsmatrisen enligt DELMIAS notation ' Hämtar in det orienteringsfel som skall visas i 3D-bilden ' Gör om roll, pitch, yaw till 3x3 rotationsmatris ' Vinklar i radianer Rz = -Flexapod_Control_Panel.ErrRz: Ry = -Flexapod_Control_Panel.ErrRy: Rx =

Flexapod_Control_Panel.ErrRx 'rx = Flexapod_Control_Panel.ErrRx * PI / 180: ry = Flexapod_Control_Panel.ErrRy * PI / 180:

rz = Flexapod_Control_Panel.ErrRz * PI / 180 pos1(0) = Cos(Ry) * Cos(Rz) pos1(1) = Cos(Ry) * Sin(Rz) pos1(2) = -Sin(Ry) pos1(3) = -Cos(Rx) * Sin(Rz) + Sin(Rx) * Sin(Ry) * Cos(Rz) pos1(4) = Cos(Rx) * Cos(Rz) + Sin(Rx) * Sin(Ry) * Sin(Rz) pos1(5) = Sin(Rx) * Cos(Ry) pos1(6) = Sin(Rx) * Sin(Rz) + Cos(Rx) * Sin(Ry) * Cos(Rz) pos1(7) = -Sin(Rx) * Cos(Rz) + Cos(Rx) * Sin(Ry) * Sin(Rz) pos1(8) = Cos(Rx) * Cos(Ry) Dim m_DIVect0 As DIVect 'Denna vektor beskriver X-axeln för den lokala konan Dim m_DIVect1 As DIVect 'Denna vektor beskriver Y-axeln för den lokala konan ' CurrentAxis = 0 betyder Konan för X-axeln ' Lösningen ligger i förståelsen att rikta Y och Z för Kona X, X och Z för Kona Y samt X och

Y för Kona Z If CurrentAxis = 0 Then

m_DIVect0.v(0) = pos1(0) 'Riktningscosin för Z för Kona Y m_DIVect0.v(1) = pos1(3) m_DIVect0.v(2) = pos1(6) m_DIVect1.v(0) = pos1(1) 'Riktningscosin för Y för Kona Z m_DIVect1.v(1) = pos1(4) m_DIVect1.v(2) = pos1(5)

End If

' //TIDIGARE LÖSNING' m_DIVect0.v(0) = pos1(1) 'Riktningscosin för Y för Kona X (röd)' m_DIVect0.v(1) = pos1(4)' m_DIVect0.v(2) = pos1(7)

' m_DIVect1.v(0) = pos1(2) 'Riktningscosin för Z för Kona X' m_DIVect1.v(1) = pos1(5)' m_DIVect1.v(2) = pos1(8)

82

Page 85: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

' ElseIf CurrentAxis = 1 Then' m_DIVect0.v(0) = pos1(2) 'Riktningscosin för X för Kona Y (grön)' m_DIVect0.v(1) = pos1(5)' m_DIVect0.v(2) = pos1(8) ' m_DIVect1.v(0) = pos1(0) 'Riktningscosin för Z för Kona Y' m_DIVect1.v(1) = pos1(3)' m_DIVect1.v(2) = pos1(6) ' ElseIf CurrentAxis = 2 Then' m_DIVect0.v(0) = pos1(0) 'Riktningscosin för X för Kona Z (blå)' m_DIVect0.v(1) = pos1(3)' m_DIVect0.v(2) = pos1(6) ' m_DIVect1.v(0) = pos1(1) 'Riktningscosin för Y för Kona Z' m_DIVect1.v(1) = pos1(4)' m_DIVect1.v(2) = pos1(7) ' End If ' Riktar aktiv kona till rätt orientering m_iFrameObject.SetAxes 0, m_DIVect0, 1, m_DIVect1, True End If

Call UpdatePage Flexapod_Control_Panel.KernelCADCtrl.UpdateSurface End Sub

83

Page 86: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

OpenFileDialog.basOption Explicit

Private Type OPENFILENAME nStructSize As Long hwndOwner As Long hInstance As Long sFilter As String sCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long sFile As String nMaxFile As Long sFileTitle As String nMaxTitle As Long sInitialDir As String sDialogTitle As String flags As Long nFileOffset As Integer nFileExtension As Integer sDefFileExt As String nCustData As Long fnHook As Long sTemplateName As String pvReserved As Long dwReserved As Long flagsEx As LongEnd Type

Private SHVIEW_THUMBNAIL As LongPrivate OSV_VERSION_LENGTH As Long

Private Const MAX_PATH As Long = 260Private Const OFN_ENABLEHOOK As Long = &H20Private Const OFN_EXPLORER As Long = &H80000Private Const OFN_ENABLESIZING As Long = &H800000

Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

Public Function ShowDialog(uForm As Object, strTitle As String, strPath As String, strFname As String) As String

Dim sFilters As String Dim OFN As OPENFILENAME 'MsgBox "strpath= " & strPath & " " & "strfname= " & strFname 'SHVIEW_THUMBNAIL = &H702D 'for winXP 'SHVIEW_THUMBNAIL = &H7031 'for Win2000 OSV_VERSION_LENGTH = 88 sFilters = "All Files" & vbNullChar & strFname & vbNullChar & vbNullChar With OFN .nStructSize = OSV_VERSION_LENGTH .hwndOwner = uForm.hWnd .sFilter = sFilters .nFilterIndex = 0 .sFile = vbNullChar & Space$(MAX_PATH) & vbNullChar & vbNullChar .nMaxFile = Len(.sFile) .sDefFileExt = "*.txt" & vbNullChar & vbNullChar .sFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar .nMaxTitle = Len(OFN.sFileTitle) .sInitialDir = strPath & vbNullChar & vbNullChar .sDialogTitle = strTitle .flags = OFN_EXPLORER Or OFN_ENABLESIZING 'Or OFN_ENABLEHOOK .fnHook = vbNull 'FARPROC(AddressOf OFNHookProc) End With 'm_lvInitialView = SHVIEW_THUMBNAIL If (GetOpenFileName(OFN) = 1) Then ShowDialog = OFN.sFile Else

84

Page 87: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

ShowDialog = "" End IfEnd Function

85

Page 88: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Public_Objects.basPublic TCPPosition(3, 3) As DoublePublic ActiveFlexapod As ObjectPublic FlexaPodTcp As ObjectPublic V5 As ObjectPublic TCPx As Double, TCPy As Double, TCPz As DoublePublic TCPrx As Double, TCPry As Double, TCPrz As DoublePublic oLeg As PartPublic oDocuments As DocumentsPublic oPartDocument As PartDocument

Public MathLib As New cMathLib

Public oParameters As Parameters

'FIXME Maybe this should be a class??Public Type gFrame transform(3, 3) As Double '4x4 homogeneous transformation matrixEnd Type

86

Page 89: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

V5lib.bas'V5lib är en bantad version av DELFOilib

Public Sub GetProductMatrixPos(p As Object, ByRef xx As Double, ByRef yy As Double, ByRef zz As Double, ByRef r11 As Double, ByRef r21 As Double, ByRef r31 As Double, ByRef r12 As Double, ByRef r22 As Double, ByRef r32 As Double, ByRef r13 As Double, ByRef r23 As Double, ByRef r33 As Double)

Dim po(11) As Variant p.Position.GetComponents po r11 = po(0) r12 = po(3) r13 = po(6) r21 = po(1) r22 = po(4) r23 = po(7) r31 = po(2) r32 = po(5) r33 = po(8) 'r11 = po(0) 'r12 = po(1) 'r13 = po(2) 'r21 = po(3) 'r22 = po(4) 'r23 = po(5) 'r31 = po(6) 'r32 = po(7) 'r33 = po(8) xx = po(9) yy = po(10) zz = po(11)

End Sub

Public Sub GetProductPos(p As Object, ByRef xx As Double, ByRef yy As Double, ByRef zz As Double, ByRef rotx As Double, ByRef roty As Double, ByRef rotz As Double)

On Error Resume Next Dim po(11) As Variant p.Position.GetComponents po GetMatrixPos po, xx, yy, zz, rotx, roty, rotzEnd Sub

'Get matrix po's Position in X, Y, Z and rotX, rotY, rotZ' http://skal.planet-d.net/demo/matrixfaq.htm#Q37Public Sub GetMatrixPos(ByRef po As Variant, ByRef xx As Double, ByRef yy As Double, ByRef zz As

Double, ByRef rotx As Double, ByRef roty As Double, ByRef rotz As Double) Dim r1 As Double, r2 As Double, cc As Double Dim ss As Double, p2 As Double, p1 As Double Dim y1 As Double, y2 As Double xx = po(9): yy = po(10): zz = po(11) If ((Abs(po(0)) >= eps) Or (Abs(po(1)) >= eps)) Then r1 = Atn2(po(1), po(0)) cc = Cos(r1): ss = Sin(r1) p1 = Atn2(-po(2), cc * po(0) + ss * po(1)) y1 = Atn2(ss * po(6) - cc * po(7), cc * po(4) - ss * po(3)) r2 = Atn2(-po(1), -po(0)) cc = Cos(r2): ss = Sin(r2) p2 = Atn2(-po(2), cc * po(0) + ss * po(1)) y2 = Atn2(ss * po(6) - cc * po(7), cc * po(4) - ss * po(3)) Else r1 = 0#: p1 = Atn2(-po(2), 0#): y1 = Atn2(-po(7), po(4)) r2 = r1: p2 = p1: y2 = y1 End If 'If ((r1 * r1 + p1 * p1 + y1 * y1) <= (r2 * r2 + p2 * p2 + y2 * y2)) Then rotz = r1 * 180 / PI: roty = p1 * 180 / PI: rotx = y1 * 180 / PI 'Else ' rotZ = r2 * 180 / PI: rotY = p2 * 180 / PI: rotX = y2 * 180 / PI 'End IfEnd Sub

'Atan2 känner av vilken kvadrant vinkeln ligger iFunction Atn2(y, x) As Double If Abs(x) < eps Then

87

Page 90: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Atn2 = Sgn(y) * PI / 2 ElseIf x > 0 Then Atn2 = Atn(y / x) 'Denna kördes Else Atn2 = Atn(y / x) + PI * Sgn(y) End IfEnd Function

Public Sub SetProductMatrixPos(p As Object, xx As Double, yy As Double, zz As Double, r11 As Double, r21 As Double, r31 As Double, r12 As Double, r22 As Double, r32 As Double, r13 As Double, r23 As Double, r33 As Double)

Dim po(11) As Variant po(0) = r11 po(1) = r21 po(2) = r31 po(3) = r12 po(4) = r22 po(5) = r32 po(6) = r13 po(7) = r23 po(8) = r33 po(9) = xx po(10) = yy po(11) = zz p.Position.SetComponents poEnd Sub

Public Sub SetProductPos(p1 As Object, xx As Double, yy As Double, zz As Double, rotx As Double, roty As Double, rotz As Double)

Dim pos1(11) rotx = rotx * PI / 180: roty = roty * PI / 180: rotz = rotz * PI / 180 pos1(0) = Cos(roty) * Cos(rotz) pos1(1) = Cos(roty) * Sin(rotz) pos1(2) = -Sin(roty) pos1(3) = -Cos(rotx) * Sin(rotz) + Sin(rotx) * Sin(roty) * Cos(rotz) pos1(4) = Cos(rotx) * Cos(rotz) + Sin(rotx) * Sin(roty) * Sin(rotz) pos1(5) = Sin(rotx) * Cos(roty) pos1(6) = Sin(rotx) * Sin(rotz) + Cos(rotx) * Sin(roty) * Cos(rotz) pos1(7) = -Sin(rotx) * Cos(rotz) + Cos(rotx) * Sin(roty) * Sin(rotz) pos1(8) = Cos(rotx) * Cos(roty) pos1(9) = xx: pos1(10) = yy: pos1(11) = zz p1.Position.SetComponents pos1End Sub

88

Page 91: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

cMathlib.cls''------------------------------------------------------------------------'''' Author : Anas S. A.'' Email : [email protected]'' Date : 18 Jan 2002'' Version : 1.0'' Description : Matrix Operations Library''''------------------------------------------------------------------------

Option Explicit

''''''''''''''''''''''''''''''''''''''''''''''''''''''''' The dimensions of the matrix are checked' Here''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Private Function Find_R_C(mat() As Double) As Double() Dim Rows As Integer, Columns As Integer Dim i As Integer, j As Integer Dim Result() As Double Columns = 0 If Mat_1D(mat, Rows) Then ReDim Result(Rows, 1) Result(0, 0) = Rows Result(0, 1) = Columns + 1 For i = 1 To Rows Result(i, 1) = mat(i - 1) Next i Else Call Mat_2D(mat, Rows, Columns) ReDim Result(Rows, Columns) Result(0, 0) = Rows Result(0, 1) = Columns For i = 1 To Rows For j = 1 To Columns '- 1 Result(i, j) = mat(i - 1, j - 1) Next j Next i End If Find_R_C = ResultEnd Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Check if matrix has only one column' shift the matrix one level and keep' its dimensions details in Mat(0,0) and Mat(0,1)' Mat(0,0)= no of rows' Mat(0,1)= no of columns''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Private Function Mat_1D(mat() As Double, m As Integer) As Boolean Dim Temp_MAT As Double On Error GoTo Error_Handler Temp_MAT = mat(0, 0) Mat_1D = False Exit FunctionError_Handler: Mat_1D = True m = UBound(mat) + 1End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Check if matrix has more than one column' if so return the dimension as described above''''''''''''''''''''''''''''''''''''''''''''''''''''''''Private Sub Mat_2D(mat() As Double, m As Integer, n As Integer) Dim Temp_MAT As Double, i As Integer i = 0 m = UBound(mat) + 1 On Error GoTo Error_Handler

89

Page 92: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Do Until i < -1 Temp_MAT = mat(0, i) i = i + 1 LoopError_Handler: n = iEnd Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Add two matrices, their dimensions should be compatible!' Function returns the summation or errors due to' dimensions incompatibility' Example:' Check Main Form !!''''''''''''''''''''''''''''''''''''''''''''''''''''''''Public Function Add(Mat_1() As Double, Mat_2() As Double) As Double() Dim Mat1() As Double, Mat2() As Double Dim sol() As Double Dim i As Integer, j As Integer On Error GoTo Error_Handler Mat1 = Find_R_C(Mat_1) Mat2 = Find_R_C(Mat_2) If Mat1(0, 0) <> Mat2(0, 0) Or Mat1(0, 1) <> Mat2(0, 1) Then GoTo Error_Dimension End If ReDim sol(Mat1(0, 0) - 1, Mat1(0, 1) - 1) For i = 1 To Mat1(0, 0) For j = 1 To Mat1(0, 1) sol(i - 1, j - 1) = Mat1(i, j) + Mat2(i, j) Next j Next i

Add = sol Erase sol Exit Function Error_Dimension: Err.Raise "5005", , "Dimensions of the two matrices do not match !"

Error_Handler: If Err.Number = 5005 Then Err.Raise "5005", , "Dimensions of the two matrices do not match !" Else Err.Raise "5022", , "One or both of the matrices are null, this operation cannot be done !!" End If

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Subtracts two matrices from each other, their' dimensions should be compatible!' Function returns the solution or errors due to' dimensions incompatibility' Example:' Check Main Form !!''''''''''''''''''''''''''''''''''''''''''''''''''''''''Public Function Subtract(Mat_1() As Double, Mat_2() As Double) As Double() Dim Mat1() As Double, Mat2() As Double Dim i As Integer, j As Integer, sol() As Double On Error GoTo Error_Handler Mat1 = Find_R_C(Mat_1) Mat2 = Find_R_C(Mat_2) If Mat1(0, 0) <> Mat2(0, 0) Or Mat1(0, 1) <> Mat2(0, 1) Then GoTo Error_Dimension End If ReDim sol(Mat1(0, 0) - 1, Mat1(0, 1) - 1) For i = 1 To Mat1(0, 0)

90

Page 93: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

For j = 1 To Mat1(0, 1) sol(i - 1, j - 1) = Mat1(i, j) - Mat2(i, j) Next j Next i

Subtract = sol Erase sol Exit Function Error_Dimension: Err.Raise "5007", , "Dimensions of the two matrices do not match !" Error_Handler: If Err.Number = 5007 Then Err.Raise "5007", , "Dimensions of the two matrices do not match !" Else Err.Raise "5022", , "One or both of the matrices are null, this operation cannot be done !!" End If

End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Multiply two matrices, their dimensions should be compatible!' Function returns the solution or errors due to' dimensions incompatibility' Example:' Check Main Form !!'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Public Function Multiply(Mat_1() As Double, Mat_2() As Double) As Double() Dim Mat1() As Double, Mat2() As Double, l As Integer Dim i As Integer, j As Integer, OptiString As String Dim sol() As Double, MulAdd As Double On Error GoTo Error_Handler MulAdd = 0

Mat1 = Find_R_C(Mat_1) Mat2 = Find_R_C(Mat_2) If Mat1(0, 1) <> Mat2(0, 0) Then GoTo Error_Dimension End If ReDim sol(Mat1(0, 0) - 1, Mat2(0, 1) - 1) For i = 1 To Mat1(0, 0) For j = 1 To Mat2(0, 1) For l = 1 To Mat1(0, 1) MulAdd = MulAdd + Mat1(i, l) * Mat2(l, j) Next l sol(i - 1, j - 1) = MulAdd MulAdd = 0 Next j Next i Multiply = sol Erase sol Exit Function Error_Dimension: Err.Raise "5009", , "Dimensions of the two matrices not suitable for multiplication !"

Error_Handler: If Err.Number = 5009 Then Err.Raise "5009", , "Dimensions of the two matrices not suitable for multiplication !" Else Err.Raise "5022", , "One or both of the matrices are null, this operation cannot be done !!" End If

End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Determinant of a matrix should be (nxn)' Function returns the solution or errors due to' dimensions incompatibility' Example:

91

Page 94: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

' Check Main Form !!'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Public Function Det(mat() As Double) As Double Dim DArray() As Double, S As Integer Dim k As Integer, i As Integer, j As Integer Dim save As Double, ArrayK As Double, k1 As Integer Dim M1 As String, Mat1() As Double On Error GoTo Error_Handler Mat1 = Find_R_C(mat) If Mat1(0, 0) <> Mat1(0, 1) Then GoTo Error_Dimension S = Mat1(0, 0) Det = 1 DArray = Mat1() For k = 1 To S If DArray(k, k) = 0 Then j = k Do While ((j < S) And (DArray(k, j) = 0)) j = j + 1 Loop If DArray(k, j) = 0 Then Det = 0 Exit Function Else For i = k To S save = DArray(i, j) DArray(i, j) = DArray(i, k) DArray(i, k) = save Next i End If Det = -Det End If ArrayK = DArray(k, k) Det = Det * ArrayK If k < S Then k1 = k + 1 For i = k1 To S For j = k1 To S DArray(i, j) = DArray(i, j) - DArray(i, k) * (DArray(k, j) / ArrayK) Next j Next i End If Next Exit Function Error_Dimension: Err.Raise "5011", , "Matrix should be a square matrix !" Error_Handler: If Err.Number = 5011 Then Err.Raise "5011", , "Matrix should be a square matrix !" Else Err.Raise "5022", , "In order to do this operation values must be assigned to the matrix !!" End IfEnd Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Inverse of a matrix, should be (nxn) and det(Mat)<>0' Function returns the solution or errors due to' dimensions incompatibility' Example:' Check Main Form !!'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Public Function Inv(mat() As Double) As Double() Dim sol() As Double Dim AI() As Double, AIN As Double, AF As Double, _ Mat1() As Double Dim LL As Integer, LLM As Integer, L1 As Integer, _ L2 As Integer, LC As Integer, LCA As Integer, _ LCB As Integer, i As Integer, j As Integer

92

Page 95: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

On Error GoTo Error_Handler Mat1 = Find_R_C(mat) If Mat1(0, 0) <> Mat1(0, 1) Then GoTo Error_Dimension If Det(Mat1) = 0 Then GoTo Error_Zero ReDim sol(Mat1(0, 0) - 1, Mat1(0, 0) - 1)

LL = Mat1(0, 0) LLM = Mat1(0, 1) ReDim AI(LL, LL)

For L2 = 1 To LL For L1 = 1 To LL AI(L1, L2) = 0 Next AI(L2, L2) = 1 Next

For LC = 1 To LL If Abs(Mat1(LC, LC)) < 0.0000000001 Then For LCA = LC + 1 To LL If LCA = LC Then GoTo 1090 If Abs(Mat1(LC, LCA)) > 0.0000000001 Then For LCB = 1 To LL Mat1(LCB, LC) = Mat1(LCB, LC) + Mat1(LCB, LCA) AI(LCB, LC) = AI(LCB, LC) + AI(LCB, LCA) Next GoTo 1100 End If1090 Next End If

1100 AIN = 1 / Mat1(LC, LC) For LCA = 1 To LL Mat1(LCA, LC) = AIN * Mat1(LCA, LC) AI(LCA, LC) = AIN * AI(LCA, LC) Next

For LCA = 1 To LL If LCA = LC Then GoTo 1150 AF = Mat1(LC, LCA) For LCB = 1 To LL Mat1(LCB, LCA) = Mat1(LCB, LCA) - AF * Mat1(LCB, LC) AI(LCB, LCA) = AI(LCB, LCA) - AF * AI(LCB, LC) Next1150 Next

Next For i = 1 To LL For j = 1 To LL sol(i - 1, j - 1) = AI(i, j) Next j Next i Inv = sol Erase sol Exit Function Error_Zero: Err.Raise "5012", , "Determinent equals zero, inverse can't be found !" Error_Dimension: Err.Raise "5014", , "Matrix should be a square matrix !" Error_Handler:If Err.Number = 5012 Then Err.Raise "5012", , "Determinent equals zero, inverse can't be found !"ElseIf Err.Number = 5014 Then Err.Raise "5014", , "Matrix should be a square matrix !"End If End Function

93

Page 96: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Multiply two vectors, dimensions should be (3x1)' Function returns the solution or errors due to' dimensions incompatibility' Example:' Check Main Form !!'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Public Function MultiplyVectors(Mat_1() As Double, Mat_2() As Double) As Double() Dim Mat1() As Double, Mat2() As Double Dim i As Double, j As Double, k As Double Dim sol(2) As Double On Error GoTo Error_Handler Mat1 = Find_R_C(Mat_1) Mat2 = Find_R_C(Mat_2) If Mat1(0, 0) <> 3 Or Mat1(0, 1) <> 1 Then GoTo Error_Dimension End If If Mat2(0, 0) <> 3 Or Mat2(0, 1) <> 1 Then GoTo Error_Dimension End If i = Mat1(2, 1) * Mat2(3, 1) - Mat1(3, 1) * Mat2(2, 1) j = Mat1(3, 1) * Mat2(1, 1) - Mat1(1, 1) * Mat2(3, 1) k = Mat1(1, 1) * Mat2(2, 1) - Mat1(2, 1) * Mat2(1, 1) sol(0) = i: sol(1) = j: sol(2) = k MultiplyVectors = sol Exit Function Error_Dimension: Err.Raise "5016", , "Dimension should be (3 x 1) for both matrices in order to do cross

multiplication !"

Error_Handler:

If Err.Number = 5016 Then Err.Raise "5016", , "Dimension should be (3 x 1) for both matrices in order to do cross

multiplication !" Else Err.Raise "5022", , "One or both of the matrices are null, this operation cannot be done !!" End If

End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Magnitude of a Vector, vector should be (3x1)' Function returns the solution or errors due to' dimensions incompatibility' Example:' Check Main Form !!'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Public Function VectorMagnitude(mat() As Double) As Double

Dim Mat1() As Double On Error GoTo Error_Handler Mat1 = Find_R_C(mat)

If Mat1(0, 0) <> 3 Or Mat1(0, 1) <> 1 Then GoTo Error_Dimension End If VectorMagnitude = Sqr(Mat1(1, 1) * Mat1(1, 1) + Mat1(2, 1) * Mat1(2, 1) + Mat1(3, 1) * Mat1(3, 1)) Exit Function Error_Dimension: Err.Raise "5018", , "Dimension of the matrix should be (1 x 3) in order to find the vector's

norm !"

94

Page 97: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Error_Handler: If Err.Number = 5018 Then Err.Raise "5018", , "Dimension of the matrix should be (3 x 1) in order to find the vector's

magnitude !" Else Err.Raise "5022", , "In order to do this operation values must be assigned to the matrix !!" End If

End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Transpose of a matrix' Function returns the solution or errors' Example:' Check Main Form !!'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Public Function Transpose(mat() As Double) As Double() Dim Mat1() As Double, Tr_Mat() As Double Dim i As Integer, j As Integer, sol() As Double On Error GoTo Error_Handler Mat1() = Find_R_C(mat()) ReDim Tr_Mat(0 To Mat1(0, 1), 0 To Mat1(0, 0)) ReDim sol(Mat1(0, 1) - 1, Mat1(0, 0) - 1) Tr_Mat(0, 0) = Mat1(0, 1) Tr_Mat(0, 1) = Mat1(0, 0) For i = 1 To Mat1(0, 0) For j = 1 To Mat1(0, 1) Tr_Mat(j, i) = Mat1(i, j) Next j Next i For i = 1 To Tr_Mat(0, 0) For j = 1 To Tr_Mat(0, 1) sol(i - 1, j - 1) = Tr_Mat(i, j) Next j Next i Transpose = sol Erase sol Exit Function Error_Handler: Err.Raise "5028", , "In order to do this operation values must be assigned to the matrix !!"

End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Multiply a matrix or a vector with a scalar quantity' Function returns the solution or errors' Example:' Check Main Form !!''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Function ScalarMultiply(Value As Double, mat() As Double) As Double() Dim i As Integer, j As Integer Dim Mat1() As Double, sol() As Double On Error GoTo Error_Handler Mat1 = Find_R_C(mat) ReDim sol(Mat1(0, 0) - 1, Mat1(0, 1) - 1) For i = 1 To Mat1(0, 0) For j = 1 To Mat1(0, 1) sol(i - 1, j - 1) = Mat1(i, j) * Value Next j Next i ScalarMultiply = sol Exit Function Error_Handler: Err.Raise "5022", , "Matrix was not assigned"

95

Page 98: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Divide matrix elements or a vector by a scalar quantity' Function returns the solution or errors' Example:' Check Main Form !!'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Public Function ScalarDivide(Value As Double, mat() As Double) As Double() Dim i As Integer, j As Integer Dim Mat1() As Double, sol() As Double On Error GoTo Error_Handler Mat1 = Find_R_C(mat) ReDim sol(Mat1(0, 0) - 1, Mat1(0, 1) - 1) For i = 1 To Mat1(0, 0) For j = 1 To Mat1(0, 1) sol(i - 1, j - 1) = Mat1(i, j) / Value Next j Next i ScalarDivide = sol Exit Function Error_Handler: Err.Raise "5022", , "Matrix was not assigned" End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Print a matrix to multitext text box' Function returns the solution or errors' Example:' Check Main Form !!'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Public Function PrintMat(Mat_1() As Double) As String Dim N_Rows As Integer, N_Columns, k As Integer, _ i As Integer, j As Integer, m As Integer Dim StrElem As String, StrLen As Long, _ Greatest() As Integer, LarString As String Dim OptiString As String, sol As String Dim Mat1() As Double Mat1 = Find_R_C(Mat_1) sol = "" OptiString = "" N_Rows = Mat1(0, 0) N_Columns = Mat1(0, 1)

ReDim Greatest(N_Columns) For i = 1 To N_Rows For j = 1 To N_Columns If i = 1 Then Greatest(j) = 0 For m = 1 To N_Rows StrElem = Format$(Mat1(m, j), "0.0000") StrLen = Len(StrElem) If Greatest(j) < StrLen Then Greatest(j) = StrLen LarString = StrElem End If Next m If Mid$(LarString, 1, 1) = "-" Then Greatest(j) = Greatest(j) + 1 End If StrElem = Format$(Mat1(i, j), "0.0000") If Mid$(StrElem, 1, 1) = "-" Then StrLen = Len(StrElem) If Greatest(j) >= StrLen Then For k = 1 To (Greatest(j) - StrLen) OptiString = OptiString & " " Next k

96

Page 99: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

OptiString = OptiString & " " End If Else StrLen = Len(StrElem) If Greatest(j) > StrLen Then For k = 1 To (Greatest(j) - StrLen) OptiString = OptiString & " " Next k End If End If OptiString = OptiString & " " & Format$(Mat1(i, j), "0.0000") Next j If i <> N_Rows Then sol = sol & OptiString & vbCrLf OptiString = "" End If sol = sol & OptiString OptiString = "" Next i PrintMat = sol Exit Function End Function

Private Function Cutting(M_L As Integer) Dim Num As Integer Num = 0 Num = M_L \ 20 If M_L Mod 20 <> 0 Then Num = Num + 1 Cutting = NumEnd Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Return the maximum of two numbers'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Public Function max(ByVal x As Double, y As Double) As Double If x >= y Then max = x ElseIf x < y Then max = y End IfEnd Function

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Return the minimum of two numbers'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Public Function min(ByVal x As Double, y As Double) As Double If x >= y Then min = y ElseIf x < y Then min = x End IfEnd Function

'''''''''''''''''''''''''''''''''''''''''''''''' This routine finds the' atan2(y,x) vlaue'''''''''''''''''''''''''''''''''''''''''''''''Public Function atan2(ByVal y As Double, ByVal x As Double) As Double Dim yy As Double, xx As Double yy = Abs(y) xx = Abs(x) If y = 0 And x > 0 Then atan2 = 0 ElseIf y > 0 And x > 0 Then atan2 = Atn(yy / xx) ElseIf y > 0 And x = 0 Then atan2 = PI / 2 ElseIf y > 0 And x < 0 Then atan2 = PI - Atn(yy / xx) ElseIf y = 0 And x < 0 Then atan2 = PI ElseIf y < 0 And x < 0 Then atan2 = Atn(yy / xx) - PI ElseIf y < 0 And x = 0 Then

97

Page 100: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

atan2 = PI / 2 ElseIf y < 0 And x > 0 Then atan2 = -Atn(yy / xx) End IfEnd Function

'''''''''''''''''''''''''''''''''''''''''''''''' This routine returns Pi value'''''''''''''''''''''''''''''''''''''''''''''''Public Function PI() As Double PI = 4 * Atn(1)End Function

'''''''''''''''''''''''''''''''''''''''''''''''' This routine returns the' arc sin vlaue of an angle'''''''''''''''''''''''''''''''''''''''''''''''Public Function asin(ByVal x As Double) As Double asin = Atn(x / (Sqr(Abs(1 - x * x)) + 1E-200))End Function

'''''''''''''''''''''''''''''''''''''''''''''''' This routine returns the' arc cos vlaue of an angle'''''''''''''''''''''''''''''''''''''''''''''''Public Function acos(ByVal x As Double) As Double acos = Atn(-x / (Sqr(1 - x * x))) + 2 * Atn(1)End Function

98

Page 101: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

FlexapodManager.clsOption Explicit

Private frames() As FramePrivate basePlateFrames() As FramePrivate topPlateFrames() As FramePrivate names() As StringPrivate amount As Integer

Public Function getAmount() As Integer getAmount = amountEnd Function

Public Function getName(ByVal index As Integer) As String getName = names(index)End Function

Public Function getTransform(ByVal index As Integer) As Frame Set getTransform = topPlateFrames(index).copy()End Function

Public Function getBasePlateFrame(ByVal index As Integer) As Frame Set getBasePlateFrame = frames(index).copy()End Function

Public Function getTopPlateFrame(ByVal index As Integer) As Frame Set getTopPlateFrame = topPlateFrames(index).copy()End Function

Public Sub setSourceFile(sourceFilePath As String) 'Read top plate frames from file Dim i As Integer Dim dummy As Variant Dim transform() As Double amount = 0 Open sourceFilePath For Input As #1 Input #1, dummy ' Skip the first line with comments Do While Not EOF(1) ReDim Preserve names(i) ReDim Preserve transform(3, 3) ReDim Preserve topPlateFrames(i) Set topPlateFrames(i) = New Frame Input #1, names(i) Input #1, transform(0, 0), transform(1, 0), transform(2, 0) ' X rotation Input #1, transform(0, 1), transform(1, 1), transform(2, 1) ' Y rotation Input #1, transform(0, 2), transform(1, 2), transform(2, 2) ' Z rotation Input #1, transform(0, 3), transform(1, 3), transform(2, 3) ' translation transform(3, 3) = 1 Call topPlateFrames(i).setMatrix(transform) amount = amount + 1 i = i + 1 Loop Close #1

End Sub

99

Page 102: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

Frame.clsOption Explicit

Private mat(3, 3) As Double

'Return a deep copy of the framePublic Function copy() As Frame Dim tmpFrame As New Frame Call tmpFrame.setMatrix(getMatrix) Set copy = tmpFrameEnd Function

'Returns a copy of the frame in matrix formPublic Function getMatrix() As Double() Dim tmpMatrix(3, 3) As Double Dim i As Integer, j As Integer For i = 0 To 3 For j = 0 To 3 tmpMatrix(i, j) = mat(i, j) Next j Next i getMatrix = tmpMatrixEnd Function

'Sets the frame using a supplied matrixPublic Sub setMatrix(m() As Double) Dim i As Integer, j As Integer For i = 0 To 3 For j = 0 To 3 mat(i, j) = m(i, j) Next j Next iEnd Sub

'Returns the translation in xPublic Function getX() As Double getX = mat(0, 3)End Function

'Returns the translation in yPublic Function getY() As Double getY = mat(1, 3)End Function

'Returns the translation in zPublic Function getZ() As Double getZ = mat(2, 3)End Function

'The next four rotation methods are based upon the Euler rotation around the z, y and x'axes, in that order. An equivalent representation is the Tait-Bryan rotation in xyz'order.' Source: http://en.wikipedia.org/wiki/Euler_angles

'Set frame orientation by Euler anglesPublic Sub setOrientation(gamma As Double, beta As Double, alpha As Double) 'gamma=Rx 'beta=Ry 'alpha=Rz Dim Rx As Double, Ry As Double, Rz As Double Rx = gamma Ry = beta Rz = alpha ' Leica manual p. 362 mat(0, 0) = Cos(Rz) * Cos(Ry) mat(1, 0) = Sin(Rz) * Cos(Rx) + Cos(Rz) * Sin(Ry) * Sin(Rx) mat(2, 0) = Sin(Rz) * Sin(Rx) - Cos(Rz) * Sin(Ry) * Cos(Rx) mat(0, 1) = -Sin(Rz) * Cos(Ry) mat(1, 1) = Cos(Rz) * Cos(Rx) - Sin(Rz) * Sin(Ry) * Sin(Rx) mat(2, 1) = Cos(Rz) * Sin(Rx) + Sin(Rz) * Sin(Ry) * Cos(Rx)

100

Page 103: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

mat(0, 2) = Sin(Ry) mat(1, 2) = -Cos(Ry) * Sin(Rx) mat(2, 2) = Cos(Ry) * Cos(Rx) mat(3, 3) = 1 ' just to be safe 'mat(0, 0) = Cos(alpha) * Cos(beta) 'mat(1, 0) = Sin(alpha) * Cos(beta) 'mat(2, 0) = -Sin(beta) 'mat(0, 1) = Cos(alpha) * Sin(beta) * Sin(gamma) - Sin(alpha) * Cos(gamma) 'mat(1, 1) = Sin(alpha) * Sin(beta) * Sin(gamma) + Cos(alpha) * Cos(gamma) 'mat(2, 1) = Cos(beta) * Sin(gamma) 'mat(0, 2) = Cos(alpha) * Sin(beta) * Cos(gamma) + Sin(alpha) * Sin(gamma) 'mat(1, 2) = Sin(alpha) * Sin(beta) * Cos(gamma) - Cos(alpha) * Sin(gamma) 'mat(2, 2) = Cos(beta) * Cos(gamma) 'mat(3, 3) = 1 ' just to be safe ' Craig Rx'y'z'(alpha,beta,gamma) sid 374 'mat(0, 0) = Cos(beta) * Cos(gamma) 'mat(1, 0) = Sin(alpha) * Sin(beta) * Cos(gamma) + Cos(alpha) * Sin(gamma) 'mat(2, 0) = -Cos(alpha) * Sin(beta) * Cos(gamma) + Sin(alpha) * Sin(gamma) 'mat(0, 1) = -Cos(beta) * Sin(gamma) 'mat(1, 1) = -Sin(alpha) * Sin(beta) * Sin(gamma) + Cos(alpha) * Cos(gamma) 'mat(2, 1) = Cos(alpha) * Sin(beta) * Sin(gamma) + Sin(alpha) * Cos(gamma) 'mat(0, 2) = Sin(beta) 'mat(1, 2) = -Sin(alpha) * Cos(beta) 'mat(2, 2) = Cos(alpha) * Cos(beta) 'mat(3, 3) = 1 ' just to be safe End Sub

'Get rotation angle around x axis of rotating frame in radiansPublic Function getRotationX() As Double 'Dim beta As Double 'beta = Atn2(-mat(2, 0), Sqr(mat(0, 0) * mat(0, 0) + mat(1, 0) * mat(1, 0))) 'getRotationX = Atn2(mat(2, 1) / Cos(beta), mat(2, 2) / Cos(beta)) 'Daniels Dim y As Double 'y = Atn(mat(0, 2) / Sqr(1 - mat(0, 2) * mat(0, 2))) ' emulates arcsin(mat(0,2)) 'getRotationX = Atn2(-mat(0, 1) / Cos(y), mat(0, 0) / Cos(y)) 'Test y = Atn2(-mat(2, 0), Sqr(mat(0, 0) * mat(0, 0) + mat(1, 0) * mat(1, 0))) getRotationX = Atn2(mat(2, 1) / Cos(y), mat(2, 2) / Cos(y)) End Function 'Get rotation angle around y axis of rotating frame in radiansPublic Function getRotationY() As Double 'getRotationY = Atn2(-mat(2, 0), Sqr(mat(0, 0) * mat(0, 0) + mat(1, 0) * mat(1, 0))) 'Daniels 'getRotationY = Atn(mat(0, 2) / Sqr(1 - mat(0, 2) * mat(0, 2))) ' emulates arcsin(mat(0,2)) 'Test getRotationY = Atn2(-mat(2, 0), Sqr(mat(0, 0) * mat(0, 0) + mat(1, 0) * mat(1, 0))) End Function 'Get rotation angle around z axis of rotating frame in radiansPublic Function getRotationZ() As Double 'Dim beta As Double 'beta = Atn2(-mat(2, 0), Sqr(mat(0, 0) * mat(0, 0) + mat(1, 0) * mat(1, 0))) 'getRotationZ = Atn2(mat(1, 0) / Cos(beta), mat(0, 0) / Cos(beta)) 'Daniels Dim y As Double 'y = Atn(mat(0, 2) / Sqr(1 - mat(0, 2) * mat(0, 2))) ' emulates arcsin(mat(0,2)) 'getRotationZ = Atn2(-mat(1, 2) / Cos(y), mat(2, 2) / Cos(y)) 'Test y = Atn2(-mat(2, 0), Sqr(mat(0, 0) * mat(0, 0) + mat(1, 0) * mat(1, 0))) getRotationZ = Atn2(mat(1, 0) / Cos(y), mat(0, 0) / Cos(y))

End Function

101

Page 104: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

'Let the frame have no translation and rotationPublic Sub setIdentity() Dim i As Integer, j As Integer For i = 0 To 3 For j = 0 To 3 If i = j Then mat(i, j) = 1 Else mat(i, j) = 0 End If Next j Next iEnd Sub

'Set translation for framePublic Sub setTranslation(x As Double, y As Double, z As Double) mat(0, 3) = x mat(1, 3) = y mat(2, 3) = zEnd Sub

'Set orientation for framePublic Sub setOrientationByQuaternions(q0 As Double, q1 As Double, q2 As Double, q3 As Double) 'The formulae are taken from 'emScon 2.4 Programmers Manual' page 365 mat(0, 0) = q0 * q0 + q1 * q1 - q2 * q2 - q3 * q3 mat(0, 1) = 2 * (q1 * q2 - q0 * q3) mat(0, 2) = 2 * (q1 * q3 + q0 * q2) mat(1, 0) = 2 * (q1 * q2 + q0 * q3) mat(1, 1) = q0 * q0 - q1 * q1 + q2 * q2 - q3 * q3 mat(1, 2) = 2 * (q2 * q3 - q0 * q1) mat(2, 0) = 2 * (q1 * q3 - q0 * q2) mat(2, 1) = 2 * (q3 * q2 + q0 * q1) mat(2, 2) = q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3 mat(3, 3) = 1 ' just to be safeEnd Sub

'Compute the inverse of the framePublic Function inverse() As Frame 'The inverse of a frame can be calculated more cleverly then this! Dim ret As New Frame Call ret.setMatrix(MathLib.Inv(mat)) Set inverse = retEnd Function

'Returns the transformation of the the argument frame in relation to the object frame.'Example: C = A x B -> Set C = A.transform(B)Public Function transform(trans As Frame) As Frame Dim tmpMatrix As New Frame Call tmpMatrix.setMatrix(MathLib.Multiply(mat, trans.getMatrix())) Set transform = tmpMatrixEnd Function

'Multiply the frame with a matrixPublic Function Multiply(matrix() As Double) As Double() Multiply = MathLib.Multiply(mat, matrix)End Function

102

Page 105: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

PickupManager.clsOption Explicit

Private frames() As FramePrivate names() As StringPrivate amount As Integer

Public Function getAmount() As Integer getAmount = amountEnd Function

Public Function getName(ByVal index As Integer) As String getName = names(index)End Function

Public Function getTransform(ByVal index As Integer) As Frame Set getTransform = frames(index).copy()End Function

Public Sub readDataFromFile() Dim FileName As String FileName = App.Path & "\Pickups.txt" Open FileName For Input As #1 Dim dummy As String Input #1, dummy ' Skip the first line with comments Dim i As Integer Dim transform(3, 3) As Double Do While Not EOF(1) ReDim Preserve names(i) ReDim Preserve frames(i) Set frames(i) = New Frame Input #1, names(i) Input #1, transform(0, 0), transform(1, 0), transform(2, 0) ' X rotation Input #1, transform(0, 1), transform(1, 1), transform(2, 1) ' Y rotation Input #1, transform(0, 2), transform(1, 2), transform(2, 2) ' Z rotation Input #1, transform(0, 3), transform(1, 3), transform(2, 3) ' translation transform(3, 3) = 1 Call frames(i).setMatrix(transform) amount = amount + 1 i = i + 1 Loop Close #1

End Sub

103

Page 106: Institutionen för datavetenskap - DiVA portal293685/FULLTEXT01.pdf · 1.6 Struktur Rapporten har följande disposition. Först kommer en genomgång av några viktiga koncept som

På svenska

Detta dokument hålls tillgängligt på Internet – eller dess framtida ersättare – under en längre tid från publiceringsdatum under förutsättning att inga extra-ordinära omständigheter uppstår.

Tillgång till dokumentet innebär tillstånd för var och en att läsa, ladda ner, skriva ut enstaka kopior för enskilt bruk och att använda det oförändrat för ickekommersiell forskning och för undervisning. Överföring av upphovsrätten vid en senare tidpunkt kan inte upphäva detta tillstånd. All annan användning av dokumentet kräver upphovsmannens medgivande. För att garantera äktheten, säkerheten och tillgängligheten finns det lösningar av teknisk och administrativ art.

Upphovsmannens ideella rätt innefattar rätt att bli nämnd som upphovsman i den omfattning som god sed kräver vid användning av dokumentet på ovan beskrivna sätt samt skydd mot att dokumentet ändras eller presenteras i sådan form eller i sådant sammanhang som är kränkande för upphovsmannens litterära eller konstnärliga anseende eller egenart.

För ytterligare information om Linköping University Electronic Press se förlagets hemsida http://www.ep.liu.se/

In English

The publishers will keep this document online on the Internet - or its possible replacement - for a considerable time from the date of publication barring exceptional circumstances.

The online availability of the document implies a permanent permission for anyone to read, to download, to print out single copies for your own use and to use it unchanged for any non-commercial research and educational purpose. Subsequent transfers of copyright cannot revoke this permission. All other uses of the document are conditional on the consent of the copyright owner. The publisher has taken technical and administrative measures to assure authenticity, security and accessibility.

According to intellectual property law the author has the right to be mentioned when his/her work is accessed as described above and to be protected against infringement.

For additional information about the Linköping University Electronic Press and its procedures for publication and for assurance of document integrity, please refer to its WWW home page: http://www.ep.liu.se/

© [Daniel Karlsson]