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 Mailinglistegeworden.
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 aneinem 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 Displayauf dem kuezesten Weg zum Ausgangspunkt zurueckgefahren werden oder derBot 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 viaLinienverfolger. An einer Kreuzung angekommen schlägt er den linken Weg ein und erforscht so alle Wege und Möglichkeiten zum Ziel zu kommen. DasZiel 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 | ---- | | ---- | StartWenn 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 Wegdorthin die Linie verloren wird, kann der Bot manuell wieder richtig aufdie 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 manden 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. Botsabfährt.
Gute Idee.
Nach Abfahren des Stacks (vorwärts oder rückwärts) ist hier derStack wieder leer, so könnte man auch verlustlos den abfahren um diesenzu 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