heise online
  • c't
  • iX
  • Technology Review
  • Mac & i
  • mobil
  • Security
  • Netze
  • Open Source
  • Developer
  • c't-TV
  • Download
  • Telepolis
  • Resale
  • Foto
  • Autos
  • Preisvergleich
  • Stellenmarkt
  • Abo
  • weitere Angebote
    • Shop
    • Artikel-Archiv
    • Veranstaltungen
    • Whitepapers
    • heise-marktplatz
    • IT-Markt
    • Tarifrechner
    • Jobs bei Heise

c't Magazin
  • Startseite
  • Artikel
  • c't-Projekte
  • Hotline & FAQ
  • Treiber & mehr
  • Kolumnen
Software zu Projekten Allgemeine Hinweise
Archiv-Suche Newsletter RSS-FeedRSS

c't › c't-Projekte

Trac
  • Login
  • Help/Guide
  • About Trac
  • Preferences
  • Wiki
  • Timeline
  • Roadmap
  • Browse Source
  • View Tickets
  • Search

Context Navigation

  • Start Page
  • Index
  • History
  • Last Change

  1. Verhalten bot_line_shortest_way …
    1. Idee
    2. Voraussetzungen
    3. Parcours ([source:devel/ct-Sim/parcours/crossings_shortest_way.xml …
    4. Erforschen des Labyrinths
    5. Abfahren des kürzesten Weges
    6. Display
    7. Kreuzungserkennung
    8. Umkehr- und Zielfelderkennung
    9. Linienfolger
    10. Datenspeicherung
    11. Ideen für Erweiterungen

Verhalten bot_line_shortest_way (Code)

Autor: F. Menzel (Stand: 03.01.2009 [1533])

Idee

Da der Bot schon relativ gut Linien abfahren kann, kam die Idee auf, den Bot auf seiner Linienfahrt auch Kreuzungen erkennen zu lassen. Mit Nutzung der Abgrundsensoren sollte dies doch möglich sein. Er sollte dann die Kreuzungen wieder erkennen können, um so an einer Kreuzung einen noch nicht befahrenen Abzweig zu nehmen. Irgendwann müßte er an einem Ziel ankommen und der vom Start zurückgelegte Weg sollte nun gespeichert sein. Aus diesen nun vorliegenden Kreuzungs-Wegeinformationen sollte es dem Bot möglich sein, direkt den kürzesten Weg vom Startpunkt zum Ziel zu nehmen.

Voraussetzungen

Der Bot fährt immer mittels Linienfolger auf einer schwarzen Linie entlang. Eine Kreuzung ist immer als X-Kreuzung ausgeführt, d.h. die Kreuzung hat genau vier mögliche Richtungen. Wie es sich gezeigt hat, ist die Erkennung einer T-Kreuzung nur mit erhöhtem Aufwand zu realisieren und evtl. später angedacht. Wenn eine Linie zu Ende ist, muss sich dort ein Umkehr-Feld mit festgelegter Farbe grün befinden. Als Ziel wird ein ebensolches Feld festgelegt, das sich aber direkt vor einer Wand befindet. An Hand des geringen Wandabstandes und der Farbe grün erfolgt die Zielerkennung. Diese Farbe ist im Simulator gut darstellbar, im Programm selbst kann diese für den echten Bot angepasst werden. Weiterhin darf ein Abzweig einer Kreuzung nicht wieder auf einen bereits befahrenen Weg zurückführen, d.h. das Labyrinth muss zyklenfrei sein. Ebenfalls wird vorausgesetzt, dass sich kein Abgrund auf seinem Weg befindet, weil mit den Abgrundsensoren eine Kreuzung überhaupt erst erkannt wird. Weiterhin wird die Vorzugsrichtung an einer Kreuzung mit Links festgelegt, d.h. der Bot biegt immer nach links ab. Im Quelltext ist dieser Wert ebenfalls leicht auf rechts änderbar.

Parcours (crossings_shortest_way.xml)

Der Linienparcours dient als Testlabyrinth zur Demonstration des Verhaltens. Vom Startpunkt des Bots muss das Ziel (rechtes grünes Feld) gefunden und sich der kürzeste Weg dorthin gemerkt werden.

Parcours

Erforschen des Labyrinths

Mittels der Pfeile wird der Fahrweg vom Startpunkt S zum Ziel Z gekennzeichnet:

Parcours mit Erklärungen

Die folgende Karte zeigt genau den oben gekennzeichneten Fahrweg. Wenn der Bot mit den Abgrundsensoren über einen Abgrund - in diesem Fall die schwarze Linie - fährt, wird der Abgrund schwarz markiert, daher die schwarzen Stellen an den Wendepunkten und Kreuzungen:

Karte nach Ausführung des Verhaltens

Abfahren des kürzesten Weges

Wenn der Bot an seinem Ziel angekommen ist, hat er sich den Weg dorthin gemerkt. Alle nicht relevanten Kreuzungen sind entfernt und zu den zielrelevanten Kreuzungen hat er sich die zu nehmenden Abzweigungen gemerkt. Wenn er wieder an den Ausgangspunkt gesetzt wird (manuelles Hinfahren oder Hinstellen), fährt er auf direktem Weg sein Ziel an. Folgende Karte zeigt genau diesen Weg des Bots auf kürzestem Weg zum Ziel:

Karte mit Beschriftungen

Display

Display zum Verhalten

Taste Funktion Beschreibung
5 GoLine Start des Verhaltens: Der Bot fährt eine gewisse Strecke vorwärts über das grüne Startwendefeld (Bedeutung für GoWayBack), bis er auf die Linie kommt, ab dann übernimmt der integrierte Linienfolger.
6 Continue Falls der Bot mal von der Linie abkommt oder eine Kreuzung nicht erkennt, kann der Bot richtig hingestellt/gedreht/gefahren und das Verhalten weitergeführt werden.
8 GoWayForw Ist der Bot am Ziel angekommen und der Weg dorthin also im Stack gespeichert, so kann der Bot an den Ausgangspunkt gestellt/gefahren und das Ziel direkt angefahren werden. Der Stack ist danach leer.
9 GoWayBack Ist der Bot am Ziel angekommen und der Weg dorthin also im Stack gespeichert, so kann der Weg rückwärts auf direktem Weg zum Ausgangspunkt abgefahren werden, d.h. vom Start-Wendefeld zur ersten Kreuzung. Der Stack ist danach leer.

Kreuzungserkennung

Erkannt wird eine X-Kreuzung daran, dass sich beide Abgrundsensoren über der schwarzen Linie befinden und der Bot eigentlich einen Abgrund detektiert (Abgrundverhalten wurde beim Start aber ja ausgeschaltet). Durch die Richtungs-Ausgleichskorrekturen des integrierten Linienfolgers ist es aber nicht gegeben, das sich immer beide Abgrundsensoren gleichzeitig auf der Kreuzungslinie befinden. Durch Schräglage kann der Eine auch wieder darüber hinweg sein, ehe der andere die Linie erkennt. Programmintern werden deswegen zwei Variablen gesetzt, sobald der jeweilige Abgrundsensor eine Linie („Abgrund“) erkennt und wenn beide gesetzt sind, wird die Kreuzung erkannt.

Umkehr- und Zielfelderkennung

Am Ende einer Linie muss sich ein Umkehrfeld befinden, damit programmintern eine Variable zur Erkennung des Linienendes und der Richtungsumkehr gesetzt werden kann. Das Umkehrfeld ist per default auf grün gesetzt, weil diese Farbe gut im Simulator verwendet und dargestellt werden kann. Gibt es direkt hinter einem solchen Feld eine Wand, so erkennt der Bot daran das Zielfeld und das Verhalten wird beendet. Der gefahrene Weg entlang der Linie und die richtigen Abzweigungen stehen gespeichert im Stack zur Verfügung.

Linienfolger

Der Bot fährt solange auf der schwarzen Linie entlang, bis eine Kreuzung oder ein Umkehr- bzw. Zielfeld erkannt wurde. Er befindet sich auf der Linie und fährt geradeaus, wenn entweder der linke oder beide Liniensensoren sich darauf befinden. Erkennen weder der linke noch der rechte Liniensensor die Linie, dann wird gewisse Zeit nach links gedreht, im anderen Fall nach rechts.

Datenspeicherung

Auf dem Weg zum Ziel vermerkt der Bot die jeweiligen Kreuzungen und die eingeschlagenen Richtungen auf dem Stack. Es wird hierfür der Positionsstack zur Speicherung von XY-Koordinaten mit denselben Routinen verwendet. Jedoch werden keine absoluten Koordinaten verwendet, sondern jedes im Stack stehende Element stellt hier eine Kreuzung dar. Die eigentliche X-Koordinate speichert den erkannten Kreuzungstyp für mögliche spätere Erweiterungen zur Erkennung der T-Kreuzung und die Y-Koordinate den Wert der zuletzt eingeschlagenen Richtung. Da die Vorzugsrichtung mit links definiert ist, wird der Wert hochgezählt um die Richtung eindeutig zu erkennen (1: links, 2: geradeaus, 3: rechts). Bei Änderung der Vorzugsrichtung ändern sich auch die Bedeutungen, was programmintern auch berücksichtigt wird. Die angetroffenen Kreuzungen werden also zuerst im Stack eingefügt mit dem Wert 1 und die linke Richtung weiterverfolgt. Nach einem erkannten Umkehrfeld kann die nächstliegende Kreuzung nur die zuletzt gespeicherte Kreuzung sein und es wird diese vom Stack genommen. Die Richtungsinfo wird um 1 erhöht, wieder in den Stack gespeichert und diese Richtung verfolgt. Hat der Bot alle drei möglichen Richtungen verfolgt ohne das Ziel gefunden zu haben, so wird die Kreuzung nicht wieder auf dem Stack gespeichert, da sie zur Zielfindung irrelevant ist. Am Ziel angekommen, befindet sich somit im Stack der kürzeste Weg zum Ziel. Das folgende Bild verdeutlicht diesen Zusammenhang noch einmal grafisch:

Richtungskennungen

Ideen für Erweiterungen

Leider ist zum momentanen Zeitpunkt die Bot-2-Bot-Kommunikation noch nicht zum Aufruf von Verhalten oder zur Datenübertragung zu anderen Bots verwendbar. Denkbar wäre nämlich die Übertragung des kürzesten Weges, also des Stacks, zu einem anderen Bot. Dieser steht am Ausgangspunkt des ersten Bots und fährt nun direkt auf dem Linienlabyrinth zum Ziel. Im Moment ist nur die Erkennung einer X-Kreuzung implementiert, da dann aus jeder Richtung kommend immer beide Abgrundsensoren zuschlagen. Bei einer T-Kreuzung ist dies nicht gegeben und zur sicheren Erkennung einer solchen Kreuzung daher Einiges mehr zu berücksichtigen. Vielleicht wird dies ja später Beachtung finden… ;-)

Attachments

  • display.jpg Download (4.8 KB) - added by ip 3 years ago. Display zum Verhalten
  • explore_dest.jpg Download (8.1 KB) - added by ip 3 years ago. Karte nach Ausführung des Verhaltens
  • kennungen.jpg Download (30.9 KB) - added by ip 3 years ago. Richtungskennungen
  • map_drive_forward.jpg Download (10.3 KB) - added by ip 3 years ago. Karte mit Beschriftungen
  • parcours.jpg Download (27.2 KB) - added by ip 3 years ago. Parcours
  • parcours1.jpg Download (30.3 KB) - added by ip 3 years ago. Parcours mit Erklärungen

Download in other formats:

  • Plain Text

Trac Powered

Powered by Trac 0.11.7
By Edgewall Software.

http://www.ctmagazin.de/
http://www.ctmagazin.de/projekte/

  • Datenschutzhinweis
  • Impressum
  • Kritik, Anregungen bitte an c't-WWW
  • Mediadaten
  • Copyright © 2011 Heise Zeitschriften Verlag
  • International: The H, The H Security, The H Open Source