Absender: Timo Sandmann
Datum: Mi, 07.01.2009 01:15:16
In-reply-to:
<000001c965ae$2c0f39c0$0300a8c0@mexpnew>
References:
<000001c965ae$2c0f39c0$0300a8c0@mexpnew>
Hi Frank,ich habe das Verhalten jetzt mal genauer angeschaut und im Moment zwei Bugs bzw. Probleme: 1. Nach erfolgreicher Zielankunft und Start von shortest_way_forward() ab Start-Position (0 | 0) dreht sich der Bot endlos auf dem ersten Grünen Feld.
Zur Verdeutlichung hiervon ein kleines Video: http://www.heise.de/ct/projekte/machmit/ctbot/browser/galery/line_shortest_way_bug1.mov?rev=1529&format=rawWenn ich den Bot dann manuell etwas nach oben verschiebe, läuft das Verhalten weiter, findet allerdings das Ziel nicht mehr (siehe Video). Durch das manuelle Anschieben stimmt natürlich die vom Bot selbst gemessene Position nicht mehr ganz, aber eine so kleine Abweichung in X-Richtung darf das Verhalten eigentlich nicht aus dem Konzept bringen, denn auf dem echten Bot stimmt die gemessene Position ja nie so ganz exakt mit der Wirklichen überein. Kleine Abweichungen sollten das Verhalten nicht stören, sonst wird es dort nie so richtig funktionieren. Es kann aber auch sein, dass die falsche Route nichts mit der Verschiebung zu tun hat, ist nur eine Vermutung.
Das LOG zum Video von Bug 1 ist im Anhang.2. Zum weiteren Testen habe ich das störrische Grüne Feld direkt nach dem Start einfach mal entfernt, dann hakt es aber an anderer Stelle durch endloses hin- und her Gedrehe, hierzu auch ein Video:
http://www.heise.de/ct/projekte/machmit/ctbot/browser/galery/line_shortest_way_bug2.mov?rev=1529&format=rawAußerdem noch eine Frage: Das Verhalten verwendet jetzt nicht das Linienfolger-Verhalten, sondern hat im Kern eine Kopie davon, warum? Es wäre ja sehr elegant, wenn zur Linienverfolgung auf den Standard- Linienfolger zurückgegriffen würde und die Kreuzungen / Enden usw. zu einem Abbruch via cancel_behavior() führten. Gab's da Probleme mit der Umsetzung, oder warum hast du in das Verhalten noch mal den Linienfolger mit eingebaut?
Gruß, Timo
behaviour_line_shortest_way.c(247) - DEBUG - beide zugeschlagen und vor!!! behaviour_line_shortest_way.c(309) - DEBUG - vor turn 90 l/r 1023 1023,way_back 0 behaviour_line_shortest_way.c(336) - DEBUG - >> X ist neu vorw. und Push, counter 1 behaviour_line_shortest_way.c(424) - DEBUG - etwas vor nach Dreh l/r 1023 1023 behaviour_line_shortest_way.c(247) - DEBUG - beide zugeschlagen und vor!!! behaviour_line_shortest_way.c(309) - DEBUG - vor turn 90 l/r 1023 1023,way_back 0 behaviour_line_shortest_way.c(336) - DEBUG - >> X ist neu vorw. und Push, counter 1 behaviour_line_shortest_way.c(424) - DEBUG - etwas vor nach Dreh l/r 163 1023 behaviour_line_shortest_way.c(247) - DEBUG - beide zugeschlagen und vor!!! behaviour_line_shortest_way.c(309) - DEBUG - vor turn 90 l/r 1023 1023,way_back 0 behaviour_line_shortest_way.c(336) - DEBUG - >> X ist neu vorw. und Push, counter 1 behaviour_line_shortest_way.c(424) - DEBUG - etwas vor nach Dreh l/r 1023 1023 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 1023 1023 behaviour_line_shortest_way.c(247) - DEBUG - beide zugeschlagen und vor!!! behaviour_line_shortest_way.c(309) - DEBUG - vor turn 90 l/r 1023 1023,way_back 1 behaviour_line_shortest_way.c(324) - DEBUG - ---X vom Stack nehmen wg. back 1 counter 2 behaviour_line_shortest_way.c(328) - DEBUG - wieder push, back 0 counter 2 behaviour_line_shortest_way.c(424) - DEBUG - etwas vor nach Dreh l/r 1023 1023 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 1023 1023 behaviour_line_shortest_way.c(247) - DEBUG - beide zugeschlagen und vor!!! behaviour_line_shortest_way.c(309) - DEBUG - vor turn 90 l/r 1023 1023,way_back 1 behaviour_line_shortest_way.c(324) - DEBUG - ---X vom Stack nehmen wg. back 1 counter 3 behaviour_line_shortest_way.c(328) - DEBUG - wieder push, back 0 counter 3 behaviour_line_shortest_way.c(424) - DEBUG - etwas vor nach Dreh l/r 1023 1023 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 1023 1023 behaviour_line_shortest_way.c(247) - DEBUG - beide zugeschlagen und vor!!! behaviour_line_shortest_way.c(309) - DEBUG - vor turn 90 l/r 1023 1023,way_back 1 behaviour_line_shortest_way.c(324) - DEBUG - ---X vom Stack nehmen wg. back 1 counter 4 behaviour_line_shortest_way.c(330) - DEBUG - X wird vergessen-irrelevant behaviour_line_shortest_way.c(424) - DEBUG - etwas vor nach Dreh l/r 1023 1023 behaviour_line_shortest_way.c(247) - DEBUG - beide zugeschlagen und vor!!! behaviour_line_shortest_way.c(309) - DEBUG - vor turn 90 l/r 1023 1023,way_back 1 behaviour_line_shortest_way.c(324) - DEBUG - ---X vom Stack nehmen wg. back 1 counter 2 behaviour_line_shortest_way.c(328) - DEBUG - wieder push, back 0 counter 2 behaviour_line_shortest_way.c(424) - DEBUG - etwas vor nach Dreh l/r 1023 1023 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 259 1023 behaviour_line_shortest_way.c(247) - DEBUG - beide zugeschlagen und vor!!! behaviour_line_shortest_way.c(309) - DEBUG - vor turn 90 l/r 1023 1023,way_back 1 behaviour_line_shortest_way.c(324) - DEBUG - ---X vom Stack nehmen wg. back 1 counter 3 behaviour_line_shortest_way.c(328) - DEBUG - wieder push, back 0 counter 3 behaviour_line_shortest_way.c(424) - DEBUG - etwas vor nach Dreh l/r 1023 1023 behaviour_line_shortest_way.c(247) - DEBUG - beide zugeschlagen und vor!!! behaviour_line_shortest_way.c(309) - DEBUG - vor turn 90 l/r 1023 1023,way_back 0 behaviour_line_shortest_way.c(336) - DEBUG - >> X ist neu vorw. und Push, counter 1 behaviour_line_shortest_way.c(424) - DEBUG - etwas vor nach Dreh l/r 1023 1023 behaviour_line_shortest_way.c(212) - DEBUG - Ziel erreicht und Ende behaviour_line_shortest_way.c(441) - DEBUG - Ende Behav. l/r 545 975 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 545 545 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 545 68 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 545 545 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 545 68 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 545 545 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 545 68 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 545 545 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 1023 927 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 68 1023 behaviour_line_shortest_way.c(247) - DEBUG - beide zugeschlagen und vor!!! behaviour_line_shortest_way.c(309) - DEBUG - vor turn 90 l/r 1023 1023,way_back 1 behaviour_line_shortest_way.c(340) - DEBUG - Stack abfahren und Richtung aus Stack behaviour_line_shortest_way.c(358) - DEBUG - nach rechts behaviour_line_shortest_way.c(411) - DEBUG - X Richtg. 1 behaviour_line_shortest_way.c(424) - DEBUG - etwas vor nach Dreh l/r 1023 1023 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 1023 1023 behaviour_line_shortest_way.c(247) - DEBUG - beide zugeschlagen und vor!!! behaviour_line_shortest_way.c(309) - DEBUG - vor turn 90 l/r 1023 1023,way_back 1 behaviour_line_shortest_way.c(340) - DEBUG - Stack abfahren und Richtung aus Stack behaviour_line_shortest_way.c(362) - DEBUG - nach links behaviour_line_shortest_way.c(411) - DEBUG - X Richtg. 3 behaviour_line_shortest_way.c(424) - DEBUG - etwas vor nach Dreh l/r 927 1023 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 68 1023 behaviour_line_shortest_way.c(247) - DEBUG - beide zugeschlagen und vor!!! behaviour_line_shortest_way.c(309) - DEBUG - vor turn 90 l/r 1023 1023,way_back 1 behaviour_line_shortest_way.c(340) - DEBUG - Stack abfahren und Richtung aus Stack behaviour_line_shortest_way.c(358) - DEBUG - nach rechts behaviour_line_shortest_way.c(411) - DEBUG - X Richtg. 1 behaviour_line_shortest_way.c(424) - DEBUG - etwas vor nach Dreh l/r 1023 1023 behaviour_line_shortest_way.c(218) - DEBUG - auf Gruen Umkehr behaviour_line_shortest_way.c(435) - DEBUG - etwas vor after green l/r 68 927 behaviour_line_shortest_way.c(247) - DEBUG - beide zugeschlagen und vor!!! behaviour_line_shortest_way.c(309) - DEBUG - vor turn 90 l/r 1023 1023,way_back 1 behaviour_line_shortest_way.c(340) - DEBUG - Stack abfahren und Richtung aus Stack behaviour_line_shortest_way.c(349) - DEBUG - kein Pop moeglich behaviour_line_shortest_way.c(441) - DEBUG - Ende Behav. l/r 1023 1023
Am 24.12.2008 um 10:58 schrieb Frank Menzel:
Hallo,in letzter Zeit ist es etwas scheinbar etwas ruhiger in der Mailingliste geworden. So möchte ich pünktlich zu Weihnachten diese Ruhe etwas störenund 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 * 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 */Anbei auch der Parcour, mit dem das Verhalten funktioniert. Auf dem zumVerhalten 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 Richtungendirekt zum Ziel, der kürzeste Weg ist somit gefunden. Falls auf dem Weg dorthin 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,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. Bots abfährt. 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 diesenzu erhalten bzw. die Kreuzungen einfach erneut pushen. Erst einmal so weit. Ich hoffe, in Kürze eine Doku nachreichen zu können. Gruß, Frank< shortest_way_patch.txt>_______________________________________________ct-bot-entwickler Mailingliste ct-bot-entwickler@xxxxxxxxxxxxxxxxx http://www.heise.de/bin/newsletter/listinfo/ct-bot-entwickler