diff --git a/src/content/glossary.tex b/src/content/glossary.tex index 4847714..9979284 100644 --- a/src/content/glossary.tex +++ b/src/content/glossary.tex @@ -152,4 +152,5 @@ \newacronym{aws}{AWS}{Amazon Web Services} \newacronym{io}{I/O}{Input/Output} \newacronym{rtde}{RTDE}{Real-time Data Exchange} -\newacronym{rdp}{RDP}{Remote Desktop Protocol} \ No newline at end of file +\newacronym{rdp}{RDP}{Remote Desktop Protocol} +\newacronym{cpu}{CPU}{Central Processing Unit} \ No newline at end of file diff --git a/src/content/ursim_impl.tex b/src/content/ursim_impl.tex index 2f43469..84b9160 100644 --- a/src/content/ursim_impl.tex +++ b/src/content/ursim_impl.tex @@ -163,6 +163,7 @@ Az Ipar 4.0 megközelítésben különös szerepet játszik a \textit{Big Data}, Az adatok gyűjtése nem késleltetés érzékeny, ezért nem okoz problémát, ha a peremhálózatról egyenesen a felhőbe küldjük. Mivel a dolgozatom a \textit{Big Data} konkrét elemzésére nem tér ki, ezért az általam tervezett rendszerben a mérési adatokkal való tervezés kimerül azok gyűjtésében. \subsection{\textit{Single Robot Controller}} % Peremhálózati rendszer basically +\label{sec:single_robot_contoller_plans} \Aref{sec:edge_layer_plans}.\ szekcióban ismertetettek alapján terveztem meg a peremhálózati rendszerben futó mikroszolgáltatás halmazt. Jelenleg ez egyetlen egy mikroszolgáltatásból áll, ez az a szolgáltatás a \textit{program}ok futtatását valósítja meg. @@ -171,6 +172,7 @@ Egy program egyszerre csak egy robotkar működését írja le, így egy ilyen k Emellett meg kell oldania olyan problémákat is, amelyek \aref{sec:ursim_demo_control}.\ szekcióban ismertetett programnál adottak -- vagy legalábbis közel-triviálisan megoldhatóak -- voltak. \subsubsection{Végrehajtási keretrendszer} +\label{sec:ursim_execution_framework} Annak érdekében, hogy a komponens absztrakt módon megoldást adjon a késleltetések áthidalására a felhő és a peremhálózati rendszerek között a robot mozgatásához szükséges lépéseket egy \textit{program}ba szedve kapja meg. Egy ilyen \textit{program} utasításokból épül fel, amelyet interpretáltan, imperatív módon hajt végre a komponens. @@ -183,6 +185,7 @@ Ezek motiválták, hogy az egyes utasításokat önálló komponensbe szervezzem Egy \textit{plugin} által definiált utasítás a funkcionalitás mellett annak végrehajtásának vége előtti megszakítását is implementálnia kell, hiszen bármikor előfordulhat olyan helyzet, hogy le kell állítani a futtatást. Emellett a végrehajtás állapotának megfigyelhetőségéhez szükséges funkciókat is meg kell valósítania. \subsubsection{Szinkronizáció} +\label{sec:ursim_snyc_proto} A demó során kiemelt szerepe van a két robotkar lépéseinek összehangolására kritikus pontokban. @@ -225,6 +228,7 @@ Az \acrshort{api} két fontos és fix funkciót kell kiszolgáljon. Szükség es A \textit{plugin}ek további funkcionalitást regisztrálhatnak, amiket az \acrshort{api} használatával lehet elérni. Ennek segítségével meg lehet valósítani a \enquote{jogging} futtatást egy olyan \textit{plugin}nel ami minden fő lépés után meghívásra kerül és várakozik az endpoint meghívására. \subsection{Felhő szolgáltatások} +\label{sec:cloud_layer_plans} % itt írok általánosságban azokról a cucmókról, ami a felhőbe kerül @@ -256,12 +260,26 @@ Az összes általam választott szolgáltatást \gls{python} nyelven implementá % ha nagyon kevés oldal van, akkor itt tudok írni a fejlesztői környezetről is illetve a tesztelésről +\subsection{Mikroszolgáltatások} + +Mint ahogy \aref{fig:usrsim_services_plan-clean}.\ ábra is mutatja, \aref{sec:single_robot_contoller_plans}.\ és \aref{sec:cloud_layer_plans}.\ szekciókban ismertetett mikroszolgáltatásokat implementáltam. + \begin{figure}[h!] \centering \includegraphics[width=1\textwidth]{figures/ursim_services_plan-clean} \caption{A tervezett mikroszolgáltatások a futtatási környezetük szerint csoportosítva} \label{fig:usrsim_services_plan-clean} \end{figure} + + +A \textit{Program Service} és a \textit{Job Orchestrator Service} esetén a \acrshort{http} interfészt a \textit{Flask} mikrokeretrendszer segítségével implementáltam. A \textit{Single Robot Controller} esetében a program felépítése miatt a \gls{python} beépített \acrshort{http} szerverét egészítettem ki, hogy megvalósítsa az interfészt. + +A \textit{Single Robot Controller} szolgáltatás esetén a komponens életciklusa eltér a hagyományos mikroszolgáltatásokétól. Ebben az esetben a szolgáltatás csak addig él, amíg futtatja a programot, ha már nincs rá szükség, akkor kilép. Elindításáért a \textit{Job Orchestrator Service} felel. + +Egy szcenárió lejátszásához több \textit{Single Robot Contoller} komponens futtatása is szükséges lehet. Hogy az egy csoportba tartozó komponensek azonosíthatóak legyenek, a \textit{Job Orchestrator Service} egy futtatási azonosítót rendel a szcenárióhoz, az egy szcenárióban indított összes \textit{Single Robot Controller} osztozik a futtatási azonosítón. + +A \textit{Program Service} esetén az eltárolt programokat egy dokumentum tárba rendeztem. Az általam válaszott dokumentum tár a \textit{MongoDB}\footnote{\url{https://www.mongodb.com/}} volt. + % Hát itt kénytelen leszek kódot magyarázni szerintem % Redis @@ -270,9 +288,6 @@ Az összes általam választott szolgáltatást \gls{python} nyelven implementá % az egyes mikroszolgáltatások különszedve - -% Le lehet írni azt is hogy hogyan extractoltam ki a lépéseket az eredeti kódból, erről egy egész szekciót lehetne írni - % Tiny HTTP Szerver, endpointok felsorolása % Pluginok compilerekkel @@ -281,32 +296,100 @@ Az összes általam választott szolgáltatást \gls{python} nyelven implementá % Esetleg pluginok felsorolással - - \subsection{\textit{Single Robot Control} \textit{plugin}ek} -% ITt lehet írni a compilerek , regisztráció és loginről +A \textit{Single Robot Control} komponens által, a \textit{programban} definiált utasítások implementációjára \textit{plugin}ek a programban osztályok csoportjaként kerültek megvalósításra. + +Minden \textit{plugin} egy különálló osztályban van megvalósítva. Ennek példányosításával lefut az adott \textit{plugin} inicializációja (például: csatlakozás a robotkarokhoz), majd regisztrálja a rendelkezésre álló utasítás osztályokat. A \textit{plugin} osztályok implementálnak egy \texttt{close} függvényt is, amely a foglalt erőforrások felszabadításáért felel. + +A beregisztrált utasítás osztályok lényegében egy \textit{factory} mintát valósítanak meg. Amikor a szolgáltatás betölt egy \textit{programot} akkor először minden lépését értelmezi azzal, hogy ezekkel a \textit{factory} osztályokkal példányosítja a konkrét utasítás objektumot. Ezen a ponton lehetőség van a bevitt adatok helyességének ellenőrzésére, hogy ez ne a futtatáskor történjen meg, ezzel futtatás közben spórolva a \acrshort{cpu} ciklusokkal és \textit{fail-early} megközelítés szerint még az előtt kiderülnek a problémák, hogy a program futtatásra kerülne. + +Az értelmezett utasításokat listába szervezve készíti elő a futtatható \textit{program}ot a szolgáltatás. Ezek a példányosított utasítások implementálják \aref{sec:ursim_execution_framework}.\ szekcióban említett három fő funkciót: \texttt{execute}, \texttt{abort} és \texttt{describe}. Az egyes paraméterek összerendelése ebben a lépésben történik meg az utasításokhoz. + +Amikor egy program futtatásra kerül, akkor a komponens egyesével lépkedve a listán minden elemnek meghívja az \texttt{execute} függvényét. Ha meg kell szakítani a futást, akkor az éppen futó lépes \texttt{abort} függvényét meghívva, leállítja azt, és a következő parancsot már nem hajtja végre. + +Ha egy utasítás futtatása közben hiba lép fel, akkor a \textit{program} végrehajtása véget ér. \subsubsection{\textit{Sync Plugin}} +Ez a \textit{plugin} valósítja meg kettő vagy több komponens által futtatott programban a szinkronizációs pontokat. + +A \textit{plugin} inicializációjakor kapcsolódik a \textit{Redis} adatbázishoz, ehhez ekkor rendelkezésre kell állnia a kapcsolódási adatoknak, így ezt a program konfigurációjával együtt kell megadnunk. + +Az általa szolgáltatott utasításnak két paramétere van, az egyik a szinkronizációs pont neve, a második pedig a komponensek száma, amelyek ugyanezen a ponton várakoznak. Annak érdekében, hogy ez egyedi legyen, és két különálló lefutása a programnak ne befolyásolja az adatbázis tartalmát, ezáltal ne legyen hatással a program lefutására, így az adatbázisban tárolt kulcsok nevéhez a futtatási azonosítót is hozzáfűzi. + +Amikor a program futása erre a pontra érkezik, akkor az várakozni fog egészen addig, amíg az összes többi komponens által futtatott program egy ugyan ilyen nevű szinkronizációs pontra nem ér. Ezután \aref{sec:ursim_snyc_proto}.\ szekcióban ismertetettek szerint \enquote{egyeztetett} időpontban halad tovább. + \subsubsection{\textit{UR-RTDE Plugin}} +Ez a \textit{plugin} jelenleg az egyetlen, amely a robotkar irányítását megvalósítja. + +Inicializációkor csatlakozik a robotkar \acrshort{rtde} interfészére, amelyre blokkoló módon küldi a mozgási utasításokat. Ennek értelmében a cím amelyre csatlakoznia kell már itt rendelkezésre kell állnia, így azt a program konfigurációjaként adhatjuk meg. + +Minden egyes utasítás akkor ér véget, ha a mozgás befejeződött, így tud a következő utasításra lépni. Hiba esetén az \acrshort{rtde} interfész lehetőséget ad arra, hogy közölje azzal aki az utasítást adta. Így egy utasítás hibájával (például érvénytelen mozgás, váratlan akadály vagy kézi megszakítás) a teljes \textit{program} végrehajtása megáll. + \subsubsection{\textit{Wait Plugin}} +A \textit{plugin} által megvalósított egyetlen utasítás addig várakoztatja a program futását, amíg annak folytatására külső befolyással nem kap utasítást. + +Ez a \textit{plugin} regisztrál egy endpointot a \acrshort{http} \acrshort{api}-ban, amellyel a program végrehajtása folytatható. + +Ennek a pluginnek a használatával megvalósítható, a demóban is alkalmazott \textit{jogging} módú futtatás. A léptetés itt nem billentyűlenyomással, hanem az \acrshort{api} meghívásával történik. + \subsubsection{Egyebek} +A fent vázolt \textit{plugin}ek mellett készítettem néhány egyszerűbbet is, amelyek egyszerűbb vagy csak hibakeresésnél használatos funkciókat implementálnak: + \begin{itemize} - \item \textbf{Log Plugin} - \item \textbf{Sleep} + \item \textbf{Log Plugin} Ezzel a \textit{plugin}nel a program futása közben előre definiált üzeneteket jeleníthetünk meg az alkalmazás naplójában. + \item \textbf{Sleep} Ez a \textit{plugin} lehetővé teszi hogy meghatározott ideig szüneteltessük a végrehajtást. \end{itemize} \subsection{\textit{Program} formátum} -% YAML és JSON -% Struktúra -% sémavalidációk -% A programok felépítéséről is lehet írni +A \textit{Program}ok felépítése és struktúrája egyszerű. Úgy alkottam meg, hogy mind ember által könnyen értelmezhető és szerkeszthető legyen, de könnyen értelmezhető legyen program által is. -\section{Tesztelés} +A \textit{program} leírása tartalmazza első sorban annak verzióját. Ez a későbbi kompatibilitási problémák megoldásának egyszerűsítésére lett bevezetve, jelenleg csak az \texttt{1}-es verzió létezik. Az a program, ahol ennek a mezőnek az értéke nem \texttt{1} az érvénytelen. + +A verzió mellett a leírás tartalmazza a program nevét, ennek nem kell egyedinek lennie csak diagnosztikai céllal létezik. Emellett a program létrehozásának időpontját és a betöltendő \textit{plugin}ek listáját. + +A \textit{program} leírása opcionálisan tartalmazhat egy \texttt{id} vagy \texttt{\_id} mezőt, ezzel megkönnyítve a program kezelését. A beolvasásnál ennek a mezőnek a jelenléte nem okoz hibát. + +A program több módon is szerializálható. Ezekből csak a \acrshort{json} és \acrshort{yaml} formátumokat használtam, előbbit a komponensek egymás közti kommunikációjában a másodikat a programok ember által történő szerkesztésére. A struktúrára egy példa \acrshort{yaml} szerializációban \aref{ex:program}.\ példán látható. + +\begin{lstlisting}[float=!ht,caption={Példa felépítse egy \textit{programak} YAML formátumban},label=ex:program] +--- +version: 1 +name: thesis_example +created_at: '2021-04-14T20:54:47.557000' +load_plugins: ["ur_rtde", "log", "wait"] +program: +- command: log + args: + level: INFO + message: This is a test program. Starting now... + +- command: moveJ + args: + q: [2.625, -0.548, 1.614, 3.645, -1.567, 4.192] + speed: 1.0 + acceleration: 4.0 + +- command: wait + args: {} + +- command: moveL + args: + pose: [0.399, -0.1, -0.26798, 0, 3.14, 0] + speed: 0.05 + acceleration: 0.75 +\end{lstlisting} + +A program sémájának validálására a \textit{Marshmallow}\footnote{\url{https://github.com/marshmallow-code/marshmallow}} könyvtárat használtam. Ezzel deklaratív módon tudtam validációs sémákat írni, amelyet minden komponensnél használtam, amely érintkezik valamilyen szinten \textit{program}okkal. Így a lehető leghamarabb vissza tudja utasítani a rendszer a hibás programokat. + +Az eredeti demó mozgását futás időben fordítottam le az általam definiált \textit{program} struktúrára azáltal, hogy a demó programban a \gls{python} által biztosított reflexiókat használva, az egyes lépéseket lecseréltem arra, hogy fájlba mentse a az utasításokat és a paramétereiket. + + +%\section{Tesztelés} diff --git a/src/include/packages.tex b/src/include/packages.tex index 2fd1814..7bbd16f 100644 --- a/src/include/packages.tex +++ b/src/include/packages.tex @@ -47,6 +47,8 @@ \setlength{\parskip}{0em} \frenchspacing \setquotestyle[quotes]{german} + \renewcommand{\lstlistingname}{Példa} + \renewcommand{\lstlistlistingname}{Példák jegyzéke} } \newcommand{\selectenglish}{ @@ -62,13 +64,15 @@ \renewcommand{\subsectionautorefname}{Section} \renewcommand{\subsubsectionautorefname}{Section} \setquotestyle[quotes]{american} + \renewcommand{\lstlistingname}{Example} + \renewcommand{\lstlistlistingname}{List of Examples} } \usepackage[numbers]{natbib} \usepackage{xspace} % User packages -\usepackage{lipsum} +%\usepackage{lipsum} \usepackage[acronym,toc]{glossaries} \usepackage{soul} \usepackage{tabularx} diff --git a/src/include/preamble.tex b/src/include/preamble.tex index 40e3d91..8525b55 100644 --- a/src/include/preamble.tex +++ b/src/include/preamble.tex @@ -121,10 +121,6 @@ \author{\vikszerzo} \title{\viktitle} -% True magic -\renewcommand\lstlistingname{Example} -\renewcommand\lstlistlistingname{List of Examples} % name of listings list - \newmdenv[ topline=false, bottomline=false,