c't

c't-Projekte - Mailinglisten


[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: 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=raw

Wenn 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=raw

Auß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ö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
*          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
*/

Anbei auch der Parcour, mit dem das Verhalten funktioniert. 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. 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,
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. 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.
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