Smart Minotaur
 Alle Klassen Dateien Funktionen Variablen Seiten
Graphen Ansatz

Beschreibung

Da der Belegtheitsgitter Ansatz ohne gute Odometrie nicht gut umsetzbar ist, wurde ein zweiter Ansatz gestartet. Das Labyrinth wurde in quadratische Zellen eingeteilt. Die Seitenlänge einer Zelle enspricht dabei der Länge einer Holzwand aus dem Labyrinth. Der Roboter bewegt sich dann stets von Zelle zu Zelle. Wenn der Roboter etwa in der Mitte einer Zelle angekommen ist prüft er zunächst in welchen Richtungen sich Wände befinden und in welche Richtungen er weiterfahren kann. Dies wird in einer Karte dokumentiert und anschließend wird durch einen Algorithmus bestimmt, welche benachbarte Zelle der Roboter als nächstes ansteuert.

Umsetzung

Die Sourcedateien sind im package minotaur_maze zu finden.

Navigation

Bei einer Fahrt von Zelle zu Zelle kann der Roboter aufgrund von Ungenauigkeiten der Motoren sowie Durchdrehen eines Rades eine schlechte Ausrichtung und somit fehlerhaftes Verhalten entwickeln. Da keine Maussensoren zum erkennen dieser Fehler zur Verfügung stehen, müssen wir dies anhand der Messwerte der Ultraschallsensoren ausgleichen. Hierbei werden die Werte der Sensoren rechts und links verglichen und es wird eine Korrektur in die Wege geleitet, die versucht den Abstand beider Sensoren zur Wand gleich zu halten. Je höher dabei der Unterschied der Sensorwerte, desto höher das Entgegenlenken durch die Korrektur. Wenn ein Sensor keine nützlichen Messwerte liefern kann, da sich an seiner Seite keine Wand sondern eine Abzweigung befindet, werden nur die Daten des anderen Sensors mit einem Sollabstand verglichen.

Um einzelne Ausreisser in den Messwerten auszugleichen wurde ein Medianfilter angewendet der die letzten 5 bis 10 Werte eines Sensors nutzt.

Beim Fahren bestimmt der Roboter anhand des zurückgelegten Weges, wann er in der nächsten Zelle angekommen ist. Daraufhin wird ermittelt welche Aktion als nächstes ausgeführt wird (Mehr dazu siehe Algorithmus). Der Roboter hat hier immer genau zwei Möglichkeiten:

  • Rotation: Der Roboter dreht sich auf der Stelle in eine angegebene Richtung um 90° oder 180°.
  • Fahrt geradeaus: Der Roboter bewegt sich zur nächsten Zelle.

Algorithmus

Es handelt sich hierbei um einen sehr simplen Algorithmus. Nachdem erkannt wurde in welche Richtung ein Weiterfahren möglich ist, wird der Roboter, falls mehrere Möglichkeiten zur Verfügung stehen, unbesuchte Zellen als Ziel bevorzugen. Wenn mehrere unbesuchte Zellen zur Verfügung stehen wird momentan bevorzugt geradeaus gefahren, da bei Drehungen ab und zu Fehler auftreten können. Daher wird versucht, so wenige Rotationen wie möglich zu machen. Mehr dazu siehe: Probleme.

Probleme

Auch in diesem Ansatz entstehen viele Probleme und Fehler aufgrund von ungenauen Sensorwerten und schlechter Odometrie.

Besonders anfällig für Fehler sind die Rotationen. Es kann passieren, dass der Roboter vor der Rotation nicht gerade steht oder bei der Rotation ein Rad durchdreht. Als Resultat dreht sich der Roboter zu weit oder zu wenig und fährt im schlechtesten Fall anschließend gegen eine Wand, da er nicht schnell genug gegenlenken kann. Diese Probleme könnten eventuell beide durch funktionsfähige Maussensoren abgefangen und korrigiert werden, die uns jedoch nicht zur Verfügung stehen (siehe Maussensor Probleme: Probleme).

Aber auch beim einfachen geradeausfahren können Fehler auftreten. So kann es vorkommen, dass der Roboter einem von ihm erkannten Fehler gegensteuern will, dies jedoch viel zu stark macht und er kann sich nicht mehr gerade in der Mitte halten und fährt entweder gegen eine Wand oder steht vor der nächsten Rotation enorm schief. Dieses Problem tritt zumeist aufgrund von unerklärlich schlechten Sensormesswerten auf. Wir haben versucht dieses Problem mittels eines Medianfilters zu beheben, jedoch ohne großen Erfolg.

Das Problem des Medianfilters besteht darin, dass die Ultraschallsensoren stets mehrere fehlerhafte Werte in Folge liefern und der Filter dadurch nutzlos wird. Mehr dazu siehe: Ultraschallsensoren.

Ein weiteres Problem besteht im Aufbau des Labyrinths. Zwischen zwei Holzplatten entsteht stets eine kleine Rille, da die Platten nicht exakt gleich groß sind. An dieser Rille kann der Roboter, vor allem beim Rotieren, hängen bleiben.