Hochschule RheinMain Robotik Pfadfindung mit Simple Paths Dokumentation Benjamin Weißer Studiengang: Informatik, Master of Science Dozent: Prof. Dr. Richter Semester: WS 2014/15 Datum: 17.01.2015 Inhaltsverzeichnis 1 Einleitung 1 2 Wegfindung 2.1 Dijkstra - Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 A* - Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Spline-Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 3 4 3 Simple Paths 3.1 Architektur . . . . . . . . . . . . . . . . . 3.2 Benutzeroberfläche . . . . . . . . . . . . . 3.3 Beschreibung der Algorithmen . . . . . . . 3.3.1 Methoden zur Stützpunkterstellung 3.3.2 Methode zur Graphenerstellung . . 3.3.3 Methoden zur Wegfindung . . . . . 3.3.4 Methoden zur Spline-Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 7 12 12 12 13 13 4 Evaluation 14 4.1 Vergleich der Methoden zur Stützpunkterstellung . . . . . . . . . . . 14 4.2 Vergleich der Methoden zur Spline-Interpolation . . . . . . . . . . . . 16 5 Fazit 6 Abbildungsverzeichnis 7 Literatur- und Quellenverzeichnis 17 I II 1 Einleitung Ein wichtiges Gebiet der Informatik umfasst den Bereich der algorithmengestützten Weg- oder Pfadfindung (engl. Pathfinding). Als Ausgangspunkt sind dabei ein Startund ein Zielpunkt in einer - teilweisen unbekannten - Umgebung vorhanden. So werden diese Wegfindungsalgorithmen zur Routenplanung nicht nur in den klassischen Navigationsgeräten eingesetzt, sondern auch in Computerspielen für die Fortbewegung von KI1 -unterstützten NPCs2 . Im Hinblick auf die populär werdenden Drohnen bzw. Multicopter und die Entwicklung hin zu deren autonomen Bewegung spielt die Wegfindung eine immer größer werdende Rolle. Das Ziel aller Wegfindungsalgorithmen liegt in der Berechnung der kostengünstigsten oder kürzesten Route. Dabei werden die Kosten, um die Strecke zwischen zwei Punkten zurückzulegen, meist nicht nur durch die reine Distanzermittlung zwischen zwei Punkten bestimmt, sondern sind noch von weiteren Faktoren abhängig. Neben dem wohl bekanntesten und am weit verbreitesten A* Algorithmus, der eine Karte als Graph interpretiert und zur Berechnung Heuristiken verwendet, existieren noch weitere komplexere oder aber auch einfachere Algorithmen, wie etwa der Dijkstra-Algorithmus. In der vorliegenden Dokumentation wird nach einem einführenden Kapitel über die Grundlagen verschiedener Ansätze zur Wegfindung deren Umsetzung in der Anwendung Simple Paths erläutert. Dabei werden insbesondere die Interaktionsmöglichkeiten über die Benutzeroberfläche erörtert und mittels zahlreicher Darstellungen beleuchtet. In einem abschließendem Kapitel werden die verschiedenen Lösungsansätze zur Wegfindung miteinander verglichen und bewertet. 1 2 Künstliche Intelligenz non-player character, dt. Nicht-Spieler-Charakter 1 2 Wegfindung Die Wegfindung gehört in der Informatik zu der algorithmengestützten Suche nach dem optimalen Weg von einem Punkt A zu einem Punkt B. Dabei ist der Begriff optimal abhängig von dem Anwendungsgebiet der Pfadsuche. Zwar wird meist nach dem kürzesten und kostengünstigsten Pfad gesucht, allerdings gibt es beim Beispiel der Routenplanung mit Hilfe eines Navigationsgerätes noch weitere Faktoren, die alle den Begriff des Optimums beeinflussen. Darunter fallen zum Beispiel die Fahrzeit, der Benzinverbrauch und die benutzten Straßen. Ausgangspunkt für diese Wegfindungsalgorithmen ist jeweils ein Graph mit unterschiedlichen Kantengewichten, die in seltenen Fällen sogar negative Gewichte besitzen können. Die nun im Folgenden vorgestellten Algorithmen hingegen terminieren nicht bei negativen Kantengewichten, so dass stets positive Kantengewichte vorausgesetzt werden. Eine weitere Vorgabe für die Wegfindung besteht darin, dass ein Graph zusammenhängend sein muss, damit ein Startpunkt S und ein Zielpunkt Z sich nicht in zwei unterschiedlichen Teilgraphen befinden. 2.1 Dijkstra - Algorithmus Bei dem Dijkstra-Algorithmus handelt es sich im Gegensatz zu dem im nächsten Abschnitt vorgestellten A* -Algorithmus um einen einfachen Suchalgorithmen anhand von Graphen. Er wurde nach seinem Erfinder E. W. Dijkstra benannt und gehört zu der Klasse der Greedy-Algorithmen, da er grundsätzlich versucht immer der Kante mit dem geringsten Kantengewicht zu folgen [1]. Der Algorithmus findet damit stets den kürzesten Weg zwischen einem Startpunkt S und einem Zielpunkt Z in einem kantengewichteten Graphen. Die Knoten in diesem Graphen, der auch den Startpunkt und den Zielpunkt enthält, werden in zwei verschiedene Klassen eingeteilt: • die Menge der unbesuchten Knoten • die Menge der besuchten Knoten Funktionsweise Innerhalb eines Initialisierungsschrittes werden allen Knoten in einem Graph die beiden Eigenschaften Vorgängerknoten und Distanz zugewiesen, wobei die Distanz in S auf 0 und in allen anderen Knoten auf unendlich gesetzt wird. Ausgehend von einem 2 2 Wegfindung Knoten K1 werden dessen unbesuchte Nachfolgeknoten besucht, bei denen jeweils ein neuer Distanzwert berechnet wird, der sich aus dem entsprechenden Kantengewicht und dem Distanzwert von K1 zusammensetzt. Sofern dieser neue Wert für einen Nachfolgeknoten kleiner als der ihm zugewiesene Distanzwert ist, wird der Distanzwert mit dem berechneten Wert aktualisiert und der Vorgänger auf K1 gesetzt. Der Knoten K1 wird anschließend in der Menge der besuchten Knoten gespeichert und aus der Menge der unbesuchten Knoten entfernt. Diese Schritte werden solange wiederholt, bis keine unbesuchten Knoten mehr vorhanden sind oder der aktuelle Knoten der gesuchte Knoten Z ist [2]. 2.2 A* - Algorithmus Der wohl wichtigste Vertreter der informierten (heuristischen) Suchalgorithmen ist der A* -Algorithmus, der erstmals im Jahr 1968 von P. Hart, N. J. Nilsson und B. Raphael beschrieben wurde [3] [4]. Der A* -Algorithmus findet aufgrund einer Heuristik zielgerichtet und optimal den Weg von einem Startpunkt S zu einem Zielpunkt Z in einem kantengewichteten Graphen. Die Knoten in diesem Graphen, der auch den Startpunkt und den Zielpunkt enthält, werden in drei verschiedene Klassen eingeteilt: • Die Menge der unbekannten Knoten beinhaltet die Knoten, die während der Wegsuche noch nicht besucht worden sind. Zu Beginn enthält diese Menge alle Knoten bis auf den Startpunkt. • Die Menge der bekannten Knoten enthält alle bereits besuchten Knoten inklusive dem jeweiligen Vorgängerknoten und einem Funktionswert f, der die reale Distanz zwischen Vorgängerknoten zum Startpunkt und geschätzter Distanz zum Zielpunkt Z darstellt. Diese Menge wird als Open List bezeichnet. Nach jedem Berechnungsschritt wird der nächste vielversprechendste Knoten mit dem geringsten f -Wert für die weitere Wegsuche benutzt. • Die Menge der abschließend untersuchten Knoten ist auch unter dem Namen Closed List bekannt und enthält alle Knoten, zu denen bereits der kürzeste Weg gefunden worden ist, um eine Mehrfachauswahl bereits besuchter Knoten zu vermeiden. Alle Knoten in dieser Menge beinhalten wie in der Open List einen Zeiger auf ihren Vorgängerknoten. Funktionsweise Ausgehend von einem Knoten K1 werden dessen Nachfolgeknoten besucht. Jeder Nachfolgeknoten Kx von K1 bekommt dabei neben einem Zeiger auf seinen Vorgängerknoten K1 den Funktionswert f zugewiesen, der sich aus der Summe der 3 2 Wegfindung beiden Funktionswerte g und h zusammensetzt. Die Summe der realen Distanzen zwischen Kx und seinen entsprechenden Vorgängerknoten (inklusive K1 ) wird dabei in g gespeichert und h beinhaltet die geschätzte, heuristische Distanz von Kx zu dem Zielpunkt Z. Diese Nachfolgeknoten werden, sofern sie nicht in der Closed List stehen, in die Open List eingetragen, während K1 damit nun als abschließend untersucht gilt und der Closed List hinzugefügt wird. Sollte dabei ein Nachfolgeknoten bereits in der Open List vorhanden sein, wird der Knoten nur mit dem neuen f -Wert und dem Zeiger auf den neuen Vorgängerknoten aktualisiert, wenn der neue Weg dorthin kürzer ist als der bisherige. Im nächsten Schritt werden die Knoten der Open List aufsteigend nach ihrem f Wert weitergehend abgearbeitet, in dem deren Nachfolgeknoten und deren f -Werte ermittelt werden. Somit fangen die beschriebenen Schritte von vorne an. Sobald Z abschließend untersucht worden ist und damit in der Closed List steht, terminiert der Algorithmus und der Weg von S zu Z wird über die entsprechenden Referenzen der Vorgängerknoten rekonstruiert. Aus diesem Grund muss der Weg rückwärts ausgegeben werden. Falls die Open List allerdings nach einem Berechnungsschritt leer sein sollte, bevor Z abschließend untersucht worden ist, terminiert der Algorithmus ebenfalls, da kein entsprechender Weg von S nach Z gefunden werden konnte [5]. 2.3 Spline-Interpolation Eng verzahnt mit der reinen Wegsuche ist die Spline-Interpolation, da in den meisten Anwendungsfällen in der Robotik (nicht die Routenplanung mit Navigationsgeräten für Autos) ein geglätteter Pfad für die Fortbewegung erwünscht ist. Aus diesem Grund befindet sich in diesem Kapitel zur Wegfindung noch ein übersichtlicher Abschnitt über Spline-Interpolation, der die Grundidee erklären wird. Als Vorbild diente die Straklatte (engl. Spline) der Schiffsbauer, die entlang vorgegebener Punkte fixiert wird und diese dann anschließend miteinander durch geringste Krümmungen und minimalster Biegeenergie verbindet. Ausgangspunkt für Splines sind demnach also einzelne Punkte, die in diesem Zusammenhang als Stützstellen oder wie in der Wegfindung ebenfalls als Knoten bezeichnet werden [6]. Eine Interpolation zwischen mehreren Knoten könnte auch direkt mit sogenannten Interpolationspolynomen geschehen, allerdings erhöht sich mit jedem weiteren Knoten, durch den interpoliert werden soll, der Grad des Polynoms [7]. Ab einer gewissen Größe ist es nicht mehr möglich ausreichend genau mit Hilfe eines einzelnen Interpolationspolynoms zu approximieren. Abhilfe schafft die Spline-Interpolation, bei der zwischen diesen Knoten stückweise stetige Polynome berechnet werden, die anschließend für die Interpolation dienen. Einschränkend müssen die Stetigkeit und 4 2 Wegfindung die Differenzierbarkeit an den Knoten zwischen den jeweiligen Polynomen eingehalten werden, da ansonsten kein glatter Verlauf der Interpolationskurve entstehen würde [6]. Als Beispiel muss zwingend gelten, dass in einem Punk K1 , der Endpunkt des stückweisen Polynoms P1 und gleichzeitig Startpunkt für das stückweise Polynom P2 darstellt, die Steigung exakt die selbe ist. Je nach Art der Spline-Interpolation müssen noch weitere Einschränkungen und Regeln für die Interpolation eingehalten werden. 5 3 Simple Paths Das folgende Kapitel widmet sich der Beschreibung und Darstellung des Programms Simple Paths, das im Rahmen der Veranstaltung Robotik an der Hochschule RheinMain entstanden ist. Ziel des Projekts war die Implementierung des Dijkstra-Algorithmus und weiteren Funktionen zur erfolgreichen Wegfindung eines Roboters durch eine bekannte Umgebung oder Wohnung inklusive Hindernissen oder Gegenständen. Der Benutzer des Programms sollte dabei neben der Festlegung der Startposition S, der Größe des Roboters und der Zielposition Z auch die Möglichkeit besitzen, die Umgebung bzw. die Wohnung den Wünschen entsprechend manuell zu erstellen. Weiterhin bestand die Anforderung, dass ein gefundener Weg mittels Interpolation - vorzugsweise mit Hilfe von Catmull-Rom-Splines - interpoliert und geglättet werden sollte. Mittels einer visuellen Animation des Roboters, der entlang des gefundenen Wegs fährt, erhält der Benutzer zudem eine Darstellung und versteht gleichzeitig auch den Nutzen dieser Interpolation. 3.1 Architektur Simple Paths ist eine mit Python [8] programmierte Anwendung, die mittels der Benutzeroberflächen-Klassenbibliothek Qt [9] umgesetzt ist. Für einzelne Algorithmen werden zusätzlich die Python-Module NumPy [10], SciPy [11] und die Bildverarbeitungs-Bibliothek OpenCV [12] verwendet. Das Programm besitzt neben dem Hauptmodul (siehe Abbildung 3.1), in dem die Benutzeroberfläche mit den zahlreichen GUI1 -Elementen programmiert ist und der Mainloop von Qt läuft, weitere Module, die für die Ausführung der Algorithmenberechnungen zuständig sind. Um eine reaktive Anwendung zu erhalten, werden diese Berechnungen über einen separaten Thread gestartet und die Zwischenergebnisse sowie den gefundenen Pfad mittels des Signal- and Slot-Systems von Qt an das Hauptmodul übermittelt. Die Vorberechnungen zur Stützpunkt- und letztendlich zur Grapherstellung finden in einem separaten Modul statt und werden von diesem Thread aufgerufen. Sobald das Ergebnis - ein ungerichteter Graph - vollständig erstellt wurde, überträgt der Thread diesen Graph an das entsprechende Modul, das den Wegfindungsalgorithmus enthält. Dieses Modul liefert als Rückgabewert eine Liste von Stützpunkten, die auf 1 graphical user interface, dt. grafische Benutzeroberfläche 6 3 Simple Paths Abbildung 3.1: Klassenübersicht des Programms dem Weg von der Startposition zur Zielposition den kürzesten Weg ergeben. 3.2 Benutzeroberfläche Simple Paths bietet eine übersichtliche Oberfläche (siehe Abbildung 3.2) mit zwei Hauptbereichen und einer zusätzlichen Menüleiste. Abbildung 3.2: Benutzeroberfläche von Simple Paths Eine Ansicht zum Zeichnen und Platzieren von verschiedenen Objekten, Hindernissen oder der Start- bzw. der Roboterposition und der Zielposition, befindet sich im linken Bereich des Programms und wird im weiteren Verlauf mit Grafikszene bezeichnet. Auf der rechten Seite sind hingegen die entsprechenden Funktionen zum Erstellen dieser Objekte vorhanden. Außerdem existieren zahlreiche Auswahlmöglichkeiten zur Wegfindung, sowie optionale Einstellungsmöglichkeiten, die 7 3 Simple Paths die Vorgehensweise der Algorithmen anhand Zeichnungen in der Grafikszene verdeutlichen. Die folgenden Abschnitte befassen sich ausführlich mit diesen Auswahlund Einstellungsmöglichkeiten. Menüleiste Die Menüleiste beherbergt die drei Menüpunkte File“, Simulation“ und ” ” About“ (siehe Abbildung 3.3). Entsprechend der Namensgebung werden über den ” Menüpunkt File“ Standardaktionen wie das Öffnen“ und Speichern“ von erstell” ” ” ten Umgebungen angeboten. (a) Datei-Menü (b) Simulations-Menü (c) Informations-Menü Abbildung 3.3: Menüpunkte der Menüleiste Bei gespeicherten Umgebungen handelt es sich um Textdateien, die pro Zeile die Koordinaten und den Typ eines Objektes beinhalten. Bei der Speicherung erfolgt eine Umwandlung der Datenstruktur eines Objekts in eine Zeichenkette, die beim Öffnen direkt wieder als die entsprechende Datenstruktur interpretiert werden kann. Der Menüpunkt Simulation“ in der Menüleiste bietet zwei Funktionen zum Star” ten der Wegfindung und der Simulation. Diese beiden Aktionen können auch über die entsprechenden GUI-Elemente in Abbildung 3.11 angesprochen werden. Über den Menüpunkt About“ können detailierte Informationen über das Pro” gramm abgerufen werden. Objekte zeichnen und platzieren Dem Benutzer stehen für die Gestaltung der Umgebung bzw. der Wohnung zwei Zeichenoperationen zur Verfügung, mit denen er schematisch Objekte bzw. Hindernisse in die Grafikszene des Programms zeichnen kann. (a) Rechteck zeichnen (b) Polygon zeichnen Abbildung 3.4: Objekte zeichnen Teil I 8 3 Simple Paths Für die Ausführung der einzelnen Zeichenoperationen muss jeweils der entsprechende Knopf mit der Maustaste gedrückt werden (siehe Abbildung 3.4 und Abbildung 3.5). (a) Roboterposition (b) Robotergröße (c) Zielposition Abbildung 3.5: Objekte zeichnen Teil II Rechtecke werden dann anschließend in die Grafikszene, wie in Abbildung 3.6 dargestellt, mittels gedrückter Maustaste von einen Start- zu einem Endpunkt gezeichnet und dabei entlang eines unsichtbaren Rasters in 10 Pixel Schritten ausgerichtet. (a) Schritt 1 (b) Schritt 2 Abbildung 3.6: Rechtecke zeichnen Für das Zeichnen von Polygonen (siehe Abbildung 3.7) genügt ein einzelner Mausklick für das Hinzufügen eines weiteren Eckpunkts. Durch das Hinzufügen eines gewünschten Eckpunkts per Doppelklick wird das Polygon zusätzlich geschlossen und das Polygonzeichnen beendet. (a) Schritt 1 (b) Schritt 2 (c) Schritt 3 Abbildung 3.7: Polygone zeichnen Für das Platzieren von Roboterposition und Zielposition wird hingegen wiederum nur ein einzelner Mausklick benötigt. Beide Positionen können allerdings 9 3 Simple Paths nachträglich neu gesetzt und mittels gedrücker Maustaste verschoben werden. Zusätzlich kann die Größe des Roboters über eine Einstellungsmöglichkeit (siehe Abbildung 3.5 (b)) festgelegt werden. Stützpunkterstellung Insgesamt stehen dem Benutzer drei verschiedene Methoden zur Stützpunkterstellung zur Auswahl (siehe Abbildung 3.8). Die standardmäßig aktivierte modellbasierte Stützpunkterstellung verteilt die Stützpunkte abhängig von den Konturen der benachbarten Geometrie. Damit verteilt diese Methode die Stützpunkte intelligenter als der rasterbasierte bzw. der stochastische Ansatz und es existiert keine Möglichkeit, die Anzahl der Stützpunkte zu kontrollieren. Abhängig von der ausgewählten Erstellungsmethode wird eine Einstellungsmöglichkeit de- bzw. aktiviert, mit der die Anzahl der zu erstellenden Stützpunkte beim rasterbasierten Ansatz beeinflusst und beim stochastischen Ansatz direkt festgelegt werden kann. (a) Auswahlbox zu (b) Auswahlbox offen (c) Anzahl der zu erstellenden Stützpunkte Abbildung 3.8: Auswahl- und Einstellungsmöglichkeiten zur Stützpunkterstellung Wegfindung Simple Paths beinhaltet neben dem standardmäßig aktivierten Dijkstra-Algorithmus zusätzlich eine A* -Implementierung zur Wegfindung. Beide können über die entsprechende Auswahlbox (siehe Abbildung 3.9) ausgewählt werden. (a) Auswahlbox zu (b) Auswahlbox offen Abbildung 3.9: Auswahlmöglichkeiten zur Pfadsuche 10 3 Simple Paths Spline-Interpolation Dem Benutzer stehen drei verschiedene Arten der Spline-Interpolation eines gefundenen Pfades zur Verfügung. Die standardmäßig ausgewählte Catmull-Rom Interpolation interpoliert zwischen den Stützpunkten und verhindert vergleichsweise gut das Aufschwingen der Spline. Sowohl die kubische Interpolation, als auch die quadratische Interpolation neigen zum Aufschwingen der interpolierten Spline, allerdings steigt die Intensität des Aufschwingens in ihrer genannten Reihenfolge. Dafür bietet die quadratische Interpolation den glättesten Verlauf von allen drei Interpolationstypen. Um den gefundenen Pfad in einer diskreten Pixelansicht entsprechend zu glätten, existiert ein einstellbarer Glättungsparameter (siehe Abbildung 3.10). (a) Auswahlbox zu (b) Auswahlbox offen (c) Glättungsparameter der Spline Abbildung 3.10: Auswahl- und Einstellungsmöglichkeiten zur Spline-Interpolation Simulation Nachdem der Benutzer die gewünschten Einstellungen vorgenommen und einen Wegfindungsalgorithmus ausgewählt hat, wird die Berechnung des kürzesten Wegs über den entsprechenden Knopf (siehe Abbildung 3.11 (a)) gestartet. Diese Berechnungen werden im Hintergrund über einen Thread ausgeführt, so dass der Rest des Programms reaktiv bleibt. Sobald alle Berechnungen abgeschlossen sind, wird der interpolierte kürzeste Pfad in der Grafikszene eingezeichnet. Zudem besteht die Möglichkeit eine Animation zu starten, in der der Roboter von seiner Startposition entlang des eingezeichneten Pfades zur Zielposition und anschließend wieder zurück fährt. Die Zeit in Sekunden, die der Roboter für diese Animation benötigen soll, lässt sich über einen entsprechenden Parameter einstellen (siehe Abbildung 3.11 (b) und (c)). (a) Pfad berechnen (b) Simulation starten (c) Simulationsgeschwindigkeit in Sekunden Abbildung 3.11: Einstellungsmöglichkeiten zur Simulation 11 3 Simple Paths 3.3 Beschreibung der Algorithmen Dieses Kapitel skizziert die Funktionsweise der verwendeten Methoden zur Stützpunkt- und zur Graphenerstellung. Die Funktionsweisen der Wegfindungsalgorithmen wurden bereits ausführlich in Kapitel 2 dargestellt. 3.3.1 Methoden zur Stützpunkterstellung Modellbasierte Stützpunkterstellung Bei der modellbasierten Stützpunkterstellung werden die Konturlinien von den Objekten im Bild analysiert und entsprechende Stützlinien von jedem Ende der Konturlinie bis hin zur Bildgrenze verlängert. Schneiden diese Stützlinien eine Konturlinie, bevor sie die Bildgrenze treffen, wird der Schnittpunkt als neues Ende dieser Stützlinie gespeichert. Im nächsten Schritt dienen die mittleren Distanzen zwischen jeweils zwei Punkten, die eine Stützlinie bilden, als Stützpunktposition. Diese intelligente Stützpunkerstellung erfolgt somit abhängig von der umliegenden Objektgeometrie und es werden keine unnötigen Stützpunkte generiert, um zusammenhängende Graphen mit recht wenigen Stützpunkten in einem nachfolgenden Schritt zu generieren. Rasterbasierte Stützpunkterstellung Der naive Ansatz der rasterbasierten Stützpunkterstellung erstellt Stützpunkte in einem festen Abstand zueinander. Dabei werden Stützpunkte, die auf Objekten im Bild liegen würden, aussortiert. Sobald allerdings die Distanzen zwischen Objekten kleiner sind als der eingestellte Abstand, führt dieses Verfahren oft zu nichtzusammenhängenden Graphen und es kann kein Weg von der Startposition zur Zielposition gefunden werden. Stochastische Stützpunkterstellung Bei diesem Verfahren werden solange zufällig Stützpunkte generiert, bis eine feste Anzahl erreicht worden ist. Ähnlich wie bei der rasterbasierten Stützpunkterstellung werden Stützpunkte, die auf Objekten im Bild liegen würden, aussortiert. Wird die Anzahl der zu generierenden Stützpunkte zu niedrig gewählt, werden bei entsprechender Umgebung oft nicht-zusammenhängende Graphen generiert und die Wegfindung von der Startposition zur Zielposition bleibt erfolglos. 3.3.2 Methode zur Graphenerstellung Innerhalb eines vorverarbeitenden Schritts werden alle möglichen Kanten zwischen allen Stützpunkten untereinander ermittelt. Während diesem Vorgang überprüft eine Routine, ob diese Kante unter Berücksichtigung der Umgebungshindernisse und 12 3 Simple Paths der Robotergröße existieren darf, so dass keine Kollisionen auftreten. Die resultierenden Kanten werden als Tupel, bestehend aus Start- und Endpunkt, in einer Liste gespeichert. Mittels dieser Kanten und der bereits bestehenden Stützpunkte wird anschließend eine Datenstruktur erstellt, deren Einträge aus einem Index mit dem Wert eines Stützpunktes und einer Liste, die seine Nachbarstützpunkte enthält, bestehen. 3.3.3 Methoden zur Wegfindung Die zwei unterschiedlichen Wegfindungsalgorithmen wurden bereits in Kapitel 2 vorgestellt, so dass in diesem Abschnitt nur noch einige allgemeine Informationen zur Implementierungsvorgehensweise genannt werden. Der Rückgabewert beider Algorithmus ist jeweils eine Liste, die die Knoten des gefundenen Pfads in der richtigen Reihenfolge enthält. Dijkstra - Algorithmus Der Algorithmus ermittelt anhand der erstellten Datenstruktur des Graphen, einem Startpunkt S und einem Zielpunkt Z über eine Rekursion den kürzesten Weg zwischen S und Z. Als weitere Parameter benötigt die Implementierung eine Liste für die bereits besuchten Knoten. Die Knoteneigenschaften Distanz und Vorgänger werden in separaten Datenstrukturen gespeichert, deren Einträge jeweils mit dem entsprechenden Knoten verknüpft sind. A* - Algorithmus Die Implementierung des A* -Algorithmus ermittelt anhand der erstellten Datenstruktur des Graphen, einem Startpunkt S und einem Zielpunkt Z innerhalb einer Schleife den kürzesten Weg zwischen S und Z. Jeder Punkt bzw. Knoten ist dabei als Instanz einer Klasse angelegt, die die Attribute für g, h und parent (entspricht dem Vorgängerknoten) enthält. Innerhalb des Algorithmus werden die zusätzlich benötigten Mengen Open List und Closed List als spezielle Listen, sogenannten Sets, angelegt. 3.3.4 Methoden zur Spline-Interpolation Alle Spline-Interpolationsmethoden werden über eine Interpolationsmethode aufgerufen, die als Parameter eine Zeichenkette für den entsprechenden Interpolationstyp erwartet. Zusätzlich muss durch einen Glättungsparameter die Diskretisierungsschritte zwischen zwei Knoten für die Interpolation festgelegt werden. Dabei ist zu beachten, dass die X- und die Y-Koordinaten der Knoten grundsätzlich unabhängig voneinander interpoliert werden. 13 4 Evaluation Das Spannende an den verschiedenen Ansätzen zur Vor- und Nachbereitung zur Wegfindung liegt nicht zwangsläufig in ihrer Vorgehensweise, sondern welche Ergebnisse letztendlich daraus resultieren und welches Wissen der Benutzer daraus ziehen kann. Dieses Kapitel befasst sich aus diesem Grund mit den Ergebnissen der Algorithmen und versucht diese zu vergleichen und zu bewerten. Die Bewertung der Wegfindungsalgorithmensoll an dieser Stelle hier ausgeklammert werden, da sowohl der Dijkstra- als auch der A* -Algorithmus den kürzesten bzw. optimalsten Pfad finden und sich in ihrer Vorgehensweise nur minimal unterscheiden. Generell wird der A* -Algorithmus oft als Weiterentwicklung des DijkstraAlgorithmus angesehen, da dieser den Dijkstra-Algorithmus um die Schätzfunktion mit Hilfe der Heuristiken erweitert und somit die Laufzeit für die Wegfindung durch eine zielgerichtetere Suche verringert. 4.1 Vergleich der Methoden zur Stützpunkterstellung Aufgrund der Tatsache, dass hinter dem modellbasierten Ansatz eine gewisse Analyse der Umgebung und der darin enthaltenen Hindernisse vorhanden ist und abhängig von der Objektdichte bzw. deren Konturen letztendlich die Stützpunkte verteilt werden, möchte ich diesen Ansatz als den intelligentesten von den hier implementierten Stützpunkterstellungsmethoden bezeichnen. Obwohl bei diesem Ansatz kein zusätzlicher Parameter zum Beeinflussen der Stützpunktanzahl angegeben werden muss, wird immer ein Weg von einem Startpunkt S zu einem Zielpunkt Z gefunden (siehe Abbildung 4.1). Die folgenden Abbildungen sind Ausschnitte aus der kompletten Grafikszene, die jedoch genügen, um die Unterschiede der Stützpunkterstellungsmethoden zu verdeutlichen. Abbildung 4.1: Modellbasiertes Stützpunkterstellungsergebnis 14 4 Evaluation Sowohl der rasterbasierte als auch der stochastische Ansatz gehen in ihrer Stützpunkterstellung eher naiv vor und haben mit entsprechenden Problemen zu kämpfen. Zudem benötigen beide Ansätze eine Überprüfung, ob sich ein erstellter Stützpunkt innerhalb eines Hindernisses befindet, um diesen gegebenenfalls wieder zu entfernen. Beide verfügen über einen Parameter, mit dem direkt (stochastisch) oder indirekt (rasterbasiert) die Anzahl der Stützpunkte kontrolliert und eingestellt wird. (a) 75 Pixel Abstand (b) 50 Pixel Abstand Abbildung 4.2: Vergleich der rasterbasierten Stützpunkterstellungsergebnisse Bei dem rasterbasierten Ansatz bestimmt dieser Parameter die Schrittweite bzw. den Abstand zwischen zwei Stützpunkten, die innerhalb eines festen Gitters horizontal und vertikal angeordnet werden. Sobald dieser Abstand größer als der Abstand zwischen zwei Konturen von Objekten ist, besteht die Möglichkeit, dass kein Stützpunkt zwischen diesen beiden Konturen erstellt wird. Aufgrund dessen wird der durch diese Konturen begrenzte Bereich nicht im Graph angebunden und letztendlich unerreichbar (siehe Abbildung 4.2). (a) 50 Stützpunkte (b) 100 Stützpunkte (c) 100 Stützpunkte Abbildung 4.3: Vergleich der stochastischen Stützpunkterstellungsergebnisse Wie die Bezeichnung des stochastischen Ansatzes vermuten lässt, birgt die zufällige Positionsgenerierung bei der Stützpunkterstellung die Gefahr, dass selbst bei einer hohen Anzahl von zu erstellenden Stützpunkten keine zusammenhängenden Graphen erstellt werden können. Bei der Benutzung dieses Ansatzes tritt dieses Problem ab einer entsprechend hohen Anzahl in der Praxis nicht mehr auf, allerdings 15 4 Evaluation kann die Punktdichte dann an zufälligen Stellen in der Umgebung unnötig hoch sein (siehe Abbildung 4.3). 4.2 Vergleich der Methoden zur Spline-Interpolation Catmull-Rom-Splines verhindern das Aufschwingen besser als die beiden alternativen Interpolationsmethoden. Während die kubische Interpolationsmethode zu teilweise starkem Aufschwingen neigt, tendiert die quadratische Spline-Interpolation oft zu größerem Überschwingen“. Für die Routenplanung innerhalb von begrenz” ten Umgebungen wie z.B. einer Wohnung mit teilweise engen Durchgängen zwischen Hindernissen oder Objekten eignen sich deswegen Catmull-Rom-Splines für die Interpolation am besten. Ein visueller Vergleich findet sich in der folgenden Abbildung 4.4. (a) Catmull-Rom (b) Kubisch (c) Quadratisch Abbildung 4.4: Vergleich der Spline-Interpolationsmethoden 16 5 Fazit Das Gebiet der Wegfindung in der Informatik umfasst einen spannenden Bereich, da nicht nur eine Vielzahl von verschiedenen Wegfindungs-Algorithmen existieren, sondern auch diverse Ansätze für die Vor- und auch die Nachbereitung. Mit Python lassen sich zudem in überschaubarer Zeit umfangreiche Algorithmen fertigstellen, was dazu geführt hat, sich näher mit dem Gebiet der Wegfindung auseinander zu setzen. Aus diesem Blickwinkel betrachtet ist es rückblickend nicht verwunderlich, dass das Projekt Simple Paths noch während seiner Entwicklung um diverse Funktionen ergänzt und der ursprünglich formulierte Projektumfang erweitert wurde. Geplanter Projektumfang Aktueller Projektumfang Stützpunkterstellung Modellbasiert Modellbasiert Rasterbasiert Stochastisch Wegfindungsalgorithmen Dijkstra Dijkstra A* Spline Interpolation Catmull-Rom Catmull-Rom Quadratisch Kubisch Tabelle 5.1: Projektumfang Die Erweiterungen betreffen allerdings nicht nur den Bereich der Algorithmen, sondern sind auch in der Benutzeroberfläche zu finden. So wurden architekturelle Überlegungen in Betracht gezogen und letztendlich auch umgesetzt, um somit eine schnelle Anwendung mittels Qt zu realisieren. Nützliche Funktionen wie das zusätzliche Ein- und Ausblenden von Stützpunkten oder dem Graphen fanden dadurch auch ihren Weg in die Implementierung von Simple Paths. 17 6 Abbildungsverzeichnis 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 Klassenübersicht des Programms . . . . . . . . . . . . . . . . . . Benutzeroberfläche von Simple Paths . . . . . . . . . . . . . . . . Menüpunkte der Menüleiste . . . . . . . . . . . . . . . . . . . . . Objekte zeichnen Teil I . . . . . . . . . . . . . . . . . . . . . . . . Objekte zeichnen Teil II . . . . . . . . . . . . . . . . . . . . . . . Rechtecke zeichnen . . . . . . . . . . . . . . . . . . . . . . . . . . Polygone zeichnen . . . . . . . . . . . . . . . . . . . . . . . . . . . Auswahl- und Einstellungsmöglichkeiten zur Stützpunkterstellung Auswahlmöglichkeiten zur Pfadsuche . . . . . . . . . . . . . . . . Auswahl- und Einstellungsmöglichkeiten zur Spline-Interpolation . Einstellungsmöglichkeiten zur Simulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 8 8 9 9 9 10 10 11 11 4.1 4.2 4.3 4.4 Modellbasiertes Stützpunkterstellungsergebnis . . . . . . . . Vergleich der rasterbasierten Stützpunkterstellungsergebnisse Vergleich der stochastischen Stützpunkterstellungsergebnisse Vergleich der Spline-Interpolationsmethoden . . . . . . . . . . . . . . . . . 14 15 15 16 I . . . . . . . . . . . . 7 Literatur- und Quellenverzeichnis [1] Edsger W Dijkstra. A note on two problems in connexion with graphs. Numerische mathematik, 1(1):269–271, 1959. [2] Thomas H Cormen, Charles E Leiserson, Ronald L Rivest, Clifford Stein, et al. Introduction to algorithms, volume 2. MIT press Cambridge, 2001. [3] Peter E Hart, Nils J Nilsson, and Bertram Raphael. A formal basis for the heuristic determination of minimum cost paths. Systems Science and Cybernetics, IEEE Transactions on, 4(2):100–107, 1968. [4] Peter E Hart, Nils J Nilsson, and Bertram Raphael. Correction to a formal basis for the heuristic determination of minimum cost paths. ACM SIGART Bulletin, (37):28–29, 1972. [5] Stuart Russell and Peter Norvig. Künstliche Intelligenz. Ein moderner Ansatz, München, 2004. [6] Josef Stoer and Roland Bulirsch. Numerische Mathematik, volume 8. Springer, 1989. [7] Britta Nestler. Approximation durch Polynome. http://www.iaf. hs-karlsruhe.de/ice/ice/nestler/fileadmin/files/ModSim/Notes/ ModSim-Skript2.pdf, 2011. Online, Stand: 15. Januar 2015. [8] Python Software Foundation. Python. https://www.python.org/. Online, Stand: 15. Januar 2015. [9] Qt Project. Qt. http://qt-project.org/. Online, Stand: 15. Januar 2015. [10] NumPy Org. NumPy. http://www.numpy.org/. Online, Stand: 15. Januar 2015. [11] SciPy Org. SciPy. http://www.scipy.org/. Online, Stand: 15. Januar 2015. [12] OpenCV Org. OpenCV. http://opencv.org/. Online, Stand: 15. Januar 2015. II