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
Institutionen 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 Kihlman
Examinator: Jonas Wallgren
Sammanfattning
Fixturer ä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.
Innehållsförteckning
Sammanfattning...1
1 Inledning...4
1.1 Bakgrund...4
1.2 Syfte...5
1.3 Avgränsningar...5
1.4 Metod...5
1.5 Källor...5
1.6 Struktur...6
2 Koordinatsystem...7
2.1 Position och riktning...7
2.2 Transformation av ramar...7
2.3 Rotationer...8
3 Flexapod - flexibel fixtur...10
3.1 Översikt...10
3.2 Matematisk modell...12
3.3 Beräkning av benlängdsfel...13
3.4 Känslighetsanalys...14
4 Grafiskt användargränssnitt...15
4.1 Krav...15
4.2 Det ursprungliga användargränssnittet...16
4.2.1 Operatörspanel...16
4.2.2 Emulator...17
4.3 Benlängdsfel...18
4.4 Flexapodvy...20
4.5 Översiktsvy...21
4.6 Operatörspanelens utseende efter avslutat arbete...22
5 Frame-klassen...25
6 Kommunikation med mätutrustning...26
7 Paketering...28
8 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
Illustrationsförteckning
Illustration 1: En komplett uppställning: BoxJoint, flexapoder, mätsystem, operatör och
operatörspanel...4
Illustration 2: Opertörpanelens utseende i prototypen...16
Illustration 3: Emulatorns utseende i prototypen...17
Illustration 4: Stapeldiagrammet när det fortfarande ritades med egen kod...18
Illustration 5: Stapeldiagrammets utseende med komponenten MSChart...19
Illustration 6: Flexapodvyns utseende i prototypen...20
Illustration 7: Den förbättrade flexapodvyn...21
Illustration 8: Översiktsvyn implementerad med Cortona VRML Viewer...22
Illustration 9: Användargränssnitt - Koordinatsystem i vanliga textrutor...23
Illustration 10: Användargränssnitt - Viktiga parametrar i stort format...24
Illustration 11: Mätutrustningen - en Leicatracker...26
Tabellförteckning
Tabell 1: Namn på och beskrivning av matriser som ingår i flexapodens matematiska modell...12
Tabell 2: Gränser för skalning av benlängdsfel...20
1 Inledning
Syftet 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 Bakgrund
SAAB 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,
Illustration 1: En komplett uppställning: BoxJoint, flexapoder, mätsystem, operatör och
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 Syfte
Kraven 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änsningar
Ett 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 Metod
Examensarbetet 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ällor
Hä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.
1.6 Struktur
Rapporten 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.
2 Koordinatsystem
Detta 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 riktning
Terminologi 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 ramar
Informationen 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
AP
? Med en rotationsmatris R
B A
(mer om den i nästa avsnitt) kan ekvationen
P
A=
BR
AP
B
P
BORG Aställas upp.
P
BORG Aär ortsvektorn i ram A för origo i ramen B. Med
matrisalgebraiska manipulationer kan P
Alösas ut ur nyss nämnda ekvation. Genom att behandla
rotationen och ortsvektorn som en matris kan ekvationen förenklas till
AP
=
BAT
BP
, där T är en
A
B
Q
AP
BORG BP
AP
homogen transform. Ekvationen har i matrisform följande utseende
2.3 Rotationer
För att hantera rotationer med den homogena transformen behövs rotationsmatrisen R
BA. 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.
[
AP
⋯
1
]
=
[
⋮
R
B A⋮
AP
BORG⋮
⋯ ⋯ ⋯ ⋯
⋯
0
0
0
⋮
1
]
[
P
B⋯
1
]
Rot y=arctan2−R
31,
R
112
R
212
Rot x=arctan2 R
32/
cos Rot y , R
33/
cos Rot y
Rot y=arctan2 R
21/
cos Rot y , R
11/
cos Rot y
atan2 y , x=arctan
y
x
[
cos K cos
−sin K cos
sin
sin K cos cos K sin sin cos K cos−sin K sin sin −cos sin
Den andra representationen som används är kvaternioner och består av fyra tal, q
0till q
3, som
entydigt bestämmer en rotation i rummet. Från dessa fyra parametrar erhålls nedanstående
rotationsmatris.
[
q
02
q
12−q
22−q
322 q
1q
2−q
0q
3
2 q
1q
3q
0q
2
2 q
1q
2q
0q
3
q
0 2−
q
1 2q
2 2−q
3 22 q
2q
3−
q
0q
1
2 q
1q
3−
q
0q
2
2 q
3q
2q
0q
1
q
0 2−q
1 2−q
2 2q
3 2]
3 Flexapod - flexibel fixtur
I 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 Översikt
Konceptet 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.
Bottenplatta
Ben
Hydraullås
Topplatta
Pickup
Mätprob
Verktygshållare
3.2 Matematisk modell
Fö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
P
Botten
Origo
Botten i koordinatsystemet för Origo.
P
MålVerktygBotten
Verktyg uttryckt i koordinatsystemet för Botten (det önskade värdet).
P
Nu VerktygBotten
Verktyg uttryckt i koordinatsystemet för Botten (det nuvarande värdet).
P
HemmaVerktygBotten
Verktyg uttryckt i koordinatsystemet för Botten i flexapodens hemmaläge.
P
Mät
Verktyg
Mät uttryckt i koordinatsystemet för Verktyg.
P
ProbMät
Prob uttryckt i koordinatsystemet för Mät.
B
BottenSex ortsvektorer med benens fästpunkter på bottenplattan uttryck i Botten.
B
ToppSex ortsvektorer med benens fästpunkter på topplattan uttryck i Verktyg.
B
Längd , nuBenens längder i den nuvarande konfigurationen.
B
Längd , målBenens längder i den önskade konfigurationen.
3.3 Beräkning av benlängdsfel
En 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,
B
Längd , nu−
B
Lä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:
BottenOrigoP
2. Beräkna topplattans nuvarande ram uttryckt i bottenplattans ram:
VerktygBottenP
Nu3. Beräkna nuvarande benlängder: B
Längd , nu4. Flexapodens önskade inställning, som är lika med topplattans önskade ram uttryckt i
bottenplattans ram
VerktygP
MålBotten
, är given på förhand.
Teckning 2: Ramarnas placeringar i den matematiska modellen
för en flexapod.
Origo
Botten
Verktyg
Mät
Prob
5. Beräkna önskade benlängder: B
Längd , mål6. Beräkna benlängdsfelen:
B
Längd , nu−
B
Längd , målHär följer en mer noggrann beskrivning av hur benlängdsfelen beräknas.
Ekvation 1 uttrycker sambanden mellan flexapodens ramar.
P
Prob Origo
=
BottenOrigoP
⋅
VerktygBottenP
⋅
VerktygMätP
⋅
ProbMätP
(1)
Löses
BottenP
Origo
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.
P
BottenOrigo
=
OrigoProbP
⋅
ProbMätP
−1⋅
VerktygMätP
−1⋅
VerktygBottenP
−1Hemma(2)
P
Hemma VerktygBotten
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
VerktygBottenP
Nubestämmas vilket är möjligt
med ekvation 1.Då erhålls ekvation 3.
P
NuVerktygBotten
=
BottenOrigoP
−1⋅
OrigoProbP
⋅
ProbMätP
−1⋅
VerktygMätP
−1(3)
De nuvarande benlängderna beräknas med ekvation 4.
B
Längd , nu=
VerktygBottenP
Nu⋅B
Topp−
B
Botten(4)
De önskade benlängderna beräknas med ekvation 5.
B
Längd , mål=
VerktygBottenP
Mål⋅
B
Topp−
B
Botten(5)
Slutligen beräknas benlängdsfelet med uttryck 6.
B
Längd , nu−B
Längd , mål(6)
3.4 Känslighetsanalys
En ö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.
B
Längd=
P
−1⋅
OrigoProbP
⋅
ProbMätP
−1⋅
VerktygMätP
−1⋅
B
Topp(7)
Av högerledet i (7) kan uttydas att benlängdsfelet som uppkommer beror av flexapodens
konfiguration och pickup.
4 Grafiskt användargränssnitt
I 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 Krav
Kihlman 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
ö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änssnittet
Prototypen 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örspanel
Illustration 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
Illustration 2: Opertörpanelens utseende i prototypen
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 Emulator
Illustration 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
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ängdsfel
Redan 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 = vbRed
FillStyle = vbSolid
Refresh
ShapeHeight = CInt(B1diff * k)
originY = 7440
Line (originX, originY) - (originX + ShapeWidth, originY -
ShapeHeight), vbRed, B
Programkoden 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
Illustration 4: Stapeldiagrammet när
det fortfarande ritades med egen
kod.
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
Illustration 5: Stapeldiagrammets utseende med komponenten
MSChart.
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,25
2
0,25
0,625
3
0,1
0,3125
4
0,05
0,125
5
0,025
0,0625
6
-
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.
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 Översiktsvy
Syftet 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.
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 arbete
Koordinatsystem 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.
Illustration 8: Översiktsvyn implementerad
med Cortona VRML Viewer.
Illustration 9 visar operatörspanelens utsseende när värden visas i vanliga textrutor.
Illustration 10 visar operatörspanelens utseende när värden visas i stort format.
5 Frame-klassen
Hanteringen 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
Beskrivning
copy
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.
6 Kommunikation med mätutrustning
I 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 funktioner
ObjConnect.GetData
Illustration 11:
Mätutrustningen -
en Leicatracker.
ObjConnect.ContinuousProbeDataGetHeaderInfo
ObjConnect.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.StopContinuousMeasurement
Set Flexapod_Control_Panel.ObjSync = Nothing
Flexapod_Control_Panel.ObjConnect.DisconnectEmbeddedSystem
Set Flexapod_Control_Panel.ObjConnect = Nothing
7 Paketering
Mot 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.exe
Installationen 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 directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles
Sedan 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 $INSTDIR
File "OPERATÖRSPANELEN (PROJEKTET).exe"
File "Flexapod Default.txt"
File "Pickups.txt"
SetOutPath $INSTDIR\models
File "models\Overview.3dxml"
File "models\test.glm"
SetOutPath $INSTDIR\redist
File /r redist\*.*
Ett speciellt kommando finns för att installera ett avinstallationsprogram.
WriteUninstaller $INSTDIR\uninstaller.exe
Nå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\redist
RegDLL 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"
SectionEnd
Avinstallationen 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.ocx
UnRegDLL $INSTDIR\redist\LTControl.dll
RMDir /r "$SMPROGRAMS\Flexapod Control Panel"
Delete "$INSTDIR\OPERATÖRSPANELEN (PROJEKTET).exe"
Delete "$INSTDIR\Flexapod Default.txt"
Delete "$INSTDIR\Pickups.txt"
Delete $INSTDIR\uninstaller.exe
RMDir /r $INSTDIR\redist
RMDir /r $INSTDIR\models
RMDir $INSTDIR
SectionEnd
Applikationer 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
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.
8 Analys av resultat
Med 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.
Referenser
Craig, 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
Bilaga A – Arkitekturbild av mjukvaran
A
n
vä
n
d
ar
g
rä
n
ss
n
itt
F
le
xa
p
o
d
C
o
nt
ro
l P
a
ne
l.f
rm
M
ät
u
tr
u
st
n
in
g
e
m
S
co
n.
b
a
s
Tr
an
sf
or
m
at
io
n
s-h
an
te
rin
g
F
ra
m
e
.c
ls
M
at
ris
-m
an
ip
u
la
tio
n
cM
a
th
L
ib
.c
ls
D
ia
lo
g
ru
ta
”Ö
p
p
n
a
fil
”
O
p
e
nF
ile
D
ia
lo
g
.b
a
s
F
le
xa
p
od
vy
G
ra
p
hi
cs
3
D
.b
a
s
F
le
xa
p
od
h
an
te
rin
g
F
le
xa
p
o
d
M
a
na
g
e
r.c
ls
P
ic
ku
p
h
an
te
rin
g
P
ic
ku
p
M
a
na
g
e
r.c
ls
D
ef
in
iti
on
a
v
ko
n
st
an
te
r
C
o
ns
ta
nt
s.
b
a
s
Bilaga B - Källkod
OPERATÖRSPANELEN (PROJEKTET).vbp
Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\WINDOWS\system32\STDOLE2.TLB#OLE Automation
Reference=*\G{58DB560B-0186-11D5-BBB6-00508B35B332}#2.4#0#Leica\LTControl.dll#LTControl Type Library
Reference=*\G{420B2830-E718-11CF-893D-00A0C9054228}#1.0#0#..\..\WINDOWS\system32\scrrun.dll#Microsoft Scripting Runtime Reference=*\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.DLL
Reference=*\G{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}#1.1#0#..\..\WINDOWS\system32\ieframe.dll#Microsoft Internet Controls Object={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 Form=MainWindow.frm
Form=Flexapod Control Panel.frm
Module=Public_Objects; Public_Objects.bas Class=cMathLib; cMathLib.cls Module=Graphics3D; Graphics3D.bas Module=ComProtocol; ComProtocol.bas Module=V5lib; V5lib.bas Class=PickupManager; PickupManager.cls Class=Frame; Frame.cls Class=cInifile; CINIFILE.CLS Class=FlexapodManager; FlexapodManager.cls Module=emScon; emScon.bas Module=Constants; Constants.bas Module=OpenFileDialog; OpenFileDialog.bas IconForm="MainWindow" Startup="Flexapod_Control_Panel" HelpFile="" Title="OPERATÖRSPANELEN (PROJEKTET)" ExeName32="OPERATÖRSPANELEN (PROJEKTET).exe" Command32="" Name="Emulatorn" HelpContextID="0" CompatibleMode="0" MajorVer=1 MinorVer=0 RevisionVer=0 AutoIncrementVer=0 ServerSupportFiles=0 VersionCompanyName="DELFOi" CompilationType=0 OptimizationType=0 FavorPentiumPro(tm)=0 CodeViewDebugInfo=0 NoAliasing=0 BoundsCheck=0 OverflowCheck=0 FlPointCheck=0 FDIVCheck=0
UnroundedFP=0 StartMode=0 Unattended=0 Retained=0 ThreadPerObject=0 MaxNumberOfThreads=1 DebugStartupOption=0 [MS Transaction Server] AutoRefresh=1
Flexapod Control Panel.frm
VERSION 5.00
Object = "{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
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