summaryrefslogtreecommitdiffstats
path: root/Dokument/Teknisk Dokumentation/text/system/03-korning.tex
diff options
context:
space:
mode:
authorMattias Uvesten <matuv053@student.liu.se>2019-12-02 21:27:21 +0100
committerMattias Uvesten <matuv053@student.liu.se>2019-12-02 21:27:21 +0100
commitcf76f528129877b94988c38d14daced605cbaa71 (patch)
tree832985d93d096caa9faf5a24839cbe6c88d9c062 /Dokument/Teknisk Dokumentation/text/system/03-korning.tex
parent34d01a5dc128f3a1819c36b7f9e93d07532fcbdb (diff)
parentdfe52de86d600654343968fea54a189f1ec9e8cc (diff)
downloadtfyy51-cf76f528129877b94988c38d14daced605cbaa71.tar.gz
Merge branch 'master' of https://gitlab.liu.se/vehsys/tfyy51/yc4_2019
Diffstat (limited to 'Dokument/Teknisk Dokumentation/text/system/03-korning.tex')
-rw-r--r--Dokument/Teknisk Dokumentation/text/system/03-korning.tex86
1 files changed, 86 insertions, 0 deletions
diff --git a/Dokument/Teknisk Dokumentation/text/system/03-korning.tex b/Dokument/Teknisk Dokumentation/text/system/03-korning.tex
new file mode 100644
index 0000000..24d58ee
--- /dev/null
+++ b/Dokument/Teknisk Dokumentation/text/system/03-korning.tex
@@ -0,0 +1,86 @@
+\subsection{Körning}
+\label{sec:systembeskrivning:korning}
+
+Huvudloopen körs åtminstonde 10 gånger i sekunden. Den beräknar var bilen
+befinner sig, hur snabbt bilen ska köra, justerar \texttt{car.constant} och sätter det
+nya gaspådraget till banan.
+
+Majoriteten av förändringarna i structen \texttt{car} görs i funktionen \texttt{do\_car()}.
+I \texttt{do\_car()} beräknas först positionen (\texttt{car.position}),
+sedan motsvarande hastighetsparameter (\texttt{car.v}) och därefter det gaspådrag
+(\texttt{car.u}) som ska sättas till banan.
+
+\subsubsection{Position}
+\label{sec:system:korning:position}
+Det finns två fall när positionen ska beräknas. När en givare har passerats sedan förra positionsberäkningen och när ingen givare har passerats. Under första varvet hanteras endast det första fallet
+och från varv 2 och frammåt görs båda parallellt.
+
+Om en ny givare har passerats, \texttt{car.new\_check\_point == true}, ökar
+programmet nuvarande segment (\texttt{car.segment}) med 1. \texttt{car.segment}, som
+alltid ligger mellan 1 och 9, används som index för att välja position i en
+lista (\texttt{car.pos\_at}). Vi kallar den positionen för \emph{givarpositionen}.
+
+Om ingen givare har passerars och första varvet är avslutat kallas först på funktionen \texttt{get\_approx\_v()}. Denna utgår ifrån
+förra varvets segmentstider (\texttt{car.seg\_times}) och segmentslängder
+(\texttt{car.seg\_len}) och beräknar med $v = \frac{s}{t}$, där \texttt{s} är segmentslängden och \texttt{t} segmentstiden, \texttt{v} som är medelhastigheten för nuvarnade
+segment, men förra varvet. Denna antas vara ungefär samma som nuvarande
+hastiget och kallas \emph{car.v}.
+
+Sedan beräknas positionen, i meter från målgivaren, med funktionen
+\texttt{get\_position()}. Den använder den ungefärliga hastigheten \texttt{v} beräknad av
+\texttt{approx\_v()} och tiden \texttt{t} sedan denna beräkning gjordes senast (en programcykel, se \ref{sec:system:korning:cykel})
+och beräknar med $s = v \cdot t$ den sträcka som bilen har åkt. Sedan adderas denna
+med förra kända positionen och returneras i \texttt{car.position}. Denna
+\emph{beräknade} position tas också fram när en givare har passerats, då skrivs den över med \emph{givarpositionen} men används i stället för att detektera missade givare. Se \ref{sec:missade givare}.
+
+\subsubsection{Gaspådrag}
+
+Efter positionsberäkningen beräknas det gaspådrag som skall sättas till banan. Detta görs i två
+funktioner, \texttt{get\_new\_v} och \texttt{get\_new\_u}.
+
+I \texttt{get\_new\_v} används bilens nuvarande postition (\texttt{car.postition})
+och hastighetskartan (\texttt{car.map}). I \texttt{car.map} finns en
+hastighetsparameter för varje \texttt{car.position} (Se \ref{sec:begrepp och systemöversikt}.), denna retuneras av funktionen
+och sparas i \texttt{car.v}.
+
+I \texttt{get\_new\_u} används denna hastighetsparameter tillsammans med
+\texttt{car.constant}. Dessa multipliceras och deras produkt retuneras och sparas
+i \texttt{car.u}.
+
+\subsubsection{Governor}
+\label{sec:systembeskrivning:governor}
+Om bootstrap är avslutad, körs den del av koden vars ända uppgift är att
+anpassa \texttt{car.constant}.
+
+Detta görs med funktionen \texttt{do\_gov}. Först görs en uppskattning av
+varvtiden utifrån hur lång tid varvet har tagit än
+så länge. Detta görs med forecasts som beräknar den approximerade varvtiden utifrån tid fram tills senast
+passerad givare samt hastighet i tidigare segment. Genom att veta en
+genomsnittlig hastighet går det med kvarvarande sträcka att räkna ut en
+ungefärlig kvarvarande tid. När tiden från mål till senaste passerade givare adderas med
+den uträknade approximerade tiden kvar, så erhålls det en uppskattad varvtid som
+används för att avgöra om en bil behöver åka snabbare eller långsammare. Om bilen dock är inne på sitt första varv görs uppskattningen endast
+utifrån förra segmentet \texttt{car.forcasts\_naive} och om första varvet är
+avslutat så används \texttt{car.forcasts} som vanligt. Detta görs efter segment 4 och 8. Dessutom används den
+faktiska varvtiden när bilen passerar mål (från varv 2 och frammåt).
+
+Sedan jämförs denna uppskattade varvtid med referenstiden (\texttt{car.ref\_time})
+och \texttt{car.constant} justeras.
+\begin{verbatim}
+car.constant = car.constant + (status - 1) * 0.08;
+\end{verbatim}
+Där \texttt{status} är den uppskattade varvtidens förhållande till \texttt{car.ref\_time}.
+D.v.s om de är exakt lika blir \texttt{status~ =~ 1}, om uppskattningen är högre blir
+den större än 1 och om den är lägre blir den mindre än 1. Således kommer \texttt{car.constant}
+höjas eller sänkas proportionellt mot hur långt ifrån \texttt{car.ref\_time} uppskattningen
+av varvtiden ligger.
+
+\subsubsection{Hantering av cykellängd}
+\label{sec:system:korning:cykel}
+I slutet av varje cykel körs det en loop som tillfälligt pausar programmet.
+För att få avläsningen att ske minst en gång var tionde sekund så pausas
+programmet kontinuerligt 0.001 sekunder tills den totala paustiden överskrider
+0.07 sekunder då nästa cykel börjar. Då pausen på 0.001 sekunder är så pass
+kort och marginalen till kravet är rätt stor så sker avläsningen mellan
+0.07 och 0.1 sekunder. I en if-sats sparas den högst
+uppmätta tiden i \texttt{highToc}. \ No newline at end of file