|
|
|
|
@@ -46,7 +46,7 @@ Az demonstráción használt \textit{Universal Robots} robotkarok többféle kom
|
|
|
|
|
|
|
|
|
|
\item \textbf{Socket Communication}: Ez egy alacsony szintű \acrshort{tcp} alapú kommunikáció, amelyben a robot kliensként viselkedik és a szerver, amihez kapcsolódik, látja el utasításokkal. Természetesen ezen a protokollon is \textit{URScript} parancsokat adhatunk ki, ezekben segítő utasítások vannak a kapcsolat életciklusának kezelésére.
|
|
|
|
|
|
|
|
|
|
\item \textbf{\acrshort{xml}-\acrshort{rpc}}: Ez a protokol lehetőséget ad sokkal széles körűbb alkalmazásokra, mint az előbbiekben említett \textit{URScript}et használó protokollok. Hiszen a robotok egyes funkcióit a paraméterekkel együtt függvényhívás szerűen végezhetjük. Ezzel sokkal komplexebb programok készíthetőek.
|
|
|
|
|
\item \textbf{\acrshort{xml}-\acrshort{rpc}}: Ez a protokol lehetőséget ad sokkal széles körűbb alkalmazásokra, mint az előbbiekben említett \textit{URScriptet} használó protokollok. Hiszen a robotok egyes funkcióit a paraméterekkel együtt függvényhívás szerűen végezhetjük. Ezzel sokkal komplexebb programok készíthetőek.
|
|
|
|
|
|
|
|
|
|
\item \textbf{\acrfull{rtde}}: Az \acrshort{rtde}-t egy robusztus megoldásnak tervezték, amely kiválthatja a \textit{Real-time} interfészt. Lehetővé teszi az \textit{UR} kontroller számára az egyéni státusz-adat és regiszter állapotok átvitelét. Ez az interfész valósidejű szinkronizációt tesz lehetővé akár 125Hz-es rátával (8ms/üzenet).
|
|
|
|
|
\end{itemize}
|
|
|
|
|
@@ -69,7 +69,7 @@ A robotokat 125Hz-es rátával kell vezérelni (azaz 8ms-ként kell utasítást
|
|
|
|
|
|
|
|
|
|
A tanszéken található kettő robotkar természetesen nem áll mindig rendelkezésre. Más csapatok más-más projektekben is használják. A fejlesztés és a tesztelés megkönnyítésére több szimulátor is megvizsgálásra került a projekten korábban dolgozó csapat által. Végül a leghatékonyabban használhatónak a \textit{DockURSim}\footnote{\url{https://github.com/ahobsonsayers/DockURSim}} bizonyult.
|
|
|
|
|
|
|
|
|
|
Lényegében a \textit{DockURSim} a robotkarokat közvetlenül irányító, \textit{Control Box}on futó szoftver becsomagolva egy \textit{Docker} konténerbe. Konkrét robotkart nem irányít, de a kommunikációs interfészeket és azok funkcionalitását teljes mértékben implementálja. Lehetőségünk van a beépített \acrfull{rdp} szerveren keresztül grafikus felületet\footnote{Ez a grafikus felület a \textit{Teach Pendant}on grafikusan kezelhető felület.} kezelni és ott meg tudjuk figyelni a robotkar mozgását.
|
|
|
|
|
Lényegében a \textit{DockURSim} a robotkarokat közvetlenül irányító, \textit{Control Boxon} futó szoftver becsomagolva egy \textit{Docker} konténerbe. Konkrét robotkart nem irányít, de a kommunikációs interfészeket és azok funkcionalitását teljes mértékben implementálja. Lehetőségünk van a beépített \acrfull{rdp} szerveren keresztül grafikus felületet\footnote{Ez a grafikus felület a \textit{Teach Pendanton} grafikusan kezelhető felület.} kezelni és ott meg tudjuk figyelni a robotkar mozgását.
|
|
|
|
|
|
|
|
|
|
Egyetlen hátránya ennek a megoldásnak, hogy a robotkarokat önállóan egy izolált környezetben tudja csak szimulálni, így a környezet fizikai hatásai, a gripperek működése és a robotkarok egymással való találkozását nem képes modellezni.
|
|
|
|
|
|
|
|
|
|
@@ -102,7 +102,7 @@ gripper vezérlését \acrshort{rest} \acrshort{api}-n keresztül végzi.
|
|
|
|
|
|
|
|
|
|
A két robotkar vezérlése két külön szálon van megvalósítva. Mindkettő szálon egymás után következnek az utasítások, a kritikus szinkronizációs részek egyszerű szál-szinkronizációs primitívekkel vannak megoldva.
|
|
|
|
|
|
|
|
|
|
A programban több futtatási mód is implementálva van. Egyrészt gyors és lassú végrehajtási sebesség között lehet választani. Ez a robotkarok mozgási sebességét befolyásolja. Emellett úgynevezett \enquote{Jogging} módban is lehet az alkalmazást futtatni. Ebben a módban a program minden mozdulat végrehajtása előtt várakozik egy gomb lenyomására a további parancsok kiadása előtt. Így lehetőség adódik az esetleges hibás mozgások hibakeresésére, illetve a program teljesen automatikus lefuttatása előtt manuális tesztelésre.
|
|
|
|
|
A programban több futtatási mód is implementálva van. Egyrészt gyors és lassú végrehajtási sebesség között lehet választani. Ez a robotkarok mozgási sebességét befolyásolja. Emellett úgynevezett \enquote{Jogging} módban is lehet az alkalmazást futtatni. Ebben a módban a program minden mozdulat végrehajtása előtt várakozik egy gomb lenyomására a további parancsok kiadása előtt. Így lehetőség adódik az esetleges hibás mozgások felderítésére, illetve a program teljesen automatikus lefuttatása előtt manuális tesztelésre.
|
|
|
|
|
|
|
|
|
|
A program a konfigurációs beállításait egy \gls{ini} fájlban tárolja. Ezek a konfigurációs beállítások elsősorban a robotkarok és a hozzá tartozó gripperek hálózati címeit adja meg, illetve a konkrét sebesség módokhoz tartozó konfigurációs értékeket.
|
|
|
|
|
|
|
|
|
|
@@ -140,7 +140,7 @@ A \enquote{középszintű} vezérlés feladata egy olyan absztrakciót adni az e
|
|
|
|
|
|
|
|
|
|
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 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.
|
|
|
|
|
A lépés sorozatokat \textit{Programnak} 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}
|
|
|
|
|
|
|
|
|
|
@@ -155,7 +155,7 @@ Az adatok gyűjtése nem késleltetés érzékeny, ezért nem okoz problémát,
|
|
|
|
|
\subsection{Peremhálózati szolgáltatások} % Peremhálózati rendszer basically
|
|
|
|
|
\label{sec:single_robot_contoller_plans}
|
|
|
|
|
|
|
|
|
|
\Aref{sec:edge_layer_plans}.\ alfejezetben 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 a szolgáltatás a \textit{program}ok futtatását valósítja meg.
|
|
|
|
|
\Aref{sec:edge_layer_plans}.\ alfejezetben 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 a szolgáltatás a \textit{programok} 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 demonstráció végrehajtásához két komponensnek kell kapcsolódnia.
|
|
|
|
|
|
|
|
|
|
@@ -164,7 +164,7 @@ Emellett meg kell oldania olyan problémákat is, amelyek \aref{sec:ursim_demo_c
|
|
|
|
|
\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.
|
|
|
|
|
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{programba} 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 lehetőség nyílik arra, hogy a programokat szinte módosítás nélkül újrahasznosítsuk.
|
|
|
|
|
|
|
|
|
|
@@ -185,7 +185,7 @@ Alapos kutatás után sajnos nem találtam erre a problémára teljes, kész meg
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
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 Hálózati idő protokoll (\acrlong{ntp}; \acrshort{ntp}) vagy Precíz idő protokoll (\acrlong{ptp}; \acrshort{ptp}) használatával. Ezt alapul véve kidolgoztam egy megfelelő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.
|
|
|
|
|
|
|
|
|
|
@@ -215,7 +215,7 @@ Azért ezt a megoldást választottam, mert a \acrshort{http} protokoll kellően
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
A \textit{pluginek} 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{pluginnel}, 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}
|
|
|
|
|
@@ -227,7 +227,7 @@ A \textit{plugin}ek további funkcionalitást regisztrálhatnak, amiket az \acrs
|
|
|
|
|
|
|
|
|
|
Az architektúra, melyet \aref{sec:edge_layer_plans}.\ alfejezetben 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 demonstráció, 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.
|
|
|
|
|
Mivel sem a demonstráció, sem a dolgozatom szempontjából nem lényeges, hogy milyen módon keletkeznek a \textit{programok} 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.
|
|
|
|
|
|
|
|
|
|
@@ -289,15 +289,15 @@ A \textit{Program Service} esetén az eltárolt programokat egy dokumentum tárb
|
|
|
|
|
% Esetleg pluginok felsorolással
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\subsection{\textit{Single Robot Control} \textit{plugin}ek}
|
|
|
|
|
\subsection{\textit{Single Robot Control} \textit{pluginek}}
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
A \textit{Single Robot Control} komponens által, a \textit{programban} definiált utasítások implementációjára \textit{pluginek} 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}.\ alfejezetben 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.
|
|
|
|
|
Az értelmezett utasításokat listába szervezve készíti elő a futtatható \textit{programot} a szolgáltatás. Ezek a példányosított utasítások implementálják \aref{sec:ursim_execution_framework}.\ alfejezetben 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.
|
|
|
|
|
|
|
|
|
|
@@ -331,10 +331,10 @@ Ennek a pluginnek a használatával megvalósítható, a demonstráció során i
|
|
|
|
|
|
|
|
|
|
\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:
|
|
|
|
|
A fent vázolt \textit{pluginek} 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} 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{Log Plugin} Ezzel a \textit{pluginnel} 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}
|
|
|
|
|
|
|
|
|
|
@@ -345,7 +345,7 @@ A robotkarok vezérlésének lépései az általam tervezett formátumú \textit
|
|
|
|
|
|
|
|
|
|
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 is.
|
|
|
|
|
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{pluginek} listáját is.
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
@@ -379,7 +379,7 @@ program:
|
|
|
|
|
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.
|
|
|
|
|
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{programokkal}. Így a lehető leghamarabb vissza tudja utasítani a rendszer a hibás programokat.
|
|
|
|
|
|
|
|
|
|
Az eredeti szoftver által vezérelt mozgást futás időben fordítottam le az általam definiált \textit{program} struktúrára azáltal, hogy a program kódjában a \gls{python} által biztosított reflexiókat használva, az egyes lépéseket lecseréltem fájlba mentő funkciókra amely rögzíti az utasításokat és a paramétereiket.
|
|
|
|
|
|
|
|
|
|
|