Skip to content
Snippets Groups Projects
Commit 959c7513 authored by Florian Leberfinger's avatar Florian Leberfinger
Browse files

Doku erweitert

parent ca5a703f
No related branches found
No related tags found
No related merge requests found
Pipeline #12597 passed
......@@ -13,6 +13,6 @@ Der Ablauf für jeden empfangenen Sensorwert kann als folgendes Ablaufdiagramm d
![image](./img/flowdiagram_1.png)
### Probleme
## Probleme
Ein Problem, das während der Umsetzung auftratt war, dass der Sensor des Roboters in der Simulation, die zum Testen verwendet wurde, und in der Realität unterschiedliche Werte lieferte. Der konkrete Unterschied war, dass es in der echten Welt öfters aufgetreten ist, dass der Sensor in eine Richtung keine Gegenstände findet anhand er den Abstand bestimmen kann. Deshalb wurde in diese Richtung der Abstand 0.0 gesetzt. Da dies kleiner als 0.3 ist, wurde in diesem Fall fälschlicherweise ein Hindernis erkannt. Um dieses Problem zu lösen, wurde die Bedingung zum Erkennen eines Objektes von `Abstand < 0.3` zu `Abstand < 0.3 und Abstand != 0` ergänzt.
Ein weiteres Problem war, dass mit dem Obrigen Ansatz nur der Abstand direkt nach vorne geprüft wurde. Dies funktionierte zwar, wenn sich ein Hindernis direkt vor dem TurtleBot befand, sobald es sich allerdings etwas zur Seite befand, wurde es nicht mehr erkannt. Um das zu löschen, musste der Abstand in einem Bereich vor dem Roboter überprüft werden. Hierzu wurden die Abstandswerte des Sensors in einem 40-Grad Bereich nach Links und Rechts getestet. Dadurch wurden nun auch seitliche Objekte erkannt und Kollisionen vermieden.
img/flowdiagram_2.png

90.9 KiB

......@@ -8,4 +8,5 @@ Bericht für die Praxisergänzende Vertiefung 2 von Florian Leberfinger (Matrike
core_concepts.md
collision_avoidance.md
maze.md
```
maze.md 0 → 100644
# Maze
Bei dieser Aufgabe soll der Turtlebot so programmiert werden, dass er selbständig durch ein zufällig erstelltes Labyrinth fährt und vor einem Ziel, dass durch eine Rote Wand markiert ist, stehen bleibt.
## Umsetzung
Bevor dieses Problem angegangen werden konnte, mussten im Vorfeld zuerste einige kleinere Aufgaben umgesetzt werden. Diese waren:
### Kollisionserkennung
Zur Erkennung von Wänden wird erneut auf den Laser Distance Sensor zurückgegriffen, der die von ihm ermittelten Daten an das Topic 'scan' sendet. Sobald bei einem von diesem veröffentlichten Datensatz der Wert direkt vor dem Bot kleiner als 0.3 ist, wird dies als Kollision erkannt.
### Drehung um 90°
Um im Irrgarten navigieren zu können, musste eine Möglichkeit geschafft werden, um den Bot um 90° zu drehen. Sobald die Drehung initialisiert wird, wird einerseits ein Befehl in das Topic 'cmd_vel' gesendet, um eine potentielle Vorwärtsbewegung zu stoppen und die Drehbewegung auf 43% des Maximalwertes zu setzen. Andererseits wird hier auch der Zeitstempel des Beginns der Rotation gespeichert.
Im Anschluss wird nun für jeden neuen Datensatz, der in das 'scan'-Topic veröffentlicht wird, überprüft ob seit dem Beginn der Drehung zwei Sekunden vergangen sind. Ist dies der Fall wird die Rotation durch das Senden der Daten (0.0, 0.0) in das Topic-'cmd_vel' beendet. Der Hintergrund zu dieser Logik ist folgende Rechnung:
`0.43 * 1.83rad/sek * 2 sek = 1.57 rad`
`1.57 rad = 90°`
Dadurch kann sichergestellt werden, dass sich der Bot immer parallel zu den Wänden des Labyrinths bewegt, solange diese ebenfalls nur aus 90° Kurven besteht.
### Erkennung des Ziels
Auch für das Erkennen der Roten Wand, die das Ziel wiederspiegelt werden die Werte des Laser Distance Sensors verwendet. In diesem Fall allerdings nicht die gemessenen Abstände, sondern die Intensitäten, die in dem Feld 'intensities' gesetzt werden. Diese Werte ändern sich je nach Farbe des erkannten Objektes. So hat z.B. die Farbe Rot in der Gazebo Simulation den Wert 2.0.
### Implementierung
Um dieses Aufgabe zu lösen musste ein Weg gefunden werden, durch das Labyrinth zu navigieren. Hierzu wird der Rechte-Hand-Algorithmus verwendet. Dieser beschreibt, dass man den Ausgang eines Irrgartens finden kann, in dem man den Weg immer so folgt, dass die rechte Hand die Mauer berührt und immer Kontakt zu dieser hält. In Fall des Turtlebots wurde dies folgendermaßen Umgesetzt: Zu Beginn wird überprüft, ob sich rechts von dem Bot eine Wand befindet, indem getestet wird, ob der Laser Distance Sensor für diese Seite einen Wert liefert, der kleiner als 0.9 ist. Ist dies nicht der Fall, dreht sich der Roboter um 90° nach rechts. Dieser Schritt wird solange wiederholt, bis eine Wand auf der rechten Seite gefunden wird. Sobald dies der Fall ist, soll der TurtleBot einfach in einer geraden Linie vorwärts fahren. Dies wird solange gemacht, bis eine von zwei Bedingungen auftritt.
- Es wird eine Abzweigung nach rechts gefunden. Dies wird bestimmt, in dem für jeden im "scan"-topic veröffentlichten Datensatz überprüft wird, ob der Abstand auf der rechten Seite größer als eins ist. Wurde eine Abzweigung erkannt, wird der aktuelle Zeitstempel gespeichert. Darauf hin wird nun für jede neue veröffentlichte Nachricht überprüft, ob seit diesem Zeitraum mindestens 0.75 Sekunden vergangen sind. Dadurch wird sichergestellt, dass sich der Bot etwa in der Mitte der Abzweigung befindet. Sobald diese Zeitspanne vergangen ist, dreht sich der Roboter um 90° nach Rechts und beginnt erneut die Vorwärtsbewegung.
- Es wird eine Wand vor dem Roboter gefunden. Darauf hin wird überprüft, ob der Weg in die linke oder rechte Seite frei ist, indem überprüft wird, ob der entsprechende Abstand, der durch den Laser Distance Sensor ermittelt wird, größer als der Wert eins ist. Falls einer dieser Pfade möglich ist, dreht sich der Bot um 90° in diese Richtung und beginnt erneut gerade aus zu fahren. Falls allerdings weder der Weg links noch der rechts frei ist, sich der Roboter also in einer Sackgasse befindet, wird zufällig bestimmt in welche Richtung er sich drehen soll. Ist diese Rotation abgeschlossen, soll er ebenfalls wieder nach vorne fahren. Dies führt nun dazu, dass sofort wieder eine Wand erkannt wird und die Oben beschriebenen Schritte durchgeführt werden. In diesem Fall wird nun aber sicher ein Weg frei sein, sodass sich der Bot nun drehen kann und so eine 180° Drehung durchführen kann.
Um nun das Ziel zu finden, wird jedes mal, wenn eine Wand erkannt wird, überprüft ob die Wand vor, rechts oder links des Roboters die Farbe Rot, die das Ziel markiert, hat. Wird das direkt vor dem Bot erkannt, wurde das Ziel gefunden und der TurtleBot kann stehen bleiben. Falls das Ziel auf der rechten, bzw. linken Seite erkannt wird, wird eine Rotation in die entsprechende Richtung eingeleitet. Ist diese Drehung abgeschlossen, wird erneut getestet, ob die Wand, die sich nun vor dem Bot befindet, das Ziel ist. Diese Bedingung wird nun natürlich erfüllt, sodass der Roboter auch in diesem Fall stehen bleiben kann.
### UML
Der Ablauf pro Sensorwert kann als folgendes, etwas abstrahiertes Ablaufdiagramm dargestellt werden.
![image](./img/flowdiagram_2.png)
## Probleme
Das größte Problem, das während der Implementierung auftratt, entstand bei der exakten Drehung des Roboters um 90°. Da dies anhand einer festen Drehgeschwindigkeit in Kombination mit der vergangenen Zeit durchgeführt wird, mussten diese beiden Werte sehr genau abgestimmt werden, damit es keine Abweichungen vom gewünschten Weg gibt. Allerdings führte die hohe Auslastung des Simulationsrechners immer wieder zu Verzögerungen im Ablauf, sodass die oben Berechneten Werte nicht anwendbar waren. Auch durch den Wechsel auf eine weniger stark ausgelastete Simulation konnte keine Anhaltende Lösung erreicht werden. Um die Implementierung auf die Gegebenheiten innerhalb der Simulation anzupassen musste der oben berechnete Werte von `0.43 * 1.83rad/sek * 2 sek` musste per Try and Error auf `0.47 * 1.83rad/sek * 2 sek` verändert werden. Da sich allerdings die Performance der Simulation auch von Durchgang zu Durchgang veränderte, gab es auch bei den Rotationen immer wieder kleinere Abweichungen.
Es wurde außerdem alternativ versucht, die Drehung nicht mittels Zeit, sondern anhand des Zustandes der Räder, der in ein eigenes Topic gesendet wird, zu steuern. Allerdings lieferte auch dies nicht den gewünschten Erfolg.
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment