From 274f5e6540b1445f98785908c30145e141a52507 Mon Sep 17 00:00:00 2001 From: marcsello Date: Sun, 23 May 2021 03:23:24 +0200 Subject: [PATCH] finally getting somewhere --- src/content/acknowledgement.tex | 6 +- src/content/appendices.tex | 5 + src/content/birbnetes_impl.tex | 3 + src/content/overview.tex | 1 + src/content/ursim_impl.tex | 171 ++++++++++++++++++++++++++++---- src/figures/pyprocsync_flow.pdf | Bin 0 -> 44723 bytes 6 files changed, 168 insertions(+), 18 deletions(-) create mode 100644 src/figures/pyprocsync_flow.pdf diff --git a/src/content/acknowledgement.tex b/src/content/acknowledgement.tex index 77bc2a3..39342e4 100644 --- a/src/content/acknowledgement.tex +++ b/src/content/acknowledgement.tex @@ -2,4 +2,8 @@ %---------------------------------------------------------------------------- \chapter*{\koszonetnyilvanitas}\addcontentsline{toc}{chapter}{\koszonetnyilvanitas} %---------------------------------------------------------------------------- -Szeretném köszönetemet kifejezni konzulensemnek, Dr.~Maliosz~Markosznak, amiért lehetővé tette, hogy egy ilyen remek témán dolgozzak és emellett a rengeteg segítséget, amit Dr.~Simon~Csabával közösen adtak munkám során. \ No newline at end of file +Szeretném köszönetemet kifejezni konzulensemnek, Dr.~Maliosz~Markosznak, amiért lehetővé tette, hogy egy ilyen remek témán dolgozzak és emellett a rengeteg segítséget, amit Dr.~Simon~Csabával közösen adtak munkám során. + +Emellett köszönettel tartozom a Távközlési és Médiainformatikai Tanszék Nagysebességű Hálózatok Laboratóriumának (HSN LAB) és a Schönherz Kollégiumban található Schönherz Elektronikai Műhelynek (SEM), hogy biztosították számomra az eszközöket, szerszámokat és helyszínt a munkámhoz. + +Emellett szeretném megköszönni családomnak és barátaimnak a végtelen támogatást amit kaptam. \ No newline at end of file diff --git a/src/content/appendices.tex b/src/content/appendices.tex index 47936e0..c62039b 100644 --- a/src/content/appendices.tex +++ b/src/content/appendices.tex @@ -22,4 +22,9 @@ \end{itemize} +\section{Precíz időszinkronizáció} +\label{append:timesync} +... + +% NTP és PTP \ No newline at end of file diff --git a/src/content/birbnetes_impl.tex b/src/content/birbnetes_impl.tex index 51ce569..b03daa4 100644 --- a/src/content/birbnetes_impl.tex +++ b/src/content/birbnetes_impl.tex @@ -183,6 +183,9 @@ Emellett időnként szükség van \enquote{kis} adatok átvitelére mindkét ir \section{Tervezés} +\subsection{Keretrendszer} +\label{sec:birbframework} + % Itt leírom az átalakítást a három rétegű pörgő lófaszra % Még jó, hogy mikro meme, meg k8s, így tök véletlenül pont a kubeedge a legjobb framework hozzá diff --git a/src/content/overview.tex b/src/content/overview.tex index d6b5679..e1616a2 100644 --- a/src/content/overview.tex +++ b/src/content/overview.tex @@ -142,6 +142,7 @@ Jelenleg is már több alkalmazásnál is használják, vagy tervezik használni A dolgozatom részeként a felhő és a peremhálózati rendszerek előnyeinek bemutatására két konkrét alkalmazást készítettem, amelyen jól demózhatóak az előnyök. Ezeknek a megvalósítását a \aref{chapter:birbnetes}.\ és \aref{chapter:ursim}.\ fejezetek részletezik. \section{Alkalmazás futtatási és fejlesztési keretrendszerek} +\label{sec:frameworks} % itt le lehet írni, hogy igazából mit is kell egy keretrendszernek tudnia diff --git a/src/content/ursim_impl.tex b/src/content/ursim_impl.tex index 68b8f76..2f43469 100644 --- a/src/content/ursim_impl.tex +++ b/src/content/ursim_impl.tex @@ -95,6 +95,7 @@ A demó szcenáriót lejátszó robotkarok egy asztalon kerültek telepítésre. Az asztalon a két munkadarabnak kijelölt helye van, ahonnan a robotkarok felemelik, az összeillesztés az asztal közepénél történik, majd valahol itt is helyezi el a kész darabot. A környezet vizuális bemutatásául \aref{fig:work_table}.\ ábra szolgál. \subsubsection{Vezérlés} +\label{sec:ursim_demo_control} A demo vezérlésére a munkám elején egy monolit Python program állt rendelkezésemre. A program úgy lett tervezve, hogy elindításával csatlakozik mindkettő robotkar \acrshort{rtde} interfészére. Majd sorban elküldi a robotkaroknak a demo végrehajtásához szükséges utasításokat. A % TODO gripper vezérlését \acrshort{rest} apin keresztül végzi. @@ -113,48 +114,154 @@ A fenti monolit demó felhő és perem számítástechnikai rendszerbe való át \subsection{Keretrendszer} -% Itt nagyon hosszan részletezem, hogy miért választottam a kube-edget +\Aref{sec:frameworks}.\ szekcióban több keretrendszert is megvizsgáltam. Ezek közül a \textit{KubeEdge}-t választottam. +A kiválasztásának fő oka az volt, hogy támogatja a mikroszolgáltatás architektúrát, emellett -- a leírása alapján -- könnyen lehet alkalmazni, hiszen ha az alkalmazásunk konténerből futtatható, alig kell rajta módosítani, hiszen a \textit{KubeEdge} képes ezeket a konténereket beütemezni, hogy a peremhálózaton futhassanak. Így a korábban szerzett mikroszolgáltatás alapú alkalmazásfejlesztési tapasztalataimat itt könnyen tudtam hasznosítani. + +Mindemellett \aref{sec:birbframework}.\ szekcióban kifejtettek alapján a másik alkalmazásomat is \textit{KubeEdge} alapokra építettem fel. Ennek köszönhetően a későbbi méréseimet is egyforma környezetben tudom végezni, ezzel egyszerűsítve azok implementációját amellett, hogy a két alkalmazáshoz nem kell két külön keretrendszert megismernem és fejleszteni rá. + +A \textit{KubeEdge} használatának további előnye, hogy az általam már jól ismert \textit{Kubernetes} konténer orkesztációs platformra épül. Így a telepítése és megismerése számomra egyszerűbb. \subsection{Architektúra} -% funkcionális felbontás +Mivel a \textit{KubeEdge}-t választottam az alkalmazásom felépítésére, így nagyon egyszerű volt annak a kérdésnek a megválaszolása, hogy milyen architektúrát használok a szoftver elkészítésére. Az alkalmazást mikroszolgáltatás architektúrára terveztem. + +Ennek érdekében a tervezés első lépéseként felbontottam funkcionális egységekre a jelenlegi demó vezérlést. A felbontásnál viszont itt nem csak a funkcionális egységek elkülönítését tartottam szem előtt. Mivel egy három rétegű architektúrára tervezek, ezért figyelembe kellett vennem annak elvárásait és adottságait. + +A végleges funkcionálisan felbontott részegységekről \aref{fig:usrsim_services_plan-blocks}.\ ábra ad áttekintést. Érdemes megfigyelni, hogy végeredményében a három rétegű architektúránk egy három szintű robot vezérlést implementál, amely a vezérlési feladatokat egyre nagyobb absztrakcióval kezeli. Az egyes rétegeken belüli rendszerek tervezését a következő szekciókban ismertetem. \begin{figure}[h!] \centering \includegraphics[width=0.9\textwidth]{figures/ursim_services_plan-blocks} - \caption{} + \caption{Demó vezérlés felbontása funkcionális egységekre a futtatási környezet és a késleltetés igények szerint} \label{fig:usrsim_services_plan-blocks} \end{figure} -\subsection{\textit{Single Robot Controller}} +\subsubsection{\textit{On-site} réteg} -\subsection{Kiegészítő szolgáltatások} +Mivel azt szeretnénk, hogy a telephelyen belüli (On-site) rendszer a lehető legminimálisabb legyen, így oda csak maga a robotkar -- és a hozzá tartozó \textit{Control Box} amely az alacsony szintű vezérlését megvalósítja -- kerül. Természetesen ebből több is kerülhet egy telephelyre, vagy akár több telephelyet is vehetünk. + +\subsubsection{Peremhálózati réteg} +\label{sec:edge_layer_plans} + +A középső rétegben alacsony késleltetésünk van a robotkar felé, viszont csak limitált erőforrásaink vannak. Ennek érdekében csak azokat a komponenseket lenne érdemes ide tenni, amelynél ezek a szempontok fontosak és azt is minimálisan tartani. Ezen a szinten ezért egy \enquote{középszintű} vezérlő komponenst terveztem. Ez már az általam írt kód szerint dolgozik, így tetszőleges logikát tudok bele implementálni. Az alacsony késleltetés miatt innen megbízhatóan és közvetlenül lehet a robotkarnak mozgató utasításokat kiadni illetve az állapotát beolvasni. + +A \enquote{középszintű} vezérlés feladata egy olyan absztrakciót adni az egyel magasabb réteg felé, hogy ott már olyan módon lehessen irányítani a robotok működését, hogy azt ne zavarja a késleltetés. Ezt az absztrakciót úgy terveztem meg, hogy nagyobb, összefüggő lépés sorozatok végrehajtását tegye lehetővé a magasabb réteg felé. + +A lépés sorozatoknál elvárás, hogy biztonságos állapotból indulnak és biztonságos állapotba érkeznek. Így a kettő lépés sorozat végrehajtása között eltelt idő nem befolyásolja károsan a rendszert. A lépés sorozatok engednek egy bizonyos fokú külső befolyást is, viszont ezeket szigorúan úgy kell implementálni, hogy itt se számítson a késleltetése a beavatkozásoknak. + +A lépés sorozatokat \textit{Program}nak neveztem el. Egy ilyen \textit{program} lépéseinek végrehajtása a futtatás. A magasabb rétegek ilyen előre összeállított programokat képesek a peremhálózati rendszer felé küldeni, illetve annak futási állapotáról információkat kapni. + +\subsubsection{Felhő réteg} + +Mivel a legmagasabb réteg -- a felhő -- és a középső réteg között a kapcsolat nem megbízható, előfordulhatnak magas, akár ingadozó késleltetések is, szélsőséges esetben a kapcsolat megszakadása, ezért ezt figyelembe véve ide olyan komponenseket lehet csak helyezni, amelyek erre nem érzékenyek. + +Mivel a peremhálózati rétegben már kialakítottunk egy absztrakciót, amely elfedi a késleltetési problémákat a felhő réteg elől, így a felhő rétegben futó szoftver ezt biztonságosan tudja használni a robotkar mozgatására. + +Az Ipar 4.0 megközelítésben különös szerepet játszik a \textit{Big Data}, azaz a nagy mennyiségű adat gyűjtése és feldolgozása és ennek felhasználása, + +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 + +\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. + +Egy program egyszerre csak egy robotkar működését írja le, így egy ilyen komponens egyszerre csak egy robotkarhoz kapcsolódik. A demó végrehajtásához két komponensnek kell kapcsolódnia. + +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} + +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. + +Szerettem volna egy olyan végrehajtási környezetet megalkotni, ahol könnyen lehet az egyes utasítások mögött cserélni a funkcionalitást. Ezzel egyrészt lehetőség nyílik arra, hogy a programokat szinte módosítás nélkül újrahasznosítsuk. + +Munkám során mások is dolgoztak a robotkarok alacsony szintű vezérlésén. Terveink szerint ezeket a törekvéseket egy projektben fogjuk majd egyesíteni. Ez is alátámasztotta a dinamikusan cserélhető funkcionalitás szükségességét. + +Ezek motiválták, hogy az egyes utasításokat önálló komponensbe szervezzem. Ezeket a komponenseket \textit{plugin}-nak neveztem el. A \textit{program} által végrehajtható utasításokat az egyes \textit{plugin}-ok implementálják. Egy \textit{plugin} többet is akár illetve egy utasítást több \textit{plugin} is implementálhat\footnote{Ilyen esetben csak egy \textit{plugin}-t használhatunk egyszerre}. Ennek köszönhetően egy utasítás mögött egy másik \textit{plugin} használatával könnyen lecserélhetjük a funkcionalitást. A program futtatása előtt definiálni kell, hogy konkrétan melyik \textit{plugin}-okat szeretnénk használni a futtatás során. + +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ó} + +A demó során kiemelt szerepe van a két robotkar lépéseinek összehangolására kritikus pontokban. + +Mivel itt már nem két szál összehangolásáról van szó hanem két egymástól független alkalmazásra, amelyek az architektúra, a peremhálózati keretrendszer és a futtatási környezetből adódóan jóformán csak hálózaton tudnak kommunikálni, ezért ez egy teljesen más megoldást kívánt. + +Alapos kutatás után sajnos nem találtam erre a problémára teljes, kész megoldást, ezért kidolgoztam egy saját megoldást. + +Mivel fontos, hogy a szinkronizáció pontos legyen minden komponensnél, ezért annak az ötletét, hogy hálózaton küldött üzenetek szolgáljanak a szinkronizáció alapjául teljesen elvetettem. + +Ezzel szemben lehetőség van a futtató környezetet adó fizikai számítógépek óráinak meglepően precíz szinkronizációjára. \Aref{append:timesync}.\ függelékben ezt részletesebben is tárgyalom. Ezt alapul véve kidolgoztam egy kellően precíz szinkronizációs protokollt. + +Szinkronizáció gyanánt a résztvevők (Az egyes \textit{Single Robot Controller} példányok) \enquote{megegyeznek} abban, hogy mikor lesz az az időpont, amikor tovább haladnak a végrehajtással. Ehhez szükség van arra, hogy megbizonyosodjanak róla, hogy minden szolgáltatás elért a végrehajtással arra a pontra, ahonnan csak együtt léphetnek tovább. + +A \enquote{megegyezéshez} egy osztott in-memory adatbázist használtam, a \textit{Redis}\footnote{\url{https://redis.io/}}-t, amely nem csak hálózaton elérhető és atomicitást garantáló műveleteket biztosít, de beépítetten tartalmaz egy üzenetsort, amely alkalmas a folytatási idő kihirdetésére. + +% Itt ezt jó lenne még taglalni + +A szinkronizációs folyamat időbeni lefutása \aref{fig:pyprocsync_flow} ábrán látható (konkrét \textit{Redis} utasításokkal bemutatva). + +\begin{figure}[h!] + \centering + \includegraphics[width=1\textwidth]{figures/pyprocsync_flow} + \caption{Az általam tervezett szinkronizációs protokoll működése szekvencia diagramon ábrázolva} + \label{fig:pyprocsync_flow} +\end{figure} + +Az protokoll arra hagyatkozik, hogy ismerjük, hogy hány komponenst kell szinkronizálni. Mindig, amikor egy program a szinkronizációs ponthoz érkezik, akkor atomikus módon megnövel egy számlálót, ha a számláló értéke egyezik, a várakozó komponensek számával, akkor az utolsó komponens a pillanatnyi rendszeridőhöz hozzáad egy fix értéket, és ezt kihirdeti a többi komponens felé\footnote{Ha feltételezzük, hogy a rendszeridők szinkronban vannak, akkor lényegében mindegy, hogy melyik komponens hirdeti ki.}. Erre a hozzáadásra azért van szükség, hogy ellensúlyozza azt az időt (ami a hálózati késleltetésből adódóan változó lehet), amíg az üzenet eljut minden komponenshez. Ezek után a komponensek a kihirdetett időben folytatják a végrehajtást. -% külön lehet írni a magas szintű tervezésről és egyes szoftverek architektúrájáról -% Itt le lehet írni a controller magas szintű terveit, plugin architektúrát +A szinkronizációs megoldást önállóan elérhető \gls{python} csomagként is publikáltam, így más projektekben is felhasználható\footnote{\url{https://github.com/marcsello/pyprocsync}}. Sajnos az implementáció csak \textit{Redis}-el működik. -% tervezés és a nehézségek nem tételesen de hasonlóan struktúrálva -% Illetve a komoly megoldásaim +\subsubsection{Megfigyelés és vezérlés} -% Kiemelve a szinkronizációs problémákat, illetve (korábban) leírva hogy pontosan milyen problémát is próbálok megoldani ezzel azaz mér van szükség rá +A szolgáltatásnak lehetőséget kell adni arra, hogy megfigyelhető és beavatkozható legyen a működése. Erre a célra egy \acrshort{http} \acrshort{api}-t terveztem. -% Ide valszeg be fog kerülni Máté Miklós munkájáról is egy kis írás +Azért ezt a megoldást választottam, mert a \acrshort{http} protokoll kellően elterjedt, ezért széleskörűen támogatott. Mivel a futtatókörnyezet \textit{Kubernetes} alapú, ezért ez a legkönnyebben kezelhető hálózati erőforrás. %TODO: alátámasztani/megindokolni + +Az \acrshort{api} két fontos és fix funkciót kell kiszolgáljon. Szükség esetén a program futását meg kell tudni szakítani (akár egy lépés végrehajtása közben is), emellett a program futásának állapotát is lekérhetővé teszi. + +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} + +% itt írok általánosságban azokról a cucmókról, ami a felhőbe kerül + + +\subsubsection{\textit{Program Service}} + +Az architektúra, melyet \aref{sec:edge_layer_plans}.\ szekcióban bemutattam lehetővé teszi, hogy a felhőben futó komponensek bármilyen programot adjanak a peremhálózati réteg számára, legyen az automatikusan vagy részben automatikusan generált. + +Mivel sem a demó sem a dolgozatom szempontjából nem lényeges, hogy milyen módon keletkeznek a \textit{program}ok magas szinten, ezért itt csak egy egyszerű, előre elkészített programokat tároló szolgáltatást terveztem. + +A szolgáltatásba fel lehet tölteni a felhasználó által megírt programot, illetve le lehet tölteni onnan egy egyszerű \acrshort{rest} \acrshort{api} használatával. + +\subsubsection{\textit{Job Orchestrator Service}} + +Erre a komponensre is szintén azért van szükség, mert a felhőbe telepített komponenseket nem szerettem volna túlzottan bonyolulttá tenni. + +Mivel a programok előre definiált formában léteznek, ezért kell egy komponens ami felel azért, hogy azoknak betöltését és végrehajtását elindítsa a peremhálózaton. + +Ennek a komponensnek a működése nagyban függ a konkrét keretrendszertől és futtató környezettől. Az alapvető feladata az, hogy szükség esetén egy absztrakcióval szolgáljon a konkrét programfuttatási eljárás fölé egyszerű \acrshort{rest} \acrshort{api} kiszolgálásával. + + +\subsubsection{\textit{Metrics Service}} + +A metrika gyűjtés tervezése és implementációja még hátra van. + +\section{Implementáció} + +Az összes általam választott szolgáltatást \gls{python} nyelven implementáltam le. Mivel népszerű programnyelv ezért mind a robotkarok vezérlésére, mind pedig a többi felhasználásra kész programozói könyvtárakkal rendelkezik, így ez egy kézenfekvő választás volt. % ha nagyon kevés oldal van, akkor itt tudok írni a fejlesztői környezetről is illetve a tesztelésről -% Szinkronizációs protokol lófasznál ne felejtsek el írni az NTP-ről és PTP-től - \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} - -\section{Implementáció} - % Hát itt kénytelen leszek kódot magyarázni szerintem % Redis @@ -169,7 +276,37 @@ A fenti monolit demó felhő és perem számítástechnikai rendszerbe való át % Tiny HTTP Szerver, endpointok felsorolása % Pluginok compilerekkel +% + % Esetleg pluginok felsorolással -% A programok felépítéséről is lehet írni \ No newline at end of file + + +\subsection{\textit{Single Robot Control} \textit{plugin}ek} + +% ITt lehet írni a compilerek , regisztráció és loginről + +\subsubsection{\textit{Sync Plugin}} + +\subsubsection{\textit{UR-RTDE Plugin}} + +\subsubsection{\textit{Wait Plugin}} + +\subsubsection{Egyebek} + +\begin{itemize} + \item \textbf{Log Plugin} + \item \textbf{Sleep} +\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 + +\section{Tesztelés} + diff --git a/src/figures/pyprocsync_flow.pdf b/src/figures/pyprocsync_flow.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a5db21c40f1887ade20e964879a29f887d8ad09c GIT binary patch literal 44723 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

{J>uF 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 literal 0 HcmV?d00001