diff --git a/.kile/mechforsch.kilepr.gui b/.kile/mechforsch.kilepr.gui index ed34cd3..9194459 100644 --- a/.kile/mechforsch.kilepr.gui +++ b/.kile/mechforsch.kilepr.gui @@ -113,11 +113,11 @@ TextFolding={"checksum":"","ranges":[]} ViMarks= [view-settings,view=0,item:main.bib] -CursorColumn=1 -CursorLine=257 +CursorColumn=14 +CursorLine=250 Dynamic Word Wrap=false JumpList= -TextFolding={"checksum":"d388fe775e2de092b50ce9dbaa861869ee036db3","ranges":[]} +TextFolding={"checksum":"cf8b2614fde9a70da69bd9296f0dc1ae50c584e2","ranges":[]} ViMarks= [view-settings,view=0,item:main.tex] @@ -137,27 +137,27 @@ TextFolding={"checksum":"052cc01250adb0f5e3ea2eff211696be3fc560ae","ranges":[]} ViMarks= [view-settings,view=0,item:tex/2_Konzept.tex] -CursorColumn=0 -CursorLine=115 +CursorColumn=73 +CursorLine=8 Dynamic Word Wrap=false JumpList= TextFolding={"checksum":"462cd841a4ae5cfb2a0372ff60c2f3b89035b3ea","ranges":[]} ViMarks= [view-settings,view=0,item:tex/3_Auswahl.tex] -CursorColumn=99 -CursorLine=364 +CursorColumn=49 +CursorLine=422 Dynamic Word Wrap=false JumpList= -TextFolding={"checksum":"9cca06e103193ebce1a74b19ba51648376b36a4b","ranges":[]} +TextFolding={"checksum":"f762ea508da691b2b7d6eed6f6ab298eb722fa32","ranges":[]} ViMarks= [view-settings,view=0,item:tex/4_Umsetzung.tex] CursorColumn=0 -CursorLine=452 +CursorLine=97 Dynamic Word Wrap=false JumpList= -TextFolding={"checksum":"dd8e7caf4d43ea72300c447784e10addb44c0e7e","ranges":[]} +TextFolding={"checksum":"0a72214ff4945abde5acc7ce77e1e946a152971f","ranges":[]} ViMarks= [view-settings,view=0,item:tex/Einleitung.tex] diff --git a/main.aux b/main.aux index a0d7987..b68bea0 100644 --- a/main.aux +++ b/main.aux @@ -70,8 +70,8 @@ \newlabel{concept_tree_demo}{{2.2}{7}{Beispiel eines BehaviorTrees\relax }{figure.caption.4}{}} \@writefile{toc}{\contentsline {section}{\numberline {2.4}Virtualisierungsumgebung als Platform}{7}{section.2.4}\protected@file@percent } \BKM@entry{id=11,dest={636861707465722E33},srcline={1}}{5C3337365C3337375C3030304B5C3030306F5C3030306D5C303030705C3030306F5C3030306E5C303030655C3030306E5C303030745C303030655C3030306E5C3030302D5C3030302F5C303030535C3030306F5C303030665C303030745C303030775C303030615C303030725C303030655C303030615C303030755C303030735C303030775C303030615C303030685C3030306C} -\BKM@entry{id=12,dest={73656374696F6E2E332E31},srcline={7}}{5C3337365C3337375C303030445C303030695C303030655C3030306E5C303030735C303030745C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C30303067} -\BKM@entry{id=13,dest={73756273656374696F6E2E332E312E31},srcline={14}}{5C3337365C3337375C303030415C303030755C303030735C303030775C303030615C303030685C3030306C} +\BKM@entry{id=12,dest={73656374696F6E2E332E31},srcline={11}}{5C3337365C3337375C303030445C303030695C303030655C3030306E5C303030735C303030745C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C30303067} +\BKM@entry{id=13,dest={73756273656374696F6E2E332E312E31},srcline={18}}{5C3337365C3337375C303030415C303030755C303030735C303030775C303030615C303030685C3030306C} \@writefile{toc}{\contentsline {chapter}{\numberline {3}Komponenten-/Softwareauswahl}{9}{chapter.3}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} @@ -87,7 +87,7 @@ \abx@aux@segm{0}{0}{cmake} \abx@aux@cite{0}{rospackages} \abx@aux@segm{0}{0}{rospackages} -\BKM@entry{id=14,dest={73756273656374696F6E2E332E312E32},srcline={51}}{5C3337365C3337375C303030425C303030655C303030735C303030635C303030685C303030725C303030655C303030695C303030625C303030755C3030306E5C30303067} +\BKM@entry{id=14,dest={73756273656374696F6E2E332E312E32},srcline={56}}{5C3337365C3337375C303030425C303030655C303030735C303030635C303030685C303030725C303030655C303030695C303030625C303030755C3030306E5C30303067} \abx@aux@cite{0}{doi:10.1126/scirobotics.abm6074} \abx@aux@segm{0}{0}{doi:10.1126/scirobotics.abm6074} \abx@aux@cite{0}{ros-git} @@ -97,8 +97,8 @@ \abx@aux@segm{0}{0}{colcon} \abx@aux@cite{0}{cmake} \abx@aux@segm{0}{0}{cmake} -\BKM@entry{id=15,dest={73656374696F6E2E332E32},srcline={109}}{5C3337365C3337375C303030535C303030695C3030306D5C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E5C303030735C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C303030675C3030305C3034305C3030305C3035305C303030475C303030615C3030307A5C303030655C303030625C3030306F5C3030305C303531} -\BKM@entry{id=16,dest={73756273656374696F6E2E332E322E31},srcline={111}}{5C3337365C3337375C303030415C303030755C303030735C303030775C303030615C303030685C3030306C} +\BKM@entry{id=15,dest={73656374696F6E2E332E32},srcline={120}}{5C3337365C3337375C303030535C303030695C3030306D5C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E5C303030735C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C303030675C3030305C3034305C3030305C3035305C303030475C303030615C3030307A5C303030655C303030625C3030306F5C3030305C303531} +\BKM@entry{id=16,dest={73756273656374696F6E2E332E322E31},srcline={122}}{5C3337365C3337375C303030415C303030755C303030735C303030775C303030615C303030685C3030306C} \abx@aux@cite{0}{coppelia} \abx@aux@segm{0}{0}{coppelia} \@writefile{toc}{\contentsline {section}{\numberline {3.2}Simulationsumgebung (Gazebo)}{12}{section.3.2}\protected@file@percent } @@ -111,39 +111,39 @@ \abx@aux@segm{0}{0}{unreal} \abx@aux@cite{0}{godot} \abx@aux@segm{0}{0}{godot} -\BKM@entry{id=17,dest={73756273656374696F6E2E332E322E32},srcline={156}}{5C3337365C3337375C303030575C303030655C3030306C5C303030745C3030302D5C3030305C3034305C303030755C3030306E5C303030645C3030305C3034305C3030304D5C3030306F5C303030645C303030655C3030306C5C3030306C5C303030625C303030655C303030735C303030635C303030685C303030725C303030655C303030695C303030625C303030755C3030306E5C30303067} +\BKM@entry{id=17,dest={73756273656374696F6E2E332E322E32},srcline={169}}{5C3337365C3337375C303030575C303030655C3030306C5C303030745C3030302D5C3030305C3034305C303030755C3030306E5C303030645C3030305C3034305C3030304D5C3030306F5C303030645C303030655C3030306C5C3030306C5C303030625C303030655C303030735C303030635C303030685C303030725C303030655C303030695C303030625C303030755C3030306E5C30303067} \abx@aux@cite{0}{sdf-format} \abx@aux@segm{0}{0}{sdf-format} \abx@aux@cite{0}{gazebo-app} \abx@aux@segm{0}{0}{gazebo-app} \@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}Welt- und Modellbeschreibung}{14}{subsection.3.2.2}\protected@file@percent } -\BKM@entry{id=18,dest={73756273656374696F6E2E332E322E33},srcline={192}}{5C3337365C3337375C303030525C3030306F5C303030625C3030306F5C303030745C303030655C303030725C303030735C303030695C3030306D5C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E} +\BKM@entry{id=18,dest={73756273656374696F6E2E332E322E33},srcline={206}}{5C3337365C3337375C303030525C3030306F5C303030625C3030306F5C303030745C303030655C303030725C303030735C303030695C3030306D5C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E} \abx@aux@cite{0}{urdf-format} \abx@aux@segm{0}{0}{urdf-format} -\BKM@entry{id=19,dest={73756273656374696F6E2E332E322E34},srcline={222}}{5C3337365C3337375C3030304D5C303030655C3030306E5C303030735C303030635C303030685C303030655C3030306E5C303030735C303030695C3030306D5C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E} \@writefile{toc}{\contentsline {subsection}{\numberline {3.2.3}Robotersimulation}{15}{subsection.3.2.3}\protected@file@percent } -\BKM@entry{id=20,dest={73656374696F6E2E332E33},srcline={238}}{5C3337365C3337375C303030525C3030306F5C303030625C3030306F5C303030745C303030655C303030725C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C30303067} +\BKM@entry{id=19,dest={73756273656374696F6E2E332E322E34},srcline={236}}{5C3337365C3337375C3030304D5C303030655C3030306E5C303030735C303030635C303030685C303030655C3030306E5C303030735C303030695C3030306D5C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E} +\BKM@entry{id=20,dest={73656374696F6E2E332E33},srcline={252}}{5C3337365C3337375C303030525C3030306F5C303030625C3030306F5C303030745C303030655C303030725C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C30303067} \abx@aux@cite{0}{moveit-docs} \abx@aux@segm{0}{0}{moveit-docs} \@writefile{toc}{\contentsline {subsection}{\numberline {3.2.4}Menschensimulation}{16}{subsection.3.2.4}\protected@file@percent } \@writefile{toc}{\contentsline {section}{\numberline {3.3}Roboterumgebung}{16}{section.3.3}\protected@file@percent } \abx@aux@cite{0}{moveitpython} \abx@aux@segm{0}{0}{moveitpython} -\BKM@entry{id=21,dest={73656374696F6E2E332E34},srcline={279}}{5C3337365C3337375C303030505C303030725C3030306F5C303030675C303030725C303030615C3030306D5C3030306D5C303030695C303030655C303030725C303030735C303030705C303030725C303030615C303030635C303030685C30303065} +\BKM@entry{id=21,dest={73656374696F6E2E332E34},srcline={293}}{5C3337365C3337375C303030505C303030725C3030306F5C303030675C303030725C303030615C3030306D5C3030306D5C303030695C303030655C303030725C303030735C303030705C303030725C303030615C303030635C303030685C30303065} \abx@aux@cite{0}{python} \abx@aux@segm{0}{0}{python} \abx@aux@cite{0}{cpp} \abx@aux@segm{0}{0}{cpp} -\BKM@entry{id=22,dest={73656374696F6E2E332E35},srcline={303}}{5C3337365C3337375C303030425C303030655C303030685C303030615C303030765C303030695C3030306F5C303030725C3030305C3034305C303030545C303030725C303030655C303030655C30303073} +\BKM@entry{id=22,dest={73656374696F6E2E332E35},srcline={317}}{5C3337365C3337375C303030425C303030655C303030685C303030615C303030765C303030695C3030306F5C303030725C3030305C3034305C303030545C303030725C303030655C303030655C30303073} \@writefile{toc}{\contentsline {section}{\numberline {3.4}Programmiersprache}{18}{section.3.4}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {3.5}Behavior Trees}{18}{section.3.5}\protected@file@percent } -\BKM@entry{id=23,dest={73756273656374696F6E2E332E352E31},srcline={352}}{5C3337365C3337375C303030415C303030735C303030795C3030306E5C303030635C303030685C303030725C3030306F5C3030306E5C303030655C3030305C3034305C3030304E5C3030306F5C303030645C303030655C30303073} +\@writefile{toc}{\contentsline {section}{\numberline {3.5}Behavior Trees}{19}{section.3.5}\protected@file@percent } +\BKM@entry{id=23,dest={73756273656374696F6E2E332E352E31},srcline={366}}{5C3337365C3337375C303030415C303030735C303030795C3030306E5C303030635C303030685C303030725C3030306F5C3030306E5C303030655C3030305C3034305C3030304E5C3030306F5C303030645C303030655C30303073} \@writefile{toc}{\contentsline {subsection}{\numberline {3.5.1}Asynchrone Nodes}{20}{subsection.3.5.1}\protected@file@percent } -\BKM@entry{id=24,dest={73756273656374696F6E2E332E352E32},srcline={369}}{5C3337365C3337375C303030445C303030615C303030745C303030655C303030695C303030665C3030306F5C303030725C3030306D5C303030615C30303074} -\BKM@entry{id=25,dest={73656374696F6E2E332E36},srcline={408}}{5C3337365C3337375C303030445C3030306F5C303030635C3030306B5C303030655C303030725C3030302D5C303030435C3030306F5C3030306D5C303030705C3030306F5C303030735C303030655C3030305C3034305C303030615C3030306C5C303030735C3030305C3034305C303030565C303030695C303030725C303030745C303030755C303030615C3030306C5C303030695C303030735C303030695C303030655C303030725C303030755C3030306E5C303030675C303030735C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C30303067} +\BKM@entry{id=24,dest={73756273656374696F6E2E332E352E32},srcline={383}}{5C3337365C3337375C303030445C303030615C303030745C303030655C303030695C303030665C3030306F5C303030725C3030306D5C303030615C30303074} \@writefile{toc}{\contentsline {subsection}{\numberline {3.5.2}Dateiformat}{21}{subsection.3.5.2}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {3.1}{\ignorespaces Beispiel eines BehaviorTrees\relax }}{21}{figure.caption.5}\protected@file@percent } \newlabel{choice_tree_demo}{{3.1}{21}{Beispiel eines BehaviorTrees\relax }{figure.caption.5}{}} +\BKM@entry{id=25,dest={73656374696F6E2E332E36},srcline={422}}{5C3337365C3337375C303030445C3030306F5C303030635C3030306B5C303030655C303030725C3030302D5C303030435C3030306F5C3030306D5C303030705C3030306F5C303030735C303030655C3030305C3034305C303030615C3030306C5C303030735C3030305C3034305C303030565C303030695C303030725C303030745C303030755C303030615C3030306C5C303030695C303030735C303030695C303030655C303030725C303030755C3030306E5C303030675C303030735C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C30303067} \@writefile{lof}{\contentsline {figure}{\numberline {3.2}{\ignorespaces Beispiel eines BehaviorTrees als .xml\relax }}{22}{figure.caption.6}\protected@file@percent } \newlabel{choice_tree_xml}{{3.2}{22}{Beispiel eines BehaviorTrees als .xml\relax }{figure.caption.6}{}} \@writefile{toc}{\contentsline {section}{\numberline {3.6}Docker-Compose als Virtualisierungsumgebung}{22}{section.3.6}\protected@file@percent } @@ -155,117 +155,121 @@ \@writefile{lof}{\contentsline {figure}{\numberline {4.1}{\ignorespaces Visualisierung des überarbeiteten Konzepts\relax }}{24}{figure.caption.7}\protected@file@percent } \newlabel{umsetzung_overview}{{4.1}{24}{Visualisierung des überarbeiteten Konzepts\relax }{figure.caption.7}{}} \@writefile{toc}{\contentsline {section}{\numberline {4.1}Docker-Compose}{25}{section.4.1}\protected@file@percent } -\BKM@entry{id=28,dest={73656374696F6E2E342E32},srcline={68}}{5C3337365C3337375C303030455C3030306E5C303030745C303030775C303030695C303030635C3030306B5C3030306C5C303030755C3030306E5C303030675C303030735C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C30303067} +\BKM@entry{id=28,dest={73656374696F6E2E342E32},srcline={72}}{5C3337365C3337375C303030455C3030306E5C303030745C303030775C303030695C303030635C3030306B5C3030306C5C303030755C3030306E5C303030675C303030735C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C30303067} \@writefile{toc}{\contentsline {section}{\numberline {4.2}Entwicklungsumgebung}{26}{section.4.2}\protected@file@percent } -\BKM@entry{id=29,dest={73656374696F6E2E342E33},srcline={109}}{5C3337365C3337375C303030565C303030655C303030725C303030775C303030655C3030306E5C303030645C303030655C303030745C303030655C3030305C3034305C303030445C303030615C303030745C303030655C3030306E5C303030745C303030795C303030705C303030655C3030306E} +\BKM@entry{id=29,dest={73656374696F6E2E342E33},srcline={113}}{5C3337365C3337375C303030565C303030655C303030725C303030775C303030655C3030306E5C303030645C303030655C303030745C303030655C3030305C3034305C303030445C303030615C303030745C303030655C3030306E5C303030745C303030795C303030705C303030655C3030306E} \@writefile{toc}{\contentsline {section}{\numberline {4.3}Verwendete Datentypen}{27}{section.4.3}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {4.2}{\ignorespaces Entwicklungsumgebung Lapce\relax }}{28}{figure.caption.8}\protected@file@percent } \newlabel{lapce}{{4.2}{28}{Entwicklungsumgebung Lapce\relax }{figure.caption.8}{}} -\BKM@entry{id=30,dest={73656374696F6E2E342E34},srcline={138}}{5C3337365C3337375C303030535C303030695C3030306D5C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E5C303030735C303030775C303030655C3030306C5C30303074} +\BKM@entry{id=30,dest={73656374696F6E2E342E34},srcline={142}}{5C3337365C3337375C303030535C303030695C3030306D5C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E5C303030735C303030775C303030655C3030306C5C30303074} \@writefile{toc}{\contentsline {section}{\numberline {4.4}Simulationswelt}{29}{section.4.4}\protected@file@percent } -\BKM@entry{id=31,dest={73656374696F6E2E342E35},srcline={177}}{5C3337365C3337375C3030304D5C303030655C3030306E5C303030735C303030635C30303068} -\BKM@entry{id=32,dest={73756273656374696F6E2E342E352E31},srcline={178}}{5C3337365C3337375C3030305C3333345C303030625C303030655C303030725C303030735C303030695C303030635C303030685C30303074} +\BKM@entry{id=31,dest={73656374696F6E2E342E35},srcline={181}}{5C3337365C3337375C3030304D5C303030655C3030306E5C303030735C303030635C30303068} +\BKM@entry{id=32,dest={73756273656374696F6E2E342E352E31},srcline={182}}{5C3337365C3337375C3030305C3333345C303030625C303030655C303030725C303030735C303030695C303030635C303030685C30303074} \@writefile{lof}{\contentsline {figure}{\numberline {4.3}{\ignorespaces Geplanter Raum\relax }}{30}{figure.caption.9}\protected@file@percent } \newlabel{room-plan}{{4.3}{30}{Geplanter Raum\relax }{figure.caption.9}{}} \@writefile{lof}{\contentsline {figure}{\numberline {4.4}{\ignorespaces Umsetzung in Blender\relax }}{30}{figure.caption.9}\protected@file@percent } \newlabel{room-finished}{{4.4}{30}{Umsetzung in Blender\relax }{figure.caption.9}{}} -\BKM@entry{id=33,dest={73756273656374696F6E2E342E352E32},srcline={191}}{5C3337365C3337375C3030304D5C3030306F5C303030645C303030655C3030306C5C3030306C5C303030695C303030655C303030725C303030755C3030306E5C30303067} -\abx@aux@cite{0}{rigify} -\abx@aux@segm{0}{0}{rigify} +\BKM@entry{id=33,dest={73756273656374696F6E2E342E352E32},srcline={198}}{5C3337365C3337375C3030304D5C3030306F5C303030645C303030655C3030306C5C3030306C5C303030695C303030655C303030725C303030755C3030306E5C30303067} \@writefile{toc}{\contentsline {section}{\numberline {4.5}Mensch}{31}{section.4.5}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {4.5.1}Übersicht}{31}{subsection.4.5.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {4.5.2}Modellierung}{31}{subsection.4.5.2}\protected@file@percent } -\@writefile{lof}{\contentsline {figure}{\numberline {4.5}{\ignorespaces Knochen des Modells\relax }}{32}{figure.caption.10}\protected@file@percent } -\newlabel{person-bones}{{4.5}{32}{Knochen des Modells\relax }{figure.caption.10}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {4.6}{\ignorespaces Armaturen des Modells\relax }}{32}{figure.caption.10}\protected@file@percent } -\newlabel{person-armature}{{4.6}{32}{Armaturen des Modells\relax }{figure.caption.10}{}} -\BKM@entry{id=34,dest={73756273656374696F6E2E342E352E33},srcline={272}}{5C3337365C3337375C303030455C303030785C303030705C3030306F5C303030725C303030745C3030305C3034305C303030645C303030655C303030725C3030305C3034305C3030304D5C3030306F5C303030645C303030655C3030306C5C3030306C5C303030615C3030306E5C303030695C3030306D5C303030615C303030745C303030695C3030306F5C3030306E5C303030655C3030306E} +\abx@aux@cite{0}{rigify} +\abx@aux@segm{0}{0}{rigify} +\@writefile{lof}{\contentsline {figure}{\numberline {4.5}{\ignorespaces Knochen des Modells\relax }}{33}{figure.caption.10}\protected@file@percent } +\newlabel{person-bones}{{4.5}{33}{Knochen des Modells\relax }{figure.caption.10}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.6}{\ignorespaces Armaturen des Modells\relax }}{33}{figure.caption.10}\protected@file@percent } +\newlabel{person-armature}{{4.6}{33}{Armaturen des Modells\relax }{figure.caption.10}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.7}{\ignorespaces Visualisierung der generierten Beugeachse\relax }}{33}{figure.caption.11}\protected@file@percent } +\newlabel{bend}{{4.7}{33}{Visualisierung der generierten Beugeachse\relax }{figure.caption.11}{}} +\BKM@entry{id=34,dest={73756273656374696F6E2E342E352E33},srcline={283}}{5C3337365C3337375C303030455C303030785C303030705C3030306F5C303030725C303030745C3030305C3034305C303030645C303030655C303030725C3030305C3034305C3030304D5C3030306F5C303030645C303030655C3030306C5C3030306C5C303030615C3030306E5C303030695C3030306D5C303030615C303030745C303030695C3030306F5C3030306E5C303030655C3030306E} \abx@aux@cite{0}{gamerig} \abx@aux@segm{0}{0}{gamerig} -\@writefile{lof}{\contentsline {figure}{\numberline {4.7}{\ignorespaces Visualisierung der generierten Beugeachse\relax }}{34}{figure.caption.11}\protected@file@percent } -\newlabel{bend}{{4.7}{34}{Visualisierung der generierten Beugeachse\relax }{figure.caption.11}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {4.5.3}Export der Modellanimationen}{34}{subsection.4.5.3}\protected@file@percent } -\BKM@entry{id=35,dest={73756273656374696F6E2E342E352E34},srcline={326}}{5C3337365C3337375C303030505C303030725C3030306F5C303030675C303030725C303030615C3030306D5C3030306D5C303030695C303030655C303030725C303030755C3030306E5C30303067} -\@writefile{lof}{\contentsline {figure}{\numberline {4.8}{\ignorespaces Vorbereitung zum Export mit GameRig\relax }}{36}{figure.caption.12}\protected@file@percent } -\newlabel{export-prepare}{{4.8}{36}{Vorbereitung zum Export mit GameRig\relax }{figure.caption.12}{}} +\BKM@entry{id=35,dest={73756273656374696F6E2E342E352E34},srcline={337}}{5C3337365C3337375C303030505C303030725C3030306F5C303030675C303030725C303030615C3030306D5C3030306D5C303030695C303030655C303030725C303030755C3030306E5C30303067} +\@writefile{lof}{\contentsline {figure}{\numberline {4.8}{\ignorespaces Vorbereitung zum Export mit GameRig\relax }}{35}{figure.caption.12}\protected@file@percent } +\newlabel{export-prepare}{{4.8}{35}{Vorbereitung zum Export mit GameRig\relax }{figure.caption.12}{}} \@writefile{lof}{\contentsline {figure}{\numberline {4.9}{\ignorespaces Benötigte Exporteinstellungen in Blender\relax }}{36}{figure.caption.13}\protected@file@percent } \newlabel{export-settings}{{4.9}{36}{Benötigte Exporteinstellungen in Blender\relax }{figure.caption.13}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.5.4}Programmierung}{37}{subsection.4.5.4}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Message Queue}{37}{subsubsection*.15}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Nachrichten}{38}{subsubsection*.17}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.5.4}Programmierung}{36}{subsection.4.5.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Message Queue}{36}{subsubsection*.15}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline ROS-Nachrichten}{38}{subsubsection*.17}\protected@file@percent } \@writefile{toc}{\contentsline {subsubsection}{\nonumberline ActorPlugin}{39}{subsubsection*.19}\protected@file@percent } -\BKM@entry{id=36,dest={73656374696F6E2E342E36},srcline={438}}{5C3337365C3337375C303030525C3030306F5C303030625C3030306F5C303030745C303030655C30303072} -\BKM@entry{id=37,dest={73756273656374696F6E2E342E362E31},srcline={439}}{5C3337365C3337375C3030305C3333345C303030625C303030655C303030725C303030735C303030695C303030635C303030685C30303074} -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline ActorServer}{40}{subsubsection*.21}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {4.6}Roboter}{40}{section.4.6}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {4.6.1}Übersicht}{40}{subsection.4.6.1}\protected@file@percent } -\BKM@entry{id=38,dest={73756273656374696F6E2E342E362E32},srcline={447}}{5C3337365C3337375C3030304D5C3030306F5C303030645C303030655C3030306C5C3030306C5C303030695C303030655C303030725C303030755C3030306E5C30303067} +\abx@aux@cite{0}{ignPlugin} +\abx@aux@segm{0}{0}{ignPlugin} +\@writefile{lof}{\contentsline {figure}{\numberline {4.10}{\ignorespaces Zustandsübergänge im ActorPlugin\relax }}{42}{figure.caption.20}\protected@file@percent } +\newlabel{plugin_states}{{4.10}{42}{Zustandsübergänge im ActorPlugin\relax }{figure.caption.20}{}} +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline ActorServer}{42}{subsubsection*.22}\protected@file@percent } +\BKM@entry{id=36,dest={73656374696F6E2E342E36},srcline={549}}{5C3337365C3337375C303030525C3030306F5C303030625C3030306F5C303030745C303030655C30303072} +\BKM@entry{id=37,dest={73756273656374696F6E2E342E362E31},srcline={550}}{5C3337365C3337375C3030305C3333345C303030625C303030655C303030725C303030735C303030695C303030635C303030685C30303074} +\BKM@entry{id=38,dest={73756273656374696F6E2E342E362E32},srcline={558}}{5C3337365C3337375C3030304D5C3030306F5C303030645C303030655C3030306C5C3030306C5C303030695C303030655C303030725C303030755C3030306E5C30303067} \abx@aux@cite{0}{freecad} \abx@aux@segm{0}{0}{freecad} -\@writefile{lof}{\contentsline {figure}{\numberline {4.10}{\ignorespaces Rohdaten aus .stl-Datei\relax }}{41}{figure.caption.22}\protected@file@percent } -\newlabel{robot_raw}{{4.10}{41}{Rohdaten aus .stl-Datei\relax }{figure.caption.22}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.6.2}Modellierung}{41}{subsection.4.6.2}\protected@file@percent } -\BKM@entry{id=39,dest={73756273656374696F6E2E342E362E33},srcline={494}}{5C3337365C3337375C3030304D5C3030306F5C303030765C303030655C303030495C303030745C3030305C3034305C303030325C3030305C3034305C3030304B5C3030306F5C3030306E5C303030665C303030695C303030675C303030755C303030725C303030615C303030745C303030695C3030306F5C3030306E} -\@writefile{lof}{\contentsline {figure}{\numberline {4.11}{\ignorespaces Visuelles Modell\relax }}{42}{figure.caption.23}\protected@file@percent } -\newlabel{robot_visual}{{4.11}{42}{Visuelles Modell\relax }{figure.caption.23}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {4.12}{\ignorespaces Kollisionsmodell\relax }}{42}{figure.caption.23}\protected@file@percent } -\newlabel{robot_collision}{{4.12}{42}{Kollisionsmodell\relax }{figure.caption.23}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.6.3}MoveIt 2 Konfiguration}{42}{subsection.4.6.3}\protected@file@percent } -\BKM@entry{id=40,dest={73756273656374696F6E2E342E362E34},srcline={509}}{5C3337365C3337375C303030495C3030306E5C303030745C303030655C303030675C303030725C303030615C303030745C303030695C3030306F5C3030306E5C3030305C3034305C3030306D5C303030695C303030745C3030305C3034305C303030475C303030615C3030307A5C303030655C303030625C3030306F} -\BKM@entry{id=41,dest={73656374696F6E2E342E37},srcline={521}}{5C3337365C3337375C303030425C303030655C303030685C303030615C303030765C303030695C3030306F5C303030725C3030305C3034305C303030545C303030725C303030655C303030655C30303073} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.6.4}Integration mit Gazebo}{43}{subsection.4.6.4}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {4.7}Behavior Trees}{43}{section.4.7}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Allgemein nutzbare Nodes}{44}{subsubsection*.25}\protected@file@percent } -\BKM@entry{id=42,dest={73756273656374696F6E2E342E372E31},srcline={595}}{5C3337365C3337375C303030535C303030755C303030625C303030745C303030725C303030655C303030655C30303073} -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Menschenspezifisch}{45}{subsubsection*.27}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Roboterspezifisch}{45}{subsubsection*.29}\protected@file@percent } -\BKM@entry{id=43,dest={73756273656374696F6E2E342E372E32},srcline={599}}{5C3337365C3337375C303030565C303030655C303030725C303030685C303030615C3030306C5C303030745C303030655C3030306E5C3030305C3034305C303030645C303030655C303030735C3030305C3034305C303030525C3030306F5C303030625C3030306F5C303030745C303030655C303030725C30303073} -\BKM@entry{id=44,dest={73756273656374696F6E2E342E372E33},srcline={601}}{5C3337365C3337375C303030565C303030655C303030725C303030685C303030615C3030306C5C303030745C303030655C3030306E5C3030305C3034305C303030645C303030655C303030735C3030305C3034305C3030304D5C303030655C3030306E5C303030735C303030635C303030685C303030655C3030306E} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.7.1}Subtrees}{46}{subsection.4.7.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {4.7.2}Verhalten des Roboters}{46}{subsection.4.7.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {4.7.3}Verhalten des Menschen}{46}{subsection.4.7.3}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {4.6}Roboter}{43}{section.4.6}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.6.1}Übersicht}{43}{subsection.4.6.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.6.2}Modellierung}{43}{subsection.4.6.2}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {4.11}{\ignorespaces Rohdaten aus .stl-Datei\relax }}{44}{figure.caption.23}\protected@file@percent } +\newlabel{robot_raw}{{4.11}{44}{Rohdaten aus .stl-Datei\relax }{figure.caption.23}{}} +\BKM@entry{id=39,dest={73756273656374696F6E2E342E362E33},srcline={605}}{5C3337365C3337375C3030304D5C3030306F5C303030765C303030655C303030495C303030745C3030305C3034305C303030325C3030305C3034305C3030304B5C3030306F5C3030306E5C303030665C303030695C303030675C303030755C303030725C303030615C303030745C303030695C3030306F5C3030306E} +\@writefile{lof}{\contentsline {figure}{\numberline {4.12}{\ignorespaces Visuelles Modell\relax }}{45}{figure.caption.24}\protected@file@percent } +\newlabel{robot_visual}{{4.12}{45}{Visuelles Modell\relax }{figure.caption.24}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {4.13}{\ignorespaces Kollisionsmodell\relax }}{45}{figure.caption.24}\protected@file@percent } +\newlabel{robot_collision}{{4.13}{45}{Kollisionsmodell\relax }{figure.caption.24}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.6.3}MoveIt 2 Konfiguration}{45}{subsection.4.6.3}\protected@file@percent } +\BKM@entry{id=40,dest={73756273656374696F6E2E342E362E34},srcline={620}}{5C3337365C3337375C303030495C3030306E5C303030745C303030655C303030675C303030725C303030615C303030745C303030695C3030306F5C3030306E5C3030305C3034305C3030306D5C303030695C303030745C3030305C3034305C303030475C303030615C3030307A5C303030655C303030625C3030306F} +\BKM@entry{id=41,dest={73656374696F6E2E342E37},srcline={632}}{5C3337365C3337375C303030425C303030655C303030685C303030615C303030765C303030695C3030306F5C303030725C3030305C3034305C303030545C303030725C303030655C303030655C30303073} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.6.4}Integration mit Gazebo}{46}{subsection.4.6.4}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {4.7}Behavior Trees}{46}{section.4.7}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Allgemein nutzbare Nodes}{46}{subsubsection*.26}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Menschenspezifisch}{47}{subsubsection*.28}\protected@file@percent } +\BKM@entry{id=42,dest={73756273656374696F6E2E342E372E31},srcline={706}}{5C3337365C3337375C303030535C303030755C303030625C303030745C303030725C303030655C303030655C30303073} +\BKM@entry{id=43,dest={73756273656374696F6E2E342E372E32},srcline={710}}{5C3337365C3337375C303030565C303030655C303030725C303030685C303030615C3030306C5C303030745C303030655C3030306E5C3030305C3034305C303030645C303030655C303030735C3030305C3034305C303030525C3030306F5C303030625C3030306F5C303030745C303030655C303030725C30303073} +\BKM@entry{id=44,dest={73756273656374696F6E2E342E372E33},srcline={712}}{5C3337365C3337375C303030565C303030655C303030725C303030685C303030615C3030306C5C303030745C303030655C3030306E5C3030305C3034305C303030645C303030655C303030735C3030305C3034305C3030304D5C303030655C3030306E5C303030735C303030635C303030685C303030655C3030306E} +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Roboterspezifisch}{48}{subsubsection*.30}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.7.1}Subtrees}{48}{subsection.4.7.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.7.2}Verhalten des Roboters}{48}{subsection.4.7.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.7.3}Verhalten des Menschen}{48}{subsection.4.7.3}\protected@file@percent } \BKM@entry{id=45,dest={636861707465722E35},srcline={101}}{5C3337365C3337375C303030535C3030307A5C303030655C3030306E5C303030615C303030725C303030695C303030655C3030306E5C303030625C303030615C303030735C303030695C303030655C303030725C303030745C303030655C3030305C3034305C303030455C303030765C303030615C3030306C5C303030755C303030615C303030745C303030695C3030306F5C3030306E} \BKM@entry{id=46,dest={73656374696F6E2E352E31},srcline={102}}{5C3337365C3337375C303030535C303030695C3030306D5C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E5C3030305C3034305C303030645C303030655C303030735C3030305C3034305C3030304D5C303030655C3030306E5C303030735C303030635C303030685C303030655C3030306E} \BKM@entry{id=47,dest={73656374696F6E2E352E32},srcline={106}}{5C3337365C3337375C303030425C303030655C303030775C303030655C303030675C303030755C3030306E5C303030675C3030305C3034305C303030645C303030655C303030735C3030305C3034305C303030525C3030306F5C303030625C3030306F5C303030745C303030655C303030725C30303073} \BKM@entry{id=48,dest={73656374696F6E2E352E33},srcline={112}}{5C3337365C3337375C303030425C303030655C303030685C303030615C303030765C303030695C3030306F5C303030725C303030545C303030725C303030655C303030655C30303073} \BKM@entry{id=49,dest={73756273656374696F6E2E352E332E31},srcline={113}}{5C3337365C3337375C3030304E5C3030306F5C303030645C303030655C30303073} \BKM@entry{id=50,dest={73756273656374696F6E2E352E332E32},srcline={117}}{5C3337365C3337375C3030304B5C3030306F5C3030306D5C303030625C303030695C3030306E5C303030695C303030655C303030725C303030655C3030306E5C3030305C3034305C303030765C3030306F5C3030306E5C3030305C3034305C3030304E5C3030306F5C303030645C303030655C303030735C3030305C3034305C3030307A5C303030755C3030305C3034305C303030655C303030695C3030306E5C303030655C303030725C3030305C3034305C303030525C303030655C303030715C303030755C303030655C303030735C30303074} -\@writefile{toc}{\contentsline {chapter}{\numberline {5}Szenarienbasierte Evaluation}{47}{chapter.5}\protected@file@percent } +\@writefile{toc}{\contentsline {chapter}{\numberline {5}Szenarienbasierte Evaluation}{49}{chapter.5}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} -\@writefile{toc}{\contentsline {section}{\numberline {5.1}Simulation des Menschen}{47}{section.5.1}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {5.2}Bewegung des Roboters}{47}{section.5.2}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {5.3}BehaviorTrees}{47}{section.5.3}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {5.3.1}Nodes}{47}{subsection.5.3.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {5.3.2}Kombinieren von Nodes zu einer Request}{47}{subsection.5.3.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {5.1}Simulation des Menschen}{49}{section.5.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {5.2}Bewegung des Roboters}{49}{section.5.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {5.3}BehaviorTrees}{49}{section.5.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {5.3.1}Nodes}{49}{subsection.5.3.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {5.3.2}Kombinieren von Nodes zu einer Request}{49}{subsection.5.3.2}\protected@file@percent } \BKM@entry{id=51,dest={636861707465722E36},srcline={121}}{5C3337365C3337375C303030445C303030695C303030735C3030306B5C303030755C303030735C303030735C303030695C3030306F5C3030306E} \BKM@entry{id=52,dest={73656374696F6E2E362E31},srcline={122}}{5C3337365C3337375C3030304C5C303030655C303030735C303030735C3030306F5C3030306E5C303030735C3030305C3034305C3030304C5C303030655C303030615C303030725C3030306E5C303030655C303030645C3030305C3034305C303030625C303030655C303030695C3030305C3034305C303030645C303030655C303030725C3030305C3034305C303030555C3030306D5C303030735C303030655C303030745C3030307A5C303030755C3030306E5C30303067} \BKM@entry{id=53,dest={73756273656374696F6E2E362E312E31},srcline={126}}{5C3337365C3337375C303030455C303030725C303030735C303030745C303030655C3030306C5C3030306C5C303030755C3030306E5C303030675C3030305C3034305C303030645C303030655C303030735C3030305C3034305C303030525C3030306F5C303030625C3030306F5C303030745C303030655C303030725C3030306D5C3030306F5C303030645C303030655C3030306C5C3030306C5C30303073} \BKM@entry{id=54,dest={73756273656374696F6E2E362E312E32},srcline={132}}{5C3337365C3337375C303030455C303030725C303030775C303030655C303030695C303030745C303030655C303030725C303030755C3030306E5C303030675C3030305C3034305C303030645C303030655C303030735C3030305C3034305C303030525C3030306F5C303030625C3030306F5C303030745C303030655C303030725C3030306D5C3030306F5C303030645C303030655C3030306C5C3030306C5C303030735C3030305C3034305C3030306D5C303030695C303030745C3030305C3034305C3030304D5C3030306F5C303030765C303030655C303030495C30303074} \BKM@entry{id=55,dest={73756273656374696F6E2E362E312E33},srcline={136}}{5C3337365C3337375C303030475C303030615C3030307A5C303030655C303030625C3030306F} -\@writefile{toc}{\contentsline {chapter}{\numberline {6}Diskussion}{48}{chapter.6}\protected@file@percent } +\@writefile{toc}{\contentsline {chapter}{\numberline {6}Diskussion}{50}{chapter.6}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} -\@writefile{toc}{\contentsline {section}{\numberline {6.1}Lessons Learned bei der Umsetzung}{48}{section.6.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.1}Erstellung des Robotermodells}{48}{subsection.6.1.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.2}Erweiterung des Robotermodells mit MoveIt}{48}{subsection.6.1.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.3}Gazebo}{48}{subsection.6.1.3}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Upgrade auf Ignition}{48}{subsubsection*.31}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Pluginarchitektur}{49}{subsubsection*.33}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {6.1}Lessons Learned bei der Umsetzung}{50}{section.6.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.1}Erstellung des Robotermodells}{50}{subsection.6.1.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.2}Erweiterung des Robotermodells mit MoveIt}{50}{subsection.6.1.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.3}Gazebo}{50}{subsection.6.1.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Upgrade auf Ignition}{50}{subsubsection*.32}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Pluginarchitektur}{51}{subsubsection*.34}\protected@file@percent } \BKM@entry{id=56,dest={73756273656374696F6E2E362E312E34},srcline={183}}{5C3337365C3337375C303030525C3030304F5C303030535C30303032} \BKM@entry{id=57,dest={73756273656374696F6E2E362E312E35},srcline={190}}{5C3337365C3337375C3030304D5C3030306F5C303030765C303030655C303030495C303030745C30303032} -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Fehlende Animationsgrundlagen}{50}{subsubsection*.35}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.4}ROS2}{50}{subsection.6.1.4}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Nachrichten und deren Echtzeitfähigkeit}{50}{subsubsection*.37}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Änderung der Compilertoolchain}{50}{subsubsection*.39}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.5}MoveIt2}{50}{subsection.6.1.5}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Upgrade auf MoveIt2}{50}{subsubsection*.41}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Fehlende Animationsgrundlagen}{52}{subsubsection*.36}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.4}ROS2}{52}{subsection.6.1.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Nachrichten und deren Echtzeitfähigkeit}{52}{subsubsection*.38}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Änderung der Compilertoolchain}{52}{subsubsection*.40}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {6.1.5}MoveIt2}{52}{subsection.6.1.5}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Upgrade auf MoveIt2}{52}{subsubsection*.42}\protected@file@percent } \BKM@entry{id=58,dest={73656374696F6E2E362E32},srcline={203}}{5C3337365C3337375C3030304C5C303030655C303030735C303030735C3030306F5C3030306E5C303030735C3030305C3034305C3030304C5C303030655C303030615C303030725C3030306E5C303030655C303030645C3030305C3034305C303030625C303030655C303030695C3030305C3034305C303030645C303030655C3030306E5C3030305C3034305C303030535C3030307A5C303030655C3030306E5C303030615C303030725C303030695C303030655C3030306E} \BKM@entry{id=59,dest={73756273656374696F6E2E362E322E31},srcline={204}}{5C3337365C3337375C303030445C303030655C303030625C303030755C303030675C303030675C303030695C3030306E5C30303067} -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Fehlerhafte Generierung der Roboter}{51}{subsubsection*.43}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Controller}{51}{subsubsection*.45}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {6.2}Lessons Learned bei den Szenarien}{51}{section.6.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.1}Debugging}{51}{subsection.6.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Fehlerhafte Generierung der Roboter}{53}{subsubsection*.44}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Controller}{53}{subsubsection*.46}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {6.2}Lessons Learned bei den Szenarien}{53}{section.6.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.1}Debugging}{53}{subsection.6.2.1}\protected@file@percent } \BKM@entry{id=60,dest={636861707465722E37},srcline={210}}{5C3337365C3337375C3030305A5C303030755C303030735C303030615C3030306D5C3030306D5C303030655C3030306E5C303030665C303030615C303030735C303030735C303030755C3030306E5C303030675C3030305C3034305C303030755C3030306E5C303030645C3030305C3034305C303030415C303030755C303030735C303030625C3030306C5C303030695C303030635C3030306B} \BKM@entry{id=61,dest={73656374696F6E2E372E31},srcline={211}}{5C3337365C3337375C303030455C303030725C303030675C303030655C303030625C3030306E5C303030695C303030735C303030735C30303065} \BKM@entry{id=62,dest={73756273656374696F6E2E372E312E31},srcline={212}}{5C3337365C3337375C303030475C303030725C303030615C303030705C303030685C303030695C303030735C303030635C303030685C303030655C3030305C3034305C303030525C303030655C303030705C303030725C3030305C3334345C303030735C303030655C3030306E5C303030745C303030615C303030745C303030695C3030306F5C3030306E5C3030305C3034305C303030645C303030655C303030725C3030305C3034305C303030535C3030307A5C303030655C3030306E5C303030615C303030725C303030695C303030655C3030306E} @@ -275,23 +279,23 @@ \BKM@entry{id=66,dest={73756273656374696F6E2E372E332E31},srcline={225}}{5C3337365C3337375C303030555C3030306D5C303030735C303030655C303030745C3030307A5C303030755C3030306E5C303030675C3030305C3034305C303030695C3030306E5C3030305C3034305C303030615C3030306E5C303030645C303030655C303030725C303030655C3030306D5C3030305C3034305C303030535C303030695C3030306D5C303030755C3030306C5C303030615C303030745C3030306F5C30303072} \BKM@entry{id=67,dest={73756273656374696F6E2E372E332E32},srcline={229}}{5C3337365C3337375C303030535C303030695C3030306D5C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E5C3030305C3034305C303030625C303030655C303030775C303030655C303030675C303030745C303030655C303030725C3030305C3034305C3030304F5C303030625C3030306A5C303030655C3030306B5C303030745C30303065} \BKM@entry{id=68,dest={73756273656374696F6E2E372E332E33},srcline={231}}{5C3337365C3337375C303030455C303030725C303030675C3030305C3334345C3030306E5C3030307A5C303030755C3030306E5C303030675C3030305C3034305C303030765C3030306F5C3030306E5C3030305C3034305C303030555C3030306D5C303030675C303030655C303030625C303030755C3030306E5C303030675C303030735C303030655C303030725C3030306B5C303030655C3030306E5C3030306E5C303030755C3030306E5C30303067} -\@writefile{toc}{\contentsline {chapter}{\numberline {7}Zusammenfassung und Ausblick}{52}{chapter.7}\protected@file@percent } +\@writefile{toc}{\contentsline {chapter}{\numberline {7}Zusammenfassung und Ausblick}{54}{chapter.7}\protected@file@percent } \@writefile{lof}{\addvspace {10\p@ }} \@writefile{lot}{\addvspace {10\p@ }} -\@writefile{toc}{\contentsline {section}{\numberline {7.1}Ergebnisse}{52}{section.7.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {7.1.1}Graphische Repräsentation der Szenarien}{52}{subsection.7.1.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {7.1.2}Anpassung der Behavior Trees an Szenarien}{52}{subsection.7.1.2}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {7.2}Diskussion}{52}{section.7.2}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {7.3}Ausblick}{52}{section.7.3}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.1}Umsetzung in anderem Simulator}{52}{subsection.7.3.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.2}Simulation bewegter Objekte}{52}{subsection.7.3.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {7.1}Ergebnisse}{54}{section.7.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {7.1.1}Graphische Repräsentation der Szenarien}{54}{subsection.7.1.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {7.1.2}Anpassung der Behavior Trees an Szenarien}{54}{subsection.7.1.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {7.2}Diskussion}{54}{section.7.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {7.3}Ausblick}{54}{section.7.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.1}Umsetzung in anderem Simulator}{54}{subsection.7.3.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.2}Simulation bewegter Objekte}{54}{subsection.7.3.2}\protected@file@percent } \abx@aux@cite{0}{octomap} \abx@aux@segm{0}{0}{octomap} \BKM@entry{id=69,dest={73756273656374696F6E2E372E332E34},srcline={237}}{5C3337365C3337375C3030305A5C303030755C303030735C303030615C3030306D5C3030306D5C303030655C3030306E5C303030625C303030725C303030695C3030306E5C303030675C303030655C3030306E5C3030305C3034305C303030765C3030306F5C3030306E5C3030305C3034305C303030415C303030635C303030745C3030306F5C303030725C303030505C3030306C5C303030755C303030675C303030695C3030306E5C3030305C3034305C303030755C3030306E5C303030645C3030305C3034305C303030415C303030635C303030745C3030306F5C303030725C303030535C303030655C303030725C303030765C303030655C30303072} \BKM@entry{id=70,dest={73756273656374696F6E2E372E332E35},srcline={244}}{5C3337365C3337375C303030535C303030655C303030705C303030615C303030725C303030695C303030655C303030725C303030655C3030306E5C3030305C3034305C303030645C303030655C303030725C3030305C3034305C303030535C303030755C303030625C303030745C303030725C303030655C303030655C303030735C3030305C3034305C303030695C3030306E5C3030305C3034305C303030655C303030695C303030675C303030655C3030306E5C303030655C3030305C3034305C303030445C303030615C303030745C303030655C303030695C303030655C3030306E} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.3}Ergänzung von Umgebungserkennung}{53}{subsection.7.3.3}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.4}Zusammenbringen von ActorPlugin und ActorServer}{53}{subsection.7.3.4}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.5}Separieren der Subtrees in eigene Dateien}{53}{subsection.7.3.5}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.3}Ergänzung von Umgebungserkennung}{55}{subsection.7.3.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.4}Zusammenbringen von ActorPlugin und ActorServer}{55}{subsection.7.3.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.5}Separieren der Subtrees in eigene Dateien}{55}{subsection.7.3.5}\protected@file@percent } \abx@aux@cite{0}{moveitpipeline} \abx@aux@segm{0}{0}{moveitpipeline} \abx@aux@cite{0}{moveitpipeline} @@ -302,13 +306,13 @@ 391704321A86D34384492C034ECA3CFA82CA0C42AFE0759A4F1491A6B69BC02A.pygtex} \ACRO{total-barriers}{1} \providecommand\totalcount@set[2]{} -\totalcount@set{page}{56} -\@writefile{lof}{\contentsline {figure}{\numberline {7.1}{\ignorespaces Visualisierung der MoveIt Pipeline \cite {moveitpipeline}\relax }}{56}{figure.caption.47}\protected@file@percent } -\newlabel{moveitpipeline}{{7.1}{56}{Visualisierung der MoveIt Pipeline \protect \cite {moveitpipeline}\relax }{figure.caption.47}{}} +\totalcount@set{page}{58} +\@writefile{lof}{\contentsline {figure}{\numberline {7.1}{\ignorespaces Visualisierung der MoveIt Pipeline \cite {moveitpipeline}\relax }}{58}{figure.caption.48}\protected@file@percent } +\newlabel{moveitpipeline}{{7.1}{58}{Visualisierung der MoveIt Pipeline \protect \cite {moveitpipeline}\relax }{figure.caption.48}{}} \ACRO{usage}{ros=={0}} \ACRO{usage}{fsm=={0}} \ACRO{usage}{mrk=={0}} -\abx@aux@read@bbl@mdfivesum{615C50B9B95C7B88A6BAC6B451B896D1} +\abx@aux@read@bbl@mdfivesum{C780F86DF5F6185AC7456C1F715CB974} \abx@aux@defaultrefcontext{0}{gamerig}{nty/global//global/global} \abx@aux@defaultrefcontext{0}{1087032}{nty/global//global/global} \abx@aux@defaultrefcontext{0}{cmake}{nty/global//global/global} @@ -323,6 +327,7 @@ \abx@aux@defaultrefcontext{0}{halo2}{nty/global//global/global} \abx@aux@defaultrefcontext{0}{ros-git}{nty/global//global/global} \abx@aux@defaultrefcontext{0}{godot}{nty/global//global/global} +\abx@aux@defaultrefcontext{0}{ignPlugin}{nty/global//global/global} \abx@aux@defaultrefcontext{0}{isla2005handling}{nty/global//global/global} \abx@aux@defaultrefcontext{0}{doi:10.1126/scirobotics.abm6074}{nty/global//global/global} \abx@aux@defaultrefcontext{0}{moveit-docs}{nty/global//global/global} @@ -344,4 +349,4 @@ \global\@namedef{scr@dte@figure@lastmaxnumwidth}{23.84654pt} \@writefile{toc}{\providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file} \@writefile{lof}{\providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file} -\gdef \@abspage@last{63} +\gdef \@abspage@last{65} diff --git a/main.bbl b/main.bbl index 07a5d96..1adff7f 100644 --- a/main.bbl +++ b/main.bbl @@ -295,6 +295,19 @@ \verb https://godotengine.org \endverb \endentry + \entry{ignPlugin}{misc}{} + \field{sortinit}{I} + \field{sortinithash}{8d291c51ee89b6cd86bf5379f0b151d8} + \field{labeltitlesource}{title} + \field{note}{letzter Zugriff 01.06.2023} + \field{title}{Ignition Gazebo: Create System Plugins} + \verb{urlraw} + \verb https://gazebosim.org/api/gazebo/2.10/createsystemplugins.html + \endverb + \verb{url} + \verb https://gazebosim.org/api/gazebo/2.10/createsystemplugins.html + \endverb + \endentry \entry{isla2005handling}{misc}{} \name{author}{1}{}{% {{hash=04a4610505a94b6883df923efb3f2f3e}{% diff --git a/main.bcf b/main.bcf index 7619d2c..d270107 100644 --- a/main.bcf +++ b/main.bcf @@ -2392,10 +2392,11 @@ cpp rigify gamerig - freecad - octomap - moveitpipeline + ignPlugin + freecad + octomap moveitpipeline + moveitpipeline diff --git a/main.blg b/main.blg index a6b7d93..a128a4e 100644 --- a/main.blg +++ b/main.blg @@ -1,15 +1,15 @@ [0] Config.pm:307> INFO - This is Biber 2.19 [0] Config.pm:310> INFO - Logfile is 'main.blg' -[45] biber:340> INFO - === Do Mai 25, 2023, 12:54:44 -[55] Biber.pm:419> INFO - Reading 'main.bcf' -[95] Biber.pm:979> INFO - Found 29 citekeys in bib section 0 +[44] biber:340> INFO - === Fr Jun 9, 2023, 15:47:34 +[54] Biber.pm:419> INFO - Reading 'main.bcf' +[95] Biber.pm:979> INFO - Found 30 citekeys in bib section 0 [102] Biber.pm:4419> INFO - Processing section 0 -[108] Biber.pm:4610> INFO - Looking for bibtex file 'main.bib' for section 0 -[109] bibtex.pm:1713> INFO - LaTeX decoding ... -[120] bibtex.pm:1519> INFO - Found BibTeX data source 'main.bib' -[173] UCollate.pm:68> INFO - Overriding locale 'de-DE' defaults 'variable = shifted' with 'variable = non-ignorable' -[173] UCollate.pm:68> INFO - Overriding locale 'de-DE' defaults 'normalization = NFD' with 'normalization = prenormalized' -[173] Biber.pm:4239> INFO - Sorting list 'nty/global//global/global' of type 'entry' with template 'nty' and locale 'de-DE' -[173] Biber.pm:4245> INFO - No sort tailoring available for locale 'de-DE' -[216] bbl.pm:660> INFO - Writing 'main.bbl' with encoding 'UTF-8' -[220] bbl.pm:763> INFO - Output to main.bbl +[110] Biber.pm:4610> INFO - Looking for bibtex file 'main.bib' for section 0 +[111] bibtex.pm:1713> INFO - LaTeX decoding ... +[122] bibtex.pm:1519> INFO - Found BibTeX data source 'main.bib' +[180] UCollate.pm:68> INFO - Overriding locale 'de-DE' defaults 'variable = shifted' with 'variable = non-ignorable' +[180] UCollate.pm:68> INFO - Overriding locale 'de-DE' defaults 'normalization = NFD' with 'normalization = prenormalized' +[180] Biber.pm:4239> INFO - Sorting list 'nty/global//global/global' of type 'entry' with template 'nty' and locale 'de-DE' +[180] Biber.pm:4245> INFO - No sort tailoring available for locale 'de-DE' +[195] bbl.pm:660> INFO - Writing 'main.bbl' with encoding 'UTF-8' +[199] bbl.pm:763> INFO - Output to main.bbl diff --git a/main.lof b/main.lof index 8c7942c..ce1f4c9 100644 --- a/main.lof +++ b/main.lof @@ -12,16 +12,17 @@ \contentsline {figure}{\numberline {4.2}{\ignorespaces Entwicklungsumgebung Lapce\relax }}{28}{figure.caption.8}% \contentsline {figure}{\numberline {4.3}{\ignorespaces Geplanter Raum\relax }}{30}{figure.caption.9}% \contentsline {figure}{\numberline {4.4}{\ignorespaces Umsetzung in Blender\relax }}{30}{figure.caption.9}% -\contentsline {figure}{\numberline {4.5}{\ignorespaces Knochen des Modells\relax }}{32}{figure.caption.10}% -\contentsline {figure}{\numberline {4.6}{\ignorespaces Armaturen des Modells\relax }}{32}{figure.caption.10}% -\contentsline {figure}{\numberline {4.7}{\ignorespaces Visualisierung der generierten Beugeachse\relax }}{34}{figure.caption.11}% -\contentsline {figure}{\numberline {4.8}{\ignorespaces Vorbereitung zum Export mit GameRig\relax }}{36}{figure.caption.12}% +\contentsline {figure}{\numberline {4.5}{\ignorespaces Knochen des Modells\relax }}{33}{figure.caption.10}% +\contentsline {figure}{\numberline {4.6}{\ignorespaces Armaturen des Modells\relax }}{33}{figure.caption.10}% +\contentsline {figure}{\numberline {4.7}{\ignorespaces Visualisierung der generierten Beugeachse\relax }}{33}{figure.caption.11}% +\contentsline {figure}{\numberline {4.8}{\ignorespaces Vorbereitung zum Export mit GameRig\relax }}{35}{figure.caption.12}% \contentsline {figure}{\numberline {4.9}{\ignorespaces Benötigte Exporteinstellungen in Blender\relax }}{36}{figure.caption.13}% -\contentsline {figure}{\numberline {4.10}{\ignorespaces Rohdaten aus .stl-Datei\relax }}{41}{figure.caption.22}% -\contentsline {figure}{\numberline {4.11}{\ignorespaces Visuelles Modell\relax }}{42}{figure.caption.23}% -\contentsline {figure}{\numberline {4.12}{\ignorespaces Kollisionsmodell\relax }}{42}{figure.caption.23}% +\contentsline {figure}{\numberline {4.10}{\ignorespaces Zustandsübergänge im ActorPlugin\relax }}{42}{figure.caption.20}% +\contentsline {figure}{\numberline {4.11}{\ignorespaces Rohdaten aus .stl-Datei\relax }}{44}{figure.caption.23}% +\contentsline {figure}{\numberline {4.12}{\ignorespaces Visuelles Modell\relax }}{45}{figure.caption.24}% +\contentsline {figure}{\numberline {4.13}{\ignorespaces Kollisionsmodell\relax }}{45}{figure.caption.24}% \addvspace {10\p@ } \addvspace {10\p@ } \addvspace {10\p@ } -\contentsline {figure}{\numberline {7.1}{\ignorespaces Visualisierung der MoveIt Pipeline \cite {moveitpipeline}\relax }}{56}{figure.caption.47}% +\contentsline {figure}{\numberline {7.1}{\ignorespaces Visualisierung der MoveIt Pipeline \cite {moveitpipeline}\relax }}{58}{figure.caption.48}% \providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file diff --git a/main.log b/main.log index df79309..aee26cd 100644 --- a/main.log +++ b/main.log @@ -1,4 +1,4 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Arch Linux) (preloaded format=pdflatex 2023.4.3) 25 MAY 2023 12:55 +This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Arch Linux) (preloaded format=pdflatex 2023.6.8) 9 JUN 2023 15:47 entering extended mode \write18 enabled. %&-line parsing enabled. @@ -1416,7 +1416,7 @@ Package tocbasic Info: character protrusion at lof deactivated on input line 89 \tf@lof=\write8 \openout8 = `main.lof'. - + File: tex/Aufgabenstellung.pdf Graphic file (type pdf) Package pdftex.def Info: tex/Aufgabenstellung.pdf used on input line 91. @@ -1425,7 +1425,7 @@ File: tex/Aufgabenstellung.pdf Graphic file (type pdf) Package pdftex.def Info: tex/Aufgabenstellung.pdf used on input line 91. (pdftex.def) Requested size: 595.50339pt x 844.83423pt. - + File: tex/Aufgabenstellung.pdf Graphic file (type pdf) Package pdftex.def Info: tex/Aufgabenstellung.pdf , page1 used on input line 91 @@ -1455,7 +1455,7 @@ Package pdftex.def Info: tex/Aufgabenstellung.pdf , page1 used on input line 91 . (pdftex.def) Requested size: 596.2394pt x 845.8784pt. [6 <./tex/Aufgabenstellung.pdf>] - + File: tex/Aufgabenstellung.pdf Graphic file (type pdf) Package pdftex.def Info: tex/Aufgabenstellung.pdf , page2 used on input line 91 @@ -1477,7 +1477,7 @@ chapter 1. ] [2]) (./tex/2_Konzept.tex [3] chapter 2. - + File: img/MA-Konzept-Übersicht.drawio.pdf Graphic file (type pdf) Package pdftex.def Info: img/MA-Konzept-Übersicht.drawio.pdf used on input li @@ -1490,7 +1490,7 @@ ne 16. LaTeX Warning: No positions in optional float specifier. Default added (so using `tbp') on input line 81. - + File: img/tree_demo.pdf Graphic file (type pdf) Package pdftex.def Info: img/tree_demo.pdf used on input line 82. @@ -1499,24 +1499,24 @@ Package pdftex.def Info: img/tree_demo.pdf used on input line 82. chapter 3. [9 -] -LaTeX Font Info: Trying to load font information for T1+zi4 on input line 58 +] [10] +LaTeX Font Info: Trying to load font information for T1+zi4 on input line 63 . (/usr/share/texmf-dist/tex/latex/inconsolata/t1zi4.fd File: t1zi4.fd 2018/01/14 T1/zi4 (Inconsolata) ) LaTeX Font Info: Font shape `T1/zi4/m/n' will be -(Font) scaled to size 10.95pt on input line 58. +(Font) scaled to size 10.95pt on input line 63. Package microtype Info: Loading generic protrusion settings for font family (microtype) `zi4' (encoding: T1). (microtype) For optimal results, create family-specific settings. (microtype) See the microtype manual for details. - [10] [11{/usr/share/texmf-dist/fonts/enc/dvips/inconsolata/i4-t1-0.enc}] [12] -[13] [14] [15] + [11{/usr/share/texmf-dist/fonts/enc/dvips/inconsolata/i4-t1-0.enc}] [12] [13] +[14] [15] [16] [17] [18] [19] [20] File: img/tree_demo.pdf Graphic file (type pdf) -Package pdftex.def Info: img/tree_demo.pdf used on input line 382. +Package pdftex.def Info: img/tree_demo.pdf used on input line 396. (pdftex.def) Requested size: 441.01779pt x 225.35489pt. \openout3 = `main.pyg'. @@ -1531,9 +1531,9 @@ LaTeX Font Info: Font shape `T1/zi4/m/it' will be (Font) scaled to size 10.95pt on input line 2. LaTeX Font Info: Font shape `T1/zi4/b/n' will be (Font) scaled to size 10.95pt on input line 3. -) [21]) (./tex/4_Umsetzung.tex [22] [23] +) [21] [22]) (./tex/4_Umsetzung.tex [23] chapter 4. - + File: img/MA-Umsetzung-Übersicht.drawio.pdf Graphic file (type pdf) Package pdftex.def Info: img/MA-Umsetzung-Übersicht.drawio.pdf used on input @@ -1546,127 +1546,144 @@ line 14. (./_minted-main/391704321A86D34384492C034ECA3CFA82CA0C42AFE0759A4F1491A6B69BC02 -A.pygtex +A.pygtex [25] LaTeX Font Info: Font shape `T1/zi4/m/n' will be (Font) scaled to size 6.0pt on input line 4. LaTeX Font Info: External font `lmex10' loaded for size (Font) <5> on input line 4. - [25]) [26{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc}{/usr/share/t -exmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc}] - +) [26{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc}{/usr/share/texmf- +dist/fonts/enc/dvips/lm/lm-mathsy.enc}] + File: img/MA-Umsetzung-Lapce.png Graphic file (type png) -Package pdftex.def Info: img/MA-Umsetzung-Lapce.png used on input line 103. +Package pdftex.def Info: img/MA-Umsetzung-Lapce.png used on input line 107. (pdftex.def) Requested size: 441.01779pt x 317.81926pt. [27] [28 <./img/MA-Umsetzung-Lapce.png>] [29] - + File: img/MA-Umsetzung-Welt-Plan.drawio.pdf Graphic file (type pdf) Package pdftex.def Info: img/MA-Umsetzung-Welt-Plan.drawio.pdf used on input l -ine 163. +ine 167. (pdftex.def) Requested size: 198.45665pt x 199.81137pt. - + File: img/MA-Umsetzung-Welt-Blender.png Graphic file (type png) Package pdftex.def Info: img/MA-Umsetzung-Welt-Blender.png used on input line -170. +174. (pdftex.def) Requested size: 198.45665pt x 150.04475pt. [30 <./img/MA-Umsetzung-Welt-Plan.drawio.pdf> <./img/MA-Umsetzung-Welt-Blender -.png>] - +.png>] [31] + File: img/MA-Umsetzung-Person-Bones.png Graphic file (type png) Package pdftex.def Info: img/MA-Umsetzung-Person-Bones.png used on input line -200. +228. (pdftex.def) Requested size: 198.45665pt x 317.53317pt. - + File: img/MA-Umsetzung-Person-Armature.png Graphic file (type png) Package pdftex.def Info: img/MA-Umsetzung-Person-Armature.png used on input li -ne 207. +ne 235. (pdftex.def) Requested size: 198.45665pt x 317.53082pt. - [31] [32 <./img/MA-Umsetzung-Person-Bones.png> <./img/MA-Umsetzung-Person-Arma -ture.png>] - + File: img/MA-Umsetzung-Joint.png Graphic file (type png) -Package pdftex.def Info: img/MA-Umsetzung-Joint.png used on input line 246. +Package pdftex.def Info: img/MA-Umsetzung-Joint.png used on input line 243. (pdftex.def) Requested size: 352.81557pt x 211.69122pt. - [33] [34 <./img/MA-Umsetzung-Joint.png>] - + [32] [33 <./img/MA-Umsetzung-Person-Bones.png> <./img/MA-Umsetzung-Person-Arma +ture.png> <./img/MA-Umsetzung-Joint.png>] +[34] + File: img/MA-Umsetzung-Animation-Prepare.png Graphic file (type png) Package pdftex.def Info: img/MA-Umsetzung-Animation-Prepare.png used on input -line 308. +line 319. (pdftex.def) Requested size: 220.5089pt x 162.05081pt. - + File: img/MA-Umsetzung-Animation-Prepare2.png Graphic file (type png) Package pdftex.def Info: img/MA-Umsetzung-Animation-Prepare2.png used on input - line 310. + line 321. (pdftex.def) Requested size: 220.5089pt x 162.05081pt. - + File: img/MA-Umsetzung-Animation-Save.png Graphic file (type png) Package pdftex.def Info: img/MA-Umsetzung-Animation-Save.png used on input lin -e 318. +e 329. (pdftex.def) Requested size: 329.6567pt x 220.5089pt. - + File: img/MA-Umsetzung-Animation-Save2.png Graphic file (type png) Package pdftex.def Info: img/MA-Umsetzung-Animation-Save2.png used on input li -ne 320. +ne 331. (pdftex.def) Requested size: 101.0357pt x 220.5089pt. - -[35] [36 <./img/MA-Umsetzung-Animation-Prepare.png> <./img/MA-Umsetzung-Animati -on-Prepare2.png> <./img/MA-Umsetzung-Animation-Save.png> <./img/MA-Umsetzung-An -imation-Save2.png>] [37] [38] [39] [40] + [35 <./img/MA-Umsetzung-Animation-Prepare.png> <./img/MA-Umsetzung-Animation-P +repare2.png>] [36 <./img/MA-Umsetzung-Animation-Save.png> <./img/MA-Umsetzung-A +nimation-Save2.png>] [37] [38] [39] [40] +Package epstopdf Info: Source file: +(epstopdf) date: 2023-06-07 17:49:05 +(epstopdf) size: 29662 bytes +(epstopdf) Output file: +(epstopdf) date: 2023-06-07 23:00:12 +(epstopdf) size: 25102 bytes +(epstopdf) Command: +(epstopdf) \includegraphics on input line 509. +Package epstopdf Info: Output file is already uptodate. + +File: uml/out/plugin_states-eps-converted-to.pdf Graphic file (type pdf) + +Package pdftex.def Info: uml/out/plugin_states-eps-converted-to.pdf used on in +put line 509. +(pdftex.def) Requested size: 441.01779pt x 187.20862pt. + [41] [42 <./uml/out/plugin_states-eps-converted-to.pdf>] [43] LaTeX Warning: No positions in optional float specifier. - Default added (so using `tbp') on input line 454. + Default added (so using `tbp') on input line 565. - + File: img/MA-Roboter-Rohdaten.png Graphic file (type png) -Package pdftex.def Info: img/MA-Roboter-Rohdaten.png used on input line 455. +Package pdftex.def Info: img/MA-Roboter-Rohdaten.png used on input line 566. (pdftex.def) Requested size: 220.5089pt x 220.50175pt. -[41 <./img/MA-Roboter-Rohdaten.png (PNG copy)>] - +[44 <./img/MA-Roboter-Rohdaten.png (PNG copy)>] + File: img/MA-Roboter-Visuell.png Graphic file (type png) -Package pdftex.def Info: img/MA-Roboter-Visuell.png used on input line 482. +Package pdftex.def Info: img/MA-Roboter-Visuell.png used on input line 593. (pdftex.def) Requested size: 216.10114pt x 165.25774pt. - + File: img/MA-Roboter-Kollision.png Graphic file (type png) -Package pdftex.def Info: img/MA-Roboter-Kollision.png used on input line 488. +Package pdftex.def Info: img/MA-Roboter-Kollision.png used on input line 599. (pdftex.def) Requested size: 216.10114pt x 165.25774pt. - [42 <./img/MA-Roboter-Visuell.png> <./img/MA-Roboter-Kollision.png>] [43] [44] - [45]) [46] + [45 <./img/MA-Roboter-Visuell.png> <./img/MA-Roboter-Kollision.png>] [46] [47] +) [48] chapter 5. -[47 +[49 ] chapter 6. -[48 +[50 -] [49] [50] [51] +] [51] [52] [53] chapter 7. -[52 +[54 -] [53] +] [55] Package microtype Info: Character `029' is missing (microtype) in font `T1/lmr/m/sc/10.95'. (microtype) Ignoring protrusion settings for this character. - [54 + [56 -] [55] - +] [57] + File: img/moveit_pipeline.png Graphic file (type png) Package pdftex.def Info: img/moveit_pipeline.png used on input line 250. (pdftex.def) Requested size: 398.33858pt x 464.73143pt. - [56 <./img/moveit_pipeline.png>] (./main.aux) + [58 <./img/moveit_pipeline.png>] (./main.aux) LaTeX Font Warning: Some font shapes were not available, defaults substituted. @@ -1679,13 +1696,13 @@ Package logreq Info: Writing requests to 'main.run.xml'. ) Here is how much of TeX's memory you used: - 38449 strings out of 476025 - 801708 string characters out of 5796533 - 1882388 words of memory out of 5000000 - 58012 multiletter control sequences out of 15000+600000 - 564869 words of font info for 145 fonts, out of 8000000 for 9000 + 38466 strings out of 476025 + 802196 string characters out of 5796533 + 1884388 words of memory out of 5000000 + 58022 multiletter control sequences out of 15000+600000 + 564871 words of font info for 145 fonts, out of 8000000 for 9000 1143 hyphenation exceptions out of 8191 - 108i,20n,131p,10626b,3223s stack positions out of 5000i,500n,10000p,200000b,80000s + 108i,20n,131p,10626b,3223s stack positions out of 10000i,1000n,20000p,200000b,200000s -Output written on main.pdf (63 pages, 3755041 bytes). +Output written on main.pdf (65 pages, 3789929 bytes). PDF statistics: - 1052 PDF objects out of 1200 (max. 8388607) - 865 compressed objects within 9 object streams - 210 named destinations out of 1000 (max. 500000) - 28851 words of extra memory for PDF output out of 29859 (max. 10000000) + 1071 PDF objects out of 1200 (max. 8388607) + 881 compressed objects within 9 object streams + 214 named destinations out of 1000 (max. 500000) + 28856 words of extra memory for PDF output out of 29859 (max. 10000000) diff --git a/main.pdf b/main.pdf deleted file mode 100644 index 93166e2..0000000 Binary files a/main.pdf and /dev/null differ diff --git a/main.synctex.gz b/main.synctex.gz index f9b91c5..3125bc2 100644 Binary files a/main.synctex.gz and b/main.synctex.gz differ diff --git a/main.tex b/main.tex index 88153af..5c50dc5 100644 --- a/main.tex +++ b/main.tex @@ -135,14 +135,14 @@ parskip=half, -Fehler durch fehlerhafte Config (Mal nachsehen, was das genau war) \subsection{Gazebo} \subsubsection{Upgrade auf Ignition} -Gazebo ist zu diesem Zeitpunkt in mehreren, teilweise gleichnamigen Versionen verfügbar, welche sich jedoch grundlegend unterscheiden. -Ein altes Projekt mit dem früheren Namen Gazebo, welches nun in Gazebo Classic umbenannt wurde, +Gazebo ist zu diesem Zeitpunkt in mehreren, teilweise gleichnamigen Versionen verfügbar, die sich jedoch grundlegend unterscheiden. +Ein altes Projekt mit dem früheren Namen Gazebo, dass nun in Gazebo Classic umbenannt wurde, die Neuimplementation der Simulationssoftware mit dem Namen Gazebo Ignition und -die nächste Version, welche nur noch den Namen Gazebo tragen soll. +die nächste Version, die nur noch den Namen Gazebo tragen soll. Dies ist darauf zurückzuführen, dass Gazebo Classic und Ignition eine Zeit lang gleichzeitig existierten, jedoch unterschiedliche Funktionen und interne Schnittstellen besitzen. Das Upgrade von Gazebo Classic auf Gazebo Ignition gestaltete sich aus mehreren Gründen schwierig. -Dies ist am leichtesten an der geänderten Nutzeroberfläche sichtbar, welche in Ignition nun modular ausgeführt ist. +Dies ist am leichtesten an der geänderten Nutzeroberfläche sichtbar, die in Ignition nun modular ausgeführt ist. Um dieses neue modulare System nutzen zu können, wurde das Dateiformat für die Simulationen angepasst. In diesem werden die benötigten Physikparameter, Nutzeroberflächen, Plugins und die Simulationswelt definiert. @@ -152,24 +152,24 @@ Danach kann die Welt Stück für Stück in das neue Format übertragen werden, w Die Arbeit in kleine Stücke aufzuteilen ist hierbei hilfreich, da Fehler während des Ladevorgangs im Log nicht weiter beschrieben werden. Auch das alte Plugin musste auf das neue System angepasst werden, was auch hier zu einer kompletten Neuimplementation führte, da die internen Systeme zu große Unterschiede aufwiesen. -Darunter fallen eine grundlegende Strukturänderung der unterliegenden Engine, welche auf ein Entity-Component-System umstellte, aber auch Veränderungen an den verwendeten Objekten innerhalb dieses Systems. +Darunter fallen eine grundlegende Strukturänderung der unterliegenden Engine, die auf ein Entity-Component-System umstellte, aber auch Veränderungen an den verwendeten Objekten innerhalb dieses Systems. \subsubsection{Pluginarchitektur} Die von Gazebo verwendete Plugininfrastruktur ist ideal, um schnell neue Funktionen in Gazebo zu entwickeln. -Jedoch existiert damit jedes Plugin im selben Prozess, was bei der Nutzung von Bibliotheken, welche nicht für die mehrfache Nutzung im selben Prozess entsprechend ausgelegt wurden, zu Problemen führen kann. +Jedoch existiert damit jedes Plugin im selben Prozess, was bei der Nutzung von Bibliotheken, die nicht für die mehrfache Nutzung im selben Prozess entsprechend ausgelegt wurden, zu Problemen führen kann. Zur Kommunikation des ActorPlugins mit dem ROS-ActionServer wurde die benötigte Funktionalität vorerst im Plugin selbst implementiert. Da diese Funktionalität zuerst entwickelt wurde, konnte sie zu diesem Zeitpunkt nur alleinstehend getestet werden. -Diese Tests verliefen vorerst erfolgreich, jedoch scheiterten sie bei der Integration des Robotermodells, welches über die \code{ros_control}-Integration ebenfalls \code{rclcpp} nutzt. +Diese Tests verliefen vorerst erfolgreich, jedoch scheiterten sie bei der Integration des Robotermodells, dass über die \code{ros_control}-Integration ebenfalls \code{rclcpp} nutzt. Um dieses Problem zu umgehen, sind mehrere Lösungsansätze denkbar. \begin{description} \item[Separater Nachrichtendienst] - Ein solcher losgelöster Dienst kann die Nachrichten mit einem anderen Programm auszutauschen, welches die Kommunikation nach außen übernimmt. + Ein solcher losgelöster Dienst kann die Nachrichten mit einem anderen Programm auszutauschen, dass die Kommunikation nach außen übernimmt. \item[Nutzung der gleichen ROS-Instanz] - Um dem Problem zu begegnen, könnte auch eine globale ROS-Instanz von Gazebo verwaltet werden, welche dann von den Plugins genutzt werden kann. - Dies könnte als ein Plugin realisiert werden, welches diese anderen Plugins zur Verfügung stellt, jedoch müssten die anderen Plugins zur Nutzung dieser Schnittstelle modifiziert werden. + Um dem Problem zu begegnen, könnte auch eine globale ROS-Instanz von Gazebo verwaltet werden, die dann von den Plugins genutzt werden kann. + Dies könnte als ein Plugin realisiert werden, dass diese anderen Plugins zur Verfügung stellt, jedoch müssten die anderen Plugins zur Nutzung dieser Schnittstelle modifiziert werden. \item[Gazebo-ROS-Brücke] - Die Gazebo-ROS-Brücke kann Nachrichten, welche in beiden Formaten definiert wurden, ineinander umwandeln. + Die Gazebo-ROS-Brücke kann Nachrichten, die in beiden Formaten definiert wurden, ineinander umwandeln. Dies ermöglicht die Kommunikation über die Brücke als Mittelmann. Dabei müssten Anpassungen an der Architektur vorgenommen werden, da Gazebo kein Äquivalent zum ActionServer besitzt. \end{description} diff --git a/main.toc b/main.toc index 68f8c5a..6417680 100644 --- a/main.toc +++ b/main.toc @@ -21,7 +21,7 @@ \contentsline {subsection}{\numberline {3.2.4}Menschensimulation}{16}{subsection.3.2.4}% \contentsline {section}{\numberline {3.3}Roboterumgebung}{16}{section.3.3}% \contentsline {section}{\numberline {3.4}Programmiersprache}{18}{section.3.4}% -\contentsline {section}{\numberline {3.5}Behavior Trees}{18}{section.3.5}% +\contentsline {section}{\numberline {3.5}Behavior Trees}{19}{section.3.5}% \contentsline {subsection}{\numberline {3.5.1}Asynchrone Nodes}{20}{subsection.3.5.1}% \contentsline {subsection}{\numberline {3.5.2}Dateiformat}{21}{subsection.3.5.2}% \contentsline {section}{\numberline {3.6}Docker-Compose als Virtualisierungsumgebung}{22}{section.3.6}% @@ -34,55 +34,55 @@ \contentsline {subsection}{\numberline {4.5.1}Übersicht}{31}{subsection.4.5.1}% \contentsline {subsection}{\numberline {4.5.2}Modellierung}{31}{subsection.4.5.2}% \contentsline {subsection}{\numberline {4.5.3}Export der Modellanimationen}{34}{subsection.4.5.3}% -\contentsline {subsection}{\numberline {4.5.4}Programmierung}{37}{subsection.4.5.4}% -\contentsline {subsubsection}{\nonumberline Message Queue}{37}{subsubsection*.15}% -\contentsline {subsubsection}{\nonumberline Nachrichten}{38}{subsubsection*.17}% +\contentsline {subsection}{\numberline {4.5.4}Programmierung}{36}{subsection.4.5.4}% +\contentsline {subsubsection}{\nonumberline Message Queue}{36}{subsubsection*.15}% +\contentsline {subsubsection}{\nonumberline ROS-Nachrichten}{38}{subsubsection*.17}% \contentsline {subsubsection}{\nonumberline ActorPlugin}{39}{subsubsection*.19}% -\contentsline {subsubsection}{\nonumberline ActorServer}{40}{subsubsection*.21}% -\contentsline {section}{\numberline {4.6}Roboter}{40}{section.4.6}% -\contentsline {subsection}{\numberline {4.6.1}Übersicht}{40}{subsection.4.6.1}% -\contentsline {subsection}{\numberline {4.6.2}Modellierung}{41}{subsection.4.6.2}% -\contentsline {subsection}{\numberline {4.6.3}MoveIt 2 Konfiguration}{42}{subsection.4.6.3}% -\contentsline {subsection}{\numberline {4.6.4}Integration mit Gazebo}{43}{subsection.4.6.4}% -\contentsline {section}{\numberline {4.7}Behavior Trees}{43}{section.4.7}% -\contentsline {subsubsection}{\nonumberline Allgemein nutzbare Nodes}{44}{subsubsection*.25}% -\contentsline {subsubsection}{\nonumberline Menschenspezifisch}{45}{subsubsection*.27}% -\contentsline {subsubsection}{\nonumberline Roboterspezifisch}{45}{subsubsection*.29}% -\contentsline {subsection}{\numberline {4.7.1}Subtrees}{46}{subsection.4.7.1}% -\contentsline {subsection}{\numberline {4.7.2}Verhalten des Roboters}{46}{subsection.4.7.2}% -\contentsline {subsection}{\numberline {4.7.3}Verhalten des Menschen}{46}{subsection.4.7.3}% -\contentsline {chapter}{\numberline {5}Szenarienbasierte Evaluation}{47}{chapter.5}% -\contentsline {section}{\numberline {5.1}Simulation des Menschen}{47}{section.5.1}% -\contentsline {section}{\numberline {5.2}Bewegung des Roboters}{47}{section.5.2}% -\contentsline {section}{\numberline {5.3}BehaviorTrees}{47}{section.5.3}% -\contentsline {subsection}{\numberline {5.3.1}Nodes}{47}{subsection.5.3.1}% -\contentsline {subsection}{\numberline {5.3.2}Kombinieren von Nodes zu einer Request}{47}{subsection.5.3.2}% -\contentsline {chapter}{\numberline {6}Diskussion}{48}{chapter.6}% -\contentsline {section}{\numberline {6.1}Lessons Learned bei der Umsetzung}{48}{section.6.1}% -\contentsline {subsection}{\numberline {6.1.1}Erstellung des Robotermodells}{48}{subsection.6.1.1}% -\contentsline {subsection}{\numberline {6.1.2}Erweiterung des Robotermodells mit MoveIt}{48}{subsection.6.1.2}% -\contentsline {subsection}{\numberline {6.1.3}Gazebo}{48}{subsection.6.1.3}% -\contentsline {subsubsection}{\nonumberline Upgrade auf Ignition}{48}{subsubsection*.31}% -\contentsline {subsubsection}{\nonumberline Pluginarchitektur}{49}{subsubsection*.33}% -\contentsline {subsubsection}{\nonumberline Fehlende Animationsgrundlagen}{50}{subsubsection*.35}% -\contentsline {subsection}{\numberline {6.1.4}ROS2}{50}{subsection.6.1.4}% -\contentsline {subsubsection}{\nonumberline Nachrichten und deren Echtzeitfähigkeit}{50}{subsubsection*.37}% -\contentsline {subsubsection}{\nonumberline Änderung der Compilertoolchain}{50}{subsubsection*.39}% -\contentsline {subsection}{\numberline {6.1.5}MoveIt2}{50}{subsection.6.1.5}% -\contentsline {subsubsection}{\nonumberline Upgrade auf MoveIt2}{50}{subsubsection*.41}% -\contentsline {subsubsection}{\nonumberline Fehlerhafte Generierung der Roboter}{51}{subsubsection*.43}% -\contentsline {subsubsection}{\nonumberline Controller}{51}{subsubsection*.45}% -\contentsline {section}{\numberline {6.2}Lessons Learned bei den Szenarien}{51}{section.6.2}% -\contentsline {subsection}{\numberline {6.2.1}Debugging}{51}{subsection.6.2.1}% -\contentsline {chapter}{\numberline {7}Zusammenfassung und Ausblick}{52}{chapter.7}% -\contentsline {section}{\numberline {7.1}Ergebnisse}{52}{section.7.1}% -\contentsline {subsection}{\numberline {7.1.1}Graphische Repräsentation der Szenarien}{52}{subsection.7.1.1}% -\contentsline {subsection}{\numberline {7.1.2}Anpassung der Behavior Trees an Szenarien}{52}{subsection.7.1.2}% -\contentsline {section}{\numberline {7.2}Diskussion}{52}{section.7.2}% -\contentsline {section}{\numberline {7.3}Ausblick}{52}{section.7.3}% -\contentsline {subsection}{\numberline {7.3.1}Umsetzung in anderem Simulator}{52}{subsection.7.3.1}% -\contentsline {subsection}{\numberline {7.3.2}Simulation bewegter Objekte}{52}{subsection.7.3.2}% -\contentsline {subsection}{\numberline {7.3.3}Ergänzung von Umgebungserkennung}{53}{subsection.7.3.3}% -\contentsline {subsection}{\numberline {7.3.4}Zusammenbringen von ActorPlugin und ActorServer}{53}{subsection.7.3.4}% -\contentsline {subsection}{\numberline {7.3.5}Separieren der Subtrees in eigene Dateien}{53}{subsection.7.3.5}% +\contentsline {subsubsection}{\nonumberline ActorServer}{42}{subsubsection*.22}% +\contentsline {section}{\numberline {4.6}Roboter}{43}{section.4.6}% +\contentsline {subsection}{\numberline {4.6.1}Übersicht}{43}{subsection.4.6.1}% +\contentsline {subsection}{\numberline {4.6.2}Modellierung}{43}{subsection.4.6.2}% +\contentsline {subsection}{\numberline {4.6.3}MoveIt 2 Konfiguration}{45}{subsection.4.6.3}% +\contentsline {subsection}{\numberline {4.6.4}Integration mit Gazebo}{46}{subsection.4.6.4}% +\contentsline {section}{\numberline {4.7}Behavior Trees}{46}{section.4.7}% +\contentsline {subsubsection}{\nonumberline Allgemein nutzbare Nodes}{46}{subsubsection*.26}% +\contentsline {subsubsection}{\nonumberline Menschenspezifisch}{47}{subsubsection*.28}% +\contentsline {subsubsection}{\nonumberline Roboterspezifisch}{48}{subsubsection*.30}% +\contentsline {subsection}{\numberline {4.7.1}Subtrees}{48}{subsection.4.7.1}% +\contentsline {subsection}{\numberline {4.7.2}Verhalten des Roboters}{48}{subsection.4.7.2}% +\contentsline {subsection}{\numberline {4.7.3}Verhalten des Menschen}{48}{subsection.4.7.3}% +\contentsline {chapter}{\numberline {5}Szenarienbasierte Evaluation}{49}{chapter.5}% +\contentsline {section}{\numberline {5.1}Simulation des Menschen}{49}{section.5.1}% +\contentsline {section}{\numberline {5.2}Bewegung des Roboters}{49}{section.5.2}% +\contentsline {section}{\numberline {5.3}BehaviorTrees}{49}{section.5.3}% +\contentsline {subsection}{\numberline {5.3.1}Nodes}{49}{subsection.5.3.1}% +\contentsline {subsection}{\numberline {5.3.2}Kombinieren von Nodes zu einer Request}{49}{subsection.5.3.2}% +\contentsline {chapter}{\numberline {6}Diskussion}{50}{chapter.6}% +\contentsline {section}{\numberline {6.1}Lessons Learned bei der Umsetzung}{50}{section.6.1}% +\contentsline {subsection}{\numberline {6.1.1}Erstellung des Robotermodells}{50}{subsection.6.1.1}% +\contentsline {subsection}{\numberline {6.1.2}Erweiterung des Robotermodells mit MoveIt}{50}{subsection.6.1.2}% +\contentsline {subsection}{\numberline {6.1.3}Gazebo}{50}{subsection.6.1.3}% +\contentsline {subsubsection}{\nonumberline Upgrade auf Ignition}{50}{subsubsection*.32}% +\contentsline {subsubsection}{\nonumberline Pluginarchitektur}{51}{subsubsection*.34}% +\contentsline {subsubsection}{\nonumberline Fehlende Animationsgrundlagen}{52}{subsubsection*.36}% +\contentsline {subsection}{\numberline {6.1.4}ROS2}{52}{subsection.6.1.4}% +\contentsline {subsubsection}{\nonumberline Nachrichten und deren Echtzeitfähigkeit}{52}{subsubsection*.38}% +\contentsline {subsubsection}{\nonumberline Änderung der Compilertoolchain}{52}{subsubsection*.40}% +\contentsline {subsection}{\numberline {6.1.5}MoveIt2}{52}{subsection.6.1.5}% +\contentsline {subsubsection}{\nonumberline Upgrade auf MoveIt2}{52}{subsubsection*.42}% +\contentsline {subsubsection}{\nonumberline Fehlerhafte Generierung der Roboter}{53}{subsubsection*.44}% +\contentsline {subsubsection}{\nonumberline Controller}{53}{subsubsection*.46}% +\contentsline {section}{\numberline {6.2}Lessons Learned bei den Szenarien}{53}{section.6.2}% +\contentsline {subsection}{\numberline {6.2.1}Debugging}{53}{subsection.6.2.1}% +\contentsline {chapter}{\numberline {7}Zusammenfassung und Ausblick}{54}{chapter.7}% +\contentsline {section}{\numberline {7.1}Ergebnisse}{54}{section.7.1}% +\contentsline {subsection}{\numberline {7.1.1}Graphische Repräsentation der Szenarien}{54}{subsection.7.1.1}% +\contentsline {subsection}{\numberline {7.1.2}Anpassung der Behavior Trees an Szenarien}{54}{subsection.7.1.2}% +\contentsline {section}{\numberline {7.2}Diskussion}{54}{section.7.2}% +\contentsline {section}{\numberline {7.3}Ausblick}{54}{section.7.3}% +\contentsline {subsection}{\numberline {7.3.1}Umsetzung in anderem Simulator}{54}{subsection.7.3.1}% +\contentsline {subsection}{\numberline {7.3.2}Simulation bewegter Objekte}{54}{subsection.7.3.2}% +\contentsline {subsection}{\numberline {7.3.3}Ergänzung von Umgebungserkennung}{55}{subsection.7.3.3}% +\contentsline {subsection}{\numberline {7.3.4}Zusammenbringen von ActorPlugin und ActorServer}{55}{subsection.7.3.4}% +\contentsline {subsection}{\numberline {7.3.5}Separieren der Subtrees in eigene Dateien}{55}{subsection.7.3.5}% \providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file diff --git a/tex/1_Einleitung.tex b/tex/1_Einleitung.tex index 052cc01..72da509 100644 --- a/tex/1_Einleitung.tex +++ b/tex/1_Einleitung.tex @@ -2,14 +2,14 @@ \section{Motivation} Die Simulation von Maschinen wird im industriellen Umfeld immer beliebter, um deren Verhalten schon vor der eigentlichen Produktion zu testen. Dazu wird ein Modell des gesamten Prozesses in der Simulation geschaffen, der durch die Maschine beeinflusst werden soll. -Das Modell wird dann um die Maschine selbst erweitert, welche Einfluss auf das System nimmt. +Das Modell wird dann um die Maschine selbst erweitert, die Einfluss auf das System nimmt. Die Veränderungen durch die Maschine werden nun analysiert, und erlauben Rückschlüsse auf die Funktion des Systems. Ein solches Modell kann nun 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 die Reproduktion des genauen Bewegungsablaufes, aber nicht verschiedene Variationen im gesamten Prozess, welche durch die Ereignisse in der Simulation ausgelöst werden. +Dies erlaubt 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. Dies soll durch eine eingängliche Beschreibungssprache ermöglicht werden, die einfach erweitert und auf neue Szenarien angepasst werden kann. @@ -35,12 +35,14 @@ In Computerspielen werden Beschreibungssprachen schon seit langer Zeit eingesetz Eine vollständige Umsetzung einer erweiterbaren Simulation mit Mensch und Roboter, gesteuert durch eine Beschreibungssprache konnte nicht gefunden werden. -\section{Welche Szenarien} +\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. -Hierfür kommen bestimmte Aufgaben, wie zum Beispiel die Interaktion mit Objekten besonders in Frage, da diese viele ähnliche Bestandteile haben, jedoch mehrere Umstände denkbar sind, in welchen diese verwendet werden können. -Dazu zählen zum Beispiel das Hineingreifen in einen Prozess, das Aufheben von Material oder das Begutachten eines Objekts, welche alle nur eine Bewegungsabfolge des beteiligten Menschen sind. +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. +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. -Das erste Szenario soll sich mit der Simulation einer bereits vollautomatisierten Fertigungsaufgabe befassen, in welcher ein Roboter im Arbeitsbereich eines Menschen Teile fertigt. +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. Der Mensch soll in diesem Szenario auch arbeiten, jedoch nur vereinzelt den Arbeitsbereich des Roboters betreten, um diesen zu beobachten. @@ -49,9 +51,9 @@ Außerdem werden grundlegende Aspekte der Simulation getestet, wie zum Beispiel Im zweiten Szenario prüft und sortiert der Roboter Teile und legt die guten 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, welches weiter transportiert werden muss. +Auch hier soll der Mensch solange eigenständig arbeiten, bis der Roboter ein aussortiertes Teil ablegt, dass weiter transportiert werden muss. -Die dritte simulierte Aufgabe stellt ein Kollaborationsszenario dar, in welchem Mensch und Roboter an der selben Aufgabe arbeiten. +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. In diesen Fällen muss nun ein Mensch aushelfen, wodurch er mit dem Roboter in Interaktion tritt. @@ -59,5 +61,5 @@ Dieser soll, wenn seine Hilfe nicht benötigt wird, andere Roboter kontrollieren \section{Welcher Nutzen / 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, welche durch eine Beschreibungssprache definiert werden sollen. -Durch deren einfache Struktur soll komplexes Verhalten einfach und überschaubar definierbar sein, welches dann in der Simulation getestet werden kann. +Dazu ist eine schnelle Konfiguration von sowohl Roboter als auch Mensch auf unterschiedliche Szenarien nötig, die durch eine Beschreibungssprache definiert werden sollen. +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 462cd84..21b8ecf 100644 --- a/tex/2_Konzept.tex +++ b/tex/2_Konzept.tex @@ -3,7 +3,7 @@ Die zu entwickelnde Simulation soll die bisher meißt separaten Zweige der Robot Um die beiden Akteure in der simulierten Umgebung zu steuern, werden Befehle von außerhalb der Simulation eingesetzt. Diese Befehle werden dabei von externer Software unter der Verwendung einer Beschreibungssprache und Feedback aus der Simulation generiert. -Hierfür wird die Beschreibungssprache in der Dienstumgebung ausgeführt, in welcher auch die Bewegungsplanung stattfindet. +Hierfür wird die Beschreibungssprache in der Dienstumgebung ausgeführt, in der auch die Bewegungsplanung stattfindet. Die Beschreibungssprache kommuniziert direkt mit der Simulation und Bewegungsplanung des simulierten Menschen. Damit der Roboter in der Simulation von der Bewegungsplanung gesteuert werden kann, werden zwischen diesen auch Nachrichten ausgetauscht. Der gesamte Vorgang ist in Abbildung \ref{concept_overview} visualisiert. @@ -22,7 +22,7 @@ Um diese Möglichkeiten zu schaffen, sind die Systeme modular aufzubauen. \section{Simulation des Roboters} Der simulierte Roboter soll für viele unterschiedliche Szenarien nutzbar sein, was spezialisierte Robotertypen ausschließt. Außerdem ist die enge Interaktion mit Menschen interessant, was einen für Mensch-Roboter-Kollaboration ausgelegten Roboter spricht. -Für diese beschriebenen Kriterien eignet sich der KUKA LBR iisy, welcher als Cobot vermarktet wird. +Für diese beschriebenen Kriterien eignet sich der KUKA LBR iisy, der als Cobot vermarktet wird. Die Bezeichnung als Cobot\cite{cobot} ist dabei ein Portemanteau aus Collaborative und Robot, was die besondere Eignung für Mensch-Roboter-Kollaboration noch einmal unterstreicht. Der Roboter besitzt auch einen modifizierbaren Endeffektor, um unterschiedlichste Aufgaben erfüllen zu können. @@ -40,31 +40,31 @@ Dieses Modell soll dabei um weitere Animationen erweiterbar sein. Es werden mehrere Animationen und Übergänge zwischen diesen benötigt, um bestimmte Bewegungen darstellen zu können. Die so erstellten Animationen müssen nun von außerhalb der Simulationsumgebung ausführbar gemacht werden, um diese später mit einer Beschreibungssprache steuern zu können. -Hierfür muss eine Komponente entwickelt werden, welche in der Simulation die Anfragen der Beschreibungssprache entgegennimmt und umsetzt. +Hierfür muss eine Komponente entwickelt werden, die in der Simulation die Anfragen der Beschreibungssprache entgegennimmt und umsetzt. Um die spätere Steuerung des Menschen von außerhalb zu erleichtern, müssen diese Anfragen im Fortschritt überwacht und abgebrochen werden können. \section{Behavior Trees als Beschreibungssprache} Bislang wird das Verhalten von Akteuren in Simationsumgebungen, darunter Roboter und Menschen, häufig in Form von State-Machines ausgedrückt. -Diese besitzen jedoch einen großen Nachteil, welcher vor allem bei komplexeren Abläufen hervortreten kann. -Dabei handelt es sich um die Übersichtlichkeit, welche bei einer wachsenden State-Machine leicht verloren geht. +Diese besitzen jedoch einen großen Nachteil, der vor allem bei komplexeren Abläufen hervortreten kann. +Dabei handelt es sich um die Übersichtlichkeit, die bei einer wachsenden State-Machine leicht verloren geht. Dies erschwert die schnelle Erfassung von Abfolgen und Zustandsübergängen bei Änderungen am Code, was zu Fehlern im späteren Betrieb führen kann. -Behavior Trees lösen dieses Problem, in dem sie sogenannte Nodes definieren, welche in einer übersichtlichen Baumstruktur angeordnet werden. +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, welcher diese für mobile Roboter einsetzen wollte. \cite{1087032} +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} Der Ablauf eines Behavior Trees startet vom sogenannten Root, der Wurzel des Baums. -Von dort an werden Nodes, welche je nach Node unterschiedliches Verhalten abbilden, miteinander verbunden. -Die Nodes werden untereinander angeordnet, welches die Relation der Nodes zueinander beschreibt. +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. 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. \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, welcher durch die darüber liegende Node ausgewertet werden kann. + 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. Häufig existieren hier die Negation, aber auch das forcieren eines bestimmten Rückgabewertes für die unterliegende Node. @@ -87,7 +87,7 @@ Es gibt mehrere grundlegende Arten von Tree-Nodes, die in vier Kategorien unters 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. -Von dort an wird als erstes die Sequenz-Node ausgeführt, welche drei untergeordnete Nodes besitzt. +Von dort an 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. @@ -97,28 +97,28 @@ 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, welche 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, welcher die Ausführung der Sequenz abbricht. +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 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 so einfach 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, welche in dieser Arbeit betrachtet werden, abzudecken. +Die hierfür erstellten Nodes sollen universell gestaltet werden, um alle Szenarien, die in dieser Arbeit betrachtet werden, abzudecken. \section{Virtualisierungsumgebung als Platform} Aufgrund von vorheriger Erfahrung mit involvierten Einrichtungsprozessen, ist der Einsatz fest definierter Umgebungen 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, welche diese bei der Ausführung auf einem anderen Grundsystem korrekt abbildet. +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. 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, welche mit den Vorteilen abgewogen werden müssen. -Alle Virtualisierungssysteme benötigen zusätzliche Rechenleistung, welche der virtualisierten Anwendung nicht mehr zur Verfügung steht. +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. Die Auswahl einer für das Projekt geeigneten Virtualisierungsumgebung stellt einen wichtigen Schritt in der Entwicklung des Gesamtsystems dar. diff --git a/tex/3_Auswahl.tex b/tex/3_Auswahl.tex index f762ea5..ee9b561 100644 --- a/tex/3_Auswahl.tex +++ b/tex/3_Auswahl.tex @@ -4,48 +4,55 @@ Diese Entscheidungen beeinflussen die späteren Entwicklungsprozess nachhaltig. Im nachfolgenden findet die Auswahl der Komponenten statt. Diese sollen später in der entwickelten Softwareumgebung ihre jeweiligen Teilbereiche abdecken. -Alle diese Teilbereiche können dann zu einer Simulation vebunden werden, welche das gesamte Problemfeld abdeckt. +Alle diese Teilbereiche können dann zu einer Simulation vebunden werden, die das gesamte Problemfeld abdeckt. Wie bereits in Abbildung \ref{concept_overview} dargestellt, ist für die Erfüllung der Aufgaben eine Dienst- und eine Simulationsumgebung erforderlich. Dieses Kapitel beschreibt die Auswahl der Umgebungen und der in diesen laufenden Prozesse. \section{Dienstumgebung} Die Dienstumgebung bestimmt maßgeblich, wie Software im Entwicklungsprozess geschrieben wird. -Durch sie werden häufig benötigte Funktionen bereitgestellt, welche durch die Programme innerhalb der Umgebung genutzt werden können. +Durch sie werden häufig benötigte Funktionen bereitgestellt, die Programme innerhalb der Umgebung nutzen können. -Bei einer Dienstumgebung für Roboter gehören zu den grundlegenden Aspekten die Nachrichtenübergabe zwischen einzelen interagierenden Programmen, um eine gemeinsame Basis für ein einfach erweiterbares System zu schaffen. -Außerdem sind Werkzeuge zur Einstellungsübergabe an Teilsysteme sinnvoll, um diese einfach an einer Stelle anpassen zu können. +Bei einer Dienstumgebung für Roboter gehört die Nachrichtenübergabe zwischen einzelen Programmen zu den grundlegenden Aspekten. +Diese wird genutzt, um eine gemeinsame Basis für ein erweiterbares System zu schaffen. +Außerdem sind Werkzeuge zur Einstellungsübergabe an Teilsysteme sinnvoll, um diese an einer Stelle anpassen zu können. \subsection{Auswahl} Es existieren mehrere Systeme, die als Dienstumgebung für Roboter in Frage kommen, wenn es lediglich um die Nachrichtenübergabe zwischen Programmen geht. -Jede Lösung, welche Nachrichten zwischen Prozessen austauschen kann, ist ein potentieller Kanidat für ein Roboterframework. +Jede Dienstumgebung, die Nachrichten zwischen Prozessen austauschen kann, ist ein potentieller Kanidat für ein Roboterframework. -Wichtige Aspekte sind dabei die Geschwindigkeit der Anbindung und die Definition der Nachrichten, welche über das System ausgetauscht werden. +Wichtige Aspekte sind dabei die Geschwindigkeit der Anbindung und die Definition der Nachrichten, die über das System ausgetauscht werden. -Nutzbare, bereits als Interprozesskommunikation integrierte Systeme sind zum Beispiel Pipes, welche Daten zwischen Prozessen über Buffer austauschen. +Nutzbare, bereits als Interprozesskommunikation integrierte Systeme sind zum Beispiel Pipes, die Daten zwischen Prozessen über Buffer austauschen. Auch die Nutzung von Message Queues und Shared Memory ist hierfür denkbar. -Diese Systeme sind performant, jedoch nicht einfach zu verwalten, da sie von einer direkten Kommunikation von 2 oder mehr Komponenten, welche exakt für diesen Zweck entwickelt wurden, ausgehen. +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. -Eine Alternative stellen Sockets dar, welche Daten zwischen mehreren Programmen austauschen können. -Dabei dient ein Programm als Server, welches Anfragen von anderen Programmen, auch Clients genannt, entgegen nimmt. +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. 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. -Dieser Nachteil besteht in der potentiellen Variation zahlreicher Kommunikationsmechanismen, welche zum Datenaustausch über all diese möglichen Systeme verwendet werden können. -Bei einem ausreichend großen Projekt treten so unweigerlich Unterschiede in der Handhabung auf, die es zu berücksichtigen gilt. +Dieser Nachteil besteht in der potentiellen Variabilität dieser Kommunikationsmechanismen. +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 sticht ROS\cite{doi:10.1126/scirobotics.abm6074} als Dienstumgebung für Roboter hervor, da es sich um ein etabliertes und quelloffenes System handelt. -Der oben genannte Nachteil einzelner Systeme wird in ROS durch mehrere standartisierte und erweiterbare Nachrichtendefinition gelöst, welche von den Programmen in der Umgebung genutzt werden. -Um diese Nachrichten zu senden und empfangen liefert ROS eine eigene Implementation des Protokolls für zum Beispiel Python\cite{python} und C++\cite{cpp}, welche mehrere Arten der Nachrichtenübergabe unterstützten. +Der oben genannte Nachteil einzelner Systeme wird in ROS durch mehrere standartisierte und erweiterbare Nachrichtendefinition gelöst, die von den Programmen in der Umgebung genutzt werden. +Um diese Nachrichten zu senden und empfangen 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 die Implementationen in den Paketen \code{rospy}, \code{rclc} und \code{rclcpp}. Die neuste Version ROS2 bietet dabei einige Verbesserungen im Vergleich zu früheren Version ROS1. Ein neues Nachrichtenformat mit Quality of Service kann zum Beispiel Nachrichten zwischenspeichern und über sowohl TCP, als auch UDP kommunizieren. Außerdem werden nun neben CMake\cite{cmake} auch andere Buildsysteme unterstützt, was zum Beispiel 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, welche von Nutzern des Systems über die Jahre erstellt wurden, machen das System so populär.\cite{rospackages} - -ROS kann für sowohl simulierte Umgebungen, aber auch für echte Roboter eingesetzt werden, da beide Anwendungsfälle durch Programme an die Umgebung angebunden werden können. +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} +ROS kann für simulierte Umgebungen, aber auch für echte Roboter eingesetzt werden. +Diese beiden Anwendungsfälle werden durch unterschiedliche Controller realisiert. +Für simulierte Umgebungen leitet der Controller die Steuerdaten an die Simulationsumgebung weiter. +Bei dem Einsatz echter Hardware werden die Zielpositionen durch den Controller an die Roboterhardware weitergeleitet. %-Alternative Ökosysteme mit gleichem Umfang wie ROS existieren nicht. %-ROS2 @@ -53,62 +60,76 @@ ROS kann für sowohl simulierte Umgebungen, aber auch für echte Roboter eingese %-LCM %-ZeroMQ \subsection{Beschreibung} -ROS2\cite{doi:10.1126/scirobotics.abm6074}, später auch einfach nur ROS genannt, beschreibt sich selbst als ``a meta operating system for robots''\cite{ros-git}. +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}. 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, welche durch ROS bereitgestellt wird. +Es handelt sich dabei um eine gemeinsame Grundlage für Programme und Daten, die durch ROS bereitgestellt wird. Einzelne Bestandteile in der Umgebung sind dabei in Pakete gegliedert, wobei jedes Paket beliebig viele Daten und Programme beinhalten kann. +Programme, die mit anderen Programmen in der Umgebung über die ROS internen Schnittstellen kommunizieren, werden in ROS ``Nodes'' genannt. -Jedes Paket enthält dabei eine \code{package.xml}-Datei, welche durch die Paketverwaltung genutzt wird. -In dieser befindet sich eine in XML verfasste Definition des Paketinhalts, welche verschiedene Aspekte des Pakets beschreibt. - -Darunter fallen Informationen über den das Paket selbt, 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, werden außerdem benötigte Pakete für die Erstellung und Ausführung des Pakets eingetragen. - -Falls C++ zur Entwicklung des Pakets verwendet wird, befindet sich außerdem eine \code{CMakeLists.txt}-Datei im Paket. -In befinden sich die Buildinstruktionen für den Compiler für die im Paket befindlichen Programme. -Durch einen Aufruf von \code{ament_cmake} werden andere Parameter aus der \code{package.xml}-Datei ergänzt. - -Außerdem können bestimmte Pfade aus dem Paket exportiert werden, sodass diese später im Workspace verfügbar sind. -Programme, welche mit anderen Programmen in der Umgebung über die ROS internen Schnittstellen kommunizieren, werden in ROS ``Nodes'' genannt. - -Zu den Aufgaben von ROS gehören dabei: +Zu den Aufgaben von ROS zählen folgende Teilbereiche: \begin{description} + \item[Organisation]\hfill \\ + Um die einzelnen Teile einer Roboterumgebung zu separieren, werden diese in ROS auf unterschiedliche Pakete aufgeteilt. + Jedes Paket enthält dabei eine \code{package.xml}-Datei. + In dieser befindet sich eine in XML verfasste Definition des Paketinhalts, die verschiedene Aspekte des Pakets beschreibt. + + Darunter fallen Informationen über den das Paket selbt, 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 Ausführung des Pakets eingetragen. + \item[Buildumgebung]\hfill \\ ROS nutzt die eigene Buildumgebung \code{colcon} \cite{colcon}, um Pakete in den Workspaces reproduzierbar zu erstellen. - Zu deren Konfiguration werden CMake\cite{cmake} und einige Erweiterungen, wie zum Beispiel das oben erwähnte \code{ament_cmake} eingesetzt. - Anhand dieser Dateien werden die fertiggestellten Pakete dann im Workspace installiert, damit diese später verwendet werden können. + Zu deren Konfiguration wird eine \code{CMakeLists.txt}-Datei erstellt, die den Buildprozess beschreibt. + In dieser sind die Buildinstruktionen für den Kompiler für die im Paket befindlichen Programme enthalten. + Der Aufruf des \code{ament_cmake}-Makros in dieser ergänzt den Kompiliervorgang um weitere Parameter aus der \code{package.xml}-Datei. + + Nach diesen Vorbereitungsschritten kann CMake das Paket kompillieren. + Hierbei werden alle in der \code{CMakeLists.txt}-Datei angegebenen Programmteile kompiliert. + + Es ist außerdem möglich, bestimmte Pfade des Pakets nach dem Buildvorgang zu exportieren. + Diese sind dann später im erstellten Workspace für die Nutzung durch andere Programme verfügbar. \item[Workspaceverwaltung]\hfill \\ - Pakete können in verschiedenen Verzeichnissen installiert werden und müssen für andere Pakete auffindbar sein. - ROS nutzt hierfür von colcon generierte Skripte, welche beim Erstellen eines Pakets und eines Workspaces mit angelegt werden. - Das Skript des Pakets fügt nur dieses Paket der Umgebung hinzu, das Skript des Workspaces führt alle Skripte der in diesem enthaltenen Pakete aus, um diese allesamt der Umgebung hinzuzufügen. + Gruppen von Paketen befinden sich in sogenannen ``Workspaces''. + Diese vereinfachen das auffinden der enthaltenen Pakete durch Skripte, die diese im System registrieren. + Die Erstellung der Skripte erfolgt anhand der bereits beschriebenen \code{CMakeLists.txt}-Datei. + Das Programm \code{colcon} analysiert diese und generiert die Skripte. + Um das Paket im System zu registrieren, muss der Nutzer die generierten Skripte ausführen, was die benötigten Umgebungsvariablen setzt. + Hierfür wird meißt ein weiteres Skript verwendet, was alle im Workspace befindlichen Pakete nacheinander der Umgebung hinzufügt. + + Dieser Vorgang erlaubt zum Beispiel das Auffinden von Paketen anhand deren Namen im Dateisystem. + Das erleichtert die Verwaltung durch die Unabhängigkeit von spezifischen Pfaden im entwickelten System. + Außerdem wird die Laufzeitumgebung für alle Programme konfiguriert, was definierte Bibliotheken für diese verfügbar macht. \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, welche diese benötigen. + Die generierten Warnungen bei fehlenden Paketen vermeiden Abstürze und undefiniertes Verhalten in der Ausführung von Nodes, die diese benötigen. \item[Datenübertragung]\hfill \\ - Um Daten zwischen Nodes austauschen zu können, müssen miteinander auf einem festgelegten Weg kommunizieren können. + Um Daten zwischen Nodes austauschen zu können, müssen sie miteinander auf einem festgelegten Weg kommunizieren können. Ein solcher Aufbau erlaubt den Austausch von Daten in vorher nicht durch die Entwickler bedachten Anwendungsfällen. Die von ROS gebotene Schnittstelle zur Datenübertragung wird in Form mehrerer Bibliotheken für unterschiedliche Programmiersprachen bereitgestellt. - Der Datenaustausch geschieht in sogenannten Topics, welche Nachrichtenkanäle zwischen den Nodes darstellen. + Der Datenaustausch geschieht in sogenannten Topics, die Nachrichtenkanäle zwischen den Nodes darstellen. Eine Node kann entweder als Server ein Topic anbieten, was durch andere Nodes gelesen wird, oder als Client auf solche bereitgestellten Topics zugreifen. - Durch die Kombination mehrerer Topics ist eine komplexere Interaktion abbildbar, welche zum Beispiel Rückgabewerte zum aktuell ausgeführten Steuerbefehl liefert. + Durch die Kombination mehrerer Topics ist eine komplexere Interaktion abbildbar, die zum Beispiel Rückgabewerte zum aktuell ausgeführten Steuerbefehl liefert. \item[Parameterübergabe]\hfill \\ Um Nodes auf neue Anwendungsfälle anpassen zu können, wird ein Konfigurationsmechanismus benötigt. - In ROS geschieht dies durch die Übergabe sogenannter Parameter, welche durch die Node gelesen werden können. - Diese eignen sich zur Übergabe von Informationen, wie zum Beispiel einem Robotermodell, aber auch um die Topics der Nodes umbenennen zu können. + In ROS geschieht dies durch die Übergabe sogenannter Parameter, die durch die Node gelesen werden können. + Diese eignen sich zur Übergabe von Informationen, wie zum Beispiel Daten über ein verwendetes Robotermodell. + Um neue Konfigurationen zu unterstützen, kann das Umbenennen von Topics einer Node nötig werden, was auch mit einen Parameter erfolgen kann. \item[Startverwaltung]\hfill \\ In sogenannten ``launch''-Files können verschiedene Nodes und andere ``launch''-Files zu komplexen Startvorgängen zusammengefasst werden. - Dabei werden diese mit den gewünschten Parametern versehen, welche verschiedene Eigenschaften der Node an die aktuelle Umgebung anpassen können. + Das Einstellen von bestimmten Parametern erlaubt die Anpassung der Funktionen an den gewünschten Anwendungsfall. \end{description} -Durch eine solche Umgebung kann die gewünschte Simulation einfacher in mehrere Komponenten zerlegt werden, was die spätere Wartung des Projekts vereinfacht. + +Eine solche Umgebung erlaubt die Zerlegung der geplanten Simulation in mehrere Komponenten. +Die daraus erfolgte Abgrenzung erhöht die Übersichtlichkeit der einzelnen Bestandteile. +Dies vereinfacht die spätere Wartung des Projekts. \section{Simulationsumgebung (Gazebo)} @@ -122,10 +143,11 @@ Eine Auswahl der als Simulationsumgebung in Frage kommenden Programme werden hie 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, welche sich im Funktionsumfang unterscheiden, jedoch hat nur die professionelle Version Zugriff auf alle Funktionen und Verwendungsszenarien. +CoppeliaSim existiert in 3 Versionen, die sich im Funktionsumfang 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. -Gazebo setzt wie CoppeliaSim auf Erweiterungen, welche die gewünschten Funktionen einbinden können. +Gazebo setzt wie CoppeliaSim auf Erweiterungen, die die gewünschten Funktionen einbinden können. Zum Beispiel existiert auch eine ROS-Brücke, welche die Anbindung an ROS ermöglicht. Auch hier unterstützt der Simulator nur Animationen für menschliche Aktoren. Das Projekt ist Open Source, unter der Apache Lizenz (Version 2.0), was die Verwendung in jeglichen Szenarien erleichtert. @@ -135,12 +157,12 @@ Es existieren mehrere Systeme zur Anbindung der Engine an ROS, vor allem das off 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. -Ein großer Nachteil hingegen ist die Lizenz, welche nur für Einzelpersonen kostenlos ist. +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. Auch hier ist die Menschensimulation aufgrund oben genannter Gründe gut möglich. Jedoch existiert für Unreal Engine keine offizielle Lösung zur Anbindung an ROS2. -Die Programmierung der Engine erfolgt in C++, was die Erstellung eines Plugins zur ROS-Anbindung der Unreal Engine ermöglichte, welche von Nutzern gewartet wird. +Die Programmierung der Engine erfolgt in C++, was die Erstellung eines Plugins zur ROS-Anbindung der Unreal Engine ermöglichte, die von Nutzern gewartet wird. Die Lizenz der Unreal Engine erlaubt die kostenfreie Nutzung bis zu einem gewissen Umsatz mit der erstellten Software. Eine weitere Möglichkeit zur Simulation stellt die Grafikengine Godot\cite{godot} dar. @@ -148,14 +170,15 @@ Im Vergleich zu Unity und Unreal Engine ist Godot quelloffene Software unter der Auch hier stellt die Simulation von menschlichen Aktoren eine Standartaufgabe dar, jedoch befinden sich Teile des dafür verwendeten Systems derzeit in Überarbeitung. Auch für diese Engine existiert eine ROS2-Anbindung, jedoch ist diese nicht offiziell. -Alle vorgestellten Softwares besitzten ein integriertes Physiksystem, welches die Simulation von starren Körpern und Gelenken erlaubt. -Aus diesen Funktionen kann ein Roboterarm aufgebaut werden, welcher dann durch eine ROS-Brücke gesteuert werden kann. +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. -Durch diese Einschränkung scheiden sowohl Unreal Engine aber auch Godot aus, welche nur durch Nutzer unterstützt werden. -Für einen späteren Einsatz ist eine offene Lizenz von Vorteil, da diese in nahezu allen Umständen eingesetzt werden kann. +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, welches gleichzeitig bereits im ROS-Ökosystem etabliert ist. +Die Wahl der 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}. @@ -168,25 +191,28 @@ Andernfalls können in der Datei eine oder mehrere Welten definiert werden. Eine Welt definiert in Gazebo den kompletten Aubau des Simulators. Zuerst enthält ein Welt-Element die Daten über die physikalischen Konstanten der Simulationsumgebung. -Außerdem werden alle benötigten Teile der Nutzeroberfläche deklariert, welche im ausgeführten Simulator verfügbar sein sollen. -Letzendlich können auch mehrere Modelle, Aktoren und Lichter in der Welt definiert werden. -Diese können auch aus anderen URIs stammen, welche in der Welt deklariert wurden. +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}. 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. -Über ein include-Element können auch andere .sdf-Dateien, welche nur ein Modell enthalten, zum Modell hinzugefügt werden. +Über ein include-Element können auch andere .sdf-Dateien, die nur ein einzelnes Modell enthalten, zu einem Modell hinzugefügt werden. -Jedes Modell wird über eine Translation und Rotation im Simulationsraum verankert, wobei das Referenzsystem des überliegenden Modells genutzt wird. +Jedes Modell wird über eine Translation und Rotation im Simulationsraum verankert. +Dies geschieht immer relativ zum Referenzsystem des überliegenden Modells. Außerdem können im Modell Einstellungen für dessen Physiksimulation vorgenommen werden. -Ein Modell enhält meißt mindestens ein Link-Element, welches zur Darstellung von dessen Geometrie verwendet wird. +Ein Modell enhält meißt mindestens ein Link-Element, dass zur Darstellung von dessen Geometrie verwendet wird. Mehrere Link-Elemente können dabei mit der Welt oder anderen Link-Elementen über Joint-Elemente verbunden werden. Diese Joint-Elemente können jedoch nicht von außerhalb gesteuert werden, was dieses Dateiformat ungeeignet für Roboterdefinitionen macht. -Lichter besitzen einen Lichttyp, welcher die Ausbreitung des Lichtes im Raum bestimmt. -Die erste Art ist direktionales Licht, welches parallel zur gewünschten Achse auftrifft, welches vor allem zur grundlegenden Raumausleuchtung genutzt werden kann. -Außerdem existieren noch Punktlichtquellen, welche von einer Position im Raum ausgehen und Spots, welche außerdem noch nur einen gewissen Winkel abdecken. +Lichter besitzen einen Lichttyp, der die Ausbreitung des Lichtes im Raum bestimmt. +Die erste Art ist direktionales Licht, dass parallel zur gewünschten Achse auftrifft. +Solche Lichter werden vor allem zur grundlegenden Raumausleuchtung genutzt. +Außerdem existieren noch Punktlichtquellen, die von einer Position im Raum ausgehen. +Neben den Punklichtquellen existieren auch noch Spots, die außerdem noch nur einen gewissen Winkel ausleuchten. 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. @@ -194,8 +220,8 @@ Diese können durch in einem Skript definierte Trajectories ausgeführt werden, Eine solche Befehlsfolge kann jedoch nicht von außerhalb der Simulation zur Laufzeit angepasst werden, was weitere Entwicklungsarbeit erforderlich macht. \subsection{Robotersimulation} -Für die Robotersimulation wird ein Modell des Roboters benötigt, in welchem dieser für die Simulationsumgebung beschrieben wird. -Gazebo und ROS nutzen hierfür .urdf-Dateien\cite{urdf-format}, welche auf XML basieren. +Für die Robotersimulation wird ein Modell des Roboters benötigt, in dem dieser für die Simulationsumgebung beschrieben wird. +Gazebo und ROS nutzen hierfür .urdf-Dateien\cite{urdf-format}, die auf XML basieren. In diesen werden die einzelnen Glieder des Roboterarms und die verbindenden Gelenke beschrieben. Jedes Glied des Modells besitzt eine Masse, einen Masseschwerpunkt und eine Trägheitsmatrix für die Physiksimulation in Gazebo. @@ -206,7 +232,8 @@ Hierbei werden die Modelle für die Physiksimulation und das Aussehen des Robote Gelenke werden separat von den Gliedern definiert und verbinden jeweils zwei Glieder miteinander. Durch das Aneinanderreihen von mehreren Gliedern und Gelenken ist die Beschreibung eines beliebigen Roboteraufbaus möglich. -Jedes Gelenk besitzt eine Position und Rotation im Raum, um dessen Effekte, welche vom Gelenktyp abhängen, berechnen zu können. +Jedes Gelenk besitzt eine Position und Rotation im Raum. +Diese werden für die Berechnung der Effekte genutzt, die vom spezifischen Gelenktyp abhängen. Aspekte wie Reibung und Dämpfung können auch hier für die Nutzung in der Physiksimulation beschrieben werden. Folgende Typen von Gelenken können in urdf-Dateien genutzt werden: \begin{description} @@ -224,35 +251,37 @@ Folgende Typen von Gelenken können in urdf-Dateien genutzt werden: ermöglichen die lineare Bewegung entlang der Achse des Gelenks. Sie werden zur Umsetzung von Linearaktuatore in der Simulation verwendet. \end{description} \subsection{Menschensimulation} -Gazebo besitzt bereits ein einfaches Animationssystem für bewegliche Aktoren, welches auch für Menschen nutzbar ist. -Für diesen existiert bereits ein Modell mit mehreren Animationen, welche allein abgespielt, oder an Bewegungen gekoppelt werden können. -Dadurch ist eine Laufanimation realisierbar, welche synchronisiert zur Bewegung abgespielt wird. +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. Dies setzt jedoch voraus, dass der gesamte Bewegungsablauf zum Simulationsstart bekannt ist. -Der Grund dafür ist auf die Definition der Pfade, welche die Bewegung auslösen, zurück zu führen. +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. 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. Um diese Einschränkung zu beheben, ist die Entwicklung eines eigenen Systems zum Bewegen und Animieren des Menschen unausweichlich. Dieses System muss, wie im Konzept beschrieben, Steuerbefehle von außen empfangen, umsetzen und Feedback liefern können. -Dafür soll ein ROS Action-Server verwendet werden, welcher die Befehle entgegennimmt, unter konstantem Feedback ausführt und nach Erfolgreicher Ausführung den Empfang des nächsten Befehlts zulässt. +Dafür soll ein ROS Action-Server verwendet werden, der die Befehle entgegennimmt, unter konstantem Feedback ausführt und nach Erfolgreicher Ausführung den Empfang des nächsten Befehlts zulässt. -Ein solches System soll als Gazebo-Plugin einbindbar sein, um Modifikationen an der Simulationsumgebung selbst auszuschließen, welche konstant weiter entwickelt wird. -Dies erlaubt die einfachere Wartung, da bei Updates der Simulationsumgebung nicht die Menschensimulation an den neuen Code angepasst werden muss. +Ein solches System soll als Gazebo-Plugin einbindbar sein, um Modifikationen an der Simulationsumgebung selbst auszuschließen, die konstant weiter entwickelt wird. +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 erleichtert und zahlreiche direkte Integrationen mit anderen ROS-Paketen, wodurch diese einfacher zusammen genutzt werden können. -Diese Eigenschaften machen das Paket als Roboterumgebung für dieses Projekt extrem attraktiv. +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. -MoveIt besteht aus meheren Komponmenten, welche in ihrer Gesamtheit den Bereich der Bewegungsplanung abdecken. -Der Nutzer kann mit MoveIt auf verschiedenen Wegen Steuerbefehle für den Roboter absenden, welche durch die Software umgesetzt werden. +MoveIt besteht aus meheren 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 einfachste Art der Inbetriebnahme ist über das mitgelieferte RViz-Plugin und die demo-Launch-Files, welche durch einen mitgelieferten Setupassistenten für den Roboter generiert werden. +Die erste Inbetriebnahme ist über das mitgelieferte RViz-Plugin und die demo-Launch-Files moglich. +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. -Darin können Roboterbewegungen unter Zuhilfenahme von Markierungen in RViz geplant und ausgeführt werden. +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, welches den Zugriff auf MoveIt in Pyhon erlaubt, welches 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. @@ -260,7 +289,7 @@ Außerdem können Objekte virtuell mit dem Roboter verbunden werden, wodurch sic 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. 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, welche diese zur Laufzeit anfordern, unter diesen auch MoveIt selbst. +Dieser läd alle Daten des Robotermodells und gibt sie an andere Programme weiter, die Roboterparameter zur Laufzeit anfordern, unter diesen auch MoveIt selbst. Durch die vorher erwähne C++-API erhält die MoveGroup die Informationen über die gewünschte Bewegung. Dabei können auch bestimmte Einschränkungen des Arbeitsraums, spezielle Trajektorien, oder Limitierungen der Gelenke in der Planung berücksichtigt werden. @@ -268,14 +297,14 @@ 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, welcher durch die MoveGroup aufgerufen wird. +Die Planung der Bewegung wird durch einen der zahlreichen implementierten Solver erledigt, 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 einfach ein anderer \code{ros_control} Controller geladen werden, welcher entweder die simulierte oder echte Hardware ansteuert. +Hiefür kann ein anderer \code{ros_control} Controller geladen werden, der entweder die simulierte oder echte Hardware ansteuert. Der Erfolg der gesamten Pipeline kann dabei durch einen Feedbackmechanismus überwacht werden. -Im Falle von Gazebo wird \code{ign_ros_control} genutzt, welches die benötigten \code{ros_control} Controller in die Simulation einbindet. +Im Falle von Gazebo wird \code{ign_ros_control} genutzt, dass die benötigten \code{ros_control} Controller in die Simulation einbindet. 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. @@ -284,44 +313,44 @@ Dieser Ablauf ist auch im Anhang unter Abbildung \ref{moveitpipeline} im Anhang Als Programmiersprache kommen in ROS standartmäß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, welche zu den hohen Programmiersprachen zählt. -Sie wird in ROS zum Beispiel in .launch.py-Dateien eingesetzt, welche den Start von Diensten in der Umgebung verwalten. +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. Die Sprache kann aber auch für die Programmierung von Nodes innerhalb des ROS-Systems verwendet werden. -C++ hingegen ist eine kompillierte, statisch typisierte, maschinennahe Programmiersprache. -In ROS wird C++ für Code verwendet, welcher entweder häufig oder in zeitkritischen Szenarien ausgeführt wird. -Aus diesem Grund wird C++ in Nodes verwendet, welche schnell auf große Datenmengen reagieren müssen. +C++ hingegen ist eine kompilierte, statisch typisierte, maschinennahe Programmiersprache. +In ROS wird C++ für Code verwendet, der entweder häufig oder in zeitkritischen Szenarien ausgeführt wird. +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, welche dann wieder kompilliert werden müssten. +Dies ist vor allem in häufig geänderten Programmen ein Nachteil, die nach einer Änderung wieder 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, welche bei einer hohen Anzahl an Simulationsschritten pro Sekunde benötigt wird. +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. 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. \section{Behavior Trees} -Zur Verwaltung der Abläufe sollen BehaviorTrees genutzt werden, welche durch die Bibliothek \code{BehaviorTree.CPP} bereitgestellt werden. -Diese Bibliothek wurde in C++ geschrieben, und ist somit einfach in ROS und dem geplanten Konzept integrierbar. +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, welche im folgenden vorgestellt werden. +Es existieren aber auch viele Beispiele und eine gute Dokumentation über die erweiterten Funktionen, 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. - Dies resultiert in Nodes, welche ohne spezielle Logik langanhaltende Aktionen ausführen können, ohne die Ausführung des BehaviorTrees zu behindern. + 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, welche aktuell ausführende Aktionen beeinflussen können. + Diese Strukturelemente erlauben die parallele Ausführung von mehreren Zweigen, die aktuell ausführende Aktionen 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 einfachen Austausch des Verhaltens, ohne die unterliegende Programme verändern zu müssen. - Dies ist vor allem in kompillierten Sprachen wie C++ sinnvoll, da Änderungen im Verhaltensablauf keiner Neukompillierung bedürfen, was die Iterationszeit für Änderungen verbessert. + \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 Neukompillierung bedürfen, was die Iterationszeit für Änderungen verbessert. \item[Plugins] können zum Start geladen werden, um weitere Nodes dem ausgeführten Programm hinzufügen zu können. Dies vereinfacht die Erweiterung um neue Funktionen und das mehrfachen Nutzen von Code. - \item[Das Blackboard] ist eine Schicht, welche den Datenfluss zwischen den Nodes erlaubt. + \item[Das Blackboard] ist eine Interaktionsebene, die den Datenfluss zwischen den Nodes erlaubt. In diesem System kann unter Verwendung einer Zeichenkette als Identifikator ein Wert in Form einer Referenz hinterlegt werden. Sogenannte Ports erlauben Nodes, Daten aus dem Blackboard zu lesen und auf dieses zu schreiben. \item[Integriertes Logging] erlaubt es, Zustandsänderungen im Behavior Tree zu visualisieren, aufzunehmen und wieder abzuspielen. @@ -333,24 +362,25 @@ Diese Dateien enthalten die Anordnung der Nodes selbst, aber auch weitere Konfig 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, da deren Funktionen aus einfacheren Nodes mit variablen Parametern abgebildet werden kann. +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. 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, welche diesen String in den gewünschten Zieltyp übersetzt. -Viele einfache Datentypen, wie Ganzzahlen und Gleitkommazahlen, werden von BehaviorTree.Cpp bereits durch mitgelieferte Funktionen unterstützt. +Um die Übersetzung aus einem String zu ermöglichen, muss eine entsprechende Funktion implementiert werden, die einen String in den gewünschten Zieltyp übersetzt. +Viele primitive Datentypen, wie Ganzzahlen und Gleitkommazahlen, werden von BehaviorTree.Cpp bereits durch mitgelieferte Funktionen unterstützt. -Das Blackboard ist ein System, welches die Nutzung von Variablen als Parameter für Ports erlaubt. +Das Blackboard ist ein System, dass die Nutzung von Variablen als Parameter für Ports erlaubt. Diese werden im Hintergrund als eine Referenz auf den eigentlichen Wert gespeichert. 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, welche zu komplexeren Strukturen zusammengesetzt werden können. +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. -Diese bilden dann in ihrer Gesamtheit eine neue Node, welche im BehaviorTree eingesetzt werden kann. +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. 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, einfach als Parameter an den SubTree übergeben werden. +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. \subsection{Asynchrone Nodes} @@ -358,24 +388,25 @@ Da nicht jeder Prozess sofort vollständig durchgeführt werden kann, muss die M 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, welche den Lebenszyklus der Node darstellen. +Außerdem werden mehrere Funktionen definiert, die den Lebenszyklus der Node darstellen. Wird eine Node durch den Aufruf der \code{onStart}-Funktion gestartet, geht diese in einen der Zustände RUNNING, SUCCESS oder FAILURE über. -Der Zustand RUNNING steht dabei für eine Node, welche sich noch in der Ausführung befindet. +Der Zustand RUNNING steht dabei für eine Node, die sich noch in der Ausführung befindet. So lang dieser Zustand anhält, wird die Node nicht noch ein weiteres Mal gestartet, sondern nur der Zustand in der neuen \code{onRunning}-Funktion abgefragt. -Der IDLE-Zustand ist ein besonderer Zustand, welcher nur durch eine vollständige Ausführung erreichbar ist. +Der IDLE-Zustand ist ein besonderer Zustand, der nur durch eine vollständige Ausführung erreichbar ist. Er wird von der Node angenommen, nachdem deren Ausführung durch SUCCESS oder FAILURE beendet wurde. -Im Falle eines Abbruchs, welcher durch andere Nodes im Baum ausgelöst werden könnte, muss die Ausführung der Node vorzeitig beendet werden. -Dies geschieht mit der neuen \code{onHalted}-Funktion, welche die Ausführung der Node abbrechen kann. +Im Falle eines Abbruchs, der durch andere Nodes im Baum ausgelöst werden könnte, muss die Ausführung der Node vorzeitig beendet werden können. +Dies geschieht mit der neuen \code{onHalted}-Funktion. +Diese wird ausgeführt, wenn die Ausführung der Node abgebrochen werden soll. \subsection{Dateiformat} Das in BehaviorTree.Cpp verwendete Dateiformat, um Behavior Trees zu erstellen, basiert auf XML. -Jedes Dokument beginnt dabei mit einem Root-Element, welches alle BehaviorTrees und eine Referenz auf die ID des Hauptbaumes enthält. +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, welches als Attribut die ID des Baumes besitzen muss. +Jeder Baum beginnt mit einem BehaviorTree-Element, dass 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. @@ -410,24 +441,26 @@ Außerdem können selbst definierte Nodes sowohl direkt mit ihrem Namen, aber au \end{figure} \section{Docker-Compose als Virtualisierungsumgebung} -Docker ist eine Virtualisierungsumgebung für Anwendungen, welche die komplette Umgebung für deren Ausführung bereitstellt. -Dadurch wird die Inbetriebnahme von Anwendungen, welche spezielle Umgebungen für ihre Ausführung benötigen auf beliebigen Systemen ermöglicht. +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. 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. -Um diesen Prozess weiter zu beschleunigen, ist auch der Einsatz eines Buildservers möglich, welcher benötigte Container als Download bereitstellt. +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, welches aus dem im Buildfile definierten Dateien und einem Overlay besteht. -In diesem Overlay werden Änderungen gespeichert, welche am Container während der Laufzeit vorgenommen werden. +Jeder Container enthält ein eigenes Dateisystem, das aus dem im Buildfile definierten Dateien und einem Overlay besteht. +In diesem Overlay werden temporär Änderungen gespeichert, die am Container während dessen Laufzeit vorgenommen werden. Sofern nicht definiert, werden diese Änderungen beim Neustart des Containers wieder entfernt. Um dies zu vermeiden, kann entweder ein Volume, eine Art virtuelles Laufwerk in einem Systemverzeichnis des Hostsystems, oder ein ``bind mount'' eingerichtet werden. -Ein ``bind mount'' ist eine direkte Verbindung zu einem Ort des Host-Dateisystems, welche in den Container hereingereicht wird. +Ein ``bind mount'' ist eine direkte Verbindung zu einem Ort des Host-Dateisystems, dass in den Container hereingereicht wird. -Docker-Compose stellt eine Erweiterung von Docker dar, welche die Inbetriebnahme der Container über ein spezielles Dateiformat verwaltet. -In dieser Datei werden weitere Optionen angegeben, welche in die Umgebung des laufenden Containers eingreifen. +Docker-Compose stellt eine Erweiterung von Docker dar. +Diese Erweiterung verwaltet die Inbetriebnahme der Container über ein spezielles Dateiformat. +Eine solche Funktion erlaubt das wiederholte Einrichten von Containern mit gleichen Parametern. +In dieser Datei werden weitere Optionen angegeben, die in die Umgebung des laufenden Containers eingreifen. Dazu gehört zum Beispiel das automatisierte Übergeben von Umgebungsvariablen, Einrichten von Netzwekumgebungen und Erstellen von Volumes und ``bind mounts''. Diese Automatisierung erleichtert die initiale Einrichtung eines Containers auf einem neuen System, da alle benötigten Aspekte leicht angepasst werden können. diff --git a/tex/4_Umsetzung.tex b/tex/4_Umsetzung.tex index 0a72214..4295e30 100644 --- a/tex/4_Umsetzung.tex +++ b/tex/4_Umsetzung.tex @@ -1,14 +1,14 @@ \chapter{Umsetzung} -Bei der Umsetzung des geplanten Systemaufbaus kam es zu mehreren Problemen, welche den geplanten Systemaufbau, sowie dessen Komplexität, negativ beeinflussen. +Bei der Umsetzung des geplanten Systemaufbaus kam es zu mehreren Problemen, die den geplanten Systemaufbau, sowie dessen Komplexität, negativ beeinflussen. Die Kommunikation zwischen dem Actormodell und dem Behavior Tree musste in mehrere Komponenten aufgeteilt werden, um Konflikte innerhalb der Simulationssoftware zu vermeiden. Zudem ist die Bewegungsplanung mit MoveIt2 deutlich komplexer als vorerst angenommen. -Diese Komplexität entsteht aus der Interaktion mehrerer Komponenten, welche das Gesamtsystem zur Ausführung benötigt. +Diese Komplexität entsteht aus der Interaktion mehrerer Komponenten, die das Gesamtsystem zur Ausführung benötigt. Alle Einzelsysteme mussten hierfür konfiguriert werden, um die Kommunikation dieser zu ermöglichen. -Anhand der hier genannten Änderungen wurde die Übersicht des Systems angepasst, welche in Abbildung \ref{umsetzung_overview} zu sehen ist. +Anhand der hier genannten Änderungen wurde die Übersicht des Systems angepasst, die in Abbildung \ref{umsetzung_overview} zu sehen ist. \begin{figure}[h] \includegraphics[width=\textwidth]{img/MA-Umsetzung-Übersicht.drawio} @@ -19,10 +19,12 @@ Anhand der hier genannten Änderungen wurde die Übersicht des Systems angepasst \section{Docker-Compose} Um Docker für die Verwaltung einer ROS-Installation verwenden zu können, müssen einige Anpassungen vorgenommen werden. -Da viele Anwendungen, unter anderem auch die Simulationsumgebung, eine Desktopumgebung benötigen, muss eine Zugriffsmöglichkeit geschaffen werden. +Da viele Anwendungen, unter anderem auch die Simulationsumgebung, eine Desktopumgebung benötigen, ist der Zugriffs auf eine solche Umgebung erforderlich. -Diese Möglichkeiten können nicht durch Docker allein gelöst werden, da Befehle auf dem Hostsystem ausgeführt werden müssen, um die gewünschten Funktionen zu aktivieren. -Um diese Modifikationen trotzdem reproduzierbar zu machen, wurde ein Shellscript geschrieben, welches zum Starten des Containers verwendet wird. +Diese Probleme können nicht durch Docker allein gelöst werden, da die Virtualisierungsumgebung eine Trennung der Systeme vorsieht. +Die Isolation des Containers von der Benutzeroberfläche des Systemskann durch eine Kombination aus zwei Komponenten aufgehoben werden. + +Um diese Modifikationen trotzdem reproduzierbar zu machen, wurde ein Shellscript geschrieben, dass zum Starten des Containers verwendet wird. Dieses Skript erstellt zuerst die benötigten Verzeichnisse für den Container, falls diese noch nicht existieren. Danach werden die SSH-Keys des Hosts in den Container kopiert, um eine SSH-Verbindung zu ermöglichen. @@ -30,21 +32,23 @@ Dieser Umweg über SSH ist nötig, da die benötigten Umgebungsvariablen für RO Außerdem werden die benötigten Zugriffe auf den lokalen X-Server durch den Container anhand dessen Hostname erlaubt. Diese Änderung erlaubt es dem Container, Fenster auf dem Desktop anzeigen zu können, solange die benötigten SysFS-Dateien hereingereicht werden. -Dies geschieht durch Einträge in der compose.yml-Datei, welche diese als ``bind mount'' in den Container hereinreicht. +Dies geschieht durch Einträge in der compose.yml-Datei, die diese als ``bind mount'' in den Container hereinreicht. Um Zugriff auf die Grafikbeschleunigung des Systems zu erhalten, muss deren Repräsentation im SysFS unter \code{/dev/dri} hineingereicht werden. -Der Zugriff auf die Desktopumgebung, welcher bereits entsperrt wurde, wird nun durch das mounten von \code{/tmp/.X11-unix} erreicht. +Der Zugriff auf die Desktopumgebung, der im vorherigen Schritt entsperrt wurde, wird nun durch das mounten von \code{/tmp/.X11-unix} erreicht. Dabei handelt es sich um den Unix-Socket des X11 Displayservers. -Zum Starten des Containers muss der Befehl \code{./start.sh} im Verzeichnis der Containerinstallation ausgeführt werden, welcher die obengenannten Schritte ausführt und den Container startet. -Eine Verbindung zum Container kann aufgebaut werden, nachdem die Meldung \code{ros_1 | Ready to connect.} in der Konsole erscheint. +Zum Starten des Containers muss der Befehl \code{./start.sh} im Verzeichnis der Containerinstallation ausgeführt werden. +Dieser führt die obengenannten Schritte aus und den Container startet. +Eine Verbindung zum Container ist möglich, nachdem die Meldung \code{ros_1 | Ready to connect.} in der Konsole erscheint. -Dafür muss ein SSH-Client eingesetzt werden, welcher eine Verbindung zu der lokalen Netzadresse des Systems mit dem Benutzer \code{ros} aufbauen kann. +Dafür wird ein SSH-Client eingesetzt, der eine Verbindung zu der lokalen Netzadresse des Systems mit dem Benutzer \code{ros} aufbauen kann. Der Port des SSH-Servers wird dabei durch die Deklaration im docker-compose.yaml an das Hostsystem durchgereicht. -Hierbei ist zu beachten, dass der SSH-Server im Container auf Port 2222 ausgeführt wird, was bei der Verbindung beachtet werden muss. +Hierbei ist zu beachten, dass der SSH-Server im Container auf Port 2222 antwortet, was nicht dem standartmäßigen Port 22 entspricht. -Nach der Verbindung wird automatisch die ROS2-Umgebung eingerichtet, welche sofort nach Verbindungsaufbau genutzt werden kann. -Um die erstellten Pakete zu kompillieren, kann das Skript \code{build.sh} im \code{workspace}-Verzeichnis verwendet werden. +Nach der Verbindung wird automatisch die ROS2-Umgebung eingerichtet. +Diese kann ohne weitere Befehle nach Verbindungsaufbau genutzt werden. +Um die erstellten Pakete zu kompillieren, wurde das Skript \code{build.sh} im \code{workspace}-Verzeichnis erstellt. \begin{minted}[breaklines,frame=single]{bash} #!/bin/bash @@ -54,36 +58,36 @@ popd || exit \end{minted} Dieses Skript nutzt \code{colcon}, um alle Pakete in \code{~/workspace}-Verzeichnis zu erstellen. -Dabei wird auch eine \code{compile_commands.json}-Datei im build-Unterordner erstellt, welche von Entwicklungsumgebungen zur Syntaxvervollständigung genutzt werden. +Dabei wird auch eine \code{compile_commands.json}-Datei im build-Unterordner erstellt, die von Entwicklungsumgebungen zur Syntaxvervollständigung genutzt werden. Um eine Nutzung in allen Umgebungen zu erlauben, wurde diese in das Hauptverzeichnis gelinkt, da einige Umgebung nur dort nach dieser Datei suchen. -Da der Kompilliervorgang parallel abläuft, erscheinen Informationen zu allen Paketen gleichzeitig, was das Finden eines Fehlers erschwert. -Um trotzdem alle wichtigen Informationen zu erhalten, kommt der Event-Handler \code{console_cohesion+} zum Einsatz, welcher die Ausgaben neu formatiert. -Durch diesen werden die Ausgaben gruppiert, und erst nach einen vollständigen Kompilliervorgang eines Pakets nacheinander ausgegeben. +Da der Kompiliervorgang parallel abläuft, erscheinen Informationen zu allen Paketen gleichzeitig, was das Finden eines Fehlers erschwert. +Um trotzdem alle wichtigen Informationen zu erhalten, kommt der Event-Handler \code{console_cohesion+} zum Einsatz, der die Ausgaben neu formatiert. +Durch diesen werden die Ausgaben gruppiert, und erst nach einen vollständigen Kompiliervorgang eines Pakets nacheinander ausgegeben. Dies ermöglicht es, aufgetretene Fehler einfacher auf ein bestimmtes Paket zurückführen zu können, ohne das gesamte Log zu durchsuchen. -Hierbei ist es hilfreich, dass die verbleibenden Kompilliervorgänge abgebrochen werden, falls der Kompilliervorgang eines Pakets fehlschlägt. +Hierbei ist es hilfreich, dass die verbleibenden Kompiliervorgänge abgebrochen werden, falls der Kompiliervorgang eines Pakets fehlschlägt. Dadurch befindet sich der Fehlers immer im letzten Paket der Ausgabe, da alle anderen Prozesse abgebrochen und nicht ausgegeben werden. \section{Entwicklungsumgebung} Ein einfacher Texteditor ist für das Schreiben von ROS-Packages ausreichend und bietet bei der Arbeit mit Containern sogar einen großen Vorteil. Das Editieren von Dateien ist mit einem Texteditor auch von außerhalb des Containers möglich. -Jedoch besitzt ein Texteditor nur wenige Funktionen einer vollständigen Entwicklungsumgebung, welche den Prozess der Softwareentwicklung beschleunigen. +Jedoch besitzt ein Texteditor nur wenige Funktionen einer vollständigen Entwicklungsumgebung, die den Prozess der Softwareentwicklung beschleunigen. Um diese Funktionen bieten zu können, analysieren Entwicklungsumgebungen den geschriebenen Code. Dies geschieht meißt auf eine von zwei unterschiedlichen Weisen. Die Entwicklungsumgebung kann eine interne Repräsentation des geschriebenen Codes generieren. Diese Repräsentation kann nun genutzt werden, um die implementierten Funktionen der Entwicklungsumgebung bereitzustellen. -Um dies zu erreichen, muss für jede unterstützte Sprache Code geschrieben werden, welcher in die Entwicklungsumgebung integriert werden muss. +Um dies zu erreichen, muss für jede unterstützte Sprache Code geschrieben werden, der in die Entwicklungsumgebung integriert werden muss. -Als Alternative existiert das Language Server Protocol, kurz LSP, welches eine Schnittstelle in Form eines JSON-RPC Protokolls zur Verfügung stellt, um Infomationen über den Code an die Entwicklungsumgebung zu übergeben. +Als Alternative existiert das Language Server Protocol, kurz LSP, dass eine Schnittstelle in Form eines JSON-RPC Protokolls zur Verfügung stellt, um Infomationen über den Code an die Entwicklungsumgebung zu übergeben. Dies erlaubt einer Entwicklungsumgebung, nur noch den benötigten Server der Sprache zu starten, um Informationen über den Code in einem standartisierten Protokoll zu erhalten. Der große Vorteil des LSP ist, dass eine Entwicklungsumgebung alle Funktionen der Programmiersprache vollständig unterstützt, solange das Protokoll vollständig implementiert wurde und ein entsprechender Server für die Sprache existiert. -Jedoch können bestimmte Funktionen, welche beim Design des LSP nicht bedacht wurden, einfacher in interner Implementation umgesetzt werden. -Deswegen haben Entwicklungsumgebungen mit interner Coderepräsentation häufig mehr Funktionen, spezialisieren sich jedoch auf bestimmte Sprachen. +Jedoch können bestimmte Funktionen, die beim Design des LSP nicht bedacht wurden, einfacher in interner Implementation umgesetzt werden. +Deswegen besitzen Entwicklungsumgebungen mit interner Coderepräsentation häufig mehr Funktionen, spezialisieren sich jedoch auf bestimmte Sprachen. In diesem Projekt wurden mehrere Entwicklungsumgebungen mit den jeweils unterschiedlichen Verfahren verwendet. Um diese mit dem Docker-Container verwenden zu können, müssen diese Umgebungen die Entwicklung auf entfernten Systemen unterstützten, da der Container vom ausführenden System getrennt ist. @@ -114,47 +118,48 @@ Um die Verständlichkeit der Dokumentation zu erleichtern, sind die in der Imple \item[Pose] ist einer der häufigsten Datentypen im Umgang mit Gazebo. Dieser Datentyp enthält die Information über die Lage und Rotation eines Objekts im Raum. Diese werden als relative Werte im Bezug auf das übergeornete Objekt gespeichert. - Objekte wie der Mensch liegen in der Hierarchie der Simulation direkt unter der Welt, welche sich direkt im Nullpunkt und ohne Rotation befindet. - Dadurch sind zum Beispiel die Koordinaten des Menschen absolut, da diese nicht durch die Welt verschoben und rotiert werden. + Objekte wie der Mensch liegen in der Hierarchie der Simulation direkt unter der Welt, deren Pose sich direkt im Nullpunkt und ohne Rotation befindet. + Durch diesen Umstand sind die Koordinaten des Menschen absolut, da diese nicht durch die Welt verschoben und rotiert werden. \item[Area] - ist eine Datenstruktur mit einem Vektor an Positionen, welche eine Zone im Zweidimensionalen Raum definieren. + ist eine Datenstruktur mit einem Vektor an Positionen, die eine Zone im Zweidimensionalen Raum definieren. Jede Position ist eine einfache Datenstruktur aus 2 Gleitkommazahlen für je die X- und Y-Koordinate der Position. - Der Verwendungszweck dieser Struktur ist die einfache Definition von Zonen, welche für Positionsgenerierungen und Postionsabfragen genutzt werden können. + Der Verwendungszweck dieser Struktur ist die einfache Definition von Zonen, die für Positionsgenerierungen und Postionsabfragen genutzt werden können. \item[ActorPluginState] - definiert 4 Werte, welche das ActorPlugin annehmen kann. Diese 4 Werte sind SETUP, IDLE, MOVEMENT und ANIMATION. + definiert 4 Zustände, die das ActorPlugin annehmen kann. Diese 4 Werte sind SETUP, IDLE, MOVEMENT und ANIMATION. \item[FeedbackMessage] - beschreibt die erste der beiden MessageQueue-Nachrichten, welche vom ActorPlugin an den ActorServer gesendet wird. + beschreibt die erste der beiden MessageQueue-Nachrichten, die vom ActorPlugin an den ActorServer gesendet wird. In dieser Struktur befindet sich der aktuelle Plugin-Zustand als \code{state} Parameter vom Typ ActorPluginState. - Außerdem ein \code{progress} Parameter in Form einer Gleitkommazahl, welche den Fortschritt der aktuellen Aktion angibt. + Außerdem ein \code{progress} Parameter in Form einer Gleitkommazahl, die den Fortschritt der aktuellen Aktion angibt. Um bei Bewegungen die aktuelle Position des Menschen zu erhalten, ist auch die aktuelle Pose des Modells im Parameter \code{current} enthalten. \item[ActionMessage] - ist die andere Nachricht, welche über die zweite MessageQueue vom ActorServer an das ActorPlugin gesendet wird. + ist die andere Nachricht, die über die zweite MessageQueue vom ActorServer an das ActorPlugin gesendet wird. Wie in der FeedbackMessage ist ein \code{state} Parameter vom selben Typ enthalten, jedoch dient dieser hier als Vorgabe für den nächsten State. Ein \code{animationName} Parameter wird als ein char-Array mit einer maximalen Länge von 255 Zeichen übergeben. - Dieser bestimmt später die Animation, welche je nach ActorPluginState während einer Bewegung oder Animation ausgeführt wird. - Der \code{animationSpeed} Parameter beschreibt entweder die Abspielgeschwindigkeit der Animation, oder die Distanz, welche pro Animationsdurchlauf zurückgelegt wird. + Dieser bestimmt später die Animation, die je nach ActorPluginState während einer Bewegung oder Animation ausgeführt wird. + Der \code{animationSpeed} Parameter beschreibt entweder die Abspielgeschwindigkeit der Animation, oder die zurückgelegte Distanz pro Animationsdurchlauf. Außerdem wird im Falle einer Bewegung der Parameter \code{target} vom Typ Pose verwendet, um die Endposition und Rotation des Actors zu bestimmen. \end{description} \section{Simulationswelt} Die Welt der Simulation wird im Paket \code{ign_world} zur Verfügung gestellt. In diesem Paket sind sowohl die Geometrien der Welt, aber auch die benötigten Dateien zum Starten der Simulation enthalten. -In diesem Fall handelt es sich um den Raum, in welchem die Interaktion zwischen Mensch und Roboter stattfinden soll. -Für diesen Raum wurde zuerst ein Raumplan erstellt, welcher alle benötigten Bereiche für die Szenarien besitzt (Abbildung \ref{room-plan}). +In diesem Fall handelt es sich um den Raum, in dem die Interaktion zwischen Mensch und Roboter stattfinden soll. +Für diesen Raum wurde zuerst ein Raumplan erstellt, der alle benötigten Bereiche für die Szenarien besitzt (Abbildung \ref{room-plan}). -Zuerst wird ein Stellplatz für den Roboter benötigt, welcher an einer Ecke des Raumes positioniert werden sollte. -Diese Position wurde gewählt, um die Verfahrgeschwindigkeit des Roboters höher zu halten, welche je nach Distanz zum Menschen angepasst werden soll. +Zuerst wird ein Stellplatz für den Roboter benötigt. +Dieser sollte an einer Ecke des Raumes positioniert werden, was zu höheren Verfahrgeschwindigkeiten führt. +Das ist durch die dynamische Verfahrgeschwindigkeit bedingt, die bei geringerer Distanz zum Menschen abnimmt. -Des weiteren werden eine Arbeits- und Lagersätte für den Menschen benötigt, welche in den Szenarien genutzt werden sollen. +Des weiteren werden eine Arbeits- und Lagersätte für den Menschen benötigt, die in den Szenarien genutzt werden sollen. Im Koexistenzszenario soll der Mensch nur an diesen Stellen seine Arbeit verrichten, jedoch sich selten dem Roboter nähern, um dessen Fortschritt zu begutachten. -Die Lagerstätte soll im Kooperationsszenario neben der Arbeit des Menschen auch für die fehlerhaften Teile verwendet werden, welche durch den Roboter aussortiert und durch den Menschen dorthin verbracht werden sollen. +Die Lagerstätte soll im Kooperationsszenario neben der Arbeit des Menschen auch für die fehlerhaften Teile verwendet werden, die durch den Roboter aussortiert und durch den Menschen dorthin verbracht werden sollen. Eine Nutzung im Kollaborationsszenario ist nicht nicht geplant, da der Mensch den Roboter überwachen und dessen Fehler korrigieren soll. Der so geplante Raum wurde in Blender modelliert und als .stl-Datei exportiert, um sie in die Welt einbinden zu können. -Für das Kooperationsszenario wurde ein Förderband moddeliert, welches in diesem Szenario dem Raum hinzugefügt wird. +Für das Kooperationsszenario wurde ein Förderband moddeliert, das nur in diesem Szenario dem Raum hinzugefügt wird. Der so erstellte Raum wird in einer .sdf-Datei als Modell referenziert, um diesen später in die Simulation einbinden zu können. -Das Förderband erhält ein eigenes Modell in einer weiteren Datei, welche zur Laufzeit in die Simulation geladen wird. +Das Förderband erhält ein eigenes Modell in einer weiteren Datei, die zur Laufzeit in die Simulation geladen wird. Für beide wird, wie später auch für den Roboter selbst, das Paket \code{ros_gz_sim} verwendet. Dieses veranlasst mit dem \code{create}-Programm das Erstellen der übergebenen Datenstruktur in Gazebo. @@ -186,18 +191,18 @@ Um diese ausführen zu können, wird der gewünschte Animationsname, aber auch a Das Feedback an den Client des ROS-Action-Servers wird bei Zustandswechseln und während laufenden Aktionen des ActorPlugins generiert. Dabei wird der aktuelle Zustand mitsamt einigen weiteren Daten, in diesem Fall die Position des Actors und der aktuelle Fortschritt der Aktion an den ActorServer gesendet. -Dies geschieht über eine zweite MessageQueue, welche den \code{FeedbackMessage}-Datentyp überträgt. +Dies geschieht über eine zweite MessageQueue, die den \code{FeedbackMessage}-Datentyp überträgt. Diese werden durch den ActorServer aufbereitet, da nicht alle Daten für die jeweilige laufende Aktion relevant sind und an den ROS-Action-Client gesendet. -Um diese Befehle in der Simulation auch visuell umsetzen zu können, werden weitere Animationen für das Modell des Menschen benötigt, welche im Kontext der zur erfüllenden Aufgabe relevant sind. -Dafür muss dan Modell in einen animierbaren Zustand gebracht werden, in welchem dann weitere Animationen erstellt und in die Simulation eingebunden werden können. +Um diese Befehle in der Simulation auch visuell umsetzen zu können, werden weitere Animationen für das Modell des Menschen benötigt, die im Kontext der zur erfüllenden Aufgabe relevant sind. +Dafür muss dan Modell in einen animierbaren Zustand gebracht werden, in dem dann weitere Animationen erstellt und in die Simulation eingebunden werden können. \subsection{Modellierung} Um neue Animationen für den Menschen in der Simulation erstellen zu können, muss ein Modell für diesen erstellt werden. Dafür wurde eine der inkludierten Animationen in Blender geöffnet und das visuelle Modell kopiert. Dieses Modell war auf Grund von vielen inneren Falten nur schlecht für Animationen geeignet, weshalb das Modell an diesen Stellen vereinfacht wurde. Eine solches Vorgehen beugt späteren Anomalien bei der Animation des Modells vor. -Diese entstehen durch unterschiedliche Verschiebung der Strukturen, welche aus dem inneren des Modells hervortreten, wenn dieses bewegt wird. +Diese entstehen durch unterschiedliche Verschiebung der Strukturen, die aus dem inneren des Modells hervortreten, wenn dieses bewegt wird. @@ -211,9 +216,9 @@ Um eine bessere Übersicht zu ermöglichen, sollten als erstes alle nicht benöt Nun müssen die Knochen durch Verschiebung und Skalierung an die richtigen Positionen im Modell gebracht werden. Dabei muss auf die Ausrichtung der Knochen zueinander geachtet werden. -Das Kreuzprodukt der Vektoren beider Knochensegmente bestimmt die Richtung der Beugeachse, welche sich im Verbindungspunkt beider Knochen befindet. +Das Kreuzprodukt der Vektoren beider Knochensegmente bestimmt die Richtung der Beugeachse, die sich im Verbindungspunkt beider Knochen befindet. Ist diese nicht richtig ausgerichtet, wenn zum Beispiel beide Knochen auf einer Gerade liegen, verbiegen sich Gelenke bei der Verwendung von inverser Kinematik zur Positionsvorgabe falsch. -Der Grund dafür ist das Kreuzprodukt, welches im oben genannten Fall ein Nullvektor ist, wodurch keine Beugeachse bestimmt werden kann. +Der Grund dafür ist das Kreuzprodukt, dass im oben genannten Fall ein Nullvektor ist, wodurch keine Beugeachse bestimmt werden kann. Deswegen muss bei der Platzierung darauf geachtet werden, dass der Startpunkt A des ersten und der Endpunkt C des zweiten Knochens auf einer Gerade liegen. Der Verbindungspunkt B der beiden Knochen wird nun vorerst auf dieser Gerade platziert. @@ -249,18 +254,18 @@ Hierfür werden für jeden Knochen entweder automatisch oder manuell Teile des M Je höher die Wichtung, desto stärker ist die Verformung an dieser Stelle, wenn der Knochen bewegt oder skaliert wird. Da das Animieren aller Knochen einzeln sehr zeitaufwändig ist, werden diese in Gruppen zusammengefasst. -Hierfür werden in Blender sogenannte Constraints eingesetzt, welche Knochen automatisch durch eingestellte Bedingungen positionieren können. +Hierfür werden in Blender sogenannte Constraints eingesetzt, die Knochen automatisch durch eingestellte Bedingungen positionieren können. Durch das Verwenden von Rigify und einem standartisierten Skelett ist die Generierung der Constraints einfach. Hierfür können die in dem Skelett enthaltenen Informationen vom Plugin genutzt werden, um alle häufig genutzten Constraints automatisch zu generieren. -In diesem Schritt werden auch neue Knochen eingefügt, welche das Skelett durch Constraints beeinflussen. +In diesem Schritt werden auch neue Knochen eingefügt, die das Skelett durch Constraints beeinflussen. Das neue Animationsmodell, visualisiert in Abbildung \ref{person-armature}, kann nun für Animationen genutzt werden. -Hierfür sehen mehrere Knochengruppen zur Verfügung, welche typische Animationsmethoden abdecken. +Hierfür sehen mehrere Knochengruppen zur Verfügung, die typische Animationsmethoden abdecken. -In Rot sind hier Knochen markiert, welche für inverse Kinematik genutzt werden, in diesem Fall Arme und Beine. +In der Farbe Rot sind im Modell Knochen markiert, die für inverse Kinematik genutzt werden, in diesem Fall Arme und Beine. Diese Knochen geben gewünschte Ausrichtung und die Zielposition des untersten Knochens vor. -Aus diesen Angaben wird die wirkliche Position der Knochen berechnet, welche durch die Constraints automatisch auf diese übertragen wird. +Aus diesen Angaben wird die wirkliche Position der Knochen berechnet, die durch die Constraints automatisch auf diese übertragen wird. Orange gefärbte Knochen werden für generelle Einstellungen von Fingern, Handfläche und Zehen genutzt. Die Handfläche kann so gekrümmt werden, wodurch sich alle Finger mit der Krümmung mitbewegen. @@ -270,7 +275,7 @@ Hierbei wird der Grad des Einknickens nicht durch eine Rotation des Knochens aus Anstatt der Rotation wird die Skalierung des Knochens eingesetzt, wobei ein kleinerer Knochen eine stärkere Knickung aller Fingerglieder bewirkt. Die gelben Knochen beeinflussen die generelle Pose des Modells. -Der Quader in der Hüfte gibt die gewünschte Höhe des Modells vor, welche auch für die inverse Kinematik benutzt wird. +Der Quader in der Hüfte gibt die gewünschte Höhe des Modells vor, die auch für die inverse Kinematik benutzt wird. Die anderen Knochen beeinflussen die Rotation des Beckens, der Wirbelsäule, der Schultern und des Kopfes. Das hier erstellte, verbesserte Rigify-Skelett kann nun durch den Einsatz der neuen Constraints einfacher animiert werden. @@ -332,18 +337,18 @@ Da sich einige Knochen nur am Anfang der Animation in einer bestimmten Pose befi \subsection{Programmierung} \subsubsection{Message Queue} -Nach der ersten Implementation des ActorPlugins kam es zu Kollisionen mit \code{ros_control}, welche beide \code{rclcpp} zur Kommunikation benutzen. +Nach der ersten Implementation des ActorPlugins kam es zu Kollisionen mit \code{ros_control}, die beide \code{rclcpp} zur Kommunikation benutzen. Diese Kollisionen führt zu einem Crash, wenn beide Plugins in der Simulation geladen werden. Dies geschieht, da beide Plugins rclcpp, eine Bibliothek zur Kommunikation mit ROS-Topics, verwenden. -In dieser Bibliothek wird eine globale Instanz angelegt, welche den Zustand des Kommunikationsprotokolls abbildet. +In dieser Bibliothek wird eine globale Instanz angelegt, die den Zustand des Kommunikationsprotokolls abbildet. Da jedoch von beiden Plugins auf diesen Zustand zugegriffen wird, kommt es zur Problemen, da kein Synchronisationsmechanismus existiert. Die dadurch entstehenden gleichzeitigen Zugriffe auf die selben Ressourcen führen zur Terminierung des Programms. Nach dem Debuggen des Crashes wurden einige Problemlösungen ausprobiert, jedoch ließ sich der Konflikt durch Modifikation des ActorPlugins allein nicht verhindern, weshalb ein anderer Weg zur Problembehebung gewählt werden musste. -Eine Anpassung beider Plugins auf die gemeinsame Nutzung einer Ressource ist möglich, erfordert jedoch potentiell weitreichende Neuimplementationen, welche zeitlich nur schwer planbar sind. -Die Nutzung eines separaten Nachrichtendienstes, welcher keinen globalen Kontext benötigt, ist die sicherste und schnellste Lösung des Problems. +Eine Anpassung beider Plugins auf die gemeinsame Nutzung einer Ressource ist möglich, erfordert jedoch potentiell weitreichende Neuimplementationen, die zeitlich nur schwer planbar sind. +Die Nutzung eines separaten Nachrichtendienstes, der keinen globalen Kontext benötigt, ist die sicherste und schnellste Lösung des Problems. Jedoch erfordert diese Implementation zusätziliche Logik, um die beiden Dienste ineinander übersetzen zu können. Die Auswahl eines Dienstes wurde dabei aus einer Reihe an unterschielichen Möglichkeiten getroffen. @@ -356,10 +361,10 @@ Der Einsatz von zerstückelten Antworten umgeht dieses Problem, jedoch müssen d Die neueren Websockets bieten die Möglichkeit, bidirektional Daten zu übertragen. Dadurch können Aktionsanfragen und Feedback auf dem gleichen Kanal übertragen werden, was das Protokoll übersichtlicher macht. -Beide Technologien basieren jedoch auf einem Webserver, welcher auf einem bestimmten Port des Systems ausgeführt werden muss, was Kollisionen mit anderen Serveices ermöglicht. +Beide Technologien basieren jedoch auf einem Webserver, der auf einem bestimmten Port des Systems ausgeführt werden muss, was Kollisionen mit anderen Serveices ermöglicht. Die Portnummer kann zwar geändert werden, ist jedoch nicht einfach mit einer Komponente assoziierbar, was sie zu einer ``Magischen Zahl'' macht. Dies sorgt für schlechte Lesbarkeit in einem wichtigen Teil des Kontrollflusses. -Außerdem besitzen beide Terchnologien durch TCP oder UDP und HTTP relativ großen Protokolloverhead, welcher bei den hohen Updateraten der Gazebo-Simulation zu Problemen führen könnte. +Außerdem besitzen beide Terchnologien durch TCP oder UDP und HTTP relativ großen Protokolloverhead, der bei den hohen Updateraten der Gazebo-Simulation zu Problemen führen könnte. Eine andere Möglichkeit ist die Nutzung von ``shared memory'', einem geteilten Speicherbereich zwischen beiden Programmen. Dieser kann zur bidirektionalen Kommunikation genutzt werden, da beide Programme auf den gleichen Speicherbereich zugreifen können. @@ -369,12 +374,12 @@ Diese gleichzeitige Modifikation kann zu Fehlern führen, wenn die Zugriffe auf Die letzte betrachtete Methode ist die Verwendung einer Message Queue. Hier wird im Betriebssystem ein Speicherbereich mit bestimmter Größe für den Datenaustauch reserviert. -Dieser Bereich besitzt ein Identifikationsmerkmal, mit welchem Anwendungen Zugriff auf diesen erlangen können. -Ein Programm kann in diesem Bereich Nachrichten ablegen, welche durch das andere Programm gelesen werden können. +Dieser Bereich besitzt ein Identifikationsmerkmal, dass es Anwendungen erlaubt, Zugriff auf diesen zu erlangen. +Ein Programm kann in diesem Bereich Daten ablegen, die durch andere Programme gelesen und geschrieben werden können. Die Koordinierung der Zugriffe erfolgt dabei durch das Betriebssystem, was gleichzeitige Zugriffe, wie bei shared memory, aussschließt. -Hierdurch kommt es zu einem Anstieg an Latenzzeit, jedoch ist dieser ausreichend gering. +Durch diesen Umstand kommt es zu einem Anstieg an Latenzzeit. -Die Wahl des Dienstes fiel auf eine MessageQueue, da die integrierten Funktionen die Entwicklung erleichtern ud die Geschwindigkeit ausreichend für das Einsatzszenario ist. +Die Wahl des Dienstes fiel auf eine MessageQueue, da die integrierten Funktionen die Entwicklung erleichtern und die Geschwindigkeit ausreichend für das Einsatzszenario ist. Jedoch existieren unter Linux 2 unabhängige Implementationen von MessageQueues mit unterschidelichen Funktionen. Die erste Implementation ist die System V MessageQueue, und verwendet zur Identifikation einfache Ganzzahlen. Eine Spezialität dieser alten Implementation ist das Sortieren der Nachrichten nach Nachrichtentyp in der gleichen Warteschlange. @@ -384,43 +389,44 @@ Die ausgewählte Implementation ist die neuere POSIX-Implementation einer Messag \subsubsection{ROS-Nachrichten} Die verwendeten Nachrichten für den ActionServer, als auch für die Message Queue sind in den entsprechenden Paketen \code{ros_actor_action_server_msgs} und \code{ros_actor_message_queue_msgs} organisiert. Sie sind absichtlich nicht in den nutzenden Paketen untergebracht, da sie durch ein externes Programm in den benötigten Code umgewandelt werden. -Dieser Schritt muss vor dem Kompilliervorgang der nutzenden Pakete geschehen, was so am einfachsten realisiert werden kann. -Dazu werden diese Nachrichtenpakete als Dependency der nutzenden Pakete angegeben, was eine automatische Anpassung der Kompillantionsreihenfolge bewirkt. +Dieser Schritt muss vor dem Kompiliervorgang der nutzenden Pakete geschehen, was so am einfachsten realisiert werden kann. +Dazu werden diese Nachrichtenpakete als Dependency der nutzenden Pakete angegeben, was eine automatische Anpassung der Kompilantionsreihenfolge bewirkt. Eine Action des \code{ros_action}-Pakets besteht immer aus 3 einzelnen Nachrichten, deren Inhalt frei definiert werden kann. Zum Start der Action wird die erste Nachricht vom Client an den Server gesendet. -In dieser Startnachricht befinden sich alle Informationen, welche zur Ausführung der Action benötigt werden. +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. -Nach dem Beginn der Action werden vom Server Feedbacknachrichten an den Client gesendet, welche den Fortschritt der Action beschreiben. +Nach dem Beginn der Action werden vom Server Feedbacknachrichten an den Client gesendet, die den Fortschritt der Action beschreiben. Dabei ist es die Aufgabe des Programmierers, diese an sinnvollen Punkten des Ablaufs zu senden. -Am Ende der Action wird die Endnachricht an den Client gesendet, welche weitere Rückgabewerte liefern kann. +Am Ende der Action wird die Endnachricht an den Client gesendet, die weitere Rückgabewerte liefern kann. Die Endnachricht enthält standartmäßig eine Erfolgsangabe, weshalb diese nicht angegeben werden muss. Ein ActionServer innerhalb eines Programmes definiert 3 Funktionen, welche die Handhabung einer Aktion definieren. -Die erste Funktion übergibt den Wert der Startnachricht, welche mit einer Antwort quittiert werden muss. +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. -ACCEPT_AND_EXECUTE signalisiert die sofortige Ausführung des gewünschten Befehls und ACCEPT_AND_DEFER steht für eine spätere Ausführung der gewünschten Aktion. -Die Option REJECT weist die Ausführung der Aktion vorzeitig ab. +Die erste mögliche Antwort ACCEPT_AND_EXECUTE signalisiert die sofortige Ausführung des gewünschten Befehls. +Als Alternative existiert die Antwort ACCEPT_AND_DEFER, die für eine verspätete Ausführung der gewünschten Aktion steht. +Die REJECT-Antwort weist die Ausführung der Aktion vorzeitig ab. Die zweite Funktion übergibt Abbruchanfragen an den Server, falls die Aktion durch den Client abgebrochen werden soll. Auch diese Anfrage kann entweder mit ACCEPT akzeptiert werden, oder mit REJECT zurückgewiesen werden. 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 welchem Feedback- und Endnachrichten an den Client gesendet werden können. +Diese erhält als Parameter ein Objekt, mit dem Feedback- und Endnachrichten an den Client gesendet werden können. \subsubsection{ActorPlugin} Das ActorPlugin steuert anhand von empfangenen Nachrichten aus der eingehenden Message Queue den Menschen in der Simulationsumgebung. -Der Code des Plugins ist dabei im Paket \code{ign_actor_plugin} organisiert, welches im Gazebo-Modell der Welt referenziert werden muss, um das Plugin zu laden. +Der Code des Plugins ist dabei im Paket \code{ign_actor_plugin} organisiert, dass im Gazebo-Modell der Welt referenziert werden muss, um das Plugin zu laden. -Das Plugin wird durch den Startvorgang und später von den empfangenen Nachrichten in mehrere Zustände versetzt, welche im folgenden erläutert werden: +Das Plugin wird durch den Startvorgang und später von den empfangenen Nachrichten in mehrere Zustände versetzt, die im folgenden erläutert werden: \begin{description} \item[Setup] wird ausschließlich zu Simulationsbeginn verwendet, um alle benötigten Referenzen aus der Simualtionumgebung im Plugin zu hinerlegen, so dass diese in den anderen Zuständen genutzt werden können. \item[Idle] - ist der Zustand, welcher nach erfolgreicher Ausführung eines Befehls angenommen wird. + ist der Zustand, der nach erfolgreicher Ausführung eines Befehls angenommen wird. \item[Movement] bedeutet die Ausführung einer Bewegung in potentiell mehreren Schritten. \item[Animation] @@ -429,18 +435,18 @@ Das Plugin wird durch den Startvorgang und später von den empfangenen Nachricht \end{description} In diesen Zuständen muss das ActorPlugin die Simulationsumgebung beeinflussen, in dem die simulierte Person bewegt und animiert wird. -Dies erfordert den Zugriff auf simulationsinterne Daten, welche durch das Plugin gelesen und verändert werden sollen. +Dies erfordert den Zugriff auf simulationsinterne Daten, die durch das Plugin gelesen und verändert werden sollen. Der Zugriff auf diese Daten wird durch ein EntityComponentManager-Objekt ermöglicht. -Durch den EntityComponentManager kann auf das so genannte ``Entity Component System'' zugegriffen werden, in welchem alle Simulationsobjekte organisiert sind. -Ein Entity Component System besteht aus einer oder mehr Entities, welche die sich in der Simulation befindlichen Objekte abbilden. -Objekte können beliebig viele Components besitzen, bei welchen es sich um zusätzliche Eigenschaften und Erweiterungen der Funktionen des betroffenen Objekts handelt. +Durch den EntityComponentManager kann auf das so genannte ``Entity Component System'' zugegriffen werden, in dem alle Simulationsobjekte organisiert sind. +Ein Entity Component System besteht aus einer oder mehr Entities, die Objekte innerhalb der Simulation abbilden. +Objekte können beliebig viele Components besitzen, bei denen es sich um zusätzliche Eigenschaften und Erweiterungen der Funktionen des betroffenen Objekts handelt. Die wichtigsten Komponenten für die Funktion des Plugins sind dabei: \begin{description} \item[components::Actor] Dieses Objekt beschreibt die simulierte Person mit allen weiteren Daten, wie zum Beispiel dessen Animationen. \item[components::AnimationName] - In dieser Komponente wird der aktuell verwendete Animationsname abgelegt, welcher von Gazebo zur Auswahl der aktuell laufenden Animation verwendet wird. + In dieser Komponente wird der aktuell verwendete Animationsname abgelegt, der von Gazebo zur Auswahl der aktuell laufenden Animation verwendet wird. \item[components::AnimationTime] enthält den aktuellen Zeitpunkt innerhalb der Animation, um die richtigen Positionsdaten aus dieser auswählen zu können. Dabei wird zwischen einzelnen Positionen linear interpoliert, falls der Zeitpunkt zwischen diesen liegt. \item[components::Pose] @@ -457,21 +463,23 @@ Folgende Funktionen werden von Gazebo unterstützt: \begin{description} \item[Configure] wird aufgerufen, sobald das Plugin geladen wurde. Alle benötigten Informationen über dessen Umgebung werden als Parameter übergeben. - Darunter fallen die Entity, zu welcher das Plugin als Component hinzugefügt wurde, eine Referenz auf die Konfiguration des Plugins in der geladenen Welt und eine aktuelle Instanz des EntityComponentManagers und EventManagers von Gazebo. + Darunter fallen die Entity, zu der das Plugin als Component hinzugefügt wurde. + Außerdem wird eine Referenz auf die Konfiguration des Plugins in der geladenen Welt übergeben. + Für den Zugriff auf die Simulationsumgebung werden zuletzt noch eine aktuelle Instanz des EntityComponentManagers und EventManagers von Gazebo übergeben. \item[PreUpdate] wird verwendet, um den nächsten Update-Schritt vorzubereiten. Diese Funktion erlaubt die Modifikation von Entities und Components und wird vor der eigentlichen Physiksimulation aufgerufen. \item[Update] wird genutzt, um die in der Simulation abgelaufene Zeit zu simulieren. Auch hier ist die Modifikation von Entities und Components möglich. In dieser Funktion werden Beispielsweise die Physiksimulation der Objekte durchgeführt. \item[PostUpdate] bietet die Möglichkeit, die Ergebnisse der Simulation vor dem nächsten Simulationsschritt auszulesen. - Dies wird zum Beispiel für die simulierten Sensoren in Gazebo genutzt, welche hier ihren Status prüfen. + Dies wird zum Beispiel für die simulierten Sensoren in Gazebo genutzt, die hier ihren Status prüfen. In dieser Funktion kann nur lesend auf Entities und Components zugegriffen werden. \end{description} -Jede dieser Funktionen ist in einem Interface mit dem Präfix \code{ISystem} definiert, welche vom Plugin genutzt werden können. +Jede dieser Funktionen ist in einem Interface mit dem Präfix \code{ISystem} definiert, die vom Plugin genutzt werden können. Für Gazebo muss das Plugin noch registriert werden, was mit dem \code{IGNITION_ADD_PLUGIN}-Makro geschieht. Mit diesen Vorbereitungsschritten wird das Plugin von Gazebo verwendbar gemacht. -Das ActorPlugin benötigt für seine Funktion das übergeornete Simulationsobjekt, welches durch das Plugin beeinflusst werden soll. +Das ActorPlugin benötigt für seine Funktion das übergeornete Simulationsobjekt, dass durch das Plugin beeinflusst werden soll. Dies erfordert die Implementation des \code{ISystemConfigure}-Interfaces für das ActorPlugin. Außerdem soll die simulierte Person bewegt werden. Da dieser Vorgang während der Simulationszeit ablaufen soll, muss hierfür das \code{ISystemUpdate}-Interface genutzt werden. @@ -479,7 +487,7 @@ Als erstes wird durch das Laden die Configure-Funktion aufgerufen. Da das Plugin erst durch Gazebo geladen werden muss, kann davon ausgegangen werden, dass alle benötigten Message Queues bereits durch den ActorServer erstellt wurden. Trotz dieses Umstandes wartet das Plugin auf deren Erstellung, um bei Konfigurationsfehlern auffälliges Verhalten zu zeigen. Im Log wird diese Aktion vermerkt, um Debugging zu erleichtern. -Nach dem erfolgreichen Aufbau der Verbindung wird ein Thread gestartet, welcher die eingehenden Nachrichten verarbeitet. +Nach dem erfolgreichen Aufbau der Verbindung wird ein Thread gestartet, der die eingehenden Nachrichten verarbeitet. Dabei wird zuerst ein Mutex gesperrt, um parallele Zugriffe durch die Update-Funktion zu verhindern. Alle in der Anfrage gespeicherten Daten werden nun übernommen und der gewünschte State gesetzt. Nach dem Entsperren des Mutex wird im nächsten Simulationschritt die gewünschte Aktion durchgeführt. @@ -494,22 +502,31 @@ Wurde eine Animation gefunden, wird deren Länge gespeichert, um diese später f Ab diesem Zeitpunkt unterscheiden sich die Implementation von Animation und Movement. Im Zustand der Animation wird nun die Komponente AnimationTime jedes Update aktualisiert. -Um die Ausführungsgeschwindigkeit einer Animation anpassen zu können, kann ein Skalierungsfaktor genutzt werden, welcher mit der abgelaufenen Zeit in der Simulation verrechnet wird. -Nach jedem Update-Schritt wird eine Feedback-Nachricht gesendet, welche den aktuellen Fortschritt der Animation enthält. +Um die Ausführungsgeschwindigkeit einer Animation anpassen zu können, wird ein Skalierungsfaktor genutzt. +Dieser optionale Faktor kann mit der abgelaufenen Zeit multipliziert werden. +Dies verursacht eine Beschleunigung oder verlangsamung der Ausführung. +Nach jedem Update-Schritt wird eine Feedback-Nachricht gesendet, die den aktuellen Fortschritt der Animation enthält. Wurde die Animation vollständig durchlaufen, wird der Zustand des ActorPlugins auf Idle gesetzt. +\begin{figure}[hpt] +\includegraphics[width=\textwidth]{uml/out/plugin_states.eps} +\caption{Zustandsübergänge im ActorPlugin} +\label{plugin_states} +\end{figure} +Alle Zustandsübergänge sind in Abbildung \ref{plugin_states} zusammengefasst. + Soll über den Movement-Zustand eine Bewegung abgespielt werden, müssen noch weitere Parameter der Bewegung berechnet werden. Dies geschieht nach dem Setzen der Animation während des ersten Update-Aufrufs. -Zuerst wird ein Vektor zur Zielposition berechnet, welcher später zur Bewegung genutzt wird. +Zuerst wird ein Vektor zur Zielposition berechnet, der später zur Bewegung genutzt wird. Sollte dieser über einer gewissen Mindestlänge liegen, wird eine Rotation des Menschen in Bewegungsrichtung ausgeführt. Nach dieser Rotation wird die Bewegung an die Zielposition umgesetzt. -Dabei wird die Bewegungsanimation abgespielt, welche durch einen Faktor an die zurückgelegte Distanz angepasst wird. +Dabei wird die Bewegungsanimation abgespielt, die durch einen Faktor an die zurückgelegte Distanz angepasst wird. Dies vermeidet, dass die Beine der Person über den Boden gleiten. -Wurde eine Endrotation angegeben, welche nicht dem Nullvektor entspricht, wird nach der Bewegung noch eine Rotation in diese Richtung ausgeführt. +Wurde eine Endrotation angegeben, die nicht dem Nullvektor entspricht, wird nach der Bewegung noch eine Rotation in diese Richtung ausgeführt. Dabei werden auch die Beine wieder in die Ausgangslage bewegt. Wenn sowohl die Zielrotation ausgeführt wurde und die Beine wieder in Ausgangslage sind, wird der Zustand auf Idle gesetzt. -Das ActorPlugin besitzt kein Konzept eines ROS-ActionServers und verlässt sich auf den ActorServer, welcher die Feedbacknachrichten in das richtige Format bringt. +Das ActorPlugin besitzt kein Konzept eines ROS-ActionServers und verlässt sich auf den ActorServer, der die Feedbacknachrichten in das richtige Format bringt. Feedback wird in den Zuständen Movement und Animation in eine zweiten Message Queue zu jedem Simulationsschritt gesendet. Um Zustandsübergänge erkennen zu können, werden auch diese als Feedback an den ActorServer gesendet. \subsubsection{ActorServer} @@ -517,13 +534,13 @@ Der ActorServer ist die Brücke zwischen ROS und dem ActorPlugin. Er ist als das Programm \code{ros_actor_action_server} im gleichnamigen Paket enthalten. Dieser weitere Dienst bindet das ActorPlugin an ROS an. -Es werden dafür zwei ROS-ActionServer gestartet, welche jeweils Bewegungen oder Animationen des simulierten Menschen auslösen können. +Dafür werden zwei ROS-ActionServer gestartet, die jeweils Bewegungen oder Animationen des simulierten Menschen auslösen können. Beide ActionServer prüfen bei dem Empfang eines neuen Ziels zuerst, ob bereits eine andere Aktion ausgeführt wird. Wird bereits eine andere Aktion ausgeführt, kommt es zur Ablehnung weiterer Anfragen. Im anderen Fall wird die Aufgabe akzeptiert und in das MessageQueue-Format übersetzt und an das ActorPlugin gesandt. Um das Starten mehrerer gleichzeitiger Aktionen zu unterbinden, muss der Empfang einer neuen Anfrage bestätigt werden, bevor weitere Befehle über den ROS-ActionServer entgegen genommen werden können. -Hierzu wird ein Mutex verwendet, welcher die Auswertung neuer Nachrichten verhindert, so lange der aktuelle Befehl noch nicht durch das Plugin bestätigt wurde. +Hierzu wird ein Mutex verwendet, der die Auswertung neuer Nachrichten verhindert, so lange der aktuelle Befehl noch nicht durch das Plugin bestätigt wurde. Parallel werden alle eingehenden Feedback-Nachrichten der Message Queue des ActorPlugins in Feedback für die aktuell laufende Action umgewandelt. Im Falle des Bewegungs-ActionServers werden mehrere Parameter benötigt. @@ -534,9 +551,9 @@ Soll eine Animation über den Action Server abgespielt werden, wird auch hier ei Die Feedbacknachricht enthält den Fortschritt der Animation als Gleitkommazahl. \section{Roboter} \subsection{Übersicht} -Der Roboter besteht aus vielen interagierenden Systemen, welche in ihrer Gesamtheit das vollständige Robotermodell in der Simulation verwendbar machen. +Der Roboter besteht aus vielen interagierenden Systemen, die in ihrer Gesamtheit das vollständige Robotermodell in der Simulation verwendbar machen. -Zuerst muss ein Modell des Roboters erstellt werden, welches in Gazebo geladen werden kann. +Zuerst muss ein Modell des Roboters erstellt werden, dass in Gazebo geladen werden kann. Dieses Modell muss dann für die Bewegungsplanung mit MoveIt erweitert werden. Hierbei werden Controller von ros_control mit dem Modell verbunden, um den aktuellen Zustand der Achsen zu überwachen und diese steuern zu können. @@ -545,8 +562,11 @@ Um diese Vielfalt an Daten standartisiert an andere Software in ROS weitergeben Für den Kuka LBR iisy existiert kein Simulationsmodell für Gazebo und ROS, weswegen dieses Modell aus Herstellerdaten generiert wurden. Hierzu stand eine .stl-Datei des Herstellers zur Verfügung. Aus dieser Datei wurden mit FreeCAD\cite{freecad} alle Glieder des Roboters als Collada-Dateien exportiert. -Dabei muss darauf geachtet werden, dass die exportierten Daten eine ausreichende Meshgröße haben, welche vorher in FreeCAD eingestellt werden muss. -Dies erlaubt das Erhalten der feinen Strukturen des Arms, auch visualisiert in Abbildung \ref{robot_raw}, welche erst später in Blender reduziert werden sollen. +Dabei muss darauf geachtet werden, dass die exportierten Daten eine ausreichende Meshgröße haben. +Diese kann vor dem Export in FreeCAD eingestellt werden. +Durch diese Einstellung bleiben feine Strukturen erhalten, die später in Blender wieder reduziert werden können. +Ein solches Vorgehen erlaubt es Blender, bessere Entscheidungen über die Reduktion von Strukturen zu treffen. +Das Resultat ist ein besseres Endmodell des Roboters. \begin{figure}[] \includegraphics[width=\textwidth/2]{img/MA-Roboter-Rohdaten} @@ -561,17 +581,17 @@ Außerdem wuden die Glieder so ausgerichtet, dass der Verbindungspunkt zum vorhe Das vollständige visuelle Modell ist in Abbildung \ref{robot_visual} zu sehen. Um die Simulation weiter zu beschleunigen, wurden die Kollisionsboxen des Arms noch weiter vereinfacht, was die Kollisionsüberprüfung dramatisch beschleunigt. -Dabei werden stark simplifizierte Formen verwendet, welche das hochqualitative visuelle Modell mit einfachen Formen umfassen. +Dabei werden stark simplifizierte Formen verwendet, die das hochqualitative visuelle Modell mit einfachen Formen umfassen. Das resultierende Modell, welches in Abbildung \ref{robot_collision} dargestellt wird, wird später zur Kollisionserkennung verwendet. -Diese Herangehensweise ist nötig, da Kollisionserkennung auf der CPU durchgeführt wird, welche durch komplexe Formen stark verlangsamt wird. +Diese Herangehensweise ist nötig, da Kollisionserkennung auf der CPU durchgeführt wird, die durch komplexe Formen stark verlangsamt wird. Um aus den generierten Gliedermodellen ein komplettes Robotermodell erstellen zu können, wurde eine .urdf-Datei erstellt. In dieser werden die verwendeten Gelenktypen zwischen den einzelnen Gliedern, aber auch deren Masse, maximale Geschwindigkeit, maximale Motorkraft, Reibung und Dämpfung hinterlegt. -Diese Daten können später zur Simulation der Motoren genutzt werden, welche den Arm bewegen. +Diese Daten können später zur Simulation der Motoren genutzt werden, die den Arm bewegen. -Die Gelenkpositionen sind dabei relative Angaben, welche sich auf das Glied beziehen, an welchem ein weiteres Glied über das Gelenk verbunden werden soll. -Alle kontrollierbaren Gelenke benötigen auch eine Gelenkachse, welche je nach Gelenktyp die mögliche Beweglichkeit bestimmt. +Die Gelenkpositionen sind dabei relative Angaben, die sich auf das Glied beziehen, an dem ein weiteres Glied über das Gelenk verbunden werden soll. +Alle kontrollierbaren Gelenke benötigen auch eine Gelenkachse, die je nach Gelenktyp die mögliche Beweglichkeit bestimmt. Alle hier erstellten Dateien wurden im Paket \code{iisy_config} zusammengefasst, um diese einfacher wiederauffinden zu können. \begin{figure}[hpt] @@ -590,33 +610,34 @@ Alle hier erstellten Dateien wurden im Paket \code{iisy_config} zusammengefasst, \end{figure} \subsection{MoveIt 2 Konfiguration} Das somit erstellte Paket kann nun mit dem neu implementierten MoveIt Configurator um die benötigten Kontrollstrukturen erweitert werden. -Dazu wurde der neue Setupassistent von MoveIt2 verwendet, welcher das Modell analysiert, um es mit für MoveIt benötigten Parameter zu erweitert. +Dazu wurde der neue Setupassistent von MoveIt2 verwendet, der das Modell für MoveIt anpasst. +Dabei wird das Modell mit weiteren Parametern versehen, die durch MoveIt genutzt werden. Die Erstellung des erweiterten Modells mit dem Assistenten funktionierte komplett fehlerfrei, jedoch ließen sich die generierten Dateien nicht nutzen. Um die generierten Dateien nutzen zu können, mussten diese weiter angepasst werden. -Dies beinhaltete die korrekte Integration der Roboterdefinitionen im Paket, aber auch zahlreiche Pfadreferenzen auf verwendete Dateien, welche nicht korrekt generiert wurden. +Dies beinhaltete die korrekte Integration der Roboterdefinitionen im Paket, aber auch zahlreiche Pfadreferenzen auf verwendete Dateien, die nicht korrekt generiert wurden. Diese können standartmäßig nicht in Gazebo, RViz und MoveGroup gleichzeitig geladen werden, da diese Programme unterschiedliche Pfadangaben verlangen, was die Nutzung verhindert. -Eine Möglichkeit zur Lösung des Problems ist die Verwendung von \code{file://}-URIs, welche von allen dieser Programme gelesen werden können. +Eine Möglichkeit zur Lösung des Problems ist die Verwendung von \code{file://}-URIs, die von allen dieser Programme gelesen werden können. Jedoch ist hier als Nachteil zu verzeichnen, dass der Moveit Setup Assistent diese URIs nicht lesen kann, was zu Fehlern bei einer Rekonfiguration führen kann. Das so erstellte Modell kann ber den Aufruf von \code{ros2 launch iisy_config demo.launch.py} in RViz getestet werden. -Hierfür erscheint das Robotermodell mit mehreren Markern und Planungsoptionen, welche genutzt werden können, um beliebige Bewegungen zu planen und auszuführen. +Hierfür erscheint das Robotermodell mit mehreren Markern und Planungsoptionen, die genutzt werden können, um beliebige Bewegungen zu planen und auszuführen. \subsection{Integration mit Gazebo} Das so erstellte Modell kann nun zur Laufzeit in Gazebo geladen werden. -Dafür wird das Paket \code{ros_gz_sim} verwendet, welches das \code{create} Programm beinhaltet. +Dafür wird das Paket \code{ros_gz_sim} verwendet, dass das \code{create}-Programm beinhaltet. Mit diesem Werkzeug kann ein Modell unter einem bestimmten Namen anhand einer Datei oder eines übergebenen Strings in Gazebo importiert werden. Das Modell kann dabei über Argumente im Raum verschoben und rotiert werden, falls diese Funktionalität benötigt wird. -In diesem Fall wird das Modell als String geladen, welcher durch \code{xacro} erstellt wurde. +In diesem Fall wird das Modell als String geladen, der durch \code{xacro} erstellt wurde. Dies ist nötig, um Informationen aus anderen Dateien in das generierte XML übernehmen zu können. -Im Modell sind auch die verwendeten Gazebo-Plugins deklariert, welche für die Integration mit \code{ros_control} verantwortlich sind. +Im Modell sind auch die verwendeten Gazebo-Plugins deklariert, die für die Integration mit \code{ros_control} verantwortlich sind. Das Gazebo-Plugin läd dabei die verwendeten Controller und versorgt diese mit Informationen über den Roboter. \section{Behavior Trees} -Alle Behavior Trees wurden im Paket \code{btree} organisert, welches die Bäume im XML-Format und die Implementation der Nodes und umliegenden Infrastruktur enthält. +Alle Behavior Trees wurden im Paket \code{btree} organisert, dass die Bäume im XML-Format und die Implementation der Nodes und umliegenden Infrastruktur enthält. Für die Umsetzung des Szenarios wurden neue Nodes für den BehaviorTree erstellt. @@ -626,11 +647,11 @@ Diese lassen sich nach Nutzung in verschiedene Gruppen einordnen. \begin{description} \item[GenerateXYPose] generiert eine Pose in einem durch den \code{area} Parameter angegebenen Bereich. - Um dies zu ermöglichen, wird zuerst die Fläche aller Dreiecke berechnet, welche den Bereich definieren. + Um dies zu ermöglichen, wird zuerst die Fläche aller Dreiecke berechnet, die den Bereich definieren. Diese werden durch den Gesamtinhalt geteilt, um eine Wichtung der Dreiecke zum Gesamtinhalt zu erreichen. Nun wird eine Zufallszahl zwischen 0 und 1 gebildet. Von dieser werden nun die Wichtungen der Dreiecke abgezogen, bis dies Zufallszahl im nächsten abzuziehenden Dreieck liegt. - Nun wird in diesem Dreieck eine zufällige Position ermittelt, welche ber den Ausgabeparameter \code{pose} ausgegeben wird. + Nun wird in diesem Dreieck eine zufällige Position ermittelt, die über den Ausgabeparameter \code{pose} ausgegeben wird. \item[InAreaTest] prüft, ob eine Pose, vorgegeben durch den \code{pose} Parameter, in einer durch den \code{area} Parameter definierten Zone liegt. Hierfür wird überprüft, ob die X und Y-Werte der Pose in einem der Dreiecke liegen, welche die Area definieren. @@ -640,25 +661,25 @@ Diese lassen sich nach Nutzung in verschiedene Gruppen einordnen. Falls der \code{offset} Parameter gesetzt ist, wird dieser mit dem \code{input} Parameter summiert. Außerdem wird die Orientierung der Pose auf den \code{orientation} Parameter gesetzt, falls dieser vorhanden ist, was den ursprünglichen Wert überschreibt. \item[InterruptableSequence] - stellt eine Sequence dar, welche auch nach ihrem Abbruch ihre Position behält. + stellt eine Sequence dar, die auch nach ihrem Abbruch ihre Position behält. Dies ist von Nöten, wenn bestimmtes Verhalten unterbrechbar ist, aber zu einem späteren Zeitpunkt fortgesetzt werden soll. Hierzu wird der Iterator der unterlegenden Sequenz nur erhöht, wenn die untergeordnete Node SUCCESS zurück gibt. Außerdem wird der Iterator nicht zurückgesetzt, wenn die Ausführung dieser modifizierten Sequenz abgebrochen wird. \item[WeightedRandom] - ist eine Steuerungsnode, welche mehrere untergeordnete Nodes besitzt. + ist eine Steuerungsnode, die mehrere untergeordnete Nodes besitzt. Dabei werden diese nicht, wie bei anderen Steuerungsnodes üblich, sequentiell ausgeführt. Anhand einer vorgegebenen Wichtung im \code{weights} Parameter wird eine der untergeordneten Nodes zufällig ausgewählt. Diese Node wird nun als einzige Node ausgeführt, bis diese den SUCCESS-Status zurück gibt. Nach dem dieser Status erreicht wurde, wird bei dem nächsten Durchlauf eine neue Node ausgewählt. Der Rückgabewert ist der Rückgabewert der ausgewählten untergeorneten Node. \item[IsCalled] - fragt den aktuellen Called-Status des Actors ab, welcher in einigen Szenarien vom Roboter verwendet wird, um den simulierten Menschen zu rufen. + fragt den aktuellen Called-Status des Actors ab, der in einigen Szenarien vom Roboter verwendet wird, um den simulierten Menschen zu rufen. Der Rückgabewert der Node ist dabei SUCCESS, falls der Mensch gerufen wird, oder FAILURE, wenn kein RUF durchgeführt wird. \item[SetCalledTo] setzt den aktuellen Called-Status auf den Wert des übergebenen \code{state} Parameters. Da diese Aktion nicht fehlschlagen kann, liefert diese Node immer SUCCESS als Rückgabewert. \item[RandomFailure] - generiert eine Zufallszahl von 0 bis 1, welche mit dem \code{failure_chance} Parameter verglichen wird. + generiert eine Zufallszahl von 0 bis 1, die mit dem \code{failure_chance} Parameter verglichen wird. Der Rückgabewert ist das Ergebnis des Vergleichs, FAILURE, wenn die Zufallszahl kleiner als der \code{failure_chance} Parameter ist, oder im anderen Falle SUCCESS. \end{description} @@ -666,13 +687,13 @@ Diese lassen sich nach Nutzung in verschiedene Gruppen einordnen. \begin{description} \item[ActorAnimation] wird verwendet, um dem simulierten Menschen eine auszuführende Animation zu senden. - Die Node benötigt zur Ausführung einen Animationsname, welcher im \code{animation_name} Parameter angegeben wird. + Die Node benötigt zur Ausführung einen Animationsname, der im \code{animation_name} Parameter angegeben wird. Ein optionaler \code{animation_speed} Parameter gibt die Ausführungsgeschwindigkeit vor. Der Rückgabewert ist SUCCESS, wenn die komplette Ausführung gelang, oder FAILURE, falls diese abgebrochen oder abgelehnt wurde. \item[ActorMovement] funktioniert wie eine ActorAnimation, sendet jedoch eine Bewegungsanfrage. - Auch für diese wird ein Animationsname benötigt, welcher im \code{animation_name} Parameter definiert wird. - Jedoch wird für die Synchronisation zur Bewegung ein Disztanzwert benötigt, welcher in einem Animationsdurchlauf zurückgelegt wird. + Auch für diese wird ein Animationsname benötigt, der im \code{animation_name} Parameter definiert wird. + Jedoch wird für die Synchronisation zur Bewegung ein Disztanzwert benötigt, der in einem Animationsdurchlauf zurückgelegt wird. Dieser wird im \code{animation_distance} Parameter übergeben. Eine Zielpose wird im \code{target} Parameter gesetzt. Eine Besonderheit dieses Paramerters ist die Verwendung des Null-Quaternions als Richtungsangabe, was die Endrotation auf die Laufrichtung setzt. @@ -681,7 +702,7 @@ Diese lassen sich nach Nutzung in verschiedene Gruppen einordnen. \subsubsection{Roboterspezifisch} \begin{description} \item[RobotMove] gibt dem Roboter eine neue Zielposition über den \code{target} Parameter vor. - Bei dieser Node handelt es sich um eine asynchrone Node, welche nur bei der erfolgreiche Ausführung der Bewegung SUCCESS zurück gibt. + Bei dieser Node handelt es sich um eine asynchrone Node, die nur bei der erfolgreiche Ausführung der Bewegung mit dem SUCCESS-Status beendet wird. \item[SetRobotVelocity] setzt eine neue maximale Geschwindigkeit des Roboters, vorgegeben durch den \code{velocity} Parameter. Der Rückgabewert ist immer SUCCESS. \end{description} diff --git a/uml/animation_states.puml b/uml/animation_states.puml new file mode 100644 index 0000000..684e5f3 --- /dev/null +++ b/uml/animation_states.puml @@ -0,0 +1,32 @@ +@startuml animation_states +hide empty description + +[*] --> Standing + +state Standing{ + [*] --> StandingIdle + StandingIdle --> [*] + StandingIdle --> ExtendArm + ExtendArm --> RetractArm + RetractArm --> StandingIdle + + StandingIdle --> Walk + Walk --> StandingIdle +} + +state Low{ + [*] --> LowIdle + LowIdle --> [*] + LowIdle --> InspectLow + InspectLow --> PutBackLow + InspectLow --> GrabLow + PutBackLow --> LowIdle + GrabLow --> LowIdle +} + +Standing -> ToLow +ToLow -> Low +Low --> ToStanding +ToStanding --> Standing + +@enduml \ No newline at end of file diff --git a/uml/out/plugin_connectivity/plugin_connectivity.eps b/uml/out/plugin_connectivity/plugin_connectivity.eps deleted file mode 100644 index 1d17704..0000000 --- a/uml/out/plugin_connectivity/plugin_connectivity.eps +++ /dev/null @@ -1,4334 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: PlantUML v1.2022.7 -%%Title: noTitle -%%BoundingBox: 0 0 515 600 -%%ColorUsage: Color -%%Origin: 0 0 -%%EndComments - -gsave -0 600 translate -.01 -.01 scale -/simplerect { -newpath moveto 1 index 0 rlineto -0 exch rlineto -neg 0 rlineto -} def -/roundrect { -newpath -dup 3 index add 2 index 2 index add 2 index 180 270 arc -2 index 5 index add 1 index sub 2 index 2 index add 2 index 270 0 arc -2 index 5 index add 1 index sub 2 index 5 index add 2 index sub 2 index 0 90 arc -dup 3 index add 2 index 5 index add 2 index sub 2 index 90 180 arc -pop pop pop pop pop -} def -/rquadto { -3 index 3 index 4 2 roll rcurveto -} def -/P$1e { -25 0 51 -3 rquadto -28 -4 45 -10 rquadto -0 87 rlineto --18 9 -53 14 rquadto --32 6 -64 6 rquadto --54 0 -101 -18 rquadto --45 -18 -73 -65 rquadto --28 -46 -28 -131 rquadto -0 -404 rlineto --100 0 rlineto -0 -54 rlineto -100 -45 rlineto -45 -148 rlineto -68 0 rlineto -0 159 rlineto -201 0 rlineto -0 89 rlineto --201 0 rlineto -0 403 rlineto -0 62 29 93 rquadto -31 29 79 29 rquadto -closepath -} def -/P$2a { --87 0 -135 70 rquadto --48 68 -48 198 rquadto -0 128 46 196 rquadto -48 67 139 67 rquadto -106 0 153 -56 rquadto -48 -56 48 -182 rquadto -0 -26 rlineto -0 -143 -50 -204 rquadto --48 -62 -153 -62 rquadto -} def -/P$m { -196 0 285 78 rquadto -89 76 89 215 rquadto -0 82 -37 156 rquadto --35 71 -123 117 rquadto --87 43 -237 43 rquadto --114 0 rlineto -0 389 rlineto --126 0 rlineto -0 -1000 rlineto -264 0 rlineto -closepath -} def -/P$p { -75 0 134 28 rquadto -59 28 101 84 rquadto -6 0 rlineto -17 -98 rlineto -98 0 rlineto -0 762 rlineto -0 160 -82 242 rquadto --81 81 -253 81 rquadto --165 0 -270 -46 rquadto -0 -114 rlineto -110 59 276 59 rquadto -96 0 151 -57 rquadto -56 -56 56 -154 rquadto -0 -28 rlineto -0 -17 1 -48 rquadto -1 -32 3 -45 rquadto --6 0 rlineto --75 114 -232 114 rquadto --145 0 -228 -101 rquadto --81 -103 -81 -285 rquadto -0 -179 81 -284 rquadto -82 -106 226 -106 rquadto -closepath -} def -/P$2b { -0 51 -6 98 rquadto -7 0 rlineto -32 -53 90 -79 rquadto -57 -28 126 -28 rquadto -126 0 190 60 rquadto -64 59 64 193 rquadto -0 453 rlineto --114 0 rlineto -0 -445 rlineto -0 -168 -154 -168 rquadto --117 0 -160 65 rquadto --43 65 -43 189 rquadto -0 359 rlineto --114 0 rlineto -0 -987 rlineto -114 0 rlineto -0 289 rlineto -} def -/P$26 { -0 123 -90 192 rquadto --89 68 -240 68 rquadto --78 0 -145 -12 rquadto --65 -10 -110 -31 rquadto -0 -112 rlineto -46 21 115 39 rquadto -70 15 145 15 rquadto -103 0 156 -39 rquadto -53 -40 53 -109 rquadto -0 -45 -20 -76 rquadto --18 -31 -67 -57 rquadto --46 -26 -131 -57 rquadto --118 -42 -179 -104 rquadto --59 -62 -59 -170 rquadto -0 -73 37 -126 rquadto -37 -53 104 -81 rquadto -67 -28 154 -28 rquadto -76 0 139 14 rquadto -64 14 117 37 rquadto --37 100 rlineto --48 -20 -104 -34 rquadto --56 -15 -117 -15 rquadto --87 0 -131 37 rquadto --43 37 -43 98 rquadto -0 46 18 78 rquadto -20 31 64 56 rquadto -43 23 118 53 rquadto -82 29 139 64 rquadto -56 34 85 82 rquadto -29 46 29 120 rquadto -} def -/P$31 { -0 709 rlineto --148 0 rlineto --26 -90 rlineto --9 0 rlineto --34 54 -93 79 rquadto --59 23 -125 23 rquadto --114 0 -184 -60 rquadto --68 -62 -68 -198 rquadto -0 -462 rlineto -193 0 rlineto -0 414 rlineto -0 75 26 114 rquadto -28 39 89 39 rquadto -87 0 120 -59 rquadto -32 -60 32 -173 rquadto -0 -334 rlineto -193 0 rlineto -} def -/P$b { -0 185 -95 289 rquadto --93 101 -254 101 rquadto --100 0 -178 -45 rquadto --76 -45 -121 -132 rquadto --45 -87 -45 -212 rquadto -0 -185 93 -285 rquadto -93 -101 254 -101 rquadto -103 0 179 45 rquadto -78 45 121 131 rquadto -45 85 45 210 rquadto -closepath -} def -/P$2l { -118 0 192 93 rquadto -75 92 75 273 rquadto -0 181 -76 275 rquadto --76 93 -196 93 rquadto --76 0 -121 -26 rquadto --45 -28 -73 -64 rquadto --10 0 rlineto -10 54 10 104 rquadto -0 285 rlineto --193 0 rlineto -0 -1021 rlineto -157 0 rlineto -26 92 rlineto -9 0 rlineto -28 -43 76 -75 rquadto -48 -31 125 -31 rquadto -closepath -} def -/P$2f { --118 0 -193 -92 rquadto --75 -93 -75 -273 rquadto -0 -182 75 -276 rquadto -76 -93 198 -93 rquadto -76 0 125 31 rquadto -50 29 79 73 rquadto -6 0 rlineto --4 -20 -9 -59 rquadto --4 -40 -4 -82 rquadto -0 -226 rlineto -193 0 rlineto -0 987 rlineto --148 0 rlineto --37 -92 rlineto --7 0 rlineto --29 43 -78 75 rquadto --46 29 -123 29 rquadto -closepath -} def -/P$2p { -35 0 62 17 rquadto -26 17 26 62 rquadto -0 45 -26 64 rquadto --26 17 -62 17 rquadto --37 0 -64 -17 rquadto --25 -18 -25 -64 rquadto -0 -45 25 -62 rquadto -26 -17 64 -17 rquadto -closepath -} def -/P$1n { --193 0 rlineto -0 -987 rlineto -193 0 rlineto -0 987 rlineto -} def -/P$11 { --81 0 -129 53 rquadto --46 51 -56 145 rquadto -354 0 rlineto --1 -89 -42 -143 rquadto --39 -54 -126 -54 rquadto -} def -/P$23 { --100 0 -164 -78 rquadto --62 -79 -62 -231 rquadto -0 -154 62 -232 rquadto -64 -79 168 -79 rquadto -64 0 106 25 rquadto -42 25 65 62 rquadto -6 0 rlineto --4 -17 -9 -50 rquadto --3 -34 -3 -70 rquadto -0 -192 rlineto -164 0 rlineto -0 835 rlineto --126 0 rlineto --31 -78 rlineto --6 0 rlineto --25 37 -65 64 rquadto --40 25 -104 25 rquadto -closepath -} def -/P$21 { --64 0 -90 40 rquadto --25 39 -26 120 rquadto -0 17 rlineto -0 87 25 134 rquadto -26 46 95 46 rquadto -54 0 81 -46 rquadto -28 -46 28 -134 rquadto -0 -178 -112 -178 rquadto -} def -/P$2w { -0 20 -1 54 rquadto --1 34 -3 57 rquadto -4 0 rlineto -7 -9 23 -28 rquadto -15 -20 31 -40 rquadto -17 -20 28 -32 rquadto -223 -235 rlineto -132 0 rlineto --281 298 rlineto -301 398 rlineto --137 0 rlineto --242 -325 rlineto --79 68 rlineto -0 256 rlineto --112 0 rlineto -0 -987 rlineto -112 0 rlineto -0 515 rlineto -closepath -} def -/P$1v { --78 3 -109 29 rquadto --31 25 -31 68 rquadto -0 37 21 53 rquadto -21 15 57 15 rquadto -53 0 89 -31 rquadto -35 -31 35 -87 rquadto -0 -50 rlineto --64 1 rlineto -} def -/P$k { --284 -750 rlineto -131 0 rlineto -159 442 rlineto -12 31 25 68 rquadto -12 37 21 71 rquadto -9 34 14 57 rquadto -4 0 rlineto -6 -23 17 -57 rquadto -10 -35 23 -73 rquadto -14 -37 23 -67 rquadto -159 -442 rlineto -131 0 rlineto --285 750 rlineto --140 0 rlineto -} def -/P$2z { --59 0 rlineto -0 251 rlineto -62 0 rlineto -98 0 140 -32 rquadto -42 -32 42 -96 rquadto -0 -65 -45 -93 rquadto --45 -28 -140 -28 rquadto -} def -/P$32 { -171 0 254 65 rquadto -82 65 82 198 rquadto -0 73 -28 123 rquadto --26 50 -68 79 rquadto --42 28 -89 45 rquadto -254 415 rlineto --135 0 rlineto --225 -382 rlineto --184 0 rlineto -0 382 rlineto --117 0 rlineto -0 -928 rlineto -256 0 rlineto -closepath -} def -/P$1k { -128 0 206 90 rquadto -79 89 79 268 rquadto -0 178 -79 270 rquadto --78 92 -207 92 rquadto --81 0 -134 -29 rquadto --51 -31 -81 -71 rquadto --7 0 rlineto -3 23 4 57 rquadto -3 32 3 57 rquadto -0 285 rlineto --114 0 rlineto -0 -1009 rlineto -93 0 rlineto -15 95 rlineto -4 0 rlineto -31 -45 81 -76 rquadto -51 -31 135 -31 rquadto -closepath -} def -/P$1p { --259 0 rlineto -0 -959 rlineto -259 0 rlineto -0 114 rlineto --118 0 rlineto -0 732 rlineto -118 0 rlineto -0 112 rlineto -} def -/P$2x { -0 20 -1 54 rquadto --1 34 -3 57 rquadto -4 0 rlineto -7 -9 23 -28 rquadto -15 -20 31 -40 rquadto -17 -20 28 -32 rquadto -223 -235 rlineto -132 0 rlineto --281 298 rlineto -301 398 rlineto --137 0 rlineto --242 -325 rlineto --79 68 rlineto -0 256 rlineto --112 0 rlineto -0 -987 rlineto -112 0 rlineto -0 515 rlineto -} def -/P$4 { -0 132 -96 207 rquadto --96 73 -260 73 rquadto --82 0 -154 -12 rquadto --71 -12 -118 -35 rquadto -0 -120 rlineto -50 23 125 42 rquadto -75 17 154 17 rquadto -112 0 168 -42 rquadto -56 -43 56 -118 rquadto -0 -48 -21 -81 rquadto --20 -34 -71 -62 rquadto --50 -29 -140 -62 rquadto --128 -45 -193 -112 rquadto --64 -67 -64 -184 rquadto -0 -79 40 -135 rquadto -40 -56 112 -87 rquadto -71 -31 165 -31 rquadto -82 0 151 15 rquadto -68 15 125 40 rquadto --40 107 rlineto --51 -21 -112 -37 rquadto --60 -15 -126 -15 rquadto --93 0 -142 40 rquadto --46 39 -46 104 rquadto -0 51 20 85 rquadto -21 32 68 59 rquadto -48 26 129 56 rquadto -89 32 148 70 rquadto -60 35 92 89 rquadto -32 51 32 129 rquadto -} def -/P$a { -0 750 rlineto --123 0 rlineto -0 -750 rlineto -123 0 rlineto -} def -/P$1u { -120 0 184 53 rquadto -64 51 64 159 rquadto -0 400 rlineto --114 0 rlineto --31 -81 rlineto --4 0 rlineto --39 48 -82 70 rquadto --42 21 -115 21 rquadto --81 0 -134 -46 rquadto --51 -46 -51 -143 rquadto -0 -95 65 -140 rquadto -67 -45 201 -50 rquadto -104 -3 rlineto -0 -26 rlineto -0 -48 -25 -70 rquadto --23 -21 -68 -21 rquadto --43 0 -85 14 rquadto --40 12 -82 29 rquadto --54 -110 rlineto -48 -25 107 -39 rquadto -59 -14 123 -14 rquadto -closepath -} def -/P$29 { -68 0 123 26 rquadto -56 25 95 78 rquadto -6 0 rlineto -15 -92 rlineto -90 0 rlineto -0 707 rlineto -0 150 -76 225 rquadto --75 76 -235 76 rquadto --153 0 -250 -45 rquadto -0 -104 rlineto -101 54 256 54 rquadto -90 0 142 -53 rquadto -51 -51 51 -143 rquadto -0 -26 rlineto -0 -15 0 -45 rquadto -1 -29 3 -40 rquadto --4 0 rlineto --70 104 -215 104 rquadto --135 0 -212 -93 rquadto --75 -95 -75 -265 rquadto -0 -167 75 -264 rquadto -76 -98 210 -98 rquadto -closepath -} def -/P$w { --93 3 -131 34 rquadto --35 31 -35 81 rquadto -0 45 26 64 rquadto -26 18 67 18 rquadto -62 0 104 -37 rquadto -43 -37 43 -104 rquadto -0 -57 rlineto --75 1 rlineto -} def -/P$0 { -187 0 275 71 rquadto -89 70 89 212 rquadto -0 79 -29 132 rquadto --28 53 -73 85 rquadto --45 31 -96 48 rquadto -275 448 rlineto --146 0 rlineto --242 -412 rlineto --198 0 rlineto -0 412 rlineto --126 0 rlineto -0 -1000 rlineto -275 0 rlineto -closepath -} def -/P$1j { -0 101 -75 153 rquadto --75 51 -203 51 rquadto --73 0 -126 -12 rquadto --51 -10 -92 -31 rquadto -0 -104 rlineto -42 21 101 39 rquadto -59 17 120 17 rquadto -85 0 125 -28 rquadto -39 -28 39 -73 rquadto -0 -26 -14 -46 rquadto --14 -21 -51 -42 rquadto --35 -20 -104 -46 rquadto --68 -26 -117 -51 rquadto --46 -26 -73 -62 rquadto --26 -37 -26 -93 rquadto -0 -89 71 -135 rquadto -73 -48 190 -48 rquadto -62 0 117 12 rquadto -56 12 104 34 rquadto --39 90 rlineto --43 -18 -92 -31 rquadto --48 -12 -98 -12 rquadto --70 0 -107 23 rquadto --37 21 -37 60 rquadto -0 28 17 48 rquadto -17 20 56 39 rquadto -40 18 106 45 rquadto -67 23 112 50 rquadto -46 26 71 64 rquadto -25 35 25 92 rquadto -} def -/P$2r { -0 90 -64 140 rquadto --64 48 -192 48 rquadto --62 0 -107 -9 rquadto --45 -7 -90 -25 rquadto -0 -135 rlineto -48 21 104 35 rquadto -56 14 100 14 rquadto -48 0 68 -14 rquadto -20 -14 20 -37 rquadto -0 -15 -9 -26 rquadto --7 -12 -35 -28 rquadto --26 -15 -84 -39 rquadto --56 -25 -93 -48 rquadto --35 -23 -53 -56 rquadto --17 -34 -17 -84 rquadto -0 -84 64 -125 rquadto -65 -42 173 -42 rquadto -56 0 106 10 rquadto -50 10 104 35 rquadto --50 117 rlineto --43 -18 -84 -31 rquadto --39 -12 -79 -12 rquadto --71 0 -71 39 rquadto -0 15 9 26 rquadto -9 10 35 25 rquadto -26 12 79 34 rquadto -51 21 89 45 rquadto -37 21 57 54 rquadto -20 32 20 87 rquadto -} def -/P$5 { --120 -309 rlineto --395 0 rlineto --118 309 rlineto --128 0 rlineto -390 -1003 rlineto -114 0 rlineto -389 1003 rlineto --131 0 rlineto -closepath -} def -/P$17 { --92 0 -165 -37 rquadto --71 -37 -112 -115 rquadto --40 -79 -40 -203 rquadto -0 -129 42 -209 rquadto -43 -81 117 -118 rquadto -73 -37 167 -37 rquadto -53 0 101 10 rquadto -50 10 81 26 rquadto --35 95 rlineto --31 -12 -73 -21 rquadto --40 -10 -76 -10 rquadto --206 0 -206 264 rquadto -0 125 50 192 rquadto -51 67 150 67 rquadto -56 0 100 -10 rquadto -43 -12 79 -29 rquadto -0 101 rlineto --34 18 -76 28 rquadto --42 9 -101 9 rquadto -} def -/P$d { -134 0 203 65 rquadto -68 64 68 209 rquadto -0 489 rlineto --121 0 rlineto -0 -479 rlineto -0 -181 -167 -181 rquadto --125 0 -173 70 rquadto --46 70 -46 201 rquadto -0 389 rlineto --123 0 rlineto -0 -750 rlineto -100 0 rlineto -17 101 rlineto -7 0 rlineto -35 -57 100 -85 rquadto -65 -29 135 -29 rquadto -} def -/P$2m { --75 0 -106 46 rquadto --29 46 -32 143 rquadto -0 20 rlineto -0 103 29 159 rquadto -31 54 112 54 rquadto -65 0 96 -54 rquadto -32 -56 32 -160 rquadto -0 -209 -132 -209 rquadto -closepath -} def -/P$1o { -32 0 62 -6 rquadto -29 -6 59 -15 rquadto -0 145 rlineto --31 12 -78 21 rquadto --45 9 -100 9 rquadto --62 0 -112 -20 rquadto --50 -20 -79 -71 rquadto --29 -51 -29 -142 rquadto -0 -342 rlineto --92 0 rlineto -0 -82 rlineto -106 -64 rlineto -56 -150 rlineto -123 0 rlineto -0 151 rlineto -198 0 rlineto -0 145 rlineto --198 0 rlineto -0 342 rlineto -0 40 23 60 rquadto -23 18 60 18 rquadto -closepath -} def -/P$2v { --110 0 -154 64 rquadto --42 64 -42 198 rquadto -0 4 rlineto -0 128 42 196 rquadto -42 68 156 68 rquadto -93 0 139 -68 rquadto -46 -70 46 -200 rquadto -0 -264 -187 -264 rquadto -} def -/P$15 { --110 -287 rlineto --368 0 rlineto --109 287 rlineto --118 0 rlineto -362 -932 rlineto -106 0 rlineto -360 932 rlineto --121 0 rlineto -closepath -} def -/P$28 { -110 0 156 -60 rquadto -45 -60 45 -182 rquadto -0 -20 rlineto -0 -131 -43 -200 rquadto --42 -70 -157 -70 rquadto --92 0 -139 73 rquadto --46 73 -46 198 rquadto -0 123 46 193 rquadto -46 68 139 68 rquadto -} def -/P$19 { -0 696 rlineto --114 0 rlineto -0 -696 rlineto -114 0 rlineto -} def -/P$1l { --107 0 -151 60 rquadto --42 59 -45 181 rquadto -0 21 rlineto -0 129 42 200 rquadto -42 68 156 68 rquadto -64 0 104 -34 rquadto -40 -35 60 -96 rquadto -20 -60 20 -139 rquadto -0 -118 -46 -190 rquadto --45 -71 -140 -71 rquadto -} def -/P$1t { -0 89 28 135 rquadto -29 45 95 45 rquadto -65 0 93 -45 rquadto -29 -46 29 -135 rquadto -0 -89 -29 -132 rquadto --28 -45 -93 -45 rquadto --65 0 -95 45 rquadto --28 43 -28 132 rquadto -} def -/P$s { -368 0 rlineto -0 481 rlineto --73 25 -151 39 rquadto --78 14 -179 14 rquadto --207 0 -320 -121 rquadto --110 -121 -110 -356 rquadto -0 -145 56 -251 rquadto -57 -106 165 -164 rquadto -107 -59 264 -59 rquadto -73 0 145 15 rquadto -71 15 129 40 rquadto --65 157 rlineto --42 -21 -96 -35 rquadto --54 -15 -114 -15 rquadto --85 0 -150 39 rquadto --62 39 -96 110 rquadto --34 70 -34 167 rquadto -0 90 25 160 rquadto -25 70 78 109 rquadto -53 39 139 39 rquadto -40 0 70 -3 rquadto -29 -4 54 -9 rquadto -0 -193 rlineto --176 0 rlineto -0 -164 rlineto -} def -/P$22 { -26 0 51 -4 rquadto -26 -6 51 -14 rquadto -0 121 rlineto --26 10 -65 18 rquadto --39 9 -84 9 rquadto --54 0 -96 -17 rquadto --42 -17 -67 -60 rquadto --25 -43 -25 -120 rquadto -0 -290 rlineto --78 0 rlineto -0 -68 rlineto -90 -54 rlineto -46 -126 rlineto -104 0 rlineto -0 128 rlineto -168 0 rlineto -0 121 rlineto --168 0 rlineto -0 290 rlineto -0 32 18 50 rquadto -20 17 53 17 rquadto -} def -/P$25 { -118 0 rlineto -0 -732 rlineto --118 0 rlineto -0 -114 rlineto -259 0 rlineto -0 959 rlineto --259 0 rlineto -0 -112 rlineto -closepath -} def -/P$20 { -101 0 164 78 rquadto -62 78 62 231 rquadto -0 153 -65 232 rquadto --64 79 -165 79 rquadto --64 0 -103 -23 rquadto --39 -23 -62 -53 rquadto --9 0 rlineto -9 45 9 87 rquadto -0 242 rlineto --164 0 rlineto -0 -864 rlineto -132 0 rlineto -23 78 rlineto -7 0 rlineto -23 -37 64 -62 rquadto -40 -26 106 -26 rquadto -closepath -} def -/P$2o { -96 0 154 51 rquadto -59 51 59 167 rquadto -0 392 rlineto --164 0 rlineto -0 -351 rlineto -0 -64 -23 -96 rquadto --23 -32 -73 -32 rquadto --75 0 -103 51 rquadto --26 51 -26 146 rquadto -0 282 rlineto --164 0 rlineto -0 -600 rlineto -125 0 rlineto -21 76 rlineto -9 0 rlineto -28 -46 78 -67 rquadto -50 -20 106 -20 rquadto -} def -/P$i { -26 0 56 -4 rquadto -29 -4 48 -9 rquadto -0 93 rlineto --20 9 -56 15 rquadto --35 6 -70 6 rquadto --59 0 -109 -20 rquadto --48 -20 -79 -70 rquadto --31 -51 -31 -142 rquadto -0 -435 rlineto --106 0 rlineto -0 -59 rlineto -107 -48 rlineto -50 -159 rlineto -71 0 rlineto -0 171 rlineto -217 0 rlineto -0 95 rlineto --217 0 rlineto -0 432 rlineto -0 68 32 101 rquadto -32 32 85 32 rquadto -closepath -} def -/P$2h { -0 40 -3 79 rquadto --1 39 -4 60 rquadto -7 0 rlineto -28 -43 76 -75 rquadto -48 -31 125 -31 rquadto -118 0 192 93 rquadto -75 92 75 273 rquadto -0 182 -75 276 rquadto --75 92 -198 92 rquadto --76 0 -121 -26 rquadto --45 -28 -73 -64 rquadto --12 0 rlineto --32 78 rlineto --148 0 rlineto -0 -987 rlineto -193 0 rlineto -0 229 rlineto -closepath -} def -/P$2s { -103 0 154 51 rquadto -53 51 53 167 rquadto -0 392 rlineto --164 0 rlineto -0 -351 rlineto -0 -129 -90 -129 rquadto --65 0 -93 46 rquadto --26 45 -26 132 rquadto -0 301 rlineto --164 0 rlineto -0 -351 rlineto -0 -129 -89 -129 rquadto --68 0 -95 51 rquadto --25 51 -25 146 rquadto -0 282 rlineto --164 0 rlineto -0 -600 rlineto -125 0 rlineto -21 76 rlineto -9 0 rlineto -26 -46 75 -67 rquadto -48 -20 100 -20 rquadto -65 0 110 21 rquadto -46 20 71 65 rquadto -14 0 rlineto -26 -46 75 -67 rquadto -50 -20 101 -20 rquadto -} def -/P$h { --89 0 -140 57 rquadto --50 56 -59 156 rquadto -381 0 rlineto --1 -95 -45 -154 rquadto --42 -59 -135 -59 rquadto -} def -/P$y { --148 0 -234 100 rquadto --85 100 -85 275 rquadto -0 173 79 275 rquadto -79 100 239 100 rquadto -62 0 115 -10 rquadto -54 -10 107 -26 rquadto -0 101 rlineto --53 20 -107 28 rquadto --54 9 -131 9 rquadto --142 0 -237 -57 rquadto --95 -59 -142 -167 rquadto --46 -107 -46 -253 rquadto -0 -140 50 -246 rquadto -51 -107 151 -167 rquadto -101 -60 243 -60 rquadto -146 0 256 54 rquadto --46 98 rlineto --42 -20 -95 -35 rquadto --53 -15 -115 -15 rquadto -} def -/P$16 { --4 -10 -14 -37 rquadto --7 -28 -17 -56 rquadto --7 -29 -12 -45 rquadto --9 40 -21 79 rquadto --10 37 -18 59 rquadto --106 281 rlineto -293 0 rlineto --103 -281 rlineto -} def -/P$27 { --129 0 -207 -89 rquadto --78 -90 -78 -270 rquadto -0 -179 78 -270 rquadto -78 -92 209 -92 rquadto -79 0 131 29 rquadto -51 29 84 71 rquadto -7 0 rlineto --1 -15 -4 -48 rquadto --3 -34 -3 -53 rquadto -0 -278 rlineto -114 0 rlineto -0 987 rlineto --92 0 rlineto --17 -93 rlineto --4 0 rlineto --31 43 -84 75 rquadto --51 31 -132 31 rquadto -closepath -} def -/P$2q { -0 600 rlineto --164 0 rlineto -0 -600 rlineto -164 0 rlineto -} def -/P$1g { -0 -23 0 -54 rquadto -1 -31 6 -53 rquadto --7 0 rlineto --29 43 -82 75 rquadto --53 31 -135 31 rquadto --126 0 -204 -89 rquadto --78 -90 -78 -270 rquadto -0 -179 79 -270 rquadto -79 -92 207 -92 rquadto -81 0 132 31 rquadto -53 31 84 76 rquadto -4 0 rlineto -17 -95 rlineto -90 0 rlineto -0 1009 rlineto --114 0 rlineto -0 -298 rlineto -closepath -} def -/P$2t { --117 0 rlineto -0 -928 rlineto -518 0 rlineto -0 103 rlineto --401 0 rlineto -0 328 rlineto -376 0 rlineto -0 103 rlineto --376 0 rlineto -0 393 rlineto -} def -/P$1 { --142 0 rlineto -0 371 rlineto -148 0 rlineto -121 0 178 -48 rquadto -56 -48 56 -142 rquadto -0 -98 -59 -139 rquadto --57 -42 -181 -42 rquadto -} def -/P$1q { -110 0 173 87 rquadto -4 0 rlineto -12 -76 rlineto -139 0 rlineto -0 601 rlineto -0 128 -76 195 rquadto --75 67 -223 67 rquadto --64 0 -118 -7 rquadto --54 -7 -106 -28 rquadto -0 -129 rlineto -110 45 234 45 rquadto -126 0 126 -135 rquadto -0 -12 rlineto -0 -18 1 -37 rquadto -1 -20 3 -35 rquadto --4 0 rlineto --31 46 -75 68 rquadto --42 20 -95 20 rquadto --107 0 -167 -81 rquadto --59 -82 -59 -228 rquadto -0 -148 60 -229 rquadto -62 -82 170 -82 rquadto -closepath -} def -/P$n { --126 0 rlineto -0 395 rlineto -100 0 rlineto -142 0 212 -45 rquadto -70 -46 70 -157 rquadto -0 -96 -62 -143 rquadto --60 -48 -193 -48 rquadto -} def -/P$1s { -0 150 -79 231 rquadto --78 81 -212 81 rquadto --84 0 -150 -35 rquadto --64 -35 -101 -106 rquadto --37 -70 -37 -170 rquadto -0 -150 78 -229 rquadto -78 -79 214 -79 rquadto -84 0 148 35 rquadto -65 35 103 104 rquadto -37 68 37 168 rquadto -closepath -} def -/P$10 { -89 0 153 39 rquadto -65 39 100 109 rquadto -34 70 34 165 rquadto -0 68 rlineto --478 0 rlineto -3 118 60 181 rquadto -57 60 162 60 rquadto -65 0 117 -12 rquadto -51 -12 106 -35 rquadto -0 100 rlineto --53 23 -106 34 rquadto --51 10 -123 10 rquadto --98 0 -175 -39 rquadto --75 -40 -117 -120 rquadto --42 -81 -42 -196 rquadto -0 -114 37 -195 rquadto -39 -82 107 -126 rquadto -70 -43 162 -43 rquadto -closepath -} def -/P$1f { -320 0 rlineto -0 456 rlineto --75 23 -151 34 rquadto --76 12 -175 12 rquadto --143 0 -243 -57 rquadto --98 -57 -150 -164 rquadto --50 -107 -50 -254 rquadto -0 -145 56 -251 rquadto -57 -107 164 -165 rquadto -107 -59 260 -59 rquadto -78 0 146 14 rquadto -70 14 129 40 rquadto --43 100 rlineto --50 -21 -112 -37 rquadto --60 -15 -128 -15 rquadto --165 0 -259 100 rquadto --92 100 -92 275 rquadto -0 110 35 196 rquadto -35 84 112 131 rquadto -76 46 201 46 rquadto -60 0 103 -6 rquadto -43 -6 78 -15 rquadto -0 -275 rlineto --203 0 rlineto -0 -104 rlineto -} def -/P$f { --123 0 rlineto -0 -1064 rlineto -123 0 rlineto -0 1064 rlineto -} def -/P$24 { -68 0 95 -39 rquadto -28 -40 29 -121 rquadto -0 -17 rlineto -0 -87 -28 -132 rquadto --26 -46 -98 -46 rquadto --54 0 -85 46 rquadto --29 46 -29 134 rquadto -0 87 29 132 rquadto -31 43 87 43 rquadto -} def -/P$2 { -0 156 -53 271 rquadto --51 115 -154 179 rquadto --101 64 -253 64 rquadto --154 0 -257 -64 rquadto --103 -64 -153 -179 rquadto --50 -117 -50 -273 rquadto -0 -153 50 -267 rquadto -50 -115 153 -179 rquadto -103 -65 259 -65 rquadto -150 0 251 64 rquadto -103 64 154 179 rquadto -53 115 53 270 rquadto -closepath -} def -/P$1w { --164 0 rlineto -0 -835 rlineto -164 0 rlineto -0 835 rlineto -} def -/P$3 { -0 189 79 298 rquadto -79 107 248 107 rquadto -171 0 250 -107 rquadto -78 -109 78 -298 rquadto -0 -189 -78 -295 rquadto --78 -107 -248 -107 rquadto --168 0 -250 107 rquadto --79 106 -79 295 rquadto -} def -/P$2d { -146 0 232 84 rquadto -85 84 85 239 rquadto -0 93 rlineto --457 0 rlineto -3 81 48 128 rquadto -46 46 128 46 rquadto -68 0 125 -14 rquadto -56 -14 115 -42 rquadto -0 150 rlineto --51 26 -109 37 rquadto --57 12 -140 12 rquadto --106 0 -189 -39 rquadto --81 -39 -128 -120 rquadto --46 -81 -46 -203 rquadto -0 -125 42 -206 rquadto -43 -82 118 -125 rquadto -75 -42 175 -42 rquadto -closepath -} def -/P$z { -18 0 40 1 rquadto -23 1 40 6 rquadto --14 104 rlineto --17 -3 -37 -6 rquadto --20 -3 -37 -3 rquadto --53 0 -100 29 rquadto --46 29 -75 82 rquadto --28 51 -28 121 rquadto -0 371 rlineto --114 0 rlineto -0 -696 rlineto -93 0 rlineto -12 128 rlineto -4 0 rlineto -34 -57 87 -98 rquadto -53 -42 126 -42 rquadto -} def -/P$1i { -0 696 rlineto --92 0 rlineto --17 -92 rlineto --6 0 rlineto --32 54 -93 79 rquadto --59 25 -126 25 rquadto --126 0 -190 -59 rquadto --62 -60 -62 -193 rquadto -0 -456 rlineto -115 0 rlineto -0 448 rlineto -0 167 154 167 rquadto -115 0 159 -65 rquadto -45 -65 45 -187 rquadto -0 -362 rlineto -114 0 rlineto -} def -/P$2e { --56 0 -93 35 rquadto --35 35 -42 112 rquadto -270 0 rlineto -0 -64 -32 -106 rquadto --32 -42 -101 -42 rquadto -} def -/P$r { -134 0 203 65 rquadto -68 64 68 209 rquadto -0 489 rlineto --121 0 rlineto -0 -479 rlineto -0 -181 -167 -181 rquadto --125 0 -173 70 rquadto --46 70 -46 201 rquadto -0 389 rlineto --123 0 rlineto -0 -750 rlineto -100 0 rlineto -17 101 rlineto -7 0 rlineto -35 -57 100 -85 rquadto -65 -29 135 -29 rquadto -closepath -} def -/P$1x { --134 0 -207 -73 rquadto --71 -75 -71 -234 rquadto -0 -109 37 -178 rquadto -37 -70 103 -103 rquadto -67 -32 153 -32 rquadto -62 0 107 12 rquadto -45 10 79 28 rquadto --48 126 rlineto --39 -15 -73 -25 rquadto --32 -10 -65 -10 rquadto --126 0 -126 181 rquadto -0 90 32 134 rquadto -34 42 93 42 rquadto -51 0 90 -14 rquadto -40 -14 78 -37 rquadto -0 139 rlineto --37 25 -79 34 rquadto --40 10 -103 10 rquadto -} def -/P$30 { -0 107 -76 165 rquadto --75 57 -226 57 rquadto --73 0 -128 -9 rquadto --53 -9 -106 -31 rquadto -0 -160 rlineto -57 26 123 43 rquadto -67 17 117 17 rquadto -57 0 81 -17 rquadto -25 -17 25 -43 rquadto -0 -18 -10 -32 rquadto --9 -14 -42 -32 rquadto --31 -18 -101 -46 rquadto --65 -28 -109 -56 rquadto --42 -28 -64 -67 rquadto --20 -40 -20 -100 rquadto -0 -98 76 -148 rquadto -78 -50 204 -50 rquadto -67 0 126 14 rquadto -59 12 123 42 rquadto --59 139 rlineto --51 -21 -98 -35 rquadto --46 -15 -95 -15 rquadto --84 0 -84 46 rquadto -0 17 10 31 rquadto -10 12 42 28 rquadto -31 15 93 42 rquadto -62 25 106 51 rquadto -43 26 67 65 rquadto -25 39 25 103 rquadto -} def -/P$2y { -189 0 279 68 rquadto -90 68 90 209 rquadto -0 64 -25 112 rquadto --23 46 -62 79 rquadto --39 32 -85 53 rquadto -273 404 rlineto --218 0 rlineto --220 -356 rlineto --104 0 rlineto -0 356 rlineto --196 0 rlineto -0 -928 rlineto -270 0 rlineto -closepath -} def -/P$14 { -25 0 51 -3 rquadto -28 -4 45 -10 rquadto -0 87 rlineto --18 9 -53 14 rquadto --32 6 -64 6 rquadto --54 0 -101 -18 rquadto --45 -18 -73 -65 rquadto --28 -46 -28 -131 rquadto -0 -404 rlineto --100 0 rlineto -0 -54 rlineto -100 -45 rlineto -45 -148 rlineto -68 0 rlineto -0 159 rlineto -201 0 rlineto -0 89 rlineto --201 0 rlineto -0 403 rlineto -0 62 29 93 rquadto -31 29 79 29 rquadto -} def -/P$g { -95 0 164 42 rquadto -70 42 107 118 rquadto -37 75 37 178 rquadto -0 73 rlineto --514 0 rlineto -3 128 64 195 rquadto -62 65 175 65 rquadto -71 0 126 -12 rquadto -56 -14 114 -39 rquadto -0 107 rlineto --57 25 -114 35 rquadto --54 12 -132 12 rquadto --106 0 -187 -43 rquadto --81 -43 -128 -129 rquadto --45 -85 -45 -210 rquadto -0 -121 40 -209 rquadto -42 -89 117 -135 rquadto -75 -48 175 -48 rquadto -closepath -} def -/P$j { -21 0 45 1 rquadto -25 1 43 6 rquadto --15 114 rlineto --18 -4 -40 -7 rquadto --21 -3 -40 -3 rquadto --57 0 -107 32 rquadto --50 31 -81 87 rquadto --29 56 -29 132 rquadto -0 400 rlineto --123 0 rlineto -0 -750 rlineto -101 0 rlineto -14 137 rlineto -4 0 rlineto -37 -62 93 -106 rquadto -57 -45 135 -45 rquadto -} def -/P$1c { -125 0 189 60 rquadto -64 59 64 195 rquadto -0 453 rlineto --114 0 rlineto -0 -445 rlineto -0 -168 -154 -168 rquadto --115 0 -160 65 rquadto --43 64 -43 187 rquadto -0 360 rlineto --114 0 rlineto -0 -696 rlineto -92 0 rlineto -17 95 rlineto -6 0 rlineto -32 -54 92 -81 rquadto -60 -26 126 -26 rquadto -} def -/P$o { -0 750 rlineto --101 0 rlineto --18 -100 rlineto --4 0 rlineto --35 59 -101 87 rquadto --64 26 -135 26 rquadto --135 0 -204 -64 rquadto --68 -65 -68 -209 rquadto -0 -490 rlineto -125 0 rlineto -0 482 rlineto -0 179 165 179 rquadto -125 0 173 -70 rquadto -48 -70 48 -201 rquadto -0 -390 rlineto -123 0 rlineto -} def -/P$v { -143 0 218 62 rquadto -76 60 76 187 rquadto -0 473 rlineto --134 0 rlineto --39 -96 rlineto --4 0 rlineto --45 57 -96 84 rquadto --50 25 -137 25 rquadto --95 0 -157 -54 rquadto --62 -54 -62 -170 rquadto -0 -112 78 -165 rquadto -79 -54 239 -59 rquadto -123 -4 rlineto -0 -31 rlineto -0 -56 -29 -81 rquadto --28 -26 -81 -26 rquadto --51 0 -101 15 rquadto --48 14 -98 35 rquadto --64 -131 rlineto -57 -29 126 -45 rquadto -70 -17 145 -17 rquadto -closepath -} def -/P$1h { -107 0 153 -59 rquadto -45 -59 46 -181 rquadto -0 -23 rlineto -0 -132 -45 -201 rquadto --43 -68 -156 -68 rquadto --93 0 -140 73 rquadto --45 73 -45 198 rquadto -0 123 46 193 rquadto -46 68 140 68 rquadto -} def -/P$9 { -28 0 50 18 rquadto -21 18 21 59 rquadto -0 39 -21 59 rquadto --21 18 -50 18 rquadto --29 0 -51 -18 rquadto --20 -20 -20 -59 rquadto -0 -40 20 -59 rquadto -21 -18 51 -18 rquadto -closepath -} def -/P$t { -0 176 -93 273 rquadto --92 95 -253 95 rquadto --98 0 -176 -42 rquadto --76 -43 -121 -125 rquadto --43 -82 -43 -201 rquadto -0 -176 92 -271 rquadto -93 -95 254 -95 rquadto -100 0 176 43 rquadto -76 42 120 123 rquadto -45 81 45 200 rquadto -closepath -} def -/P$7 { --100 0 -178 -40 rquadto --76 -40 -121 -125 rquadto --43 -85 -43 -218 rquadto -0 -139 45 -225 rquadto -46 -87 126 -128 rquadto -79 -40 179 -40 rquadto -57 0 110 12 rquadto -53 10 87 28 rquadto --39 101 rlineto --32 -12 -78 -23 rquadto --45 -10 -84 -10 rquadto --220 0 -220 284 rquadto -0 135 53 207 rquadto -54 71 160 71 rquadto -60 0 107 -12 rquadto -46 -12 85 -31 rquadto -0 109 rlineto --37 20 -82 29 rquadto --45 10 -109 10 rquadto -} def -/P$1r { --115 0 -115 181 rquadto -0 179 117 179 rquadto -62 0 92 -35 rquadto -31 -35 31 -125 rquadto -0 -20 rlineto -0 -96 -29 -137 rquadto --29 -42 -95 -42 rquadto -} def -/P$8 { -26 0 56 -4 rquadto -29 -4 48 -9 rquadto -0 93 rlineto --20 9 -56 15 rquadto --35 6 -70 6 rquadto --59 0 -109 -20 rquadto --48 -20 -79 -70 rquadto --31 -51 -31 -142 rquadto -0 -435 rlineto --106 0 rlineto -0 -59 rlineto -107 -48 rlineto -50 -159 rlineto -71 0 rlineto -0 171 rlineto -217 0 rlineto -0 95 rlineto --217 0 rlineto -0 432 rlineto -0 68 32 101 rquadto -32 32 85 32 rquadto -} def -/P$12 { -126 0 187 56 rquadto -60 54 60 176 rquadto -0 475 rlineto --82 0 rlineto --21 -98 rlineto --4 0 rlineto --45 56 -96 84 rquadto --50 26 -137 26 rquadto --95 0 -157 -50 rquadto --62 -50 -62 -156 rquadto -0 -104 81 -160 rquadto -82 -56 253 -60 rquadto -118 -4 rlineto -0 -40 rlineto -0 -87 -37 -120 rquadto --37 -34 -107 -34 rquadto --53 0 -103 15 rquadto --50 15 -92 37 rquadto --35 -85 rlineto -45 -25 107 -42 rquadto -62 -17 131 -17 rquadto -closepath -} def -/P$2n { -0 600 rlineto --126 0 rlineto --21 -76 rlineto --7 0 rlineto --29 45 -79 67 rquadto --50 20 -106 20 rquadto --96 0 -154 -51 rquadto --57 -53 -57 -168 rquadto -0 -390 rlineto -164 0 rlineto -0 350 rlineto -0 64 21 96 rquadto -23 32 75 32 rquadto -75 0 101 -50 rquadto -28 -51 28 -146 rquadto -0 -282 rlineto -164 0 rlineto -} def -/P$2i { --75 0 -106 46 rquadto --29 46 -32 143 rquadto -0 20 rlineto -0 103 29 159 rquadto -31 54 112 54 rquadto -59 0 93 -54 rquadto -35 -56 35 -160 rquadto -0 -103 -35 -156 rquadto --35 -53 -96 -53 rquadto -} def -/P$2g { -81 0 112 -46 rquadto -32 -46 34 -142 rquadto -0 -20 rlineto -0 -104 -32 -159 rquadto --31 -54 -117 -54 rquadto --62 0 -100 56 rquadto --35 54 -35 157 rquadto -0 104 35 157 rquadto -37 51 103 51 rquadto -} def -/P$2k { -0 39 -3 79 rquadto --3 39 -7 79 rquadto -3 0 rlineto -18 -28 39 -54 rquadto -21 -28 45 -53 rquadto -198 -215 rlineto -218 0 rlineto --282 307 rlineto -300 401 rlineto --223 0 rlineto --204 -287 rlineto --82 67 rlineto -0 220 rlineto --193 0 rlineto -0 -987 rlineto -193 0 rlineto -0 442 rlineto -closepath -} def -/P$33 { --131 0 rlineto -0 343 rlineto -139 0 rlineto -112 0 164 -43 rquadto -53 -45 53 -132 rquadto -0 -90 -54 -128 rquadto --54 -39 -170 -39 rquadto -} def -/P$18 { -26 0 46 17 rquadto -20 17 20 54 rquadto -0 37 -20 56 rquadto --20 17 -46 17 rquadto --28 0 -48 -17 rquadto --18 -18 -18 -56 rquadto -0 -37 18 -54 rquadto -20 -17 48 -17 rquadto -closepath -} def -/P$1y { -125 0 196 70 rquadto -73 70 73 201 rquadto -0 79 rlineto --387 0 rlineto -1 68 40 109 rquadto -39 39 109 39 rquadto -57 0 104 -10 rquadto -48 -12 98 -35 rquadto -0 126 rlineto --43 21 -93 31 rquadto --48 10 -117 10 rquadto --90 0 -160 -32 rquadto --68 -34 -107 -101 rquadto --39 -68 -39 -171 rquadto -0 -106 34 -175 rquadto -35 -70 100 -104 rquadto -64 -35 148 -35 rquadto -closepath -} def -/P$1z { --46 0 -78 31 rquadto --31 31 -37 95 rquadto -229 0 rlineto -0 -54 -28 -90 rquadto --28 -35 -85 -35 rquadto -} def -/P$2c { --193 0 rlineto -0 -928 rlineto -531 0 rlineto -0 160 rlineto --337 0 rlineto -0 239 rlineto -314 0 rlineto -0 160 rlineto --314 0 rlineto -0 367 rlineto -} def -/P$2j { --159 0 -246 -87 rquadto --85 -87 -85 -276 rquadto -0 -129 43 -210 rquadto -45 -82 123 -121 rquadto -79 -39 181 -39 rquadto -73 0 126 15 rquadto -54 14 95 32 rquadto --57 150 rlineto --45 -18 -85 -29 rquadto --39 -12 -78 -12 rquadto --150 0 -150 215 rquadto -0 106 39 157 rquadto -40 50 110 50 rquadto -62 0 107 -15 rquadto -46 -17 92 -45 rquadto -0 164 rlineto --45 29 -93 40 rquadto --48 12 -121 12 rquadto -} def -/P$13 { --129 4 -179 40 rquadto --50 35 -50 103 rquadto -0 57 35 85 rquadto -35 26 92 26 rquadto -87 0 145 -48 rquadto -59 -48 59 -150 rquadto -0 -62 rlineto --103 4 rlineto -} def -/P$e { --160 0 -253 107 rquadto --92 107 -92 295 rquadto -0 185 85 295 rquadto -85 107 257 107 rquadto -65 0 125 -10 rquadto -59 -10 114 -28 rquadto -0 109 rlineto --54 20 -115 29 rquadto --59 10 -140 10 rquadto --153 0 -256 -62 rquadto --101 -64 -153 -179 rquadto --50 -115 -50 -273 rquadto -0 -151 54 -265 rquadto -54 -115 162 -181 rquadto -107 -65 262 -65 rquadto -157 0 275 59 rquadto --50 106 rlineto --45 -20 -103 -37 rquadto --56 -17 -123 -17 rquadto -} def -/P$1m { --81 0 -129 53 rquadto --46 51 -56 145 rquadto -354 0 rlineto --1 -89 -42 -143 rquadto --39 -54 -126 -54 rquadto -closepath -} def -/P$2u { -0 43 -3 82 rquadto --1 37 -3 59 rquadto -6 0 rlineto -29 -43 81 -73 rquadto -53 -29 134 -29 rquadto -129 0 207 90 rquadto -79 89 79 268 rquadto -0 179 -79 270 rquadto --79 90 -207 90 rquadto --81 0 -134 -29 rquadto --51 -29 -81 -71 rquadto --9 0 rlineto --23 89 rlineto --81 0 rlineto -0 -987 rlineto -114 0 rlineto -0 240 rlineto -closepath -} def -/P$1b { -0 123 48 196 rquadto -50 71 156 71 rquadto -104 0 154 -71 rquadto -50 -73 50 -196 rquadto -0 -123 -50 -193 rquadto --50 -70 -156 -70 rquadto --106 0 -154 70 rquadto --48 70 -48 193 rquadto -} def -/P$6 { --3 -10 -14 -40 rquadto --9 -29 -18 -60 rquadto --7 -31 -14 -48 rquadto --9 43 -21 85 rquadto --12 40 -21 64 rquadto --112 301 rlineto -315 0 rlineto --112 -301 rlineto -} def -/P$1a { -0 173 -87 268 rquadto --87 93 -237 93 rquadto --92 0 -164 -42 rquadto --71 -42 -114 -123 rquadto --40 -81 -40 -196 rquadto -0 -171 85 -265 rquadto -87 -93 237 -93 rquadto -95 0 167 42 rquadto -71 42 112 121 rquadto -40 79 40 195 rquadto -closepath -} def -/P$1d { --114 0 rlineto -0 -987 rlineto -114 0 rlineto -0 987 rlineto -} def -/P$c { -0 132 51 210 rquadto -53 78 167 78 rquadto -114 0 167 -78 rquadto -53 -78 53 -210 rquadto -0 -132 -53 -207 rquadto --53 -76 -167 -76 rquadto --115 0 -167 76 rquadto --51 75 -51 207 rquadto -} def -/P$u { -0 104 34 159 rquadto -34 53 112 53 rquadto -76 0 110 -53 rquadto -34 -54 34 -159 rquadto -0 -104 -34 -157 rquadto --34 -53 -112 -53 rquadto --76 0 -110 53 rquadto --34 53 -34 157 rquadto -} def -/P$x { --193 0 rlineto -0 -987 rlineto -193 0 rlineto -0 987 rlineto -closepath -} def -/P$q { --93 0 -145 75 rquadto --51 75 -51 214 rquadto -0 137 50 210 rquadto -51 73 150 73 rquadto -114 0 165 -60 rquadto -51 -60 51 -195 rquadto -0 -29 rlineto -0 -154 -53 -220 rquadto --53 -67 -167 -67 rquadto -} def -/P$l { -21 0 45 1 rquadto -25 1 43 6 rquadto --15 114 rlineto --18 -4 -40 -7 rquadto --21 -3 -40 -3 rquadto --57 0 -107 32 rquadto --50 31 -81 87 rquadto --29 56 -29 132 rquadto -0 400 rlineto --123 0 rlineto -0 -750 rlineto -101 0 rlineto -14 137 rlineto -4 0 rlineto -37 -62 93 -106 rquadto -57 -45 135 -45 rquadto -closepath -} def -1 1 1 setrgbcolor -1000 42047 13300 11847 simplerect -closepath eofill -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -1000 42047 13300 11847 simplerect -closepath stroke -1 1 1 setrgbcolor -1000 50888 27400 4906 simplerect -closepath eofill -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -1000 50888 27400 4906 simplerect -closepath stroke -1 1 1 setrgbcolor -1000 50888 43300 4906 simplerect -closepath eofill -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -1000 50888 43300 4906 simplerect -closepath stroke -150 setlinewidth -0 0 0 setrgbcolor -44950 33506 5450 19689 simplerect -closepath stroke -150 setlinewidth -0 0 0 setrgbcolor -42950 8311 6450 33271 simplerect -closepath stroke -50 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -13750 3906 moveto -53{ -0 500 rlineto -0 500 rmoveto -} repeat -stroke -50 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -27900 3906 moveto -53{ -0 500 rlineto -0 500 rmoveto -} repeat -stroke -50 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -43800 3906 moveto -53{ -0 500 rlineto -0 500 rmoveto -} repeat -stroke -0.89 0.89 0.94 setrgbcolor -12700 3306 7450 500 250 roundrect -closepath eofill -50 setlinewidth -0.09 0.09 0.09 setrgbcolor -12700 3306 7450 500 250 roundrect -closepath stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -8560 1696 moveto -P$0 -8554 1805 moveto -P$1 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -10057 2195 moveto -P$2 -9268 2195 moveto -P$3 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -10853 2429 moveto -P$4 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -12112 2696 moveto -P$5 -11842 1973 moveto -P$6 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -12670 2710 moveto -P$7 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -13320 2609 moveto -P$8 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -13631 1665 moveto -P$9 -13692 1946 moveto -P$a -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -14621 2320 moveto -P$b -14054 2320 moveto -P$c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -15129 1932 moveto -P$d -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -16114 1793 moveto -P$e -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -16692 2696 moveto -P$f -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17031 1665 moveto -P$9 -17092 1946 moveto -P$a -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17659 1932 moveto -P$g -17657 2032 moveto -P$h -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -18529 1932 moveto -P$d -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -19320 2609 moveto -P$i -fill -0.89 0.89 0.94 setrgbcolor -12700 3306 7450 56595 250 roundrect -closepath eofill -50 setlinewidth -0.09 0.09 0.09 setrgbcolor -12700 3306 7450 56595 250 roundrect -closepath stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -8560 57791 moveto -P$0 -8554 57901 moveto -P$1 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -10057 58290 moveto -P$2 -9268 58290 moveto -P$3 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -10853 58524 moveto -P$4 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -12112 58791 moveto -P$5 -11842 58068 moveto -P$6 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -12670 58805 moveto -P$7 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -13320 58704 moveto -P$8 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -13631 57760 moveto -P$9 -13692 58041 moveto -P$a -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -14621 58415 moveto -P$b -14054 58415 moveto -P$c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -15129 58027 moveto -P$d -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -16114 57888 moveto -P$e -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -16692 58791 moveto -P$f -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17031 57760 moveto -P$9 -17092 58041 moveto -P$a -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17659 58027 moveto -P$g -17657 58127 moveto -P$h -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -18529 58027 moveto -P$d -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -19320 58704 moveto -P$i -fill -0.89 0.89 0.94 setrgbcolor -9200 3306 23300 500 250 roundrect -closepath eofill -50 setlinewidth -0.09 0.09 0.09 setrgbcolor -9200 3306 23300 500 250 roundrect -closepath stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -24762 2696 moveto -P$5 -24492 1973 moveto -P$6 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -25320 2710 moveto -P$7 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -25970 2609 moveto -P$8 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -26871 2320 moveto -P$b -26304 2320 moveto -P$c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -27368 1932 moveto -P$j -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -28203 2429 moveto -P$4 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -28709 1932 moveto -P$g -28707 2032 moveto -P$h -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -29568 1932 moveto -P$j -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -29984 2696 moveto -P$k -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -30809 1932 moveto -P$g -30807 2032 moveto -P$h -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -31668 1932 moveto -P$l -fill -0.89 0.89 0.94 setrgbcolor -9200 3306 23300 56595 250 roundrect -closepath eofill -50 setlinewidth -0.09 0.09 0.09 setrgbcolor -9200 3306 23300 56595 250 roundrect -closepath stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -24762 58791 moveto -P$5 -24492 58068 moveto -P$6 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -25320 58805 moveto -P$7 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -25970 58704 moveto -P$8 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -26871 58415 moveto -P$b -26304 58415 moveto -P$c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -27368 58027 moveto -P$j -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -28203 58524 moveto -P$4 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -28709 58027 moveto -P$g -28707 58127 moveto -P$h -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -29568 58027 moveto -P$j -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -29984 58791 moveto -P$k -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -30809 58027 moveto -P$g -30807 58127 moveto -P$h -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -31668 58027 moveto -P$l -fill -0.89 0.89 0.94 setrgbcolor -9200 3306 39200 500 250 roundrect -closepath eofill -50 setlinewidth -0.09 0.09 0.09 setrgbcolor -9200 3306 39200 500 250 roundrect -closepath stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -40662 2696 moveto -P$5 -40392 1973 moveto -P$6 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -41220 2710 moveto -P$7 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -41870 2609 moveto -P$8 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -42771 2320 moveto -P$b -42204 2320 moveto -P$c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -43268 1932 moveto -P$j -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -43800 1696 moveto -P$m -43789 1804 moveto -P$n -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -44442 2696 moveto -P$f -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -45346 1946 moveto -P$o -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -45884 1932 moveto -P$p -45901 2035 moveto -P$q -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -46581 1665 moveto -P$9 -46642 1946 moveto -P$a -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -47279 1932 moveto -P$r -fill -0.89 0.89 0.94 setrgbcolor -9200 3306 39200 56595 250 roundrect -closepath eofill -50 setlinewidth -0.09 0.09 0.09 setrgbcolor -9200 3306 39200 56595 250 roundrect -closepath stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -40662 58791 moveto -P$5 -40392 58068 moveto -P$6 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -41220 58805 moveto -P$7 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -41870 58704 moveto -P$8 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -42771 58415 moveto -P$b -42204 58415 moveto -P$c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -43268 58027 moveto -P$j -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -43800 57791 moveto -P$m -43789 57899 moveto -P$n -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -44442 58791 moveto -P$f -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -45346 58041 moveto -P$o -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -45884 58027 moveto -P$p -45901 58130 moveto -P$q -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -46581 57760 moveto -P$9 -46642 58041 moveto -P$a -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -47279 58027 moveto -P$r -fill -1 1 1 setrgbcolor -1000 42047 13300 11847 simplerect -closepath eofill -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -1000 42047 13300 11847 simplerect -closepath stroke -1 1 1 setrgbcolor -1000 50888 27400 4906 simplerect -closepath eofill -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -1000 50888 27400 4906 simplerect -closepath stroke -1 1 1 setrgbcolor -1000 50888 43300 4906 simplerect -closepath eofill -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -1000 50888 43300 4906 simplerect -closepath stroke -0.93 0.93 0.93 setrgbcolor -51400 300 0 7092 simplerect -closepath eofill -100 setlinewidth -0.93 0.93 0.93 setrgbcolor -51400 300 0 7092 simplerect -closepath stroke -100 setlinewidth -0 0 0 setrgbcolor -newpath -0 7092 moveto -51400 0 rlineto -stroke -100 setlinewidth -0 0 0 setrgbcolor -newpath -0 7392 moveto -51400 0 rlineto -stroke -0.93 0.93 0.93 setrgbcolor -4600 2570 23400 5906 simplerect -closepath eofill -200 setlinewidth -0 0 0 setrgbcolor -4600 2570 23400 5906 simplerect -closepath stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -24468 7174 moveto -P$s -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -25646 7340 moveto -P$t -25156 7340 moveto -P$u -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -26092 6973 moveto -P$v -26120 7369 moveto -P$w -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -26795 7696 moveto -P$x -fill -0.09 0.09 0.09 setrgbcolor -newpath -12100 11447 moveto -1000 400 rlineto --1000 400 rlineto -400 -400 rlineto -12100 11447 lineto -closepath eofill -200 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -12100 11447 moveto -1000 400 rlineto --1000 400 rlineto -400 -400 rlineto -12100 11447 lineto -closepath stroke -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -0 11847 moveto -12700 0 rlineto -stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -1223 10428 moveto -P$y -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -1935 10557 moveto -P$z -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -2379 10557 moveto -P$10 -2378 10651 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -3075 10559 moveto -P$12 -3107 10931 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -3743 11185 moveto -P$14 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -4279 10557 moveto -P$10 -4278 10651 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -5607 11267 moveto -P$15 -5357 10595 moveto -P$16 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -6090 11279 moveto -P$17 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -6643 11185 moveto -P$14 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -6968 10309 moveto -P$18 -7025 10570 moveto -P$19 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -7815 10917 moveto -P$1a -7289 10917 moveto -P$1b -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -8345 10557 moveto -P$1c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -9223 10428 moveto -P$y -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -9725 11267 moveto -P$1d -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -9968 10309 moveto -P$18 -10025 10570 moveto -P$19 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -10479 10557 moveto -P$10 -10478 10651 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -11245 10557 moveto -P$1c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -11943 11185 moveto -P$1e -fill -0.09 0.09 0.09 setrgbcolor -newpath -26200 14618 moveto -1000 400 rlineto --1000 400 rlineto -400 -400 rlineto -26200 14618 lineto -closepath eofill -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -26200 14618 moveto -1000 400 rlineto --1000 400 rlineto -400 -400 rlineto -26200 14618 lineto -closepath stroke -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -14300 15018 moveto -12500 0 rlineto -stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -15529 13947 moveto -P$1f -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -16615 14087 moveto -P$1a -16089 14087 moveto -P$1b -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17075 13729 moveto -P$12 -17107 14101 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17625 14437 moveto -P$1d -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -18435 13728 moveto -P$z -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -18879 13728 moveto -P$10 -18878 13822 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -19775 14451 moveto -P$1g -19576 14356 moveto -P$1h -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -20692 13740 moveto -P$1i -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -21179 13728 moveto -P$10 -21178 13822 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -22064 14245 moveto -P$1j -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -22443 14356 moveto -P$1e -fill -0.09 0.09 0.09 setrgbcolor -newpath -15400 17789 moveto --1000 400 rlineto -1000 400 rlineto --400 -400 rlineto -15400 17789 lineto -closepath eofill -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -15400 17789 moveto --1000 400 rlineto -1000 400 rlineto --400 -400 rlineto -15400 17789 lineto -closepath stroke -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -14800 18189 moveto -31{ -200 0 rlineto -200 0 rmoveto -} repeat -100 0 rlineto -stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -16529 17117 moveto -P$1f -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17615 17258 moveto -P$1a -17089 17258 moveto -P$1b -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -18075 16900 moveto -P$12 -18107 17272 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -18625 17608 moveto -P$1d -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -19435 16898 moveto -P$z -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -19879 16898 moveto -P$10 -19878 16992 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -20764 17416 moveto -P$1j -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -21242 16898 moveto -P$1k -21221 16994 moveto -P$1l -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -22315 17258 moveto -P$1a -21789 17258 moveto -P$1b -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -22845 16898 moveto -P$1c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -23764 17416 moveto -P$1j -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -24179 16898 moveto -P$10 -24178 16992 moveto -P$1m -fill -0.93 0.93 0.93 setrgbcolor -newpath -5450 19689 moveto -11750 19689 lineto -11750 20659 lineto -10750 21659 lineto -5450 21659 lineto -5450 19689 lineto -closepath eofill -150 setlinewidth -0 0 0 setrgbcolor -newpath -5450 19689 moveto -11750 19689 lineto -11750 20659 lineto -10750 21659 lineto -5450 21659 lineto -5450 19689 lineto -stroke -150 setlinewidth -0 0 0 setrgbcolor -44950 33506 5450 19689 simplerect -closepath stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -7342 20455 moveto -P$v -7370 20852 moveto -P$w -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -8045 21178 moveto -P$1n -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -8550 21036 moveto -P$1o -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -13585 21238 moveto -P$1p -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -13931 20454 moveto -P$1q -13982 20586 moveto -P$1r -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -14981 20763 moveto -P$1s -14567 20763 moveto -P$1t -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -15382 20452 moveto -P$1u -15404 20788 moveto -P$1v -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -16000 21065 moveto -P$1w -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -16682 20452 moveto -P$1u -16704 20788 moveto -P$1v -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17379 21076 moveto -P$1x -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17979 21076 moveto -P$1x -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -18582 20454 moveto -P$1y -18584 20569 moveto -P$1z -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -19370 20454 moveto -P$20 -19317 20583 moveto -P$21 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -19989 20944 moveto -P$22 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -20482 20454 moveto -P$1y -20484 20569 moveto -P$1z -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -21126 21076 moveto -P$23 -21182 20944 moveto -P$24 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -21578 21126 moveto -P$25 -fill -0.09 0.09 0.09 setrgbcolor -newpath -42100 23630 moveto -1000 400 rlineto --1000 400 rlineto -400 -400 rlineto -42100 23630 lineto -closepath eofill -150 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -42100 23630 moveto -1000 400 rlineto --1000 400 rlineto -400 -400 rlineto -42100 23630 lineto -closepath stroke -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -28400 24030 moveto -36{ -200 0 rlineto -200 0 rmoveto -} repeat -stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -29753 23201 moveto -P$26 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -30179 22740 moveto -P$10 -30178 22833 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -30843 23368 moveto -P$14 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -31675 22741 moveto -P$12 -31707 23113 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -32390 23462 moveto -P$17 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -32943 23368 moveto -P$14 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -33268 22491 moveto -P$18 -33325 22752 moveto -P$19 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -34115 23099 moveto -P$1a -33589 23099 moveto -P$1b -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -34645 22740 moveto -P$1c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -35675 22741 moveto -P$12 -35707 23113 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -36445 22740 moveto -P$1c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -37157 23462 moveto -P$27 -37175 23368 moveto -P$28 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -38243 23368 moveto -P$14 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -38775 22741 moveto -P$12 -38807 23113 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -39535 22740 moveto -P$z -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -39957 22740 moveto -P$29 -39973 22835 moveto -P$2a -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -40779 22740 moveto -P$10 -40778 22833 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -41443 23368 moveto -P$1e -fill -0.09 0.09 0.09 setrgbcolor -newpath -29500 26801 moveto --1000 400 rlineto -1000 400 rlineto --400 -400 rlineto -29500 26801 lineto -closepath eofill -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -29500 26801 moveto --1000 400 rlineto -1000 400 rlineto --400 -400 rlineto -29500 26801 lineto -closepath stroke -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -28900 27201 moveto -14300 0 rlineto -stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -30753 26371 moveto -P$26 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -31143 26538 moveto -P$14 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -31675 25912 moveto -P$12 -31707 26284 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -32343 26538 moveto -P$14 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -32879 25910 moveto -P$10 -32878 26004 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -33890 26632 moveto -P$17 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -34325 25921 moveto -P$2b -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -35275 25912 moveto -P$12 -35307 26284 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -36045 25910 moveto -P$1c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -36757 25910 moveto -P$29 -36773 26006 moveto -P$2a -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -37579 25910 moveto -P$10 -37578 26004 moveto -P$1m -fill -0.93 0.93 0.93 setrgbcolor -51400 300 0 30186 simplerect -closepath eofill -100 setlinewidth -0.93 0.93 0.93 setrgbcolor -51400 300 0 30186 simplerect -closepath stroke -100 setlinewidth -0 0 0 setrgbcolor -newpath -0 30186 moveto -51400 0 rlineto -stroke -100 setlinewidth -0 0 0 setrgbcolor -newpath -0 30486 moveto -51400 0 rlineto -stroke -0.93 0.93 0.93 setrgbcolor -7900 2570 21750 29001 simplerect -closepath eofill -200 setlinewidth -0 0 0 setrgbcolor -7900 2570 21750 29001 simplerect -closepath stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -22660 30790 moveto -P$2c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -23443 30067 moveto -P$2d -23445 30206 moveto -P$2e -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -24243 30067 moveto -P$2d -24245 30206 moveto -P$2e -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -24976 30803 moveto -P$2f -25043 30648 moveto -P$2g -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -25745 30032 moveto -P$2h -25884 30221 moveto -P$2i -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -26642 30067 moveto -P$v -26670 30464 moveto -P$w -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -27440 30803 moveto -P$2j -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -28045 30245 moveto -P$2k -fill -0.93 0.93 0.93 setrgbcolor -newpath -6450 33271 moveto -13750 33271 lineto -13750 34242 lineto -12750 35242 lineto -6450 35242 lineto -6450 33271 lineto -closepath eofill -150 setlinewidth -0 0 0 setrgbcolor -newpath -6450 33271 moveto -13750 33271 lineto -13750 34242 lineto -12750 35242 lineto -6450 35242 lineto -6450 33271 lineto -stroke -150 setlinewidth -0 0 0 setrgbcolor -42950 8311 6450 33271 simplerect -closepath stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -8245 34761 moveto -P$1n -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -9096 34405 moveto -P$t -8606 34405 moveto -P$u -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -9896 34405 moveto -P$t -9406 34405 moveto -P$u -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -10446 34037 moveto -P$2l -10384 34192 moveto -P$2m -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -15585 34820 moveto -P$1p -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -16287 34047 moveto -P$2n -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -16776 34036 moveto -P$2o -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17389 34527 moveto -P$22 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17718 33811 moveto -P$2p -17800 34047 moveto -P$2q -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -18100 34647 moveto -P$1w -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -18782 34034 moveto -P$1u -18804 34370 moveto -P$1v -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -19479 34658 moveto -P$1x -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -20089 34527 moveto -P$22 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -20418 33811 moveto -P$2p -20500 34047 moveto -P$2q -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -21181 34345 moveto -P$1s -20767 34345 moveto -P$1t -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -21676 34036 moveto -P$2o -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -22418 33811 moveto -P$2p -22500 34047 moveto -P$2q -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -23054 34469 moveto -P$2r -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -23679 34658 moveto -P$1x -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -24581 34345 moveto -P$1s -24167 34345 moveto -P$1t -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -25440 34036 moveto -P$2s -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -26170 34036 moveto -P$20 -26117 34166 moveto -P$21 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -26700 34647 moveto -P$1w -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -27082 34036 moveto -P$1y -27084 34152 moveto -P$1z -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -27789 34527 moveto -P$22 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -28282 34036 moveto -P$1y -28284 34152 moveto -P$1z -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -28926 34658 moveto -P$23 -28982 34527 moveto -P$24 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -29378 34708 moveto -P$25 -fill -0.09 0.09 0.09 setrgbcolor -newpath -29500 37212 moveto --1000 400 rlineto -1000 400 rlineto --400 -400 rlineto -29500 37212 lineto -closepath eofill -150 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -29500 37212 moveto --1000 400 rlineto -1000 400 rlineto --400 -400 rlineto -29500 37212 lineto -closepath stroke -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -28900 37612 moveto -36{ -200 0 rlineto -200 0 rmoveto -} repeat -stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -30343 37031 moveto -P$2t -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -31179 36322 moveto -P$10 -31178 36416 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -31879 36322 moveto -P$10 -31878 36416 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -32557 37044 moveto -P$27 -32575 36950 moveto -P$28 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -33225 36285 moveto -P$2u -33421 36417 moveto -P$2v -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -34175 36324 moveto -P$12 -34207 36695 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -34890 37044 moveto -P$17 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -35323 36560 moveto -P$2w -fill -0.09 0.09 0.09 setrgbcolor -newpath -15400 40383 moveto --1000 400 rlineto -1000 400 rlineto --400 -400 rlineto -15400 40383 lineto -closepath eofill -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -15400 40383 moveto --1000 400 rlineto -1000 400 rlineto --400 -400 rlineto -15400 40383 lineto -closepath stroke -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -14800 40783 moveto -31{ -200 0 rlineto -200 0 rmoveto -} repeat -100 0 rlineto -stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -16243 40202 moveto -P$2t -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17079 39493 moveto -P$10 -17078 39586 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17779 39493 moveto -P$10 -17778 39586 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -18457 40215 moveto -P$27 -18475 40121 moveto -P$28 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -19125 39455 moveto -P$2u -19321 39588 moveto -P$2v -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -20075 39494 moveto -P$12 -20107 39866 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -20790 40215 moveto -P$17 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -21223 39730 moveto -P$2x -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -22390 40215 moveto -P$17 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -22975 39494 moveto -P$12 -23007 39866 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -23525 40202 moveto -P$1d -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -23825 40202 moveto -P$1d -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -24125 39455 moveto -P$2u -24321 39588 moveto -P$2v -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -25075 39494 moveto -P$12 -25107 39866 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -25790 40215 moveto -P$17 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -26223 39730 moveto -P$2w -fill -0.93 0.93 0.93 setrgbcolor -51400 300 0 44468 simplerect -closepath eofill -100 setlinewidth -0.93 0.93 0.93 setrgbcolor -51400 300 0 44468 simplerect -closepath stroke -100 setlinewidth -0 0 0 setrgbcolor -newpath -0 44468 moveto -51400 0 rlineto -stroke -100 setlinewidth -0 0 0 setrgbcolor -newpath -0 44768 moveto -51400 0 rlineto -stroke -0.93 0.93 0.93 setrgbcolor -5900 2570 22750 43283 simplerect -closepath eofill -200 setlinewidth -0 0 0 setrgbcolor -5900 2570 22750 43283 simplerect -closepath stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -23737 44144 moveto -P$2y -23723 44305 moveto -P$2z -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -24643 44349 moveto -P$2d -24645 44488 moveto -P$2e -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -25646 44862 moveto -P$30 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -26403 44363 moveto -P$31 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -26845 45073 moveto -P$1n -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -27350 44930 moveto -P$1o -fill -0.09 0.09 0.09 setrgbcolor -newpath -29500 48824 moveto --1000 400 rlineto -1000 400 rlineto --400 -400 rlineto -29500 48824 lineto -closepath eofill -200 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -29500 48824 moveto --1000 400 rlineto -1000 400 rlineto --400 -400 rlineto -29500 48824 lineto -closepath stroke -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -28900 49224 moveto -36{ -200 0 rlineto -200 0 rmoveto -} repeat -stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -30753 48395 moveto -P$26 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -31143 48562 moveto -P$14 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -31675 47935 moveto -P$12 -31707 48307 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -32343 48562 moveto -P$14 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -32879 47934 moveto -P$10 -32878 48028 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -33890 48656 moveto -P$17 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -34325 47945 moveto -P$2b -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -35275 47935 moveto -P$12 -35307 48307 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -36045 47934 moveto -P$1c -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -36757 47934 moveto -P$29 -36773 48029 moveto -P$2a -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -37579 47934 moveto -P$10 -37578 48028 moveto -P$1m -fill -0.09 0.09 0.09 setrgbcolor -newpath -15400 51995 moveto --1000 400 rlineto -1000 400 rlineto --400 -400 rlineto -15400 51995 lineto -closepath eofill -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -15400 51995 moveto --1000 400 rlineto -1000 400 rlineto --400 -400 rlineto -15400 51995 lineto -closepath stroke -100 setlinewidth -0.09 0.09 0.09 setrgbcolor -newpath -14800 52395 moveto -31{ -200 0 rlineto -200 0 rmoveto -} repeat -100 0 rlineto -stroke -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -16382 50886 moveto -P$32 -16375 50987 moveto -P$33 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -17179 51104 moveto -P$10 -17178 51198 moveto -P$11 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -18064 51622 moveto -P$1j -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -18792 51117 moveto -P$1i -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -19125 51814 moveto -P$1d -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -19543 51733 moveto -P$14 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -20390 51826 moveto -P$17 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -20975 51106 moveto -P$12 -21007 51478 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -21525 51814 moveto -P$1d -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -21825 51814 moveto -P$1d -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -22125 51067 moveto -P$2u -22321 51200 moveto -P$2v -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -23075 51106 moveto -P$12 -23107 51478 moveto -P$13 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -23790 51826 moveto -P$17 -fill -0 setlinewidth -[] 0 setdash -0 0 0 setrgbcolor -newpath -24223 51342 moveto -P$2w -fill -200 setlinewidth -0.66 0 0.21 setrgbcolor -newpath -12900 53895 moveto -1800 1800 rlineto -stroke -200 setlinewidth -0.66 0 0.21 setrgbcolor -newpath -12900 55695 moveto -1800 -1800 rlineto -stroke -grestore -showpage -%plantuml done -%%EOF diff --git a/uml/out/plugin_connectivity/plugin_connectivity.latex b/uml/out/plugin_connectivity/plugin_connectivity.latex deleted file mode 100644 index 7bcdcf5..0000000 --- a/uml/out/plugin_connectivity/plugin_connectivity.latex +++ /dev/null @@ -1,137 +0,0 @@ -\documentclass{standalone} -\usepackage{tikz} -\usepackage{aeguill} -\begin{document} -% generated by Plantuml 1.2022.7 -\definecolor{plantucolor0000}{RGB}{255,255,255} -\definecolor{plantucolor0001}{RGB}{176,176,176} -\definecolor{plantucolor0002}{RGB}{128,128,128} -\definecolor{plantucolor0003}{RGB}{226,226,240} -\definecolor{plantucolor0004}{RGB}{24,24,24} -\definecolor{plantucolor0005}{RGB}{0,0,0} -\definecolor{plantucolor0006}{RGB}{254,255,221} -\definecolor{plantucolor0007}{RGB}{238,238,238} -\definecolor{plantucolor0008}{RGB}{64,64,64} -\begin{tikzpicture}[yscale=-1 -,pstyle0/.style={color=plantucolor0001,fill=white,line width=1.0pt} -,pstyle1/.style={color=plantucolor0002,line width=1.5pt} -,pstyle2/.style={color=plantucolor0001,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt} -,pstyle3/.style={color=plantucolor0004,fill=plantucolor0003,line width=0.5pt} -,pstyle4/.style={color=plantucolor0004,fill=plantucolor0006,line width=0.5pt} -,pstyle5/.style={color=plantucolor0007,fill=plantucolor0007,line width=1.0pt} -,pstyle6/.style={color=plantucolor0002,line width=1.0pt} -,pstyle7/.style={color=plantucolor0002,fill=plantucolor0007,line width=2.0pt} -,pstyle8/.style={color=plantucolor0008,fill=plantucolor0008,line width=1.0pt} -,pstyle9/.style={color=plantucolor0008,line width=1.0pt} -,pstyle10/.style={color=plantucolor0008,line width=1.0pt,dash pattern=on 2.0pt off 2.0pt} -,pstyle11/.style={color=plantucolor0002,fill=plantucolor0007,line width=1.5pt} -,pstyle12/.style={color=plantucolor0001,line width=2.0pt} -] -\draw[pstyle0] (153.8615pt,156.186pt) rectangle (163.8615pt,705.4822pt); -\draw[pstyle0] (313.3771pt,49.0679pt) rectangle (323.3771pt,767.5501pt); -\draw[pstyle0] (478.7515pt,49.0679pt) rectangle (488.7515pt,767.5501pt); -\draw[pstyle1] (66.7865pt,234.598pt) rectangle (556.1768pt,698.4822pt); -\draw[pstyle1] (76.7865pt,370.4221pt) rectangle (546.1768pt,485.2461pt); -\draw[pstyle1] (76.7865pt,499.2461pt) rectangle (546.1768pt,582.3642pt); -\draw[pstyle2] (158.7865pt,39.0679pt) -- (158.7865pt,733.4822pt); -\draw[pstyle2] (317.4068pt,39.0679pt) -- (317.4068pt,733.4822pt); -\draw[pstyle2] (483.3262pt,39.0679pt) -- (483.3262pt,733.4822pt); -\draw[pstyle3] (86.7865pt,10pt) arc (180:270:5pt) -- (91.7865pt,5pt) -- (225.9365pt,5pt) arc (270:360:5pt) -- (230.9365pt,10pt) -- (230.9365pt,33.0679pt) arc (0:90:5pt) -- (225.9365pt,38.0679pt) -- (91.7865pt,38.0679pt) arc (90:180:5pt) -- (86.7865pt,33.0679pt) -- cycle; -\node at (93.7865pt,12pt)[below right,color=black]{ROS ActionClient}; -\draw[pstyle3] (86.7865pt,737.4822pt) arc (180:270:5pt) -- (91.7865pt,732.4822pt) -- (225.9365pt,732.4822pt) arc (270:360:5pt) -- (230.9365pt,737.4822pt) -- (230.9365pt,760.5501pt) arc (0:90:5pt) -- (225.9365pt,765.5501pt) -- (91.7865pt,765.5501pt) arc (90:180:5pt) -- (86.7865pt,760.5501pt) -- cycle; -\node at (93.7865pt,739.4822pt)[below right,color=black]{ROS ActionClient}; -\draw[pstyle3] (264.4068pt,10pt) arc (180:270:5pt) -- (269.4068pt,5pt) -- (367.3475pt,5pt) arc (270:360:5pt) -- (372.3475pt,10pt) -- (372.3475pt,33.0679pt) arc (0:90:5pt) -- (367.3475pt,38.0679pt) -- (269.4068pt,38.0679pt) arc (90:180:5pt) -- (264.4068pt,33.0679pt) -- cycle; -\node at (271.4068pt,12pt)[below right,color=black]{ActorServer}; -\draw[pstyle3] (264.4068pt,737.4822pt) arc (180:270:5pt) -- (269.4068pt,732.4822pt) -- (367.3475pt,732.4822pt) arc (270:360:5pt) -- (372.3475pt,737.4822pt) -- (372.3475pt,760.5501pt) arc (0:90:5pt) -- (367.3475pt,765.5501pt) -- (269.4068pt,765.5501pt) arc (90:180:5pt) -- (264.4068pt,760.5501pt) -- cycle; -\node at (271.4068pt,739.4822pt)[below right,color=black]{ActorServer}; -\draw[pstyle3] (431.3262pt,10pt) arc (180:270:5pt) -- (436.3262pt,5pt) -- (531.1768pt,5pt) arc (270:360:5pt) -- (536.1768pt,10pt) -- (536.1768pt,33.0679pt) arc (0:90:5pt) -- (531.1768pt,38.0679pt) -- (436.3262pt,38.0679pt) arc (90:180:5pt) -- (431.3262pt,33.0679pt) -- cycle; -\node at (438.3262pt,12pt)[below right,color=black]{ActorPlugin}; -\draw[pstyle3] (431.3262pt,737.4822pt) arc (180:270:5pt) -- (436.3262pt,732.4822pt) -- (531.1768pt,732.4822pt) arc (270:360:5pt) -- (536.1768pt,737.4822pt) -- (536.1768pt,760.5501pt) arc (0:90:5pt) -- (531.1768pt,765.5501pt) -- (436.3262pt,765.5501pt) arc (90:180:5pt) -- (431.3262pt,760.5501pt) -- cycle; -\node at (438.3262pt,739.4822pt)[below right,color=black]{ActorPlugin}; -\draw[pstyle0] (153.8615pt,156.186pt) rectangle (163.8615pt,705.4822pt); -\draw[pstyle0] (313.3771pt,49.0679pt) rectangle (323.3771pt,767.5501pt); -\draw[pstyle0] (478.7515pt,49.0679pt) rectangle (488.7515pt,767.5501pt); -\draw[pstyle4] (67pt,54.0679pt) -- (67pt,81.0679pt) -- (153pt,81.0679pt) -- (153pt,64.0679pt) -- (143pt,54.0679pt) -- (67pt,54.0679pt); -\draw[pstyle4] (143pt,54.0679pt) -- (143pt,64.0679pt) -- (153pt,64.0679pt) -- (143pt,54.0679pt); -\node at (73pt,59.0679pt)[below right,color=black]{Protocol:}; -\draw[pstyle4] (212pt,54.0679pt) -- (212pt,81.0679pt) -- (307pt,81.0679pt) -- (307pt,64.0679pt) -- (297pt,54.0679pt) -- (212pt,54.0679pt); -\draw[pstyle4] (297pt,54.0679pt) -- (297pt,64.0679pt) -- (307pt,64.0679pt) -- (297pt,54.0679pt); -\node at (218pt,59.0679pt)[below right,color=black]{ros\_action}; -\draw[pstyle4] (347pt,54.0679pt) -- (347pt,81.0679pt) -- (472pt,81.0679pt) -- (472pt,64.0679pt) -- (462pt,54.0679pt) -- (347pt,54.0679pt); -\draw[pstyle4] (462pt,54.0679pt) -- (462pt,64.0679pt) -- (472pt,64.0679pt) -- (462pt,54.0679pt); -\node at (353pt,59.0679pt)[below right,color=black]{MessageQueue}; -\draw[pstyle5] (0pt,108.6269pt) rectangle (566.1768pt,111.6269pt); -\draw[pstyle6] (0pt,108.6269pt) -- (566.1768pt,108.6269pt); -\draw[pstyle6] (0pt,111.6269pt) -- (566.1768pt,111.6269pt); -\draw[pstyle7] (259.0368pt,96.7739pt) rectangle (307.14pt,122.4799pt); -\node at (265.0368pt,100.7739pt)[below right,color=black]{\textbf{Goal}}; -\draw[pstyle8] (141.8615pt,152.186pt) -- (151.8615pt,156.186pt) -- (141.8615pt,160.186pt) -- (145.8615pt,156.186pt) -- cycle; -\draw[pstyle9] (0pt,156.186pt) -- (147.8615pt,156.186pt); -\node at (9.5pt,136.4799pt)[below right,color=black]{create ActionClient}; -\draw[pstyle8] (301.3771pt,183.892pt) -- (311.3771pt,187.892pt) -- (301.3771pt,191.892pt) -- (305.3771pt,187.892pt) -- cycle; -\draw[pstyle9] (163.8615pt,187.892pt) -- (307.3771pt,187.892pt); -\node at (195.4141pt,168.186pt)[below right,color=black]{goal request}; -\draw[pstyle9] (164.8615pt,219.598pt) -- (174.8615pt,215.598pt); -\draw[pstyle9] (164.8615pt,219.598pt) -- (174.8615pt,223.598pt); -\draw[pstyle10] (163.8615pt,219.598pt) -- (312.3771pt,219.598pt); -\node at (190.2546pt,199.892pt)[below right,color=black]{goal response}; -\draw[pstyle11] (66.7865pt,234.598pt) -- (132.0532pt,234.598pt) -- (132.0532pt,244.304pt) -- (122.0532pt,254.304pt) -- (66.7865pt,254.304pt) -- (66.7865pt,234.598pt); -\draw[pstyle1] (66.7865pt,234.598pt) rectangle (556.1768pt,698.4822pt); -\node at (81.7865pt,235.598pt)[below right,color=black]{\textbf{alt}}; -\node at (147.0532pt,236.598pt)[below right,color=black]{\textbf{[goal accepted]}}; -\draw[pstyle9] (476.7515pt,278.01pt) -- (466.7515pt,274.01pt); -\draw[pstyle9] (476.7515pt,278.01pt) -- (466.7515pt,282.01pt); -\draw[pstyle9] (323.3771pt,278.01pt) -- (477.7515pt,278.01pt); -\node at (335.3771pt,258.304pt)[below right,color=black]{set state and target}; -\draw[pstyle9] (324.3771pt,309.716pt) -- (334.3771pt,305.716pt); -\draw[pstyle9] (324.3771pt,309.716pt) -- (334.3771pt,313.716pt); -\draw[pstyle10] (323.3771pt,309.716pt) -- (477.7515pt,309.716pt); -\node at (357.5169pt,290.01pt)[below right,color=black]{state change}; -\draw[pstyle5] (0pt,339.5691pt) rectangle (566.1768pt,342.5691pt); -\draw[pstyle6] (0pt,339.5691pt) -- (566.1768pt,339.5691pt); -\draw[pstyle6] (0pt,342.5691pt) -- (566.1768pt,342.5691pt); -\draw[pstyle7] (240.3737pt,327.716pt) rectangle (325.8032pt,353.4221pt); -\node at (246.3737pt,331.716pt)[below right,color=black]{\textbf{Feedback}}; -\draw[pstyle11] (76.7865pt,370.4221pt) -- (179.6265pt,370.4221pt) -- (179.6265pt,380.1281pt) -- (169.6265pt,390.1281pt) -- (76.7865pt,390.1281pt) -- (76.7865pt,370.4221pt); -\draw[pstyle1] (76.7865pt,370.4221pt) rectangle (546.1768pt,485.2461pt); -\node at (91.7865pt,371.4221pt)[below right,color=black]{\textbf{opt par }}; -\node at (194.6265pt,372.4221pt)[below right,color=black]{\textbf{[abort of current action]}}; -\draw[pstyle8] (301.3771pt,409.8341pt) -- (311.3771pt,413.8341pt) -- (301.3771pt,417.8341pt) -- (305.3771pt,413.8341pt) -- cycle; -\draw[pstyle9] (163.8615pt,413.8341pt) -- (307.3771pt,413.8341pt); -\node at (191.0765pt,394.1281pt)[below right,color=black]{abort request}; -\draw[pstyle8] (466.7515pt,441.5401pt) -- (476.7515pt,445.5401pt) -- (466.7515pt,449.5401pt) -- (470.7515pt,445.5401pt) -- cycle; -\draw[pstyle9] (323.3771pt,445.5401pt) -- (472.7515pt,445.5401pt); -\node at (349.0047pt,425.8341pt)[below right,color=black]{set state to Idle}; -\draw[pstyle9] (164.8615pt,477.2461pt) -- (174.8615pt,473.2461pt); -\draw[pstyle9] (164.8615pt,477.2461pt) -- (174.8615pt,481.2461pt); -\draw[pstyle10] (163.8615pt,477.2461pt) -- (312.3771pt,477.2461pt); -\node at (185.9161pt,457.5401pt)[below right,color=black]{abort response}; -\draw[pstyle11] (76.7865pt,499.2461pt) -- (154.1038pt,499.2461pt) -- (154.1038pt,508.9521pt) -- (144.1038pt,518.9521pt) -- (76.7865pt,518.9521pt) -- (76.7865pt,499.2461pt); -\draw[pstyle1] (76.7865pt,499.2461pt) rectangle (546.1768pt,582.3642pt); -\node at (91.7865pt,500.2461pt)[below right,color=black]{\textbf{loop}}; -\node at (169.1038pt,501.2461pt)[below right,color=black]{\textbf{[until action is completed or aborted]}}; -\draw[pstyle9] (324.3771pt,542.6582pt) -- (334.3771pt,538.6582pt); -\draw[pstyle9] (324.3771pt,542.6582pt) -- (334.3771pt,546.6582pt); -\draw[pstyle10] (323.3771pt,542.6582pt) -- (477.7515pt,542.6582pt); -\node at (369.6072pt,522.9521pt)[below right,color=black]{feedback}; -\draw[pstyle9] (164.8615pt,574.3642pt) -- (174.8615pt,570.3642pt); -\draw[pstyle9] (164.8615pt,574.3642pt) -- (174.8615pt,578.3642pt); -\draw[pstyle10] (163.8615pt,574.3642pt) -- (312.3771pt,574.3642pt); -\node at (175.8615pt,554.6582pt)[below right,color=black]{feedback callback}; -\draw[pstyle5] (0pt,611.2172pt) rectangle (566.1768pt,614.2172pt); -\draw[pstyle6] (0pt,611.2172pt) -- (566.1768pt,611.2172pt); -\draw[pstyle6] (0pt,614.2172pt) -- (566.1768pt,614.2172pt); -\draw[pstyle7] (252.5128pt,599.3642pt) rectangle (313.664pt,625.0702pt); -\node at (258.5128pt,603.3642pt)[below right,color=black]{\textbf{Result}}; -\draw[pstyle9] (324.3771pt,658.7762pt) -- (334.3771pt,654.7762pt); -\draw[pstyle9] (324.3771pt,658.7762pt) -- (334.3771pt,662.7762pt); -\draw[pstyle10] (323.3771pt,658.7762pt) -- (477.7515pt,658.7762pt); -\node at (357.5169pt,639.0702pt)[below right,color=black]{state change}; -\draw[pstyle9] (164.8615pt,690.4822pt) -- (174.8615pt,686.4822pt); -\draw[pstyle9] (164.8615pt,690.4822pt) -- (174.8615pt,694.4822pt); -\draw[pstyle10] (163.8615pt,690.4822pt) -- (312.3771pt,690.4822pt); -\node at (186.68pt,670.7762pt)[below right,color=black]{result callback}; -\draw[pstyle12] (149.8615pt,705.4822pt) -- (167.8615pt,723.4822pt); -\draw[pstyle12] (149.8615pt,723.4822pt) -- (167.8615pt,705.4822pt); -\end{tikzpicture} -\end{document} diff --git a/uml/out/plugin_connectivity/plugin_connectivity.png b/uml/out/plugin_connectivity/plugin_connectivity.png deleted file mode 100644 index 5281b96..0000000 Binary files a/uml/out/plugin_connectivity/plugin_connectivity.png and /dev/null differ diff --git a/uml/out/plugin_connectivity/plugin_connectivity.svg b/uml/out/plugin_connectivity/plugin_connectivity.svg deleted file mode 100644 index b158dde..0000000 --- a/uml/out/plugin_connectivity/plugin_connectivity.svg +++ /dev/null @@ -1,39 +0,0 @@ -ROS ActionClientROS ActionClientActorServerActorServerActorPluginActorPluginGoalCreate ActionClientGoal requestGoal responsealt[goal accepted]Set action and targetState changeFeedbackloop[until action is completed]FeedbackFeedback callbackResultState changeResult callback \ No newline at end of file diff --git a/uml/out/plugin_states-eps-converted-to.pdf b/uml/out/plugin_states-eps-converted-to.pdf new file mode 100644 index 0000000..e724afd Binary files /dev/null and b/uml/out/plugin_states-eps-converted-to.pdf differ diff --git a/uml/out/plugin_states.eps b/uml/out/plugin_states.eps new file mode 100644 index 0000000..a586a75 --- /dev/null +++ b/uml/out/plugin_states.eps @@ -0,0 +1,2007 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: PlantUML v1.2022.7 +%%Title: noTitle +%%BoundingBox: 0 0 523 222 +%%ColorUsage: Color +%%Origin: 0 0 +%%EndComments + +gsave +0 222 translate +.01 -.01 scale +/roundrect { +newpath +dup 3 index add 2 index 2 index add 2 index 180 270 arc +2 index 5 index add 1 index sub 2 index 2 index add 2 index 270 0 arc +2 index 5 index add 1 index sub 2 index 5 index add 2 index sub 2 index 0 90 arc +dup 3 index add 2 index 5 index add 2 index sub 2 index 90 180 arc +pop pop pop pop pop +} def +/rquadto { +3 index 3 index 4 2 roll rcurveto +} def +/P$b { +0 750 rlineto +-123 0 rlineto +0 -750 rlineto +123 0 rlineto +} def +/P$18 { +0 362 rlineto +201 0 rlineto +132 0 184 -51 rquadto +51 -51 51 -135 rquadto +0 -78 -54 -126 rquadto +-53 -48 -192 -48 rquadto +-190 0 rlineto +} def +/P$6 { +-114 0 -160 65 rquadto +-46 64 -50 195 rquadto +0 23 rlineto +0 139 45 214 rquadto +45 75 168 75 rquadto +68 0 112 -37 rquadto +43 -39 65 -103 rquadto +21 -65 21 -150 rquadto +0 -128 -50 -204 rquadto +-48 -78 -153 -78 rquadto +closepath +} def +/P$d { +-100 0 -178 -40 rquadto +-76 -40 -121 -125 rquadto +-43 -85 -43 -218 rquadto +0 -139 45 -225 rquadto +46 -87 126 -128 rquadto +79 -40 179 -40 rquadto +57 0 110 12 rquadto +53 10 87 28 rquadto +-39 101 rlineto +-32 -12 -78 -23 rquadto +-45 -10 -84 -10 rquadto +-220 0 -220 284 rquadto +0 135 53 207 rquadto +54 71 160 71 rquadto +60 0 107 -12 rquadto +46 -12 85 -31 rquadto +0 109 rlineto +-37 20 -82 29 rquadto +-45 10 -109 10 rquadto +} def +/P$f { +75 0 134 28 rquadto +59 28 101 84 rquadto +6 0 rlineto +17 -98 rlineto +98 0 rlineto +0 762 rlineto +0 160 -82 242 rquadto +-81 81 -253 81 rquadto +-165 0 -270 -46 rquadto +0 -114 rlineto +110 59 276 59 rquadto +96 0 151 -57 rquadto +56 -56 56 -154 rquadto +0 -28 rlineto +0 -17 1 -48 rquadto +1 -32 3 -45 rquadto +-6 0 rlineto +-75 114 -232 114 rquadto +-145 0 -228 -101 rquadto +-81 -103 -81 -285 rquadto +0 -179 81 -284 rquadto +82 -106 226 -106 rquadto +closepath +} def +/P$k { +128 0 190 65 rquadto +62 64 62 209 rquadto +0 489 rlineto +-121 0 rlineto +0 -482 rlineto +0 -178 -151 -178 rquadto +-109 0 -156 64 rquadto +-46 62 -46 182 rquadto +0 414 rlineto +-121 0 rlineto +0 -482 rlineto +0 -178 -154 -178 rquadto +-112 0 -156 70 rquadto +-43 70 -43 201 rquadto +0 389 rlineto +-123 0 rlineto +0 -750 rlineto +100 0 rlineto +17 101 rlineto +7 0 rlineto +34 -57 93 -85 rquadto +59 -29 126 -29 rquadto +176 0 229 125 rquadto +7 0 rlineto +37 -64 101 -93 rquadto +65 -31 139 -31 rquadto +} def +/P$3 { +26 0 56 -4 rquadto +29 -4 48 -9 rquadto +0 93 rlineto +-20 9 -56 15 rquadto +-35 6 -70 6 rquadto +-59 0 -109 -20 rquadto +-48 -20 -79 -70 rquadto +-31 -51 -31 -142 rquadto +0 -435 rlineto +-106 0 rlineto +0 -59 rlineto +107 -48 rlineto +50 -159 rlineto +71 0 rlineto +0 171 rlineto +217 0 rlineto +0 95 rlineto +-217 0 rlineto +0 432 rlineto +0 68 32 101 rquadto +32 32 85 32 rquadto +} def +/P$i { +-139 6 -193 45 rquadto +-53 39 -53 109 rquadto +0 64 37 93 rquadto +39 28 100 28 rquadto +93 0 156 -51 rquadto +64 -53 64 -162 rquadto +0 -67 rlineto +-110 4 rlineto +} def +/P$j { +0 56 -6 104 rquadto +7 0 rlineto +35 -57 98 -85 rquadto +62 -29 135 -29 rquadto +135 0 204 65 rquadto +68 64 68 207 rquadto +0 489 rlineto +-121 0 rlineto +0 -479 rlineto +0 -181 -167 -181 rquadto +-126 0 -173 71 rquadto +-46 70 -46 201 rquadto +0 387 rlineto +-123 0 rlineto +0 -1064 rlineto +123 0 rlineto +0 312 rlineto +closepath +} def +/P$11 { +0 -35 18 -51 rquadto +20 -17 46 -17 rquadto +26 0 45 17 rquadto +20 15 20 51 rquadto +0 34 -20 53 rquadto +-18 17 -45 17 rquadto +-26 0 -46 -17 rquadto +-18 -18 -18 -53 rquadto +closepath +} def +/P$s { +-139 0 -223 -96 rquadto +-84 -98 -84 -290 rquadto +0 -193 84 -292 rquadto +85 -98 225 -98 rquadto +87 0 142 32 rquadto +56 31 90 78 rquadto +7 0 rlineto +0 -18 -4 -54 rquadto +-3 -35 -3 -56 rquadto +0 -300 rlineto +123 0 rlineto +0 1064 rlineto +-100 0 rlineto +-17 -101 rlineto +-6 0 rlineto +-32 48 -89 82 rquadto +-56 32 -145 32 rquadto +closepath +} def +/P$t { +118 0 167 -65 rquadto +48 -65 48 -196 rquadto +0 -21 rlineto +0 -140 -46 -215 rquadto +-45 -75 -170 -75 rquadto +-100 0 -150 79 rquadto +-48 78 -48 212 rquadto +0 134 48 209 rquadto +50 73 151 73 rquadto +} def +/P$v { +-148 0 rlineto +-354 -478 rlineto +-101 90 rlineto +0 387 rlineto +-126 0 rlineto +0 -1000 rlineto +126 0 rlineto +0 493 rlineto +40 -48 84 -95 rquadto +43 -48 87 -95 rquadto +270 -303 rlineto +146 0 rlineto +-396 435 rlineto +412 564 rlineto +} def +/P$h { +137 0 203 60 rquadto +65 59 65 190 rquadto +0 510 rlineto +-89 0 rlineto +-23 -106 rlineto +-6 0 rlineto +-48 60 -103 90 rquadto +-53 29 -148 29 rquadto +-103 0 -170 -53 rquadto +-67 -54 -67 -170 rquadto +0 -110 87 -171 rquadto +89 -60 271 -67 rquadto +128 -3 rlineto +0 -45 rlineto +0 -93 -40 -129 rquadto +-40 -37 -114 -37 rquadto +-59 0 -112 18 rquadto +-53 17 -100 39 rquadto +-37 -92 rlineto +48 -26 115 -45 rquadto +67 -18 140 -18 rquadto +closepath +} def +/P$l { +-123 0 rlineto +0 -1064 rlineto +123 0 rlineto +0 1064 rlineto +} def +/P$w { +-120 -309 rlineto +-395 0 rlineto +-118 309 rlineto +-128 0 rlineto +390 -1003 rlineto +114 0 rlineto +389 1003 rlineto +-131 0 rlineto +closepath +} def +/P$19 { +-17 -57 -31 -112 rquadto +-12 -56 -20 -87 rquadto +-6 0 rlineto +-4 31 -17 87 rquadto +-12 54 -32 112 rquadto +-134 421 rlineto +-139 0 rlineto +-206 -750 rlineto +126 0 rlineto +104 400 rlineto +15 60 28 121 rquadto +14 60 20 101 rquadto +6 0 rlineto +4 -23 12 -57 rquadto +7 -35 17 -73 rquadto +10 -39 20 -70 rquadto +132 -421 rlineto +134 0 rlineto +128 421 rlineto +15 48 29 104 rquadto +15 56 21 96 rquadto +4 0 rlineto +4 -35 18 -96 rquadto +15 -62 32 -126 rquadto +104 -400 rlineto +125 0 rlineto +-207 750 rlineto +-143 0 rlineto +-129 -421 rlineto +} def +/P$p { +-118 0 -165 68 rquadto +-45 68 -45 212 rquadto +0 6 rlineto +0 137 45 212 rquadto +45 73 168 73 rquadto +101 0 150 -73 rquadto +50 -75 50 -215 rquadto +0 -284 -203 -284 rquadto +} def +/P$r { +-360 0 rlineto +0 -73 rlineto +117 -26 rlineto +0 -798 rlineto +-117 -28 rlineto +0 -73 rlineto +360 0 rlineto +0 73 rlineto +-117 28 rlineto +0 798 rlineto +117 26 rlineto +0 73 rlineto +} def +/P$o { +0 46 -3 89 rquadto +-1 40 -3 64 rquadto +6 0 rlineto +32 -46 87 -78 rquadto +56 -32 145 -32 rquadto +139 0 223 96 rquadto +85 96 85 290 rquadto +0 193 -85 292 rquadto +-85 96 -223 96 rquadto +-89 0 -145 -31 rquadto +-54 -32 -87 -78 rquadto +-9 0 rlineto +-25 95 rlineto +-89 0 rlineto +0 -1064 rlineto +123 0 rlineto +0 259 rlineto +closepath +} def +/P$m { +0 185 -95 289 rquadto +-93 101 -254 101 rquadto +-100 0 -178 -45 rquadto +-76 -45 -121 -132 rquadto +-45 -87 -45 -212 rquadto +0 -185 93 -285 rquadto +93 -101 254 -101 rquadto +103 0 179 45 rquadto +78 45 121 131 rquadto +45 85 45 210 rquadto +closepath +} def +/P$c { +134 0 203 65 rquadto +68 64 68 209 rquadto +0 489 rlineto +-121 0 rlineto +0 -479 rlineto +0 -181 -167 -181 rquadto +-125 0 -173 70 rquadto +-46 70 -46 201 rquadto +0 389 rlineto +-123 0 rlineto +0 -750 rlineto +100 0 rlineto +17 101 rlineto +7 0 rlineto +35 -57 100 -85 rquadto +65 -29 135 -29 rquadto +} def +/P$q { +134 0 203 65 rquadto +68 64 68 209 rquadto +0 489 rlineto +-121 0 rlineto +0 -479 rlineto +0 -181 -167 -181 rquadto +-125 0 -173 70 rquadto +-46 70 -46 201 rquadto +0 389 rlineto +-123 0 rlineto +0 -750 rlineto +100 0 rlineto +17 101 rlineto +7 0 rlineto +35 -57 100 -85 rquadto +65 -29 135 -29 rquadto +closepath +} def +/P$12 { +0 -35 18 -51 rquadto +18 -17 45 -17 rquadto +26 0 45 17 rquadto +20 15 20 51 rquadto +0 34 -20 53 rquadto +-18 17 -45 17 rquadto +-26 0 -45 -17 rquadto +-18 -18 -18 -53 rquadto +} def +/P$14 { +-328 -876 rlineto +-6 0 rlineto +4 43 6 117 rquadto +3 73 3 153 rquadto +0 606 rlineto +-115 0 rlineto +0 -1000 rlineto +185 0 rlineto +307 818 rlineto +6 0 rlineto +312 -818 rlineto +185 0 rlineto +0 1000 rlineto +-125 0 rlineto +0 -614 rlineto +0 -73 3 -143 rquadto +3 -71 6 -117 rquadto +-4 0 rlineto +-334 875 rlineto +-103 0 rlineto +} def +/P$e { +0 56 -6 104 rquadto +7 0 rlineto +35 -57 98 -85 rquadto +62 -29 135 -29 rquadto +135 0 204 65 rquadto +68 64 68 207 rquadto +0 489 rlineto +-121 0 rlineto +0 -479 rlineto +0 -181 -167 -181 rquadto +-126 0 -173 71 rquadto +-46 70 -46 201 rquadto +0 387 rlineto +-123 0 rlineto +0 -1064 rlineto +123 0 rlineto +0 312 rlineto +} def +/P$5 { +137 0 221 96 rquadto +85 95 85 290 rquadto +0 192 -85 292 rquadto +-84 98 -223 98 rquadto +-87 0 -143 -32 rquadto +-56 -32 -89 -76 rquadto +-7 0 rlineto +1 23 4 60 rquadto +3 35 3 62 rquadto +0 307 rlineto +-123 0 rlineto +0 -1085 rlineto +101 0 rlineto +15 101 rlineto +6 0 rlineto +34 -48 87 -81 rquadto +54 -34 146 -34 rquadto +closepath +} def +/P$16 { +187 0 282 56 rquadto +96 54 96 192 rquadto +0 87 -50 146 rquadto +-48 57 -140 73 rquadto +0 7 rlineto +62 9 112 35 rquadto +51 26 81 76 rquadto +29 48 29 126 rquadto +0 135 -93 210 rquadto +-92 73 -253 73 rquadto +-351 0 rlineto +0 -1000 rlineto +285 0 rlineto +closepath +} def +/P$1 { +95 0 164 42 rquadto +70 42 107 118 rquadto +37 75 37 178 rquadto +0 73 rlineto +-514 0 rlineto +3 128 64 195 rquadto +62 65 175 65 rquadto +71 0 126 -12 rquadto +56 -14 114 -39 rquadto +0 107 rlineto +-57 25 -114 35 rquadto +-54 12 -132 12 rquadto +-106 0 -187 -43 rquadto +-81 -43 -128 -129 rquadto +-45 -85 -45 -210 rquadto +0 -121 40 -209 rquadto +42 -89 117 -135 rquadto +75 -48 175 -48 rquadto +closepath +} def +/P$1a { +0 109 -81 165 rquadto +-81 56 -218 56 rquadto +-78 0 -135 -12 rquadto +-56 -12 -98 -35 rquadto +0 -110 rlineto +43 21 107 40 rquadto +64 18 129 18 rquadto +93 0 135 -29 rquadto +42 -29 42 -79 rquadto +0 -28 -15 -50 rquadto +-15 -23 -56 -45 rquadto +-39 -23 -114 -51 rquadto +-71 -28 -123 -54 rquadto +-51 -28 -79 -67 rquadto +-28 -40 -28 -101 rquadto +0 -95 76 -146 rquadto +78 -51 204 -51 rquadto +68 0 128 14 rquadto +59 12 110 35 rquadto +-42 98 rlineto +-46 -20 -100 -34 rquadto +-51 -14 -106 -14 rquadto +-75 0 -115 25 rquadto +-39 25 -39 67 rquadto +0 29 17 51 rquadto +18 21 60 42 rquadto +43 20 115 48 rquadto +70 26 120 54 rquadto +51 28 78 68 rquadto +26 39 26 98 rquadto +closepath +} def +/P$z { +-284 -750 rlineto +131 0 rlineto +159 442 rlineto +12 31 25 68 rquadto +12 37 21 71 rquadto +9 34 14 57 rquadto +4 0 rlineto +6 -23 17 -57 rquadto +10 -35 23 -73 rquadto +14 -37 23 -67 rquadto +159 -442 rlineto +131 0 rlineto +-285 750 rlineto +-140 0 rlineto +} def +/P$10 { +-139 6 -193 45 rquadto +-53 39 -53 109 rquadto +0 64 37 93 rquadto +39 28 100 28 rquadto +93 0 156 -51 rquadto +64 -53 64 -162 rquadto +0 -67 rlineto +-110 4 rlineto +closepath +} def +/P$u { +-89 0 -140 57 rquadto +-50 56 -59 156 rquadto +381 0 rlineto +-1 -95 -45 -154 rquadto +-42 -59 -135 -59 rquadto +closepath +} def +/P$8 { +21 0 45 1 rquadto +25 1 43 6 rquadto +-15 114 rlineto +-18 -4 -40 -7 rquadto +-21 -3 -40 -3 rquadto +-57 0 -107 32 rquadto +-50 31 -81 87 rquadto +-29 56 -29 132 rquadto +0 400 rlineto +-123 0 rlineto +0 -750 rlineto +101 0 rlineto +14 137 rlineto +4 0 rlineto +37 -62 93 -106 rquadto +57 -45 135 -45 rquadto +} def +/P$x { +-3 -10 -14 -40 rquadto +-9 -29 -18 -60 rquadto +-7 -31 -14 -48 rquadto +-9 43 -21 85 rquadto +-12 40 -21 64 rquadto +-112 301 rlineto +315 0 rlineto +-112 -301 rlineto +} def +/P$n { +0 132 51 210 rquadto +53 78 167 78 rquadto +114 0 167 -78 rquadto +53 -78 53 -210 rquadto +0 -132 -53 -207 rquadto +-53 -76 -167 -76 rquadto +-115 0 -167 76 rquadto +-51 75 -51 207 rquadto +} def +/P$9 { +0 109 -81 165 rquadto +-81 56 -218 56 rquadto +-78 0 -135 -12 rquadto +-56 -12 -98 -35 rquadto +0 -110 rlineto +43 21 107 40 rquadto +64 18 129 18 rquadto +93 0 135 -29 rquadto +42 -29 42 -79 rquadto +0 -28 -15 -50 rquadto +-15 -23 -56 -45 rquadto +-39 -23 -114 -51 rquadto +-71 -28 -123 -54 rquadto +-51 -28 -79 -67 rquadto +-28 -40 -28 -101 rquadto +0 -95 76 -146 rquadto +78 -51 204 -51 rquadto +68 0 128 14 rquadto +59 12 110 35 rquadto +-42 98 rlineto +-46 -20 -100 -34 rquadto +-51 -14 -106 -14 rquadto +-75 0 -115 25 rquadto +-39 25 -39 67 rquadto +0 29 17 51 rquadto +18 21 60 42 rquadto +43 20 115 48 rquadto +70 26 120 54 rquadto +51 28 78 68 rquadto +26 39 26 98 rquadto +} def +/P$4 { +0 750 rlineto +-101 0 rlineto +-18 -100 rlineto +-4 0 rlineto +-35 59 -101 87 rquadto +-64 26 -135 26 rquadto +-135 0 -204 -64 rquadto +-68 -65 -68 -209 rquadto +0 -490 rlineto +125 0 rlineto +0 482 rlineto +0 179 165 179 rquadto +125 0 173 -70 rquadto +48 -70 48 -201 rquadto +0 -390 rlineto +123 0 rlineto +} def +/P$13 { +26 0 56 -4 rquadto +29 -4 48 -9 rquadto +0 93 rlineto +-20 9 -56 15 rquadto +-35 6 -70 6 rquadto +-59 0 -109 -20 rquadto +-48 -20 -79 -70 rquadto +-31 -51 -31 -142 rquadto +0 -435 rlineto +-106 0 rlineto +0 -59 rlineto +107 -48 rlineto +50 -159 rlineto +71 0 rlineto +0 171 rlineto +217 0 rlineto +0 95 rlineto +-217 0 rlineto +0 432 rlineto +0 68 32 101 rquadto +32 32 85 32 rquadto +closepath +} def +/P$g { +-93 0 -145 75 rquadto +-51 75 -51 214 rquadto +0 137 50 210 rquadto +51 73 150 73 rquadto +114 0 165 -60 rquadto +51 -60 51 -195 rquadto +0 -29 rlineto +0 -154 -53 -220 rquadto +-53 -67 -167 -67 rquadto +} def +/P$2 { +-89 0 -140 57 rquadto +-50 56 -59 156 rquadto +381 0 rlineto +-1 -95 -45 -154 rquadto +-42 -59 -135 -59 rquadto +} def +/P$17 { +128 0 175 -40 rquadto +48 -42 48 -123 rquadto +0 -82 -57 -118 rquadto +-57 -35 -185 -35 rquadto +-164 0 rlineto +0 318 rlineto +184 0 rlineto +closepath +} def +/P$y { +0 21 -3 59 rquadto +-1 35 -1 62 rquadto +4 0 rlineto +7 -10 25 -31 rquadto +17 -21 34 -43 rquadto +17 -21 29 -35 rquadto +240 -253 rlineto +143 0 rlineto +-303 320 rlineto +323 429 rlineto +-148 0 rlineto +-259 -350 rlineto +-85 73 rlineto +0 276 rlineto +-121 0 rlineto +0 -1064 rlineto +121 0 rlineto +0 556 rlineto +closepath +} def +/P$7 { +-557 0 rlineto +0 -1000 rlineto +557 0 rlineto +0 110 rlineto +-431 0 rlineto +0 312 rlineto +406 0 rlineto +0 109 rlineto +-406 0 rlineto +0 356 rlineto +431 0 rlineto +0 110 rlineto +} def +/P$15 { +-548 0 rlineto +0 -81 rlineto +403 -573 rlineto +-379 0 rlineto +0 -95 rlineto +515 0 rlineto +0 92 rlineto +-398 562 rlineto +407 0 rlineto +0 95 rlineto +} def +/P$a { +28 0 50 18 rquadto +21 18 21 59 rquadto +0 39 -21 59 rquadto +-21 18 -50 18 rquadto +-29 0 -51 -18 rquadto +-20 -20 -20 -59 rquadto +0 -40 20 -59 rquadto +21 -18 51 -18 rquadto +closepath +} def +/P$0 { +0 132 -96 207 rquadto +-96 73 -260 73 rquadto +-82 0 -154 -12 rquadto +-71 -12 -118 -35 rquadto +0 -120 rlineto +50 23 125 42 rquadto +75 17 154 17 rquadto +112 0 168 -42 rquadto +56 -43 56 -118 rquadto +0 -48 -21 -81 rquadto +-20 -34 -71 -62 rquadto +-50 -29 -140 -62 rquadto +-128 -45 -193 -112 rquadto +-64 -67 -64 -184 rquadto +0 -79 40 -135 rquadto +40 -56 112 -87 rquadto +71 -31 165 -31 rquadto +82 0 151 15 rquadto +68 15 125 40 rquadto +-40 107 rlineto +-51 -21 -112 -37 rquadto +-60 -15 -126 -15 rquadto +-93 0 -142 40 rquadto +-46 39 -46 104 rquadto +0 51 20 85 rquadto +21 32 68 59 rquadto +48 26 129 56 rquadto +89 32 148 70 rquadto +60 35 92 89 rquadto +32 51 32 129 rquadto +} def +0.13 0.13 0.13 setrgbcolor +newpath +13750 4559 1000 0 360 arc +closepath eofill +0.95 0.95 0.95 setrgbcolor +16200 7720 18250 700 1250 roundrect +closepath eofill +50 setlinewidth +0.09 0.09 0.09 setrgbcolor +16200 7720 18250 700 1250 roundrect +closepath stroke +50 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +18250 3606 moveto +16200 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +25103 2429 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +25609 1932 moveto +P$1 +25607 2032 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +26370 2609 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27246 1946 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27876 1932 moveto +P$5 +27853 2035 moveto +P$6 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19443 5603 moveto +P$7 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20018 4839 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20757 5395 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +21220 5515 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +21759 4839 moveto +P$1 +21757 4939 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +22331 4572 moveto +P$a +22392 4853 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +23029 4839 moveto +P$c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +23918 4839 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +24231 4572 moveto +P$a +24292 4853 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +24870 5617 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +25392 4851 moveto +P$e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +26420 5515 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27296 4853 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27929 4839 moveto +P$c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28734 4839 moveto +P$f +28751 4942 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +30129 4839 moveto +P$c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +30953 4840 moveto +P$h +30989 5240 moveto +P$i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +31770 5617 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +32292 4851 moveto +P$j +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19453 7242 moveto +P$0 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +19731 6478 moveto +P$a +19792 6760 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +20892 6746 moveto +P$k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +21996 6760 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +22392 7510 moveto +P$l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +22953 6747 moveto +P$h +22989 7147 moveto +P$i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +23720 7422 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +24031 6478 moveto +P$a +24092 6760 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +25021 7133 moveto +P$m +24454 7133 moveto +P$n +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +25529 6746 moveto +P$c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +26557 7302 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +26892 6705 moveto +P$o +27103 6849 moveto +P$p +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27959 6746 moveto +P$1 +27957 6846 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28734 6746 moveto +P$f +28751 6849 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +29431 6478 moveto +P$a +29492 6760 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +30129 6746 moveto +P$c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +31029 6746 moveto +P$q +fill +0.95 0.95 0.95 setrgbcolor +11600 5813 20550 15373 1250 roundrect +closepath eofill +50 setlinewidth +0.09 0.09 0.09 setrgbcolor +11600 5813 20550 15373 1250 roundrect +closepath stroke +50 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +20550 18280 moveto +11600 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +25467 17370 moveto +P$r +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +25934 17384 moveto +P$s +25954 17283 moveto +P$t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +26692 17370 moveto +P$l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27259 16606 moveto +P$1 +27257 16706 moveto +P$u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +21917 20277 moveto +P$v +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +22359 19513 moveto +P$1 +22357 19613 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +22931 19246 moveto +P$a +22992 19527 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +23629 19513 moveto +P$c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +24459 19513 moveto +P$1 +24457 19613 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +26012 20277 moveto +P$w +25742 19553 moveto +P$x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +26390 19769 moveto +P$y +27220 20189 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +27531 19246 moveto +P$a +27592 19527 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28034 20277 moveto +P$z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +28631 19246 moveto +P$a +28692 19527 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +29220 20189 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +29753 19514 moveto +P$h +29789 19914 moveto +P$10 +29548 19324 moveto +P$11 +29810 19324 moveto +P$12 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +30520 20189 moveto +P$13 +fill +0.95 0.95 0.95 setrgbcolor +16600 7720 35650 14421 1250 roundrect +closepath eofill +50 setlinewidth +0.09 0.09 0.09 setrgbcolor +16600 7720 35650 14421 1250 roundrect +closepath stroke +50 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +35650 17327 moveto +16600 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +40976 16417 moveto +P$14 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +42471 16041 moveto +P$m +41904 16041 moveto +P$n +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +42784 16417 moveto +P$z +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43609 15653 moveto +P$1 +43607 15753 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44942 15653 moveto +P$k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +45709 15653 moveto +P$1 +45707 15753 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +46579 15653 moveto +P$c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +47370 16330 moveto +P$13 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36753 19324 moveto +P$15 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +37031 18293 moveto +P$a +37092 18574 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +37659 18560 moveto +P$1 +37657 18660 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +38292 19324 moveto +P$l +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +38834 18560 moveto +P$f +38851 18663 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +39759 18560 moveto +P$1 +39757 18660 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +40618 18560 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +40931 18293 moveto +P$a +40992 18574 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +41570 19338 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +42092 18572 moveto +P$e +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43120 19236 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +43659 18560 moveto +P$1 +43657 18660 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44420 19236 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44959 18560 moveto +P$1 +44957 18660 moveto +P$u +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +36571 20231 moveto +P$16 +36596 20657 moveto +P$17 +36412 20762 moveto +P$18 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +37459 20467 moveto +P$1 +37457 20567 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +38453 20807 moveto +P$19 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +39359 20467 moveto +P$1 +39357 20567 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +40134 20467 moveto +P$f +40151 20570 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +41396 20481 moveto +P$4 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +42029 20467 moveto +P$c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +42834 20467 moveto +P$f +42851 20570 moveto +P$g +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +44134 21245 moveto +P$s +44154 21143 moveto +P$t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +45059 20467 moveto +P$1 +45057 20567 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +46057 21023 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +47312 21231 moveto +P$w +47042 20507 moveto +P$x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +47870 21245 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +48520 21143 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +49421 20854 moveto +P$m +48854 20854 moveto +P$n +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +49918 20467 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +50657 21023 moveto +P$1a +fill +0.95 0.95 0.95 setrgbcolor +16300 5813 700 15373 1250 roundrect +closepath eofill +50 setlinewidth +0.09 0.09 0.09 setrgbcolor +16300 5813 700 15373 1250 roundrect +closepath stroke +50 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +700 18280 moveto +16300 0 rlineto +stroke +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6162 17370 moveto +P$w +5892 16647 moveto +P$x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6779 16606 moveto +P$c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7381 16339 moveto +P$a +7442 16620 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +8542 16606 moveto +P$k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9303 16608 moveto +P$h +9339 17008 moveto +P$i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10070 17283 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10381 16339 moveto +P$a +10442 16620 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11371 16994 moveto +P$m +10804 16994 moveto +P$n +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +11879 16606 moveto +P$q +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +1962 20277 moveto +P$w +1692 19553 moveto +P$x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +2579 19513 moveto +P$c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +3181 19246 moveto +P$a +3242 19527 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +4342 19513 moveto +P$k +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5103 19514 moveto +P$h +5139 19914 moveto +P$i +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +5870 20189 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +6181 19246 moveto +P$a +6242 19527 moveto +P$b +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7171 19900 moveto +P$m +6604 19900 moveto +P$n +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +7679 19513 moveto +P$c +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +8884 20291 moveto +P$s +8904 20189 moveto +P$t +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +9809 19513 moveto +P$1 +9807 19613 moveto +P$2 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +10807 20069 moveto +P$9 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12062 20277 moveto +P$w +11792 19553 moveto +P$x +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +12620 20291 moveto +P$d +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +13270 20189 moveto +P$3 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14171 19900 moveto +P$m +13604 19900 moveto +P$n +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +14668 19513 moveto +P$8 +fill +0 setlinewidth +[] 0 setdash +0 0 0 setrgbcolor +newpath +15407 20069 moveto +P$1a +fill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +14784 4559 moveto +15731 4559 16679 4559 17627 4559 curveto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +18117 4559 moveto +-900 -400 rlineto +400 400 rlineto +-400 400 rlineto +900 -400 rlineto +18117 4559 lineto +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +18117 4559 moveto +-900 -400 rlineto +400 400 rlineto +-400 400 rlineto +900 -400 rlineto +18117 4559 lineto +closepath stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +26350 8463 moveto +26350 10445 26350 12848 26350 14770 curveto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +26350 15250 moveto +400 -900 rlineto +-400 400 rlineto +-400 -400 rlineto +400 900 rlineto +26350 15250 lineto +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +26350 15250 moveto +400 -900 rlineto +-400 400 rlineto +-400 -400 rlineto +400 900 rlineto +26350 15250 lineto +closepath stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +32194 20215 moveto +33144 20373 34095 20455 35046 20461 curveto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +35538 20454 moveto +-904 -389 rlineto +404 395 rlineto +-395 404 rlineto +895 -410 rlineto +35538 20454 lineto +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +35538 20454 moveto +-904 -389 rlineto +404 395 rlineto +-395 404 rlineto +895 -410 rlineto +35538 20454 lineto +closepath stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +35638 16107 moveto +34687 16081 33736 16132 32786 16258 curveto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +32294 16347 moveto +949 261 rlineto +-455 -336 rlineto +336 -455 rlineto +-830 529 rlineto +32294 16347 lineto +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +32294 16347 moveto +949 261 rlineto +-455 -336 rlineto +336 -455 rlineto +-830 529 rlineto +32294 16347 lineto +closepath stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +17593 20461 moveto +18568 20461 19543 20380 20518 20218 curveto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +17119 20451 moveto +893 415 rlineto +-393 -406 rlineto +406 -393 rlineto +-906 384 rlineto +17119 20451 lineto +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +17119 20451 moveto +893 415 rlineto +-393 -406 rlineto +406 -393 rlineto +-906 384 rlineto +17119 20451 lineto +closepath stroke +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +17019 16110 moveto +17994 16078 18969 16127 19944 16257 curveto +stroke +0.09 0.09 0.09 setrgbcolor +newpath +20418 16343 moveto +-830 -529 rlineto +336 455 rlineto +-455 336 rlineto +949 -261 rlineto +20418 16343 lineto +closepath eofill +100 setlinewidth +0.09 0.09 0.09 setrgbcolor +newpath +20418 16343 moveto +-830 -529 rlineto +336 455 rlineto +-455 336 rlineto +949 -261 rlineto +20418 16343 lineto +closepath stroke +grestore +showpage +%plantuml done +%%EOF diff --git a/uml/plugin_animation.puml b/uml/plugin_animation.puml new file mode 100644 index 0000000..1af8065 --- /dev/null +++ b/uml/plugin_animation.puml @@ -0,0 +1,14 @@ +@startuml plugin_animation + +start + +:Setzen der gewünschten Animation; +:Berechnung der Animationslänge aus Parametern; +repeat + :Aktualisieren der Animationszeit; +repeat while (Animationslänge nicht erreicht?) is (J a) +:Status auf Idle setzen; + +stop + +@enduml \ No newline at end of file diff --git a/uml/plugin_movement.puml b/uml/plugin_movement.puml new file mode 100644 index 0000000..221c71d --- /dev/null +++ b/uml/plugin_movement.puml @@ -0,0 +1,37 @@ +@startuml plugin_movement + +start + +:Setzen der gewünschten Animation; +:Berechnung der Bewegungsparameter; +:Berechnung der Bewegungslänge; + +if (Distanz zu Ziel) then (größer als 0.001m) + ->; + repeat + :Drehen zum Bewegungsziel; + repeat while (Zum Bewegungsziel ausgerichtet?) is (Nein) + ->Ja; + repeat + :Bewegen zum Bewegungsziel; + repeat while (Bewegungsziel erreicht?) is (Nein) + ->Ja; +else (kleiner als 0.001m) +endif + +if (Zielrotation gegeben) then (>0.001m) + repeat + :Drehen zum Bewegungsziel; + repeat while (Zum Bewegungsziel ausgerichtet?) is (Nein) + ->Ja; + repeat + :Bewegen zum Bewegungsziel; + repeat while (Bewegungsziel erreicht?) is (Nein) + ->Ja; +endif + +:Status auf Idle setzen; + +stop + +@enduml \ No newline at end of file diff --git a/uml/plugin_states.puml b/uml/plugin_states.puml new file mode 100644 index 0000000..a91de06 --- /dev/null +++ b/uml/plugin_states.puml @@ -0,0 +1,21 @@ +@startuml plugin_states +[*] -> Setup +Setup : Ersteinrichtung nach +Setup : Simulationsbeginn + + + +Setup --> Idle +Idle: Keine Aktivität + + +Idle -right-> Movement +Movement: zielgerichtete +Movement: Bewegung des Actors +Movement -> Idle + +Idle -left-> Animation +Animation: Animation des Actors +Animation -> Idle + +@enduml \ No newline at end of file diff --git a/uml/subtree_walk.png b/uml/subtree_walk.png deleted file mode 100644 index cef3004..0000000 Binary files a/uml/subtree_walk.png and /dev/null differ diff --git a/uml/subtree_walk.puml b/uml/subtree_walk.puml deleted file mode 100644 index 3f3bc6c..0000000 --- a/uml/subtree_walk.puml +++ /dev/null @@ -1,17 +0,0 @@ -@startmindmap - -top to bottom direction - -* Fallback -** Ubuntu -*** Linux Mint -*** Kubuntu -*** Lubuntu -*** KDE Neon -** LMDE -** SolydXK -** SteamOS -** Raspbian with a very long name -*** Raspmbc => OSMC -*** Raspyfi => Volumio -@endmindmap \ No newline at end of file