1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
\section{Systembeskrivning}
\subsection{Innan start}
Vid uppstart ritas knappar ut på displayenm se figur x. Med dessa knappar går
det att välja om en eller två banor ska vara aktiva och om de ska styras
autonomt av systemet eller manuellt med handkontroll. Det går också att ställa
in en referenstid mellan 12 och 15 sekunder med 0,5 sekunders intervall genom
att trycka på + och - på displayen. Varje 0,x sekunder skickas ett kommando till
displayen som skickar information om alla knapptryck som skett sedan minnet
efterfrågades senast. Händelserna bearbetas i den kronologiska ordning de
trycktes i och ändrar på variabler enligt de knapptryck som skett.
\subsection{Uppstart}
Vid automatisk körning körs funktionen \emph{do\_boot} vars syfte är att få fram en
initierande konstant (\emph{car\_constant}) och spänningspådrag för den bil som står på banan. Då bilen är
positionerad framför målbågen höjer funktionen konstanten kontinuerligt i ett
tidsintervall på 0.7 sekunder. När väl konstanten är tillräckligt stor för att
bilen ska kunna rulla och passera målbågen så dämpas höjningen av konstanten och förändringen sker med en lägre frekvens. Vid passering av den andra givaren så slutar
funktionen tillfälligt att förändra konstanten och låter bilen, med den
tilldelade konstanten, åka igenom det tredje segmentet för att få en uträknad tid. Med
tiden det tagit för bilen att ta sig igenom segmentet räknar funktionen ut
vilken förväntad varvtid bilen skulle få med just den konstanten den hade i
segmentet. (beskriva forecastsuträkningen?) Det sista funktionen gör är att
återigen justera konstanten. Om den förväntade varvtiden är större än 15
sekunder, som är referensvarvtiden för första varvet, så ökar konstanten och är
den förväntade varvtiden mindre än 15 sekunder så sänks konstanten.
\subsection{Körning}
Huvudloopen körs åtminstonde 10 gånger i sekunden. Den beräknar först var bilen
befinner sig, sedan väljer den hur snabbt bilen ska köra och slutligen sätts den
hastigheten till banan.
Den viktigaste delen av huvudloopen är funktionen \emph{do\_car}. Funktionen
beräknar de ändrinar som skall göras i matlab-structen \emph{car} och är indelad
i många delar.
\subsubsection{Position}
Det finns två fall när positionen ska beräknas. När en givare har passerats och
när en givare inte har passerats. Under första varvet görs endast det första och
från varv 2 och frammåt görs båda paralellt.
Om en ny givare har passerats, \emph{car.new\_check\_point == true}, ökar
programmet nuvarande segment (\emph{car.segment}) med 1. \emph{car.segment}, som
alltid ligger mellan 1 och 9, används som index för att välja position i en
lista (\emph{car.pos\_at}).
Om ingen givare har passerars och bilen har avslutat första varvet, alltså
oftast, görs lite mer avancerade beräkningar. För att beräkna positionen
använder proggrammet först en funktion \emph{get\_aprox\_v}. Denna utgår ifrån
förra varvets segmentstider (\emph{car.seg\_times}) och segmentslängder
(\emph{car.seg\_len}) och beräknar med v = s/t medelhastigheten för nuvarnade
segment, men förra varvet. Denna antas vara ungefär samma sak som nuvarande
hastiget.
Sedan beräknas den fakiska positionen, i meter från målgivaren, med funktionen
\emph{get\_position}. Den använder den ungefärliga hastigheten beräknad av
\emph{aprox\_v} och tiden sedan denna beräkning gjordes senast (en programcykel)
och beräknar med s = v * t den sträcka som bilen har åkt. Sedan adderas denna
med förra kända postionen och retuneras i \emph{car.position}.
\subsection{Gaspådrag}
Sedan beräknas det gaspådrag som skall sättas till banan. Detta görs i två
funktioner, \emph{get\_new\_v}) och \emph{get\_new\_u}.
I \emph{get\_new\_v} används bilens nuvarande postition (\emph{car.postition})
och hastihetskartan (\emph{car.map}). I \emph{car.map} finns en
hastighetsparameter för varje \emph{car.position}, denna retuneras av funktionen
och sparas i \emph{car.v}.
I \emph{get\_new\_u} används denna hastighetsparameter tillsammans med
\emph{car.constant}. Dessa multipliceras och deras produkt retuneras och sparas
i \emph{car.u}.
\subsubsection{Governor}
Sedan, om bootstrap är avslutad, körs den del av koden vars ända uppgift är att
anpassa \emph{car.constant}.
Detta görs med funktionen \emph{do\_gov}. Först görs en uppskattning av varvtiden utifrån hur lång tid varvet har tagit än
så länge. Om bilen är inne på sitt första varv görs uppskattningen endast
utifrån förra segmentet \emph{car.forcasts\_naive} och om första varvet är
avslutat använder den i stället \emph{car.forcasts} som kollar på hela varvtiden
fram till och med nu. Detta görs efter segment 4 och 8. Desutom används den
faktiska varvtiden när bilen passerar mål (från varv 2 och frammåt).
Sedan jämförs den uppskattade varvtiden med referenstiden \emph{car.ref\_time}.
Om den uppskattade varviden är högre än referenstiden höjs \emph{car.constant}
och om den är lägre sänks \emph{car.constant}.
\subsubsection{Display}
I varje programcykel skickas nuvarande värdet på u till två stapeldiagram på
displayen för vardera bil. Se appendix N för mer information om displayens
stapeldiagram. Om ett nytt varv har inletts skrivs dessutom varvnumret och
varvtiden ut på displayen.
\subsection{Avslut}
När körningen avslutas så får banan ingen mer spänning och bilarna stannar.
Ifall en bil har kört fler än 2 varv så sparas statistik från körningen.
|