Skip to content
Snippets Groups Projects
Forked from an inaccessible project.
Die Challenges.md 5.63 KiB

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 zu finden.
Das eigene Repository 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:

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) aus der scan_callback-Methode:

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.