From 9ebb18886fca9e12262580c356db04f7217aa548 Mon Sep 17 00:00:00 2001 From: yenon Date: Sun, 2 Jul 2023 18:06:37 +0200 Subject: [PATCH] More Changes. --- .kile/mechforsch.kilepr.gui | 42 ++++----- img/MA-Umsetzung-Übersicht.pdf | Bin 58588 -> 62010 bytes img/MA-tree-demo.pdf | Bin 51501 -> 52450 bytes tex/1_Einleitung.tex | 44 ++++----- tex/2_Konzept.tex | 75 +++++++++------ tex/3_Auswahl.tex | 138 ++++++++++++++++------------ tex/4_Umsetzung.tex | 8 +- tex/5_Evaluation_und_Diskussion.tex | 46 +++++----- tex/6_Ausblick.tex | 26 ++++-- 9 files changed, 214 insertions(+), 165 deletions(-) diff --git a/.kile/mechforsch.kilepr.gui b/.kile/mechforsch.kilepr.gui index 0d50aca..7725a01 100644 --- a/.kile/mechforsch.kilepr.gui +++ b/.kile/mechforsch.kilepr.gui @@ -2,7 +2,7 @@ kile_livePreviewEnabled=true kile_livePreviewStatusUserSpecified=true kile_livePreviewTool=LivePreview-PDFLaTeX -lastDocument=tex/5_Evaluation_und_Diskussion.tex +lastDocument=tex/4_Umsetzung.tex [document-settings,item:Einleitung.tex] Bookmarks= @@ -139,64 +139,64 @@ TextFolding={"checksum":"","ranges":[]} ViMarks= [view-settings,view=0,item:main.bib] -CursorColumn=0 -CursorLine=0 +CursorColumn=33 +CursorLine=321 Dynamic Word Wrap=false JumpList= -TextFolding={"checksum":"b10ad087170976892139d22580412bc441722b7c","ranges":[]} +TextFolding={"checksum":"64bbdc6d25aa8e655ff2b9b9aaa47140545f4269","ranges":[]} ViMarks= [view-settings,view=0,item:main.tex] CursorColumn=0 -CursorLine=97 +CursorLine=105 Dynamic Word Wrap=false JumpList= -TextFolding={"checksum":"a9f3802ff2422622f2ccbc846c82d7d7d46db982","ranges":[]} +TextFolding={"checksum":"80ccd936ce5ae7dc5995816ffe293139ed94b427","ranges":[]} ViMarks= [view-settings,view=0,item:tex/1_Einleitung.tex] CursorColumn=0 -CursorLine=19 +CursorLine=7 Dynamic Word Wrap=false JumpList= -TextFolding={"checksum":"578f69b0ffbc27d095768d7a3111120650ffd5d0","ranges":[]} +TextFolding={"checksum":"752ca31e1c24d1d85d2d8fb12ebdefa2996283f2","ranges":[]} ViMarks= [view-settings,view=0,item:tex/2_Konzept.tex] -CursorColumn=67 -CursorLine=116 +CursorColumn=12 +CursorLine=19 Dynamic Word Wrap=false JumpList= -TextFolding={"checksum":"60485ed57cc9cd7aa26821b7c57cadfc76a24734","ranges":[]} +TextFolding={"checksum":"6ef833b681fc8f01a09442bcb6e152ae53c9a838","ranges":[]} ViMarks= [view-settings,view=0,item:tex/3_Auswahl.tex] -CursorColumn=28 -CursorLine=132 +CursorColumn=15 +CursorLine=45 Dynamic Word Wrap=false JumpList= -TextFolding={"checksum":"6b7f9d13d5c6f43641e50a66c4529ff479e866b6","ranges":[]} +TextFolding={"checksum":"7cc0088b0b9cf29bb8431a83dabf12502827f1cd","ranges":[]} ViMarks= [view-settings,view=0,item:tex/4_Umsetzung.tex] -CursorColumn=91 -CursorLine=853 +CursorColumn=29 +CursorLine=953 Dynamic Word Wrap=false JumpList= -TextFolding={"checksum":"5c4f9f82c6c2646c073a4757f197beed4b273c78","ranges":[]} +TextFolding={"checksum":"109c6b373243657c2344cec26c14be91fef98dc1","ranges":[]} ViMarks= [view-settings,view=0,item:tex/5_Evaluation_und_Diskussion.tex] -CursorColumn=0 -CursorLine=51 +CursorColumn=45 +CursorLine=91 Dynamic Word Wrap=false JumpList= TextFolding={"checksum":"ab50ad5132cf05a1290a02b2b48c793d41937fb9","ranges":[]} ViMarks= [view-settings,view=0,item:tex/6_Ausblick.tex] -CursorColumn=0 -CursorLine=39 +CursorColumn=82 +CursorLine=21 Dynamic Word Wrap=false JumpList= TextFolding={"checksum":"85f5725ed69452476240fe61ecbb12cc35b38976","ranges":[]} diff --git a/img/MA-Umsetzung-Übersicht.pdf b/img/MA-Umsetzung-Übersicht.pdf index bc851eeeef42426ded85524817433c1763a8b2da..5b68e05c897804c4eceb0daf30678387ad6ce930 100644 GIT binary patch delta 31847 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 diff --git a/img/MA-tree-demo.pdf b/img/MA-tree-demo.pdf index 7d24af0f0be62f5c10790442b60b8176fbcf3bf1..66b138c3bed8ed23948e5ac914d192b0033ec745 100644 GIT binary patch delta 30087 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 delta 29070 zcmYg#V{oNS7j2vqb7I@ciESGb+qQWowry*IiEU17ClhO8JGt}TTes?~?p{^ByVves zd+#4lJ-wF+S(5~rpij@q$_C_QVFj|$v#?PA>$LF93XW#t#%|^$G~&FhEUauS|9?w; z#0)(I2S>6t10@L65_<@_mx8bDF?o5(s&a^B7kQfkE^uNMC$v06;SbvlLm zix=V}z`bJwa|Czf=5lcGi+^Wu)j~jO`Ua;ahccBjuJ_|~7v;<49a|uA2G!)W)LCkU z?=KnA^T$=Mz`>p)$lL27Wkju)i2LR`Z5;jgr~%~!iTACDtAxN!5pe_=iU_l@R-TZ*jT#F`i_w%nP;Nt8Q+ zV_;G`m(X%xeR|WX=VXt(sQ$?ryLU6EWA9O|>KN|h`f>N6mvGzv>DANm^FiwM;Oz?Z zd^0t8mQM|S>-A=7en7wHKwudciE0qvN=(#)KnlX3wwdq!c-y}K3BKQVa-j%ycT1Bj zp!4T;FkRrJmZQ30OX4I(P!6<1pdVJ!m*k-`HseE}0H+pox&>L{+>W@rlFqcuW!v(AS)aTTa%c2ZudFlq zcQZ#<$+AQK-+DouqbI@EB~GcMio5cKt<#G<2+Oif{Awccv&%eG3pQhwEHxP9*)0w` zGL@EAgmRSQ0Dp?I)TH2fN$X_m;O`Yy8=y6lVfYOhm-*$oi(qR;b|

*c~i43ErpA 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 N4*-RhR!m;}{{Z6#9>xFw diff --git a/tex/1_Einleitung.tex b/tex/1_Einleitung.tex index 752ca31..98f5f5a 100644 --- a/tex/1_Einleitung.tex +++ b/tex/1_Einleitung.tex @@ -6,14 +6,14 @@ Das Modell wird um die Maschine selbst erweitert, die Einfluss auf das System ni Die Veränderungen durch die Maschine werden analysiert, und erlauben Rückschlüsse auf die Funktion des Systems. Ein solches Modell kann für die Erkennung von Fehlverhalten und Problemen schon weit vor der eigentlichen Inbetriebnahme der Maschine genutzt werden. -Im wachsenden Feld der Mensch-Roboter-Kollaboration existieren bereits einige Lösungen, um auch die namensgebende Interaktion von Mensch und Roboter simulieren zu können. -Eine häufige Einschränkung der Simulatoren ist dabei, dass der Bewegungsablauf in der Simulation bereits vor deren Ausführung fest definiert werden muss. -Dies erlaubt lediglich die Reproduktion des genauen Bewegungsablaufes, aber -nicht verschiedene Variationen im gesamten Prozess, die durch die Ereignisse in -der Simulation ausgelöst werden. -Um eine solche Funktionalität bereitstellen zu können, muss der Bewegungsablauf von sowohl Roboter und Mensch zur Laufzeit der Simulation gesteuert werden. +Da in der Realität oftmals Menschen und Maschinen im gleichen Umfeld mit- oder auch zusammenarbeiten, ist es sinnvoll, die Menschen in die Simulation einzubeziehen. -Diese Steuerung soll durch eine eingängliche Beschreibungssprache ermöglicht werden, die einfach erweitert und auf neue Szenarien angepasst werden kann. +Im wachsenden Feld der Mensch-Roboter-Kollaboration existieren bereits einige Lösungen, um auch die namensgebende Interaktion von Mensch und Roboter zu simulieren. +Eine häufige Einschränkung der Simulatoren ist dabei, dass der Bewegungsablauf in der Simulation bereits vor deren Ausführung fest definiert werden muss. +Dies erlaubt lediglich die Reproduktion des geplanten Bewegungsablaufes, aber nicht dessen Variation im Prozess, ausgelöst durch Ereignisse in der Simulation. +Um eine solche Funktionalität bereitzustellen, müssen die Bewegungsabläufe sowohl von Roboter als auch Mensch zur Laufzeit der Simulation gesteuert werden können. + +Diese Steuerung soll durch eine eingängliche Beschreibungssprache erfolgen, die einfach erweitert und auf neue Szenarien angepasst werden kann. Um diese Funktionalität zu demonstrieren, sind 3 unterschiedliche Testszenarien in der Simulationsumgebung abzubilden. Diese sollen durch verschiedene Aufgaben unterschiedliche Interaktionsgrade zwischen Mensch und Roboter simulieren. @@ -23,47 +23,47 @@ Aktuelle wissenschaftliche Arbeiten befassen sich mit vielen unterschiedlichen T Die Planung von unterschiedlichen Reaktionen von Roboter auf den Menschen in verschiedenen Interaktionsszenarien stellt eine Grundlage für spätere Projekte dar.\cite{DOMBROWSKI2018134} Hierbei wird die erwünschte Interaktion betrachtet und aus den gewonnenen Daten werden Einschränkungen generiert. -Diese Einschränkungen können in der Interaktion verwendet werden, um Verletzungen durch den Roboter auszuschließen. +Diese Einschränkungen können in der Interaktion verwendet werden, zum Beispiel Verletzungen des Menschen durch den Roboter auszuschließen. Ein anderer Weg der Kollisionsvermeidung ist die Planung der maximal zurücklegbaren Distanz eines Menschen aus seiner aktuellen Position.\cite{ffdrobotsim} Dafür werden die maximalen Beschleunigungen einzelner Körperteile ermittelt, um diese während der Interaktion überwachen zu können. Sollte ein Mensch den Roboter erreichen können, muss dieser in der dafür benötigten Zeit stoppen können. Dies sorgt für eine Geschwindigkeitsanpassung im Nahfeld, da hier schnellere Bewegungen möglich sind. -Es existieren auch zahlreiche Wege, die Bewegungs- und Interaktionsplanung eines Roboters mit Beschreibungssprachen abzudecken.\cite{btintro} +Es existieren auch zahlreiche Ansätze, die Bewegungs- und Interaktionsplanung eines Roboters mit Beschreibungssprachen abzudecken.\cite{btintro} Dabei kommt es auf die Umsetzung in der Beschreibungssprache, aber auch auf Anforderungen an das System an, um zum Beispiel das Abbrechen von Aktionen zu ermöglichen. In Computerspielen werden Beschreibungssprachen schon seit langer Zeit eingesetzt, um verschiedene Systeme, wie zum Beispiel die Steuerung von Nichtspielercharakteren, zu beschreiben.\cite{halo2} -Eine vollständige Umsetzung einer erweiterbaren Simulation mit Mensch und Roboter, gesteuert durch eine Beschreibungssprache konnte nicht gefunden werden. +Eine vollständige Umsetzung einer erweiterbaren Simulation mit Mensch und Roboter, gesteuert durch eine Beschreibungssprache konnte bei der Recherche zu dieser Arbeit jedoch nicht gefunden werden. \section{Auswahl der Szenarien} -Die drei zu modellierenden Szenarien sollten so gewählt werden, dass in vorherigen Szenarien genutzte Bestandteile in späteren, komplexeren Szenarien weiter genutzt werden können. +Die drei zu modellierenden Szenarien sollten so gewählt werden, dass spätere komplexere Szenarien auf einfacheren Vorgängern aufsetzten und deren Funktionen weiter nutzen und ergänzen. Hierfür kommen bestimmte Aufgaben, wie zum Beispiel die Interaktion mit Objekten besonders in Frage. -Diese besitzen viele ähnliche Bestandteile, die jedoch in mehrere Umständen nutzbar sind. +Diese besitzen viele ähnliche Bestandteile, die in mehrere Umständen nutzbar sind. Das erlaubt den Einsatz von wenigen Animationen in vielen Szenarien. -Dazu zählen zum Beispiel das Hineingreifen in einen Prozess, das Aufheben von Material oder das Begutachten eines Objekts, die alle nur eine ähnliche Bewegungsabfolge des beteiligten Menschen sind. +Dazu zählen zum Beispiel das Hineingreifen in einen Prozess, das Aufheben von Material oder das Begutachten eines Objekts, die jeweils nur eine ähnliche Bewegungsabfolge des beteiligten Menschen sind. Das erste Szenario soll sich mit der Simulation einer bereits vollautomatisierten Fertigungsaufgabe befassen, in der ein Roboter im Arbeitsbereich eines Menschen Teile fertigt. -Die zu erwartende Interaktion beschränkt sich hierbei auf die Anpassung der Fahrgeschwindigkeit bei Annäherung des Menschen, um Kollisionen zu vermeiden. +Die zu erwartende Interaktion beschränkt sich hierbei auf die Anpassung der Fahrgeschwindigkeit des Roboters bei Annäherung des Menschen, um Kollisionen zu vermeiden. Der Mensch soll in diesem Szenario an einer anderen Aufgabe arbeiten. -Während dieser Arbeit betritt der Mensch vereinzelt den Arbeitsbereich des Roboters, was eine entsprechende Reaktion hervorrufen soll. +Während dieser Arbeit betritt der Mensch vereinzelt den Arbeitsbereich des Roboters, was die entsprechende Reaktion des Roboters hervorrufen soll. -Dieses Szenario ist ein Beispiel für eine Koexistenz zwischen Roboter und Mensch, wo beide an unterschiedlichen Aufgaben, jedoch im selben Raum, arbeiten. +Dieses Szenario ist ein Beispiel für eine Koexistenz zwischen Roboter und Mensch, wo beide im selben Raum, jedoch an unterschiedlichen Aufgaben arbeiten. Außerdem werden grundlegende Aspekte der Simulation getestet, wie zum Beispiel das Bewegen von Mensch und Roboter und die sicherheitsrelevante Aktion der Geschwindigkeitsanpassung. Im zweiten Szenario prüft und sortiert der Roboter Teile und legt die fehlerfreien Exemplare auf einem Fließband zur Weiterverarbeitung ab. -Die Mängelexemplare werden hingegen in einer besonderen Zone abgelegt, von wo sie vom Menschen abtransportiert werden. -Auch hier soll der Mensch solange eigenständig arbeiten, bis der Roboter ein aussortiertes Teil ablegt, dass weiter transportiert werden muss. +Die Mängelexemplare werden hingegen in einer dafür vorgesehenen Zone abgelegt, von wo sie vom Menschen abtransportiert werden. +Auch hier soll der Mensch solange eigenständig arbeiten, bis der Roboter ein aussortiertes Teil ablegt, das transportiert werden muss. Die dritte simulierte Aufgabe stellt ein Kollaborationsszenario dar, in dem Mensch und Roboter an der selben Aufgabe arbeiten. -Hierbei soll eine Palette entladen werden, wobei der Roboter nicht jedes Objekt ausreichend manipulieren kann. -Dies resultiert in Problemen beim Aufheben, Transport und Ablegen der Objekte. +Hierbei soll der Roboter eine Palette entladen, wobei er nicht jedes Objekt ausreichend manipulieren kann. +Dies wird durch zufällige Fehler beim Aufheben, Transport und Ablegen der Objekte abgebildet. In diesen Fällen muss ein Mensch aushelfen, wodurch er mit dem Roboter in Interaktion tritt. -Dieser soll, wenn seine Hilfe nicht benötigt wird, andere Roboter kontrollieren, was durch das Laufen im Raum abgebildet werden soll. +Der Mensch soll, wenn seine Hilfe nicht benötigt wird, andere Roboter kontrollieren, was durch das Laufen im Raum abgebildet werden soll. \section{Contributions} Durch diese Arbeit soll in zukünftigen Projekten die Möglichkeit geschaffen werden, konzeptionelle Probleme bei der Erstellung neuer Aufgabenbereiche eines Roboters frühzeitig durch Simulation erkennbar zu machen. -Dazu ist eine schnelle Konfiguration von sowohl Roboter als auch Mensch auf unterschiedliche Szenarien nötig. +Dazu ist eine schnelle Adaption von sowohl Roboter als auch Mensch auf unterschiedliche Szenarien nötig. Die Szenarien sollen dabei durch eine Beschreibungssprache definiert werden. Durch deren einfache Struktur soll komplexes Verhalten einfach und überschaubar definierbar sein, dass dann in der Simulation getestet werden kann. diff --git a/tex/2_Konzept.tex b/tex/2_Konzept.tex index 6ef833b..d73a8c0 100644 --- a/tex/2_Konzept.tex +++ b/tex/2_Konzept.tex @@ -27,7 +27,7 @@ Die Bezeichnung als Cobot\cite{cobot} ist dabei ein Portemanteau aus Collaborati Der Roboter besitzt einen modifizierbaren Endeffektor, um unterschiedlichste Aufgaben erfüllen zu können. Um den Kuka iisy in der Simulation verwenden zu können, muss ein Modell des Roboterarms erstellt werden. -Dieses Modell sollte die physikalischen Eigenschaften des Roboters möglichst gut abbilden. +Dieses Modell sollte die physikalischen Eigenschaften des Roboters möglichst genau abbilden. Anhand dieses Modells kann der Roboter dann in der Simulation dargestellt werden und mit anderen Objekten interagieren. \section{Simulation des Menschen} @@ -37,7 +37,7 @@ Für komplexere Verhaltensweisen können Animationen und andere Aktionen, wie zu Um diese Animationen erstellen zu können, wird zuerst ein animierbares Modell des Menschen benötigt. Das zu erstellende Modell soll dabei um weitere Animationen erweiterbar sein. -Unterschiedliche Animationen gehen dabei meist von verschidenen Ursprungszuständen aus. +Unterschiedliche Animationen gehen dabei meist von verschiedenen Ursprungszuständen aus. Um zwischen diesen Ursprungszuständen wechseln zu können, werden weitere Animationen benötigt. Die so erstellten Animationen müssen von außerhalb der Simulationsumgebung ausführbar gemacht werden. @@ -57,28 +57,28 @@ Dies erschwert die schnelle Erfassung von Abfolgen und Zustandsübergängen bei Behavior Trees lösen dieses Problem, in dem sie sogenannte Nodes definieren, die in einer übersichtlichen Baumstruktur angeordnet werden. Die einzelnen Nodes verändern dabei das System und lösen den Wechsel zu neuen Nodes aus. -Ursprünglich wurde das Konzept von Rodney Brooks entwickelt, der diese für mobile Roboter einsetzen wollte. \cite{1087032} -Das System setzte sich jedoch erst später in der Spieleindustrie, für die Beschreibung von menschlichem Verhalten durch. \cite{isla2005handling} +Ursprünglich wurde das Konzept der Behavior Trees von Rodney Brooks entwickelt, der diese für mobile Roboter einsetzen wollte. \cite{1087032} +Das System setzte sich später jedoch zuerst in der Spieleindustrie, für die Beschreibung von menschlichem Verhalten durch. \cite{isla2005handling} Der Ablauf eines Behavior Trees startet vom sogenannten Root, der Wurzel des Baums. Von dort an werden Nodes, die je nach Node unterschiedliches Verhalten abbilden, miteinander verbunden. -Die Nodes werden untereinander angeordnet, dass die Relation der Nodes zueinander beschreibt. +Die Nodes werden untereinander angeordnet, was die Relation der Nodes zueinander beschreibt. Jede Node ist entweder direkt unter der Root-Node oder einer anderen Node angeordnet. Außerdem kann jede Node eine beliebige Anzahl an untergeordneten Nodes besitzen. -Es gibt mehrere grundlegende Arten von Tree-Nodes, die in vier Kategorien unterschieden werden können. +Es gibt mehrere grundlegende Arten von Tree-Nodes, die in vier Kategorien unterschieden werden. \begin{description} \item[Aktions-Nodes] beschreiben einzelne ausführbare Aktionen, die das System beeinflussen können. Jede Aktion liefert dabei einen Rückgabewert über ihren Erfolg, der durch die darüber liegende Node ausgewertet werden kann. \item[Dekorations-Nodes] können den Rückgabewert einer anderen Node modifizieren. - Meist existiert die Negation des Rückgabewerts, aber auch das Forcieren eines bestimmten Rückgabewertes, für die unterliegende Node. + Zumeist wird die Negation des Rückgabewerts verwendet, aber auch das Forcieren eines bestimmten Rückgabewertes ist möglich. \item[Sequenz-Nodes] beschreiben eine nacheinander ausgeführte Abfolge von darunter liegenden Nodes. Sollte eine Node einen Fehler zurückgeben, wird die Ausführung der Sequenz abgebrochen, was wiederum zur Rückgabe eines Fehlers durch die Sequenz selbst führt. Beim erfolgreichen Durchlauf gibt die Sequenz einen Erfolg zurück. \item[Fallback-Nodes] - verhalten sich ähnlich zu Sequenz-Nodes, jedoch werden darunter liegenden Nodes nacheinander ausgeführt, bis eine Node Erfolg zurück gibt. + verhalten sich ähnlich wie Sequenz-Nodes, jedoch werden darunter liegenden Nodes nacheinander ausgeführt, bis eine Node Erfolg zurück gibt. In diesem Fall wird die Ausführung der Fallback-Node mit einem Erfolg abgebrochen. Ein Fehler wird hier zurückgegeben, wenn alle Nodes ohne eine Erfolgsmeldung durchlaufen wurden. \end{description} @@ -91,39 +91,62 @@ Es gibt mehrere grundlegende Arten von Tree-Nodes, die in vier Kategorien unters \end{figure} Das in Abbildung \ref{concept_tree_demo} visualisierte Beispiel zeigt die Abfolge, um eine Tür zu öffnen und zu durchschreiten. -Die Ausführung des Baumes beginnt an der Root-Node. +Die Ausführung des Baumes beginnt an der Root-Node, wobei die Zahlen über den Nodes die Reihenfolge der Rückgabewerte angeben. + Von dort aus wird als erstes die Sequenz-Node ausgeführt, die drei untergeordnete Nodes besitzt. - Diese drei Nodes werden in Leserichtung, in diesem Falle von links nach rechts, ausgeführt. -Daraus resultierend wird als erstes die linke Node ausgeführt, diese ist jedoch eine Fallback-Node mit weiteren untergeordneten Nodes. -Da der Rückgabewert der Fallback-Node von den in ihr befindlichen Nodes bestimmt wird, werden diese nacheinander ausgeführt. -Hier gelten die oben genannten Regeln für Fallback-Nodes. -In diesem Fall wird geprüft, ob die Tür bereits offen ist. -Da dies nicht der Fall ist, wird die nächste Node ausgeführt, welche die Tür öffnen soll. -Dieser Versuch gelingt, weshalb die Ausführung der Fallback-Node mit einem Erfolg beendet wird. -Dadurch wird die nächste Node in der Sequenz ausgeführt, die prüft, ob die Tür durchlaufen werden kann. -Da dies nicht möglich ist, da die Tür zwar offen, aber durch dahinter liegende Gegenstände blockiert ist, wird ein Misserfolg gemeldet, der die Ausführung der Sequenz abbricht. -Diese würde von neuem beginnen, da die Root-Node ihre untergeornete Node ohne Berücksichtigung des Rückgabewertes neu startet. +Daraus resultierend wird als erstes die linke Fallback-Node, die ihrerseits untergeordnete Nodes besitzt, ausgeführt. +Da der Rückgabewert der Fallback-Node von den unter ihr befindlichen Nodes bestimmt wird, werden diese nacheinander ausgeführt. -Durch die Definition neuer Nodes und einer anderen Baumstruktur lassen sich so einfach neue Verhalten implementieren. +Von diesem Punkt an beginnen die Rückgaben, die das weitere Verhalten beeinflussen. +Folgender Kontrollfluss findet in diesem Beispiel statt: + +\begin{enumerate} + \item{ + In dieser Node wird geprüft, ob die Tür bereits offen ist. + Da die Tür nicht offen ist, wird ein Misserfolg zurückgemeldet. + } + \item{ + Dieses Ergebnis löst die Ausführung der nächsten untergeordneten Node der Fallback-Node aus. + Die so ausgewählte Node soll die Tür öffnen. + Der Versuch gelingt und der Erfolg wird an die Fallback-Node übergeben. + } + \item{ + Da die untergeornete Node eine erfolgreiche Ausführung meldet, wird die Ausführung der Fallback-Node mit einem erfolgreichen Rückgabewert beendet. + Daher wird die Node "Tür eintreten" nicht mehr ausgeführt. + } + \item{ + Dadurch wird die nächste Node in der Sequenz ausgeführt, die prüft, ob die Tür durchlaufen werden kann. + Da dies nicht möglich ist, da die Tür zwar offen, aber durch dahinter liegende Gegenstände blockiert ist, wird ein Misserfolg gemeldet. + } + \item{ + Der gemeldete Misserfolg der untergeordneten Node bricht die Ausführung der Sequenz mit einem negativen Rückgabewert ab. + } +\end{enumerate} + +Dieser Ablauf würde nun von neuem beginnen, da die Root-Node ihre untergeornete Node ohne Berücksichtigung des Rückgabewertes neu startet. + +Durch die Definition neuer Nodes und einer anderen Baumstruktur lassen sich neue Verhalten implementieren. Dies erlaubt die schnelle Anpassung des Verhaltens der gesteuerten Systeme. In dieser Arbeit sollen deshalb BehaviorTrees für die Steuerung von Mensch und Roboter verwendet werden. Die hierfür erstellten Nodes sollen universell gestaltet werden, um alle Szenarien, die in dieser Arbeit betrachtet werden, abzudecken. -\section{Virtualisierungsumgebung als Platform} -Um Fehler durch die unvollständige Einrichtung der Umgebung zu vermeiden, ist der Einsatz fest definierter Prozesse unerlässlich. +\section{Virtualisierungsumgebung als Plattform} +Um Fehler durch die unvollständige Einrichtung der Umgebung zu vermeiden, ist der Einsatz fest definierter Prozesse in einer stabilen Umgebung unerlässlich. Dies kann durch den Einsatz einer Virtualisierungsumgebung geschehen, in der das zu entwerfende System ausgeführt wird. Dadurch können benötigte Programme, Pfade und Umgebungsvariablen in der Virtualisierungsumgebung hinterlegt werden, die diese bei der Ausführung auf einem anderen Grundsystem korrekt abbildet. -Eine solche Struktur erhöht die Zuverlässigkeit der Umgebung, da alle Änderungen an der Umgebung auf alle ausführenden Systeme gespiegelt werden. +Eine solche Struktur erhöht die Zuverlässigkeit der Umgebung, da die Änderungen an der Umgebung auf alle ausführenden Systeme gespiegelt werden. Ein weiterer Vorteil ist die beschleunigte Entwicklung, da Änderungen nicht mehr an einzelne Zielsysteme angepasst werden müssen. Hinzu kommt die einfachere Inbetriebnahme eines bereits entwickelten Systems, da keine Anpassungen am Hostsystem vorgenommen werden müssen. Natürlich existieren auch Nachteile der Virtualisierung, die mit den Vorteilen abgewogen werden müssen. -Alle Virtualisierungssysteme benötigen zusätzliche Rechenleistung, die der virtualisierten Anwendung nicht mehr zur Verfügung steht. -Außerdem muss bei grafischen Systemen bedacht werden, wie die darzustellenden Daten vom Hostsystem angezeigt werden können. +Alle Virtualisierungssysteme benötigen zusätzliche Rechenleistung, die dann der virtualisierten Anwendung nicht mehr zur Verfügung steht. +Außerdem muss bei grafischen Systemen die Darstellung der relevanten grafischen Daten auf dem Hostsystem berücksichtigt werden. -Die Auswahl einer für das Projekt geeigneten Virtualisierungsumgebung stellt einen wichtigen Schritt in der Entwicklung des Gesamtsystems dar. +Die Auswahl einer für das Projekt geeigneten Virtualisierungsumgebung beeinflusst das Ergebnis dieser Arbeit zwar nicht direkt, hat aber großen Einfluss auf die Pflege des Gesamtsystems. +Dies erlaubt zum Beispiel unabhängige, dedizierte Versionen der Softwarekomponenten und die Möglichkeit isolierter Upgrades dieser Komponenten. +Eine solche Plattform sorgt somit für die Reproduzierbarkeit der Ergebnisse auf verschiedenen Systemen. diff --git a/tex/3_Auswahl.tex b/tex/3_Auswahl.tex index 7cc0088..d8d3f8f 100644 --- a/tex/3_Auswahl.tex +++ b/tex/3_Auswahl.tex @@ -1,6 +1,5 @@ \chapter{Komponenten-/Softwareauswahl} -Die Auswahl der verwendeten Softwarekomponenten ist ein wichtiger Schritt in der Entwicklung. -Die Festlegung auf eine Komponente beeinflusst den späteren Entwicklungsprozess nachhaltig. +Die Auswahl der verwendeten Softwarekomponenten beeinflusst den späteren Entwicklungsprozess nachhaltig. Alle Komponenten sollen später in der entwickelten Softwareumgebung ihre jeweiligen Teilbereiche abdecken. Alle diese Teilbereiche können dann zu einer Simulation vebunden werden, die das gesamte Problemfeld abdeckt. @@ -24,11 +23,10 @@ Wichtige Aspekte sind dabei die Geschwindigkeit der Anbindung und die Definition Nutzbare, bereits als Interprozesskommunikation integrierte Systeme sind zum Beispiel Pipes, die Daten zwischen Prozessen über Buffer austauschen. Auch die Nutzung von Message Queues oder Shared Memory ist für diesen Einsatzzweck möglich. Diese Systeme sind performant, jedoch schwerer zu verwalten. -Ein Problem dieser Methoden ist die direkte Kommunikation mehrerer Komponenen. -Diese Art der Kommunikation sieht keine Modifikation von Nachrichten zur Anpassung an andere Szenarien vor. +Ein Problem dieser Methoden ist die direkte Kommunikation mehrerer Komponenten, da diese Art der Kommunikation keine Modifikation von Nachrichten zur Anpassung an andere Szenarien vorsieht. Eine Alternative stellen Sockets dar, die Daten zwischen mehreren Programmen austauschen können. -Dabei dient ein Programm als Server, dass Anfragen von anderen Programmen, auch Clients genannt, entgegen nimmt. +Dabei dient ein Programm als Server, der Anfragen von anderen Programmen, auch Clients genannt, entgegen nimmt. Die Kommunikation zwischen Client und Server ist bidirektional möglich, was kompliziertere Protokolle ermöglicht. Alle diese Lösungen besitzen einen gemeinsamen Nachteil in deren Nachrichtendefinition. @@ -36,17 +34,17 @@ Dieser Nachteil besteht in der potentiellen Variabilität dieser Kommunikationsm Bei einem ausreichend großen Projekt treten so unweigerlich Unterschiede in der Handhabung von Nachrichten auf, die es zu berücksichtigen gilt. Durch solche Unterschiede kann es zu Inkompatibilitäten zwischen Programmen kommen, was sich auf die universelle Nutzbarkeit der Programme negativ auswirkt. -In diesem Bereich ist ROS\cite{doi:10.1126/scirobotics.abm6074} als Dienstumgebung für Roboter bekannt, da es sich um ein etabliertes und quelloffenes System handelt. +Im Bereich der Robotik ist ROS\cite{doi:10.1126/scirobotics.abm6074} als Dienstumgebung für Roboter bekannt, da es sich um ein etabliertes und quelloffenes System handelt. Der oben genannte Nachteil einzelner Systeme wird in ROS durch mehrere standardisierte und erweiterbare Nachrichtendefinition gelöst, die von den Programmen in der Umgebung genutzt werden. Um diese Nachrichten senden und empfangen zu können, liefert ROS eine eigene Implementation des Protokolls für mehrere Programmiersprachen mit. -Für zum Beispiel Python\cite{python}, C und C++\cite{cpp} existieren entsprechende Implementationen in den Paketen \code{rospy}, \code{rclc} und \code{rclcpp}. +Für zum Beispiel Python\cite{python}, C und C++\cite{cpp} existieren entsprechende Implementationen in Form der Pakete \code{rospy}, \code{rclc} und \code{rclcpp}. Die neuste Version ROS2 bietet dabei mehrere Verbesserungen im Vergleich zu früheren Version ROS1 \cite{changesRosII}. Ein neues Nachrichtenformat mit Quality of Service kann beispielsweise Nachrichten zwischenspeichern und über sowohl TCP, als auch UDP kommunizieren. Außerdem werden neben CMake\cite{cmake} auch andere Buildsysteme unterstützt, was die Verwendung von Python erlaubt. Generell existieren im Feld der Roboter-Dienstumgebungen keine freien Alternativen mit ähnlichem Funktionsumfang und gleicher Reichweite. -Vor allem die unzähligen ROS-Bibliotheken, die von Nutzern des Systems über die Jahre erstellt wurden, machen das System so populär.\cite{rospackages} +Vor allem die Vielzahl von ROS-Bibliotheken, die von Nutzern des Systems über die Jahre erstellt wurden, machen das System so populär.\cite{rospackages} ROS kann für simulierte Umgebungen, aber auch für echte Roboter eingesetzt werden. Diese beiden Anwendungsfälle werden durch unterschiedliche Controller realisiert. @@ -59,7 +57,7 @@ Bei dem Einsatz echter Hardware werden die Zielpositionen durch den Controller a %-LCM %-ZeroMQ \subsection{Beschreibung} -ROS2\cite{doi:10.1126/scirobotics.abm6074}, später auch nur ROS genannt, beschreibt sich selbst als ``a meta operating system for robots''\cite{ros-git}. +ROS2\cite{doi:10.1126/scirobotics.abm6074}, im weiteren Verlauf nur ROS genannt, beschreibt sich selbst als ``a meta operating system for robots''\cite{ros-git}. Hierbei ist ``operating system'' nicht in seiner herkömmlichen Bedeutung eines vollständigen Betriebssystems zu verstehen. Es handelt sich dabei um eine gemeinsame Grundlage für Programme und Daten, die durch ROS bereitgestellt wird. @@ -75,7 +73,7 @@ Zu den Aufgaben von ROS zählen folgende Teilbereiche: Darunter fallen Informationen über das Paket selbst, wie dessen Name, Beschreibung und Version. Außerdem sind Name und Mailadresse des Autors, sowie die gewählte Lizenz des Codes vermerkt. - Um das Paket später korrekt ausführen zu können, sind benötigte Pakete für den Kompiliervorgang und die Ausführung des Pakets eingetragen. + Um das Paket später korrekt ausführen zu können, werden benötigte Pakete für den Kompiliervorgang und die Ausführung in die package.xml-Datei eingetragen. \item[Buildumgebung]\hfill \\ ROS nutzt die eigene Buildumgebung \code{colcon} \cite{colcon}, um Pakete in den Workspaces reproduzierbar zu erstellen. @@ -103,7 +101,7 @@ Zu den Aufgaben von ROS zählen folgende Teilbereiche: \item[Abhängigkeitsverwaltung]\hfill \\ ROS kann durch die in den Paketen deklarierten Abhängigkeiten prüfen, ob diese in der aktuellen Umgebung ausführbar sind. - Die generierten Warnungen bei fehlenden Paketen vermeiden Abstürze und undefiniertes Verhalten in der Ausführung von Nodes, die diese benötigen. + Die generierten Warnungen bei fehlenden Paketen helfen dem Anwender, Abstürze und undefiniertes Verhalten bei der Ausführung von Nodes zu vermeiden, die diese Pakete benötigen. \item[Datenübertragung]\hfill \\ Um Daten zwischen Nodes austauschen zu können, müssen die Nodes miteinander auf einem festgelegten Weg kommunizieren können. @@ -137,12 +135,12 @@ Als Simulationsumgebung eignen sich verschiedenen Programme, die sich hinsichtli Hierfür kommen dedizierte Werkzeuge zur Robotersimulation, aber auch beispielsweise universell einsetzbare Gameengines in Frage. Ein Vergleich dieser Werkzeuge ist hierbei sinnvoll, da der gebotene Funktionsumfang der Softwares sich stark unterscheidet. Auch andere Aspekte, wie Lizenzen oder schwer bewertbare Aspekte wie Nutzerfreundlichkeit, sind hierbei zu betrachten. -Eine Auswahl der als Simulationsumgebung in Frage kommenden Programme werden hier vorgestellt. +Eine Auswahl der als Simulationsumgebung in Frage kommenden Programme wird hier vorgestellt. CoppeliaSim\cite{coppelia}, früher auch V-REP genannt, ist eine Robotersimulationsumgebung mit integriertem Editor und ROS-Unterstützung. Es unterstützt viele Sprachen (C/C++, Python, Java, Lua, Matlab oder Octave) zur Entwicklung von Erweiterungen des Simulators. -Der Simulator selbst unterstützt Menschliche Aktoren, jedoch können diese nur Animationen abspielen oder zusammen mit Bewegungen abspielen. -CoppeliaSim existiert in 3 Versionen, die sich im Funktionsumfang unterscheiden. +Der Simulator selbst unterstützt menschliche Aktoren, jedoch können diese nur Animationen abspielen oder zusammen mit Bewegungen abspielen. +CoppeliaSim existiert in 3 Versionen, die sich im Funktionsumfang und Lizenz unterscheiden. Jedoch besitzt nur die professionelle Version Zugriff auf alle Funktionen und Verwendungsszenarien. Gazebo Ignition\cite{gazebo} ist wie CoppeliaSim eine Robotersimulationsumgebung, jedoch ohne integrierten Editor und direkte ROS-Unterstützung. @@ -155,7 +153,7 @@ Unity\cite{unity} hingegen ist primär eine Grafikengine für Nutzung in Compute Es existieren mehrere Systeme zur Anbindung der Engine an ROS, vor allem das offizielle ``Robotics Simulation''-Paket und ZeroSim. Beide Systeme erlauben die Erweiterung der Gameengine um die Simulation von Robotern. Unity besitzt eine gute Dokumentation, die vor allem auf die Nutzung im Einsteigerbereich zurückzuführen ist. -Auch die Optionen zur Menschensimulation sind gut, da diese häufig in Spielen verwendet werden. +Auch die Optionen zur Menschensimulation sind umfangreich, da diese häufig in Spielen verwendet werden. Ein großer Nachteil hingegen ist die Lizenz, die nur für Einzelpersonen kostenlos ist. Die Unreal Engine\cite{unreal} ist wie Unity eine Grafikengine aus dem Spielebereich. @@ -172,16 +170,18 @@ Auch für diese Engine existiert eine ROS2-Anbindung, jedoch ist diese nicht off Alle vorgestellten Softwares besitzten ein integriertes Physiksystem, dass die Simulation von starren Körpern und Gelenken erlaubt. Diese Funktionen erlauben den Aufbau eines Roboterarms, der durch eine ROS-Brücke gesteuert wird. -Um den Entwicklungsvorgang zu beschleunigen, ist die Auswahl einer Umgebung mit bereits existierender ROS-Unterstützung sinnvoll. +Um den Fokus dieser Arbeit auf die gestellte Aufgabe zu ermöglichen, ist die Auswahl einer Umgebung mit bereits existierender ROS-Unterstützung sinnvoll. Durch diese Einschränkung scheiden sowohl Unreal Engine aber auch Godot aus. Diese bieten zwar diese Funktionalität, jedoch wird diese nur durch Nutzer gewartet und ist demzufolge nicht offiziell unterstützt. Für einen späteren Einsatz ist eine offene Lizenz von Vorteil, da diese einen Einsatz in nahezu allen Umständen erlaubt. -Die Wahl der Simulationsumgebung fiel deshalb auf Gazebo Ignition, dass gleichzeitig bereits im ROS-Ökosystem etabliert ist. +Die Wahl der hier zu verwendenden Simulationsumgebung fiel deshalb auf Gazebo Ignition, dass gleichzeitig bereits im ROS-Ökosystem etabliert ist. Dabei erlauben die offizielle ROS-Anbindung und offene Lizenz eine zuverlässige Verwendung in unterschiedlichsten Szenarien. \subsection{Welt- und Modellbeschreibung} Um die Simulationsumgebung zu beschreiben, nutzt Gazebo das .sdf-Dateiformat\cite{sdf-format}. Dieses Format basiert auf XML und wird zur Definition gesamter Welten, aber auch einzelner Objekte innerhalb dieser Welten benutzt. +Eine Welt ist in Gazebo eine Umgebung aus mehreren Objekten, welche simuliert werden sollen. +Die Welt beschreibt außerdem die simulierte Physikumgebung und deren Konstanten, wie zum Beispiel die Gravitation. Um verschiedene Versionen des Formats zu unterstützen, enthält das einzige sdf-Element die gewünschte Versionsnummer. Eine solche Datei kann, wie bereits oben beschrieben, unterschiedliche Daten enthalten. @@ -193,7 +193,7 @@ Zuerst enthält ein Welt-Element die Daten über die physikalischen Konstanten d Außerdem werden alle benötigten Teile der Nutzeroberfläche deklariert, die im ausgeführten Simulator verfügbar sein sollen. Letzendlich ist auch die Definition mehrerer Modelle, Aktoren und Lichter in der Welt möglich. Diese können auch aus anderen URIs stammen, die in der Welt deklariert wurden. -Dies erlaubt das Laden von zum Beispiel vorher definierten Objekten oder Objekten aus der offiziellen Bibliothek\cite{gazebo-app}. +Dies erlaubt zum Beispiel das Laden von vorher definierten Objekten oder Objekten aus der offiziellen Bibliothek\cite{gazebo-app}. Ein Modell enthält einen Roboter oder ein anderes physikalisches Objekt in der Simulation. Die Deklaration eines weiteren Untermodells ist möglich, um komplexere Strukturen abbilden zu können. @@ -216,7 +216,9 @@ Neben den Punklichtquellen existieren auch noch Spots, die außerdem noch nur ei Die Actor-Komponente wird für animierte Modelle in der Simulation eingesetzt. Sie besteht aus einem Namen für das Modell, einer Skin, welche das Aussehen des Modells definiert und mehreren Animationen. Diese können durch in einem Skript definierte Trajectories ausgeführt werden, was eine einfache Simulation eines Menschen erlaubt. -Eine solche Befehlsfolge kann jedoch nicht von außerhalb der Simulation zur Laufzeit angepasst werden, was weitere Entwicklungsarbeit erforderlich macht. + +Eine solche Befehlsfolge kann jedoch nicht von außerhalb der Simulation zur Laufzeit angepasst werden. +Diese Funktionalität wurde im Rahmen der Arbeit hinzugefügt. \subsection{Robotersimulation} Für die Robotersimulation wird ein Modell des Roboters benötigt, in dem dieser für die Simulationsumgebung beschrieben wird. @@ -239,7 +241,7 @@ Folgende Typen von Gelenken können in urdf-Dateien genutzt werden: \item[freie Gelenke] ermöglichen vollständige Bewegung in allen 6 Freiheitsgraden (Rotation und Translation). Sie stellen den normalen Zustand der Glieder zueinander dar. \item[planare Gelenke] - erlauben Bewegungen senkrecht zur Achse des Gelenks. Sie werden zum Beispiel für Bodenkollisionen eingesetzt. + erlauben Bewegungen senkrecht zur Achse des Gelenks. Sie werden zum Beispiel für Oberflächen eingesetzt, auf welchen Objekte gleiten sollen. \item[feste Gelenke] sperren alle 6 Freiheitsgrade und werden häufig zur Fixierung von Objekten in einer Szene genutzt. \item[kontinuierliche Gelenke] @@ -252,10 +254,10 @@ Folgende Typen von Gelenken können in urdf-Dateien genutzt werden: \subsection{Menschensimulation} Gazebo besitzt bereits ein simples Animationssystem für bewegliche Aktoren, dass auch für Menschen nutzbar ist. Für diesen existiert bereits ein Modell mit mehreren Animationen, die allein abgespielt, oder an Bewegungen gekoppelt werden können. -Dadurch ist eine Laufanimation realisierbar, die synchronisiert zu einer Bewegung abgespielt wird. +Dadurch ist zum Beispiel eine Laufanimation realisierbar, die synchronisiert zu einer Bewegung abgespielt wird. Dies setzt jedoch voraus, dass der gesamte Bewegungsablauf zum Simulationsstart bekannt ist. -Der Grund dafür ist auf die Definition der Pfade zurück zu führen, die Aktionen wie Bewegungen und Animationen auslösen können. +Der Grund dafür ist auf die Definition der Pfade zurückzuführen, die Aktionen wie Bewegungen und Animationen auslösen. Diese können nur als dem Actor untergeordnetes Element in der .sdf-Datei definiert werden, was Veränderungen zur Laufzeit ausschließt. Durch diesen Umstand ist der somit realisierbare Simulationsumfang nicht ausreichend, um die gewünschten Szenarien abzubilden. @@ -267,25 +269,25 @@ Ein solches System soll als Gazebo-Plugin einbindbar sein, um Modifikationen an Dies vereinfacht die Wartung, da bei Updates der Simulationsumgebung nicht die Menschensimulation an den neuen Code angepasst werden muss. \section{Roboterumgebung} MoveIt2\cite{moveit-docs} ist das meist genutzte ROS2 Paket für Bewegungsplanung von Robotern. -Deshalb existiert viel Dokumentation für die zahlreichen Komponenten, was die Entwicklung neuer Komponenten erleichtert. -Außerdem sind zahlreiche direkte Integrationen mit anderen ROS-Paketen verfügbar, was das Nutzen dieser mit MoveIt zusammen erlaubt. -Diese Eigenschaften machen das MoveIt als Bewegungsplanungsumgebung für dieses Projekt extrem attraktiv. +Deshalb existiert eine umfangreiche Dokumentation für die zahlreichen Komponenten, was die Entwicklung neuer Komponenten erleichtert. +Außerdem sind zahlreiche direkte Integrationen mit anderen ROS-Paketen verfügbar, was die Nutzung dieser zusammen mit MoveIt erlaubt. +Aufgrund dieser Eigenschaften ist MoveIt eine vorteilhafte Bewegungsplanungsumgebung für dieses Projekt. -MoveIt besteht aus meheren Komponmenten, die in ihrer Gesamtheit den Bereich der Bewegungsplanung abdecken. +MoveIt besteht aus mehreren Komponmenten, die in ihrer Gesamtheit den Bereich der Bewegungsplanung abdecken. Der Nutzer kann mit MoveIt auf verschiedenen Wegen Steuerbefehle für den Roboter absenden, die durch die Software umgesetzt werden. -Die erste Inbetriebnahme ist über das mitgelieferte RViz-Plugin und die demo-Launch-Files moglich. +Die erste Inbetriebnahme ist über das mitgelieferte RViz-Plugin und die demo-Launch-Files möglich. Diese wurden mit dem mitgelieferten Setupassistenten für den Roboter generiert. Durch die Ausführung dieser Demo startet RViz, eine Test- und Visualisierungsumgebung für ROS. In dieser können Roboterbewegungen unter Zuhilfenahme von Markierungen in RViz geplant und ausgeführt werden. Da sich eine solche Bewegungsplanung nur beschränkt zur Automatisierung durch Software eignet, müssen die der Demo zugrundeliegenden Schnittstellen genutzt werden. -Für die Sprache Python existierte für die Vorgängerversion MoveIt noch das moveit_commander Paket, dass den Zugriff auf MoveIt in Pyhon erlaubt, dass aber für MoveIt2 noch nicht portiert wurde. \cite{moveitpython} +Für die Sprache Python existierte für die Vorgängerversion MoveIt noch das moveit_commander Paket, dass den Zugriff auf MoveIt in Pyhon erlaubt, dass aber für MoveIt2 noch nicht portiert wurde\cite{moveitpython}. Die direkte Nutzung der C++-API ist aktuell die einzige offizielle Möglichkeit, mit MoveIt2 direkt zu interagieren. -Dabei kann sowohl die Planung und Ausführung von Bewegungen ausgelöst werden, aber auch Exklusionszonen eingerichtet werden. +Dabei können sowohl die Planung und Ausführung von Bewegungen ausgelöst aber auch Exklusionszonen eingerichtet werden. Außerdem können Objekte virtuell mit dem Roboter verbunden werden, wodurch sich diese in RViz mit dem Roboter bewegen. -Natürlich können die Befehle auch direkt an die entsprechenden Topics gesendet werden um einzelne Bereiche des Systems zu testen, jedoch ist so kein einfacher Zugriff auf erweiterte Optionen möglich. +Natürlich können die Befehle auch direkt an die entsprechenden Topics gesendet werden um einzelne Bereiche des Systems zu testen. Um die durch den Setupassistenten generierten Informationen an MoveIt zu übergeben, wird intern ein RobotStatePublisher verwendet. Dieser läd alle Daten des Robotermodells und gibt sie an andere Programme weiter, die Roboterparameter zur Laufzeit anfordern, unter diesen auch MoveIt selbst. @@ -296,11 +298,11 @@ Dabei können auch bestimmte Einschränkungen des Arbeitsraums, spezielle Trajek Diese Daten können durch eine OccupancyMap ergänzt werden, welche die Bereiche beschreibt, die sich um den Roboter befinden. Eine solche Erweiterung erlaubt die automatische Nutzung von Kollisionsvermeidung mit Objekten im Planungsbereich. -Die Planung der Bewegung wird durch einen der zahlreichen implementierten Solver erledigt, der durch die MoveGroup aufgerufen wird. +Die Planung der Bewegung wird durch einen der in MoveIt implementierten Solver realisiert, der durch die MoveGroup aufgerufen wird. Um die generierte Bewegung umzusetzen, werden die gewünschten Gelenkpositionen als Abfolge an die \code{ros_control} Controller des Roboters weitergegeben. Diese Abstaktion erlaubt die Nutzung von sowohl simulierten, aber auch echten Robotern. -Hiefür kann ein anderer \code{ros_control} Controller geladen werden, der entweder die simulierte oder echte Hardware ansteuert. +Dazu werden für echte und simulierte Roboter unterschiedliche ros_control Controller verwendet. Der Erfolg der gesamten Pipeline kann dabei durch einen Feedbackmechanismus überwacht werden. Im Falle von Gazebo wird \code{ign_ros_control} genutzt, dass die benötigten \code{ros_control} Controller in die Simulation einbindet. @@ -309,11 +311,11 @@ Diese können dann wie normale Controller von \code{ros_control} genutzt werden. Dieser Ablauf ist auch im Anhang unter Abbildung \ref{moveitpipeline} im Anhang visualisiert. \section{Programmiersprache} -Als Programmiersprache kommen in ROS standartmäßig Python\cite{python} und C++\cite{cpp} zum Einsatz. +Als Programmiersprache kommen in ROS standardmäßig Python\cite{python} und C++\cite{cpp} zum Einsatz. Diese beiden Sprachen sind in der Softwareentwicklung beliebt, unterscheiden sich jedoch stark in Funktionsumfang und Entwicklungsprozess. Python ist eine interpretierte Skriptsprache, die zu den hohen Programmiersprachen zählt. -Sie wird in ROS zum Beispiel in .launch.py-Dateien eingesetzt, die den Start von Diensten in der Umgebung verwalten. +Sie wird in ROS zum Beispiel in \code{.launch.py}-Dateien eingesetzt, die den Start von Diensten in der Umgebung verwalten. Die Sprache kann aber auch für die Programmierung von Nodes innerhalb des ROS-Systems verwendet werden. C++ hingegen ist eine kompilierte, statisch typisierte, maschinennahe Programmiersprache. @@ -321,13 +323,14 @@ In ROS wird C++ für Code verwendet, der entweder häufig oder in zeitkritischen Aus diesem Grund wird C++ in Nodes verwendet, die schnell auf große Datenmengen reagieren müssen. Die Nutzung eines Kompilierers beschleunigt C++ deutlich im Vergleich zu Python, ist jedoch weniger geeignet für häufige Modifikation. -Dies ist vor allem in häufig geänderten Programmen ein Nachteil, die nach einer Änderung wieder kompiliert werden müssen. +Dies ist vor allem in häufig geänderten Programmen ein Nachteil, die nach einer Änderung erneut kompiliert werden müssen. Aus diesem Grund wird Python vor allem in .launch.py-Dateien verwendet, welche die Interaktion der anderen Programme in der Umgebung verwalten. -Um die gewünschten Funktionen für die Simulation umsetzen zu können, ist die Programmierung in C++ nötig. -Da zum Beispiel Gazebo-Plugins auf C++ als Programmiersprache ausgelegt sind, was die Nutzung anderer Sprachen stark erschwert. -Ein Grund dafür ist die hohe Geschwindigkeit, die bei einer hohen Anzahl an Simulationsschritten pro Sekunde benötigt wird. -Außerdem kann MoveIt2 zur aktuellen Zeit nur mit C++ direkt gesteuert werden. +Um die gewünschten Funktionen für die Simulation umsetzen zu können, ist die Programmierung in C++ nahezu unumgänglich. +Zum Beispiel sind Gazebo-Plugins in C++ erstellt, was die Nutzung anderer Sprachen stark einschränkt. + +Ein Grund für die Nutzung von C++ ist die hohe Geschwindigkeit, die bei einer hohen Anzahl von Simulationsschritten pro Sekunde benötigt wird. +Außerdem kann MoveIt2 derzeit nur mit C++ direkt gesteuert werden. Die Verwendung von C++ für die zu entwickelnden Nodes erscheint deshalb aus oben genannten Gründen naheliegend. In den Launch-Skripten wird jedoch Python verwendet werden, da hier die Vorteile einer Skriptsprache überwiegen. @@ -336,14 +339,14 @@ In den Launch-Skripten wird jedoch Python verwendet werden, da hier die Vorteile Zur Verwaltung der Abläufe sollen BehaviorTrees genutzt werden, die durch die Bibliothek \code{BehaviorTree.CPP} bereitgestellt werden. Diese Bibliothek wurde in C++ geschrieben, und ist somit in ROS und dem geplanten Konzept integrierbar. -Es existieren aber auch viele Beispiele und eine gute Dokumentation über die erweiterten Funktionen, die im folgenden vorgestellt werden. +Es existieren auch viele Beispiele und eine gute Dokumentation über die erweiterten Funktionen der Bibliothek, die im folgenden vorgestellt werden. \begin{description} \item[Asynchrone Nodes] - sind in \code{BehaviorTree.CPP} leichter umsetzbar, da diese im Lebenszyklus der Nodes beim Konzept der Bibliothek mit bedacht wurden. + sind in \code{BehaviorTree.CPP} leichter umsetzbar, da diese in Form verschiedener Zustände der Nodes beim Konzept der Bibliothek mit bedacht wurden. Dies resultiert in Nodes, die ohne spezielle Logik langanhaltende Aktionen ausführen können, ohne die Ausführung des BehaviorTrees zu behindern. \item[Reaktives Verhalten] ist ein neues Konzept, um die Handhabung von asnchronen Nodes zu vereinfachen. - Diese Strukturelemente erlauben die parallele Ausführung von mehreren Zweigen, die aktuell ausführende Aktionen beeinflussen können. + Diese Strukturelemente erlauben die parallele Ausführung von mehreren Zweigen, die die aktuell ausgeführte Aktion beeinflussen können. Darunter fällt die Modifizierung von Parametern der Aktionen, aber auch der vollständige Abbruch einer Aktion durch äußere Einflüsse. \item[Das .xml-Format der Behavior Trees] ermöglicht einen Austausch des Verhaltens, ohne die unterliegende Programme verändern zu müssen. Dies ist vor allem in kompilierten Sprachen wie C++ sinnvoll, da Änderungen im Verhaltensablauf keiner Neukompilierung bedürfen, was die Iterationszeit für Änderungen verbessert. @@ -356,13 +359,13 @@ Es existieren aber auch viele Beispiele und eine gute Dokumentation über die er Dies erleichtert das häufig schwierige Debuggen von Zustandsmaschienen erheblich, da das Verhalten genau untersucht werden kann. \end{description} -BehaviorTrees werden in \code{BehaviorTree.CPP} als .xml-Dateien gespeichert. +BehaviorTrees werden in \code{BehaviorTree.CPP} in Form von .xml-Dateien gespeichert. Diese Dateien enthalten die Anordnung der Nodes selbst, aber auch weitere Konfigurationsmöglichkeiten in Form von Ein- und Ausgabeports. Ports können verwendet werden, um Nodes generischer zu gestalten. Durch veränderbare Parameter im später erstellten Tree können Nodes ohne Programmänderung verändert werden. Falls die Nodes mit Bedacht erstellt wurden, kann so auf viele spezialisierte Nodes verzichtet werden. -Um dies zu ermöglichen kann deren Funktion durch mehrere andere Nodes in einem Subtree mit Parametern abgebildet werden. +Um dies zu ermöglichen, kann deren Funktion durch mehrere andere Nodes in einem Subtree mit Parametern abgebildet werden. Diese in den Ports übertragenen Daten können sowohl aus einem String ausgelesen, aber auch aus dem sogenannten Blackboard entnommen werden. Um die Übersetzung aus einem String zu ermöglichen, muss eine entsprechende Funktion implementiert werden, die einen String in den gewünschten Zieltyp übersetzt. @@ -373,21 +376,21 @@ Diese werden im Hintergrund als eine Referenz auf den eigentlichen Wert gespeich Eine solche Funktion erlaubt das weitere Zerlegen von Vorgängen innerhalb des BehaviorTrees. Solche kleineren Nodes sind durch ihren limitierten Umfang universeller einsetzbar, da sie nur kleinere Teilprobleme betrachten, die zu komplexeren Strukturen zusammengesetzt werden können. -Um die dadurch wachsenden Strukturen besser überblicken zu können, lassen sich Nodes als sogenannte SubTrees abspeichern. +Um die dadurch wachsenden Strukturen besser überblicken zu können, lassen sich Nodes als sogenannte Subtrees abspeichern. Diese bilden dann in ihrer Gesamtheit eine neue Node, die im BehaviorTree eingesetzt werden kann. -Um den Einsatz von Variablen innerhalb eines SubTrees zu ermöglichen, besitzt jeder SubTree ein separates Blackboard. +Um den Einsatz von Variablen innerhalb eines Subtrees zu ermöglichen, besitzt jeder Subtree ein separates Blackboard. Dadurch kann auch ein Eingriff durch äußere Einflüsse verhindert werden. -Natürlich sollte es auch möglich sein, Variablen an solche SubTrees zu übergeben. -Diese können, wie auch bei normalen Nodes, als Parameter an den SubTree übergeben werden. -Die Bibliothek \code{BehaviorTree.CPP} verbindet dann diese Werte und erlaubt die Datenübergabe zu und von dem SubTree. +Natürlich sollte es auch möglich sein, Variablen an solche Subtrees zu übergeben. +Diese können, wie auch bei normalen Nodes, als Parameter an den Subtree übergeben werden. +Die Bibliothek \code{BehaviorTree.CPP} verbindet dann diese Werte und erlaubt die Datenübergabe zum und vom Subtree. \subsection{Asynchrone Nodes} Da nicht jeder Prozess sofort vollständig durchgeführt werden kann, muss die Möglichkeit geschaffen werden, lang anhaltende Prozesse abzubilden. Dies geschieht in \code{BehaviorTree.CPP} durch asynchrone Nodes. Eine asynchrone Node besitzt neben den Zuständen SUCCESS und FAILURE einer normalen Node auch noch die beiden neuen Zustände RUNNING und IDLE. -Außerdem werden mehrere Funktionen definiert, die den Lebenszyklus der Node darstellen. +Außerdem werden mehrere Funktionen definiert, die den Lebenszyklus der Node definieren. Wird eine Node durch den Aufruf der \code{onStart}-Funktion gestartet, geht diese in einen der Zustände RUNNING, SUCCESS oder FAILURE über. @@ -405,12 +408,11 @@ Das in BehaviorTree.Cpp verwendete Dateiformat, um Behavior Trees zu erstellen, Jedes Dokument beginnt dabei mit einem Root-Element, dass alle BehaviorTrees und eine Referenz auf die ID des Hauptbaumes enthält. Diese wird benötigt, da auch Unterbäume im selben Dokument deklariert und genuzt werden können, diese aber sonst nicht vom Hauptbaum unterscheidbar sind. -Jeder Baum beginnt mit einem BehaviorTree-Element, dass als Attribut die ID des Baumes besitzen muss. +Jeder Baum beginnt mit einem BehaviorTree-Element, das als Attribut die ID des Baumes besitzen muss. Als untergeornete Elemente des Baumes werden die Nodes entsprechend der gewünschten Baumstruktur angeordnet. -Zur besseren Visualisierung der XML-Struktur wurde hier die bereits aus dem Konzept bekannte Baumstruktur, hier noch einmal in Abbildung \ref{choice_tree_demo} zu sehen, umgewandelt. -Die resultierende Datei ist in Abbildung \ref{choice_tree_xml} abgebildet. -Dabei ist zu beachten, dass die Root-Node nicht in der Struktur existiert, da diese nur den Eintrittspunkt in die Struktur darstellt. +Als Beispiel wird der bereits im Konzept verwendete Behavior Tree (hier nochmals in Abbildung \ref{choice_tree_xml} zu sehen) in die entsprechende XML-Repräsentation umgewandelt. +Dabei ist zu beachten, dass die Root-Node in der Datei nicht existiert, da diese nur den Eintrittspunkt in die Struktur darstellt. Außerdem können selbst definierte Nodes sowohl direkt mit ihrem Namen, aber auch über den Namen Action mit ihrem Namen als ID-Parameter, referenziert werden. \begin{figure}[hpt] \includegraphics[width=\textwidth]{img/MA-tree-demo} @@ -439,14 +441,28 @@ Außerdem können selbst definierte Nodes sowohl direkt mit ihrem Namen, aber au \label{choice_tree_xml} \end{figure} -\section{Docker-Compose als Virtualisierungsumgebung} -Docker ist eine Virtualisierungsumgebung für Anwendungen, die eine komplette Umgebung für deren Ausführung bereitstellt. -Dadurch wird die Inbetriebnahme von Anwendungen, die spezielle Umgebungen für ihre Ausführung benötigen auf beliebigen Systemen ermöglicht. +\section{Virtualisierungsumgebung} -Dies wird durch den Einsatz von sogenannten Containern erreicht. -Ein solcher Container wird über sogenannte Build-Files definiert. -Ein Build-File enthält exakte Instruktionen, wie der Container aus anderen Containern, Dateien oder einer Kombination beider erstellt werden kann. -Der so erstellte Container wird anhand dieser Definition durch den ausführenden Rechner erstellt. +Die Auswahl der Virtualisierungsumgebung erfolgt zwischen einer virtuellen Maschine und einer Containerumgebung. + +Bei einer virtuellen Maschine (VM) werden alle Komponenten der Maschine simuliert, was das Nutzen anderer Betriebssysteme ermöglicht. +Dies beinhaltet auch die Abstraktion von Speichermedien und anderen Geräten. +Eine virtualisierte Umgebung erzeugt kleine Performanceverluste durch diese Abstraktion. + +Eine Containerumgebung nutzt den Kernel des Hostsystems mit, was die Virtualisierug auf die Ebenen über dem Betriebssystem beschränkt. +Die auszuführende Umgebung muss also mit dem Systemkernel lauffähig sein, um in einem Container ausgeführt werden zu können. +Die Performanceverluste dieser Umgebung sind kleiner als die einer virtuellen Maschine, da grundlegende Teile des Systems nicht mehrfach ausgeführt werden müssen. + +Da bereits eine Linux-Maschine zur Entwicklung vorhanden ist, ist die Virtualisierung eines weiteren Linux-Kernels nur mit weiterem Performanceverlust verbunden. +Außerdem soll in der Virtualisierungsumgebung Grafikbeschleunigung genutzt werden, wozu in einer VM eine Grafikkarte an das Zielsystem durchgereicht wird. +In einer Containerumgebung kann die Grafikeinheit des Hostsystems mit genutzt werden, indem die Geräte in den Container hereingereicht werden. + +Auf Grund dieser Punkte wurde eine Containerumgebung verwendet. +Docker ist eine verbreitete Umgebung für die Ausführung von Containern, die auf Grund der extensiven Dokumentation und Verfügbarkeit auf allen gängigen Linux-Systemen ausgewählt wurde. + +Ein Container wird in Docker über sogenannte Build-Files definiert. +Das Build-File enthält exakte Instruktionen, wie der Container aus anderen Containern, Dateien oder einer Kombination beider erstellt werden kann. +Der so erstellte Container wird anhand dieser Definition durch den Host erstellt. Um diesen Prozess weiter zu beschleunigen, ist auch der Einsatz eines Buildservers möglich, der benötigte Container als Download bereitstellt. Jeder Container enthält ein eigenes Dateisystem, das aus dem im Buildfile definierten Dateien und einem Overlay besteht. diff --git a/tex/4_Umsetzung.tex b/tex/4_Umsetzung.tex index 109c6b3..6bdc45d 100644 --- a/tex/4_Umsetzung.tex +++ b/tex/4_Umsetzung.tex @@ -410,7 +410,7 @@ Dieser Schritt muss vor dem Kompiliervorgang der nutzenden Pakete geschehen. Dazu werden diese Nachrichtenpakete als Dependency der nutzenden Pakete angegeben, was eine automatische Anpassung der Kompilationsreihenfolge bewirkt. Eine Action des \code{ros_action}-Pakets besteht immer aus 3 einzelnen Nachrichten, deren Inhalt frei definiert werden kann. -\begin{enumerate} +\begin{itemize} \item{Zum Start der Action wird die erste Nachricht vom Client an den Server gesendet. In dieser Startnachricht befinden sich alle Informationen, die zur Ausführung der Action benötigt werden. Nach dieser Nachricht kann der Server später entscheiden, ob die Aktion ausgeführt werden soll und sie gegebenenfalls abbrechen.} @@ -418,11 +418,11 @@ Nach dieser Nachricht kann der Server später entscheiden, ob die Aktion ausgef Dabei ist es die Aufgabe des Programmierers, diese an signifikanten Punkten des Ablaufs zu senden.} \item{Am Ende der Action wird die Endnachricht an den Client gesendet, die weitere Rückgabewerte liefern kann. Die Endnachricht enthält standardmäßig eine Erfolgsangabe, weshalb diese nicht angegeben werden muss.} -\end{enumerate} +\end{itemize} Ein ActionServer innerhalb eines Programmes definiert 3 Funktionen, welche die Handhabung einer Aktion definieren. -\begin{enumerate} +\begin{itemize} \item{ Die erste Funktion übergibt den Wert der Startnachricht, die mit einer Antwort quittiert werden muss. Hierbei sind die Antworten ACCEPT_AND_DEFER, ACCEPT_AND_EXECUTE und REJECT möglich. @@ -439,7 +439,7 @@ Ein ActionServer innerhalb eines Programmes definiert 3 Funktionen, welche die H Um Feedback während der Ausführung der Aktion geben zu können, exisitiert die dritte Funktion. Diese erhält als Parameter ein Objekt, mit dem Feedback- und Endnachrichten an den Client gesendet werden können. } -\end{enumerate} +\end{itemize} Die gesamte Kommunikation einer Anfrage verläuft wie in Abbildung \ref{plugin_sequence} dargestellt. Zuerst wird durch den Client eine Zielvorgabe an den Server gesendet. Sollte der Server diese abweisen, wird die Kommunikation beendet. diff --git a/tex/5_Evaluation_und_Diskussion.tex b/tex/5_Evaluation_und_Diskussion.tex index ab50ad5..205d269 100644 --- a/tex/5_Evaluation_und_Diskussion.tex +++ b/tex/5_Evaluation_und_Diskussion.tex @@ -7,12 +7,12 @@ Die Auswahl einer geeigneten Umgebung für die gewünschte Simulation erfolgte i Hierfür wurden mehrere Komponenten einzeln verglichen und ausgewählt. Folgende Komponenten wurden für die Umgebung ausgewählt: \begin{itemize} - \item ROS2 als Dienstumgebung - \item Gazebo Ignition als Simulationssoftware - \item BehaviorTree.CPP als Beschreibungssprache + \item ROS2 als Dienstumgebung, + \item Gazebo Ignition als Simulationssoftware und + \item BehaviorTree.CPP als Beschreibungssprache. \end{itemize} -Alle Komponenten können miteinander kommunizieren, was den Aufbau einer Simulationsumgebung erlaubt. +Alle Komponenten können prinzipiell miteinander kommunizieren, was den Aufbau einer Simulationsumgebung erlaubt. \subsubsection{Nutzung der Virtualisierungsumgebung} Die auf Docker basierende Virtualisierungsumgebung stellt eine vollständige ROS2-Installation dar. @@ -20,7 +20,7 @@ In dieser Umgebung sind alle für die Arbeit benötigten Pakete enthalten. Der Start der Umgebung erfolgt über das im Projektverzeichnis befindliche \code{start.sh}-Shellskript. Dieses Skript wird ohne Parameter ausgeführt. -Falls die Umgebung noch nicht genutzt wurde, wird eine neue Containervorlage erstellt. +Beim ersten Start der Umgebung wird automatisch eine neue Containervorlage erstellt. Der Start der Umgebung wird mit der Ausgabe \code{ros-ros-1 | Ready to connect.} abgeschlossen, die auch in Abbildung \ref{console-docker-started} sichtbar ist. Während der Nutzung der Umgebung muss das Terminal weiter geöffnet bleiben. Nach dem Senden eines Terminiersignals durch das Schließen des Terminals oder die Tastenkombination \code{Ctrl+C} wird die Containerumgebung beendet. @@ -28,12 +28,13 @@ Nach dem Senden eines Terminiersignals durch das Schließen des Terminals oder d \begin{figure} \includegraphics[width=\textwidth]{img/MA-Docker-Started} \centering -\caption{Konsole mit ausgeführter Virtualisierungsumgebung} +\caption{Konsole mit gestarteter Virtualisierungsumgebung} \label{console-docker-started} \end{figure} Die Verbindung in die ROS-Umgebung erfolgt über SSH in einer separaten Konsole. -In der so aufgebauten Session kann die Hardwarebeschleunigung des Hostsystems automatisch genutzt werden. +Eine SSH-Verbindung wird mit dem Befehl \code{ssh ros@localhost -p 2222} aufgebaut. +In dieser Session kann die Hardwarebeschleunigung des Hostsystems automatisch genutzt werden. Dies wurde in Abbildung \ref{console-docker-passthrough} durch die Ausführung von \code{glxgears}, einer OpenGL-Anwendung zum Testen der Grafikpipeline, demonstriert. Das entworfene Containersystem ist mit der bereitgestellten Funktionalität eine Grundlage für die weitere Implementation. @@ -50,12 +51,15 @@ Für den simulierten Menschen und Roboter werden verschiedene Modelle benötigt. Das Robotermodell wurde aus Herstellerdaten exportiert und in Blender nachbearbeitet. Eine Definition des Roboters wurde für Gazebo und MoveIt erstellt, um die Zusammenhänge der einzelnen Armglieder und die physikalische Eigenschaften der Gelenke festzulegen. +Für das Modell des Menschen wurde eine bereits in Gazebo enthaltene Animation als Grundlage verwendet. +Das in dieser enthaltene Modell wurde angepasst, um das Erstellen weiterer Animationen zu vereinfachen. +Mit Hilfe dieses modifizierten Modells wurden dann die benötigten Animationen erstellt. \subsubsection{Steuerung des Menschen} Durch den Start der Simulation wird selbstständig das erstellte ActorPlugin geladen. Der Start des für diese Arbeit implementierten ActorServers erfolgt zeitgleich, um die Anbindung an ROS zu gewährleisten. -Beide Anwendungen zusammen erlauben das Ausführen von Bewegungen und Animationen zur Laufzeit in der Simulation. +Beide Anwendungen zusammen erlauben das Ausführen von Bewegungen und Animationen während der Laufzeit der Simulation. Alle für die Simulation des Menschen erstellten Animationen werden automatisch geladen, sobald diese durch das Plugin verwendet werden. Dies kann durch die erstellten BehaviorTree-Nodes erfolgen, aber auch durch das Verwenden von Terminalbefehlen zu Testzwecken. @@ -63,23 +67,23 @@ Dies kann durch die erstellten BehaviorTree-Nodes erfolgen, aber auch durch das \subsubsection{Definition von Verhalten mit einer Beschreibungssprache} -Die Definition von verschiedenen Verhaltensweisen über eine Beschreibungssprache wurde durch die Erstellung neuer Nodes erreicht. +Die Definition von verschiedenen Verhaltensweisen über eine Beschreibungssprache wurde durch die Erstellung neuer Nodes für einen Behavior Tree erreicht. Für die Bewegung und Animation des Menschen sind die Nodes ActorMovement und ActorAnimation verfügbar. Die Steuerung des Roboters erfolgt durch die RobotMove- und SetRobotVelocity-Node. Beide Nodes zur Kontrolle des Roboters starten eine neue Bewegung mit den neuen Parametern. -Im Falle einer laufenden Bewegung wird diese gestoppt und mit den neuen Parametern gestartet. +Im Falle einer laufenden Bewegung wird diese vorher gestoppt. Um Bewegungen in Zonen zu ermöglichen, kann die GenerateXYPose-Node zufällige Positionen in einer Zone generieren. Die InAreaTest-Node erlaubt eine Auskunft über die Position von Objekten. Eine Redefinition von bestehenden Parametern der generierten Pose ist über die OffsetPose-Node möglich. -Eine Wiederaufnahme von unvollständigen Aktionen ist durch die implementierte Interruptable\-Sequence-Node möglich. +Eine Wiederaufnahme von unvollendeten Aktionen ist durch die implementierte Interruptable\-Sequence-Node möglich. -Die Entscheidung über die Ausführung von einer aus mehreren Aktionen ist durch die WeightedRandom-Node realisiert. +Die Entscheidung über die Ausführung einer von mehreren möglichen Aktionen wird mit der WeightedRandom-Node realisiert. Um Fehler simulieren zu können, ist der Abbruch von Aktionen nötig. Dies wird durch die RandomFailure-Node erreicht. -Eine Kombination aus diesen neu implementieren und den bereits verfügbaren Nodes kann alle benötigten Verhalten darstellen. +Eine Kombination dieser neu implementieren und den bereits in BehaviorTree.CPP verfügbaren Nodes kann alle in den Szenarien benötigten Verhaltensweisen darstellen. \section{Simulation der Szenarien} Das Starten der Simulation erfolgt über ein Skript innerhalb des \code{ign_world}-Pakets. @@ -88,7 +92,7 @@ In diesem Skript werden alle für die Simulation benötigten ROS2-Nodes gestarte Durch die Verwendung des optionalen Parameters \code{scene} kann das gewünschte Szenario ausgewählt werden. Dieser muss in folgendem Format verwendet werden: -\code{ros2 launch ign_world gazebo_controller_launch.py scene:=[Coex|Coop|Colab]} +\code{ros2 launch ign_world gazebo_controller_launch.py scene:=[Coex|Coop|Colab]}. Als Standard wird die Option \code{Coex} genutzt, falls der \code{scene}-Parameter nicht spezifiziert wird. Nach dem Start der Simulationsumgebung ist der Raum vollständig geladen und einsatzbereit (Abbildung \ref{sim-room}). @@ -144,7 +148,7 @@ In diesem Szenario begibt sich der Mensch nur mit einer Wahrscheinlichkeit von 5 Eine Ausweitung der Interaktion erfolgt im Kooperationsszenario. In diesem werden durch den Roboter Objekte entweder weitergereicht oder aussortiert. Nach jedem aussortierten Objekt wird der Mensch gerufen. -Der Mensch holt den Ausschuss dann nach dem erledigen seiner aktuellen Aufgabe ab. +Der Mensch holt die aussortierten Objekte nach dem Erledigen seiner aktuellen Aufgabe ab. Diese Interaktion und das in diesem Szenario hinzugefügte Fließband sind in Abbildung \ref{coop-human} dargestellt. \begin{figure} @@ -158,8 +162,8 @@ Diese Interaktion und das in diesem Szenario hinzugefügte Fließband sind in Ab Für das Kollaborationsszenario durchschreitet der Mensch den Raum, was die Kontrolle mehrerer Systeme simuliert. Der Roboter bewegt in diesem Szenario Objekte vom linken auf den rechten Tisch, wobei Fehler auftreten können. -Bei einem Fehler beendet der Mensch seinen Kontrollgang und hebt ein Objekt auf, um es zum Roboter zurückzubringen (Abbildung \ref{colab-drop}). -Der Roboter bricht den fehlgeschlagenen Vorgang ab, und beginnt diesen mit dem nächsten Objekt von neuem. +Bei einem Fehler beendet der Mensch seinen Kontrollgang und hebt ein Objekt auf, bringt es zum Roboter zurück und legt es auf dem rechten Tisch ab (Abbildung \ref{colab-drop}). +Der Roboter bricht den fehlgeschlagenen Vorgang ab und setzt die Arbeit mit dem nächsten Objekt fort. \begin{figure} \begin{minipage}{.45\textwidth} @@ -176,12 +180,12 @@ Der Roboter bricht den fehlgeschlagenen Vorgang ab, und beginnt diesen mit dem n \end{figure} \section{Zusammenfassung} -Alle simulierten Szenarien sind in einer Beschreibungssprache abgebildet. -Es wurden entsprechende Austauschmechanismen für die Beschreibungsprache geschaffen, welche auch neue Szenarien darstellen können. +Es wurden entsprechende Nodes für die Bewegung von Mensch und Roboter geschaffen. +Mit diesen Nodes wurden alle simulierten Szenarien in einer Beschreibungssprache abgebildet. Die vollständige Kontrolle der Endeffektorposition des Roboters und der Bewegung des Menschen in der Simulation sind möglich. -Eine dynamische Simulation von Objekten, welche durch Roboter und Mensch beeinflusst werden können, konnte nicht umgesetzt werden. - +Die dynamische Simulation von Objekten, die durch Roboter und Mensch beeinflusst werden können, wurde im Rahmen dieser Arbeit aus Komplexitätsgründen nicht umgesetzt. +Einen Überblick über die dafür notwendigen Erweiterungen wird in Sektion \ref{objectsim} skizziert. \section{Lessons Learned} Während der Entwicklung des Projekts wurden zahlreiche Erkenntnisse gesammelt, welche die Entwicklung weiterer Projekte mit dieser Plattform erleichtern können. diff --git a/tex/6_Ausblick.tex b/tex/6_Ausblick.tex index 85f5725..c4998f9 100644 --- a/tex/6_Ausblick.tex +++ b/tex/6_Ausblick.tex @@ -4,7 +4,7 @@ Die Umsetzung des gleichen Problems in einem anderen Simulator bietet die Mögli Hierbei ist vor allem die Anbindung an ROS interessant, welche mit Gazebo mit nur einem Plugin gleichzeitig funktioniert. Eine verbesserte Anbindung an ROS würde die schnellere Entwicklung von Komponenten und Szenarien erlauben. -Da diese für viele andere Simulatoren erst geschaffen werden muss, kann von Anfang an ein Fokus auf Erweiterbarkeit gelegt werden. +Da diese für viele andere Simulatoren erst geschaffen werden muss, kann von Anfang an der Fokus auf Erweiterbarkeit gelegt werden. Je nach gewählter Umgebung ist es potentiell nötig, bestimmte Basisfunktionen neu zu implementieren, falls diese noch nicht unterstützt werden. Moderne Gameengines sind für diesen Einsatzzweck geeignet, da diese viele Bestandteile einer Simulationsplatform bereits enthalten. @@ -13,7 +13,7 @@ Außerdem ist die hohe Verfügbarkeit von Tutorials und Dokumentation für diese Mitgelieferte Werkzeuge bekannter Engines wie Unity, Unreal Engine und Godot beinhalten ausgereifte Physik- und Animationssysteme. Diese können für Roboterbewegungen und Menschensimulation verwendet werden. -\section{Simulation bewegter Objekte} +\section{Simulation bewegter Objekte}\label{objectsim} Die Simulation bewegter Objekte benötigt ein neues Gazebo-Plugin, welches mit den bereits entwickelten Komponenten der aktuellen Umgebung interagiert. Um ein Objekt mit dem Roboter oder Menschen zu bewegen, muss dieses auf eine von zwei Arten bewegt werden. @@ -26,8 +26,13 @@ Da der Mensch nicht aus einzelnen Physikobjekten besteht, ist die Anbringung als Stattdessen muss die aktuelle Position des Armes anhand der Animationsdaten verfolgt werden, um die Position des Objektes diesen anzupassen. Die unterschiedliche Anbindung von Roboter und Mensch erfordert mehrere Implementationen, welche Zustandsdaten über das Objekt austauschen müssen. -Um die Objekte mit -\section{Ergänzung von Umgebungserkennung} +Um die Objekte zu steuern, muss eine weitere ROS-Anbindung in einem entsprechenden Gazebo-Plugin erfolgen. + +Dieses Plugin unterliegt den selben Limitierungen, die auch schon im ActorPlugin beachtet werden mussten. +Eine weitere Nachrichtenübergabe als Zwischenschritt vor dem eigentlichen ROS-Server ist so unausweichlich. + +Dieser Kommunikationsmechanismus muss das Erstellen, Entfernen und Bewegen von Objekten zwischen Roboter, Umgebung und Mensch unterstützen. +\section{Erweiterung um Umgebungserkennung} Eine Ergänzung von simulierten Tiefenkameras zur Umgebungserkennung stellt eine weitere mögliche Ausbaustufe des Projekts dar. Mit den Kameras kann eine Tiefenkarte erstellt werden, um die Verfahrgeschwindigkeit des Roboters zu kontrollieren. MoveIt implementiert für diesen Verwendungszweck bereits sogenannte Octomaps. @@ -37,12 +42,13 @@ Der Einsatz dieser OctoMaps zum Ausweichen von Hindernissen ist bereits in der B Für die Reduktion der Verfahrgeschwindigkeit muss der erwartete Raum mit dem aktuellen Raum verglichen werden. Daraus kann die Distanz zu einem unerwarteten Objekt berechnet werden, um die Verfahrgeschwindigkeit dementsprechend anzupassen. \section{Zusammenführung von ActorPlugin und ActorServer} - --Mechanismus für Datenaustausch zwischen ROS und Gazebo überdenken/überarbeiten - --Geteilte ROS Instanz zwischen Plugins? Wie? - --Potentielle Integration von ROS als Messagedients in Gazebo +Die aktuelle, separate Implementation von ActorServer und ActorPlugin kann durch eine Vereinigung der Implementation verbessert werden. +Folgende Versuche wurden bereits durchgeführt, führten aber zu keinem Erfolg: +\begin{itemize} + \item{Die Ausführung in einem separaten Thread,} + \item{eine Trennung vom Hauptprogramm mittels Fork und} + \item{das Weglassen der Initialisierung von rclcpp, da diese später durch ign_ros2_control durchgeführt wird.} +\end{itemize} \section{Migration auf die neuste ROS-Version} Die neuste ROS-Version bietet keine expliziten Vorteile der Umgebung selbst, jedoch sind in dieser mehr Pakete verfügbar.