# Die Challenges und der Code

Es wurden verschiedene Challenges gestellt, die der Bot mit unseren Skripten lösen sollte.  
Die verschiedenen Challenges sind in [diesem Repository](https://mygit.th-deg.de/gaydos/tb3-maze-challenges) zu finden.  
Das [eigene Repository](https://mygit.th-deg.de/ps16214/ros2_project/) enthält die Skripte zu den einzelnen Challenges.
Diese sind aber bei jeder einzelnen Challenge nochmal mitverlinkt. Die einzelne Challenge, die ausgelassen wurde, ist
die dritte Challenge, bei der es hieß, es sei nicht zwingend notwendig.

Hier eine kurze Übersicht:
* [Challenge 0](#challenge-0)
* [Challenge 1](#challenge-1)
* [Challenge 2](#challenge-2)
* [Challenge 4](#challenge-4)
* [Challenge 5](#challenge-5)

## Challenge 0:
### Aufgabenstellung
> Wie weit ist die minimale Distanz zur Wand, ohne diese zu berühren?

### Lösung
Mithilfe der Laser-Sensor-Daten des Wafflebot-Roboters konnte man die Distanz 360 Grad um den Roboter herum messen und
ausgeben lassen. Der hierfür notwendige Parameter war `msg.ranges[]`. Die vier voreingestellten Distanzen waren folgende:
* `msg.ranges[0]`: Die Distanz vor dem Roboter
* `msg.ranges[90]`: Die Distanz links vom Roboter
* `msg.ranges[-90]`: Die Distanz rechts vom Roboter
* `msg.ranges[180]`: Die Distanz hinter dem Roboter

Die Angaben der Distanz waren zwischen __inf.__ und __0__:
* `inf.`: Das nächste Objekt weiter entfernt, als der Sensor messen kann
* `0`: Das nächste Objekt würde quasi __im__ Sensor stehen. 0 ist eigentlich nicht zu erreichen, da um den Sensor herum
noch ein Bereich dazuzurechnen ist, da der Wafflebot breiter ist, als nur der Sensor.


## Challenge 1:
### Aufgabenstellung
> Fahr so nah wie möglich zur roten Wand und bleib davor stehen, ohne damit in Berührung zu kommen

### Lösung
Die Herangehensweise hierfür war schlicht und ergreifend, in die Methode `scan_callback` eine if-else-Schleife einzubauen.  
In dieser Schleife wurde lediglich festgelegt, dass der Roboter so lange beschleunigen, also geradeaus fahren sollte,
bis `msg.ranges[0]` kleiner oder gleich 0.2 war. Ist dieser Wert erreicht, so wird die Beschleunigung wieder auf den
Wert __0__ gesetzt; d.h. der Bot bleibt stehen. 0.2 war die perfekte Distanz, um ganz knapp vor der roten Wand stehen zu
bleiben und nicht anzufahren.

Der relevante Code ([hier zu finden](https://mygit.th-deg.de/ps16214/ros2_project/-/blob/main/tb3_challenge1.py)) aus der `scan_callback`-Methode:
```python
def __init__(self):
    self.safe_distance = 0.2

def scan_callback(self, msg):
    if msg.ranges[0] > self.safe_distance:
        self.vel(100, 0)
    else:
        self.vel(0, 0)
        print("Wall found! Stopping..")
        sys.exit()
```
Wörtlich bedeutet der Code:  
Wenn die vordere Distanz größer als die festgelegte `self.safe_distance` ist, dann soll der Roboter mit 100% der 
maximalen Geschwindigkeit fahren. Wenn dies jedoch nicht zutrifft (was beim Unterschreiten der safe_distance erreicht
wird), dann fährt der Roboter mit 0% der maximalen Geschwindigkeit; d.h. er bleibt stehen. Anschließend wird noch ein
print-statement ausgeführt und das Programm wird mit `sys.exit()` beendet.


## Challenge 2:
### Aufgabenstellung
> Fahr zur roten Wand und bleib in einer sicheren Distanz stehen. Rotiere anschließend gegen den Uhrzeigersinn und fahr
> zur Holzwand und bleib stehen.

### Lösung
Hierfür wurde das Skript aus Challenge 1 wiederverwendet.

Die Herangehensweise hierfür war schlicht und ergreifend, in die Methode `scan_callback` eine if-else-Schleife einzubauen.  
In dieser Schleife wurde lediglich festgelegt, dass der Roboter so lange beschleunigen, also geradeaus fahren sollte,
bis `msg.ranges[0]` kleiner oder gleich 0.2 war. Ist dieser Wert erreicht, so wird die Beschleunigung wieder auf den
Wert __0__ gesetzt; d.h. der Bot bleibt stehen. 0.2 war die perfekte Distanz, um ganz knapp vor der roten Wand stehen zu
bleiben und nicht anzufahren.

Der relevante Code aus der `scan_callback`-Methode:
```python
def __init__(self):
    self.safe_distance = 0.2

def scan_callback(self, msg):
    if msg.ranges[0] > self.safe_distance:
        self.vel(100, 0)
    else:
        self.vel(0, 0)
        print("Wall found! Stopping..")
        sys.exit()
```
Wörtlich bedeutet der Code:  
Wenn die vordere Distanz größer als die festgelegte `self.safe_distance` ist, dann soll der Roboter mit 100% der 
maximalen Geschwindigkeit fahren. Wenn dies jedoch nicht zutrifft (was beim Unterschreiten der safe_distance erreicht
wird), dann fährt der Roboter mit 0% der maximalen Geschwindigkeit; d.h. er bleibt stehen. Anschließend wird noch ein
print-statement ausgeführt und das Programm wird mit `sys.exit()` beendet.


This is the second paragraph.

## Blockquotes

Kermit from the Muppet Movie:

> Life's like a movie. Write your own ending.

## Lists

- apple
- banana
- cherry

## Links

More info can be found on [Python docs – Exceptions](https://docs.python.org/3/reference/executionmodel.html#exceptions).

## Images

![Charles J. Sharp, CC BY-SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0>, via Wikimedia Commons](https://upload.wikimedia.org/wikipedia/commons/thumb/8/81/Scarlet_darter_%28Crocothemis_erythraea%29_female_Bulgaria.jpg/320px-Scarlet_darter_%28Crocothemis_erythraea%29_female_Bulgaria.jpg)

## Code snippets

We can use `find -iname STRING` to search for a file in Unix.

The following code[^1] shuffles a list:

```python
from random import shuffle

foo = [1, 2, 3, 4]
shuffle(foo) 
print(foo)
```

## The end

If you want to try these, follow this [Markdown tutorial](https://commonmark.org/help/tutorial). It also includes a web-based code editor.

[^1]: Code from [PythonSnippets.dev](https://pythonsnippets.dev/snippet/23/)