diff options
| author | Mattias Uvesten <matuv053@student.liu.se> | 2019-12-02 21:27:21 +0100 |
|---|---|---|
| committer | Mattias Uvesten <matuv053@student.liu.se> | 2019-12-02 21:27:21 +0100 |
| commit | cf76f528129877b94988c38d14daced605cbaa71 (patch) | |
| tree | 832985d93d096caa9faf5a24839cbe6c88d9c062 /Dokument/Teknisk Dokumentation/text/system | |
| parent | 34d01a5dc128f3a1819c36b7f9e93d07532fcbdb (diff) | |
| parent | dfe52de86d600654343968fea54a189f1ec9e8cc (diff) | |
| download | tfyy51-cf76f528129877b94988c38d14daced605cbaa71.tar.gz | |
Merge branch 'master' of https://gitlab.liu.se/vehsys/tfyy51/yc4_2019
Diffstat (limited to 'Dokument/Teknisk Dokumentation/text/system')
5 files changed, 152 insertions, 0 deletions
diff --git a/Dokument/Teknisk Dokumentation/text/system/01-innan-start.tex b/Dokument/Teknisk Dokumentation/text/system/01-innan-start.tex new file mode 100644 index 0000000..19e3003 --- /dev/null +++ b/Dokument/Teknisk Dokumentation/text/system/01-innan-start.tex @@ -0,0 +1,11 @@ +\subsection{Innan start} + +Vid uppstart ritas knappar ut på displayen, 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. För att reagera på knapptryck skickas varje +0,4 sekunder ett kommando till displayen som instruerar displayen att lägga +information om alla knapptryck som skett i dess interna minne. Detta interna +minne läses sedan av och händelserna bearbetas i den kronologiska ordning de +gjordes i. diff --git a/Dokument/Teknisk Dokumentation/text/system/02-uppstart.tex b/Dokument/Teknisk Dokumentation/text/system/02-uppstart.tex new file mode 100644 index 0000000..02b8869 --- /dev/null +++ b/Dokument/Teknisk Dokumentation/text/system/02-uppstart.tex @@ -0,0 +1,48 @@ +\subsection{Uppstart} +\label{sec:systembeskrivning:uppstart} +Vid autonom körning utgår systemet ifrån en bootstrap som är systemet för uppstarten av bilarna. Då körs funktionen \texttt{do\_boot()} som arbetar fram en +initial \texttt{car.constant}. Detta sker i tre steg. Innan bilen börjar rulla +höjs \texttt{car.constant} varje 0,7 sekunder. När bilen börjar rulla och åker +under målgivaren höjs \texttt{car.constant} långsammare tills bilen åkt under +den första givaren varpå \texttt{car.constant} inte längre ändras. Vid den +tredje givaren jämförs hur lång tid det senaste segmentet tog att köra och en +sista \texttt{car.constant} räknas ut som förväntas ge en varvtid på 15 +sekunder. Om den förväntade varvtiden är längre än 15 sekunder höjs +\texttt{car.constant} och om den förväntade varvtiden är lägre sänks +\texttt{car.constant}. + +\begin{figure} + \centering + \begin{tikzpicture} + \draw + (0,0) -- + (1,0) -- + (1,1) -- + (2,1) -- + (2,2) -- + (3,2) -- + (3,3) -- + (4,3) -- + (4,5) -- + (7,5) -- + (7,5.5) -- + (10,5.5); + \draw [dotted] (10, 5.5) -- (14, 5.5); + \draw [->] (0,0) -- (15, 0) node[right]{$t$}; + \draw [->] (0,0) -- (0, 8) node[above]{Spänning}; + \draw [dotted] (4, 0) -- (4, 0.5) node[right]{Målgivarutslag} -- (4,3); + \draw [dotted] (10,0) -- (10, 3) node[right]{Bootstrap slut} -- (10, 5.5); + \draw [decoration={brace, raise=2pt}, decorate] (1,1) -- (2,1); % dt + \node at (1.5, 1.5) {$dt_1$}; + \draw [decoration={brace, raise=2pt}, decorate] (1,0) -- (1,1); + \node at (0.5, 0.5) {$dU_1$}; + \draw [decoration={brace, raise=2pt}, decorate] (4,3) -- (4,5); + \node at (3.5, 4) {$dU_2$}; + \draw [decoration={brace, raise=2pt}, decorate] (4,5) -- (7,5); + \node at (5.5, 5.5) {$dt_2$}; + \draw [decoration={brace, mirror, raise=2pt}, decorate] (7,5) -- (7,5.5); + \node at (7.55,5.25) {$dU_3$}; + \end{tikzpicture} + \caption{Metod för start av bil.} + \label{fig:bootstrap} +\end{figure} 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 diff --git a/Dokument/Teknisk Dokumentation/text/system/04-gas.tex b/Dokument/Teknisk Dokumentation/text/system/04-gas.tex new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Dokument/Teknisk Dokumentation/text/system/04-gas.tex @@ -0,0 +1 @@ + diff --git a/Dokument/Teknisk Dokumentation/text/system/05-display.tex b/Dokument/Teknisk Dokumentation/text/system/05-display.tex new file mode 100644 index 0000000..5b36342 --- /dev/null +++ b/Dokument/Teknisk Dokumentation/text/system/05-display.tex @@ -0,0 +1,6 @@ +\subsection{Display} + +I varje programcykel skickas värdet på \texttt{car.u} till två stapeldiagram på +displayen för vardera bil. Se \ref{app:funktioner och filer:display} för information om displayens +stapeldiagram. Om ett nytt varv inleds skrivs dessutom förra varvnumret och +varvtiden ut på displayen. |
