-
Patrick Simmel authoredPatrick Simmel authored
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.