c't Projekte - c't-Bot und c't-Sim - Mailinglisten

c't-Bot und c't-Sim


[Voriger (Datum)] [Nächster (Datum)] [Voriger (Thread)] [Nächster (Thread)]
[Nach Datum][Nach Thread]

Re: [ct-bot] neues Verhalten bot_drive_line_shortest_way...

Absender: Timo Sandmann
Datum: Mo, 05.01.2009 23:31:10
In-reply-to: <000001c965ae$2c0f39c0$0300a8c0@mexpnew>
References: <000001c965ae$2c0f39c0$0300a8c0@mexpnew>


Hi,

Am 24.12.2008 um 10:58 schrieb Frank Menzel:
Hallo,
in letzter Zeit ist es etwas scheinbar etwas ruhiger in der Mailingliste
geworden.

ja, ich wollte eigentlich noch vor dem Weihnachtsurlaub ein Verhalten vorstellen, das die CPU-Auslastung des Bots während der Ausführung eines anderen Verhaltens misst / ausgibt und außerdem auch die Live- Map-Anzeige für den echten Bot fertigstellen, da hat aber leider die Zeit nicht ganz gereicht. Das kommt dann demnächst.

So möchte ich pünktlich zu Weihnachten diese Ruhe etwas stören
und mein neues Verhalten bot_drive_line_shortest_way vorstellen.
Hier die Beschreibung laut Programmtext:
/*!
* @file    behaviour_drive_line_shortest_way.c
* @brief   Linienverfolger, der an Kreuzungen eine bestimmte
Vorzugsrichtung einschlaegt (links) und diesen Weg weiterverfolgt, bis
das Ziel
* (gruenes Feld an Wand) gefunden ist; Linien muessen immer an
einem gruenen Feld ohne Hindernis enden, damit der botein Ende erkennt
und
*          umdrehen kann

Hier wäre es schön, wenn das auch ohne die grünen Felder ginge, also dass der Bot selbst erkennt, wenn er sich im 360 Grad gedreht hat.


*          Die Kreuzungen und der eingeschlagene Weg werden auf dem
Stack vermerkt, Wege die nicht zum Ziel fuehren vergessen; Am Ziel
angekommen
*          steht im Stack der kuerzeste Weg; Es kann nun via Display
auf dem kuezesten Weg zum Ausgangspunkt zurueckgefahren werden oder der
Bot wieder
*          manuell an den Start gestellt werden und das Ziel auf
kuerzestem Weg angefahren werden
* @author Frank Menzel (Menzelfr@xxxxxx)
* @date    21.12.2008
*/

Sehr cooles Verhalten :-) Werde ich morgen mal ausprobieren und genauer anschauen!

Anbei auch der Parcour, mit dem das Verhalten funktioniert.

Finde ich den nicht, oder ist der irgendwo in den Weiten des Internets hängengeblieben?

Auf dem zum
Verhalten gehörenden Screen kann mit Taste 5 (GoLine) das Verhalten
gestartet werden, der Bot fährt vorwärts zur Linie und weiter via
Linienverfolger. An einer Kreuzung angekommen schlägt er den linken Weg ein und erforscht so alle Wege und Möglichkeiten zum Ziel zu kommen. Das
Ziel ist das rechte grüne Feld an der Wand (Zieldefinition Grün vor
Wand). Eine Linie endet an einem grünen Feld, wo der bot dann umkehrt
und zur Kreuzung zurückfährt und dann wieder den linken Weg nimmt. Die
Kreuzungen und die relativen Pfadabbiegungen werden auf den Stack
gespeichert. Eine Kreuzung, wo alle Wege ins Nichts führen, wird
vergessen, da diese irrelevant ist zur Zielfindung. So am Ziel
angekommen stehen im Stack nur noch alle Kreuzungen und Richtungen
direkt zum Ziel, der kürzeste Weg ist somit gefunden.

Ich habe jetzt noch nicht in den Code geschaut oder das Verhalten ausprobiert, aber nur mal nach der Beschreibung hier: Warum sollte das der kürzeste Weg sein? Ich meinte z.B. in folgendem Parcours:

Ziel
     |
----
|    |
----
     |
Start

Wenn ich die Beschreibung richtig verstehe, fährt der Bot jetzt linksherum den "Umweg" zum Ziel. Das ist aber doch dann nicht der kürzeste Weg?

Falls auf dem Weg
dorthin die Linie verloren wird, kann der Bot manuell wieder richtig auf
die Linie gesetzt werden und mit Taste 6 (Continue) das Verhalten an
dieser Stelle weitergeführt werden.
Am Ziel kann der Bot den nun feststehenden kürzesten Weg wieder zum
Ausgangspunkt zurückfahren via Taste 9 oder man stellt den Bot manuell
wieder an den Ausgangspunkt und mit Taste 8 geht’s direkt wieder zum
Ziel, d.h. an den Kreuzungen wird in die richtige Richtung direkt zum
Ziel abgebogen.
Ich habe Grün im Programm festgelegt, weil diese Farbe gut im Simu
darstellbar ist, kann aber auf die eigene gewünschte Farbe im Prog
festgelegt werden. Als Ziel gilt diese Farbe und dahinter Wand.
Als Erweiterungen könnte man später auch die die T-Kreuzungen erkennen,

Das wäre auf jeden Fall sehr sinnvoll :-)

würde aber hier erst einmal höheren Aufwand bedeuten. Auch könnte man
den kürzesten Weg, der sich ja bei Zielankunft im Stack befindet, einem 2. Bot senden via bot2bot-Kommunikation (wenn dies mal so möglich ist), der sich am Startpunkt des 1. Bots befindet und nun den Weg des 1. Bots
abfährt.

Gute Idee.

Nach Abfahren des Stacks (vorwärts oder rückwärts) ist hier der
Stack wieder leer, so könnte man auch verlustlos den abfahren um diesen
zu erhalten bzw. die Kreuzungen einfach erneut pushen.

Vielleicht wäre eine Funktion zum Klonen eines Positionsstacks hier praktisch? Einfach eine Kopie erstellen, die dann den Weg nicht vergisst, weil sie nicht benutzt wird. Will man noch mal fahren, macht man wieder eine Kopie usw.

Grüße,
Timo