## c't-Projekte - Mailinglisten

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

### AW: [ct-bot] Bot_solve_maze mit Abbruchbedingung

Absender: Frank Menzel
Datum: Fr, 27.07.2007 20:03:02
In-reply-to: <8A40DEF0-32AF-40D2-807C-3BAE84129C58@xxxxxxxxxxxxxxx>

    Hallo,
    ich habe mir das so vorgestellt wie im Patch angehangen. Solve_maze wird
    dazu eine Abbruchfunktion übergeben, welche true liefert wenn eben
    solve_maze beendet werden soll. Das kann der Fall sein in
    map_go_destination, falls der Pfadplaner keinen Erfolg hatte. Dann
    geht?s weiter mit solve_maze solange, bis laut Map der Weg zum Ziel frei
    ist, was wiederum mittels map_way_freefields gecheckt wird...

    Mit freundlichen Grüßen
    Frank Menzel

    -----Ursprüngliche Nachricht-----
    Von: ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx
    [mailto:ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx] Im Auftrag von Timo
    Sandmann
    Gesendet: Freitag, 20. Juli 2007 15:56
    An: Entwicklung rund um den c't-bot
    Betreff: Re: [ct-bot] Bot_solve_maze mit Abbruchbedingung

    Hallo,

    Am 20.07.2007 um 15:27 schrieb Menzel, Frank IT-OO4:
    > Hallo,
    > Wie wäre es denn, wenn man dem Verhalten eine Beendigungsbedingung
    > mitgeben könnte in Form einer frei definierten Routine ? Ist diese
    > nicht belegt (default) ist alles wie jetzt. Wird diese belegt und
    > die darin festgelegte Bedingung erfüllt, so wird das Verhalten
    > einfach beendet.
    > Meine Denkweise geht dahin: Auf dem Weg zu einem Ziel komme ich zu
    > einem Hindernis. Mein Verhalten wird unterbrochen, ich starte
    > solve_maze mit der Abbruchbedingung und lande wieder in meinem
    > Verhalten auf dem Weg zum Ziel. So könnte man den Wandfolger
    > starten lassen zum umrunden des Hindernisses und wenn der Weg zum
    > Ziel frei ist wird es wieder beendet...

    das ist eine sehr gute Idee! :-)
    Ich würde aber vorschlagen sie allgemeiner und für alle Verhalten
    benutzbar umzusetzen, so wie das unter <https://www.heise.de/ct/
    projekte/machmit/ctbot/wiki/NeueVerhalten> (kann man evtl. etwas
    anders implementieren als dort skizziert) schon mal angedacht wurde.
    Abbrechen kann man laufende Verhalten "von außen" ja bereits per
    RemoteCall, derselbe Mechanismus sollte sich ebenfalls für ein
    Verhalten, das eine Boolsche Funktion als Bedingung übergeben bekommt
    und in Abhängigkeit davon den Abbruch durchführt, nutzen lassen.
    Voraussetzung ist allerdings, dass solve_maze() (und alle anderen
    Verhalten) auch korrekt initialisiert werden, wenn sie nach einem
    Abbruch neu gestartet wurden, siehe Bug #120 <https://www.heise.de/ct/
    projekte/machmit/ctbot/ticket/120>.

    Viele Grüße,
    Timo

    _______________________________________________
    ct-bot-entwickler Mailingliste
    ct-bot-entwickler@xxxxxxxxxxxxxxxxx
    http://www.heise.de/bin/newsletter/listinfo/ct-bot-entwickler

    Index: C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_map_go_destination.c
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_map_go_destination.c	(revision 1188)
    +++ C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_map_go_destination.c	(working copy)
    @@ -97,6 +97,10 @@
      */
     static uint8 hangon_behaviour_fired=False;

    +/*!
    + * Kennung ob bereits solve_maze nach einem erfolglosen Planungsversuch gelaufen ist
    + */
    +static uint8 solve_maze_started=0;

      /*! Elternposition, d.h. Botposition vor neuer Position */
     static uint16 x_parent=0;
    @@ -117,6 +121,16 @@
     	bot_drive_distance(0,0,-BOT_SPEED_FOLLOW,10);// 10cm rueckwaerts nur bei Hindernis
     }

    +/* Abbruchbedingung fuer den Wandverfolger solve_maze; ist laut Map der Weg zum Ziel frei, dann
    + * wird solve_maze beendet
    + */
    + int8 stop_if_way_free(void) {
    + 	// bei freier Fahrt zum Endepunkt Loesen von Wand
    +	if (map_way_free_fields(world_to_map(x_pos),world_to_map(y_pos),dest_x_map,dest_y_map)) {
    +		return True;
    +	}
    +   return False;
    + }

     // ============= eigenstaendiges Parallelverhalten zum eigentlichen Fahrverhalten =======

    @@ -527,8 +541,21 @@

     			// Pfadplanung hat naechsten anzufahrenden Punk um den Bot ermittelt
                 if (next_x==0 && next_y==0) {  // nichts gefunden -> Ende
    -				gotoStatexy=POS_REACHED;  // Kein Ziel mehr gefunden go_path und Schluss
    -				break;
    +				if (solve_maze_started==0) {
    +					solve_maze_started=1;
    +					gotoStatexy=DIRECTION_GOAL;  // Pfadplanung vorsehen
    +					// Pfadplanung kommt hier nicht weiter, solve_maze anwerfen-dieses
    +					// laeuft solange bis Weg zum Ziel frei ist oder dieses eben am Ausgang angekommen ist
    +					// dazu wird eine Abbruchfunktion uebergeben; sobald keine Wand mehr zu sehen ist und damit
    +					// an einer Ecke angekommen, wird diese Routine immer durchlaufen; ist laut Map der Weg zum
    +					// Ziel frei, dann liefert die Routine True und solve_maze wird beendet
    +					bot_solve_maze(data,stop_if_way_free);
    +					break;
    +				}
    +				else {
    +				  gotoStatexy=POS_REACHED;  // Kein Ziel mehr gefunden go_path und Schluss
    +				  break;
    +				}
     			}
                 // Zwischenziel belegen
     		    target_x = next_x;
    @@ -776,6 +803,7 @@
     		activateBehaviour(bot_avoid_border_behaviour);
     	#endif

    +    solve_maze_started=0; // Pfadplaner schon gelaufen init.
         gotoStatexy=DIRECTION_GOAL;  // auf Zielfahrt init.
        	switch_to_behaviour(caller, bot_gotoxy_behaviour_map, OVERRIDE);  // Umschaltung zum Fahr-Verhalten
     }
    Index: C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_solve_maze.c
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_solve_maze.c	(revision 1188)
    +++ C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_solve_maze.c	(working copy)
    @@ -54,6 +54,8 @@
     #define MEASURE_LEFT				1
     #define MEASURE_RIGHT				-1

    +/* Abbruchfunktion des Verhaltens() */
    +int8 (*check_function_solvemaze)(void)=0;

     /*!
      * Das Verhalten dreht sich um 45 Grad in die angegebene Richtung (0=rechts, 1=links)
    @@ -592,6 +594,12 @@
     				mazeState=SOLVE_MAZE_LOOP;
     				break;
     			}
    +			/* Pruefen der Abbruchfunktion wenn ueberhaupt definiert */
    +			if(check_function_solvemaze && (*check_function_solvemaze)()) {
    +			    mazeState=REACHED_GOAL;
    +				break;
    +			}
    +
     			/* messen, wo genau die Ecke ist */
     			mazeState=APPROACH_CORNER;
     			if (followWall==CHECK_WALL_LEFT){
    @@ -644,10 +652,13 @@
      * in nicht immer optimaler Weise aber in jedem Fall. Es arbeitet nach dem Hoehlenforscher-Algorithmus.
      * Einschraenkung: Objekte im Labyrinth, die Endlossschleifen verursachen koennen, z.b. ein einzeln
      * stehender Pfeiler im Labyrinth um den der Bot dann immer wieder herum fahren wuerde.
    + * @param caller Verhaltensdatensatz
    + * @param check Funktion, die bei True das Verhalten beendet; bei Uebergabe von 0 endlos
      */

    -void bot_solve_maze(Behaviour_t *caller){
    +void bot_solve_maze(Behaviour_t *caller,int8 (*check)(void)){
     	LOG_INFO("bot_solve_maze()");
    +	check_function_solvemaze = check;  // Abbruchfunktion wird zugewiesen
     	switch_to_behaviour(caller, bot_solve_maze_behaviour,NOOVERRIDE);
     }

    Index: C:/eclipse/workspace/ct-Bot/include/bot-logic/behaviour_solve_maze.h
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/include/bot-logic/behaviour_solve_maze.h	(revision 1188)
    +++ C:/eclipse/workspace/ct-Bot/include/bot-logic/behaviour_solve_maze.h	(working copy)
    @@ -38,9 +38,11 @@
      * in nicht immer optimaler Weise aber in jedem Fall. Es arbeitet nach dem Hoehlenforscher-Algorithmus.
      * Einschraenkung: Objekte im Labyrinth, die Endlossschleifen verursachen koennen, z.b. ein einzeln
      * stehender Pfeiler im Labyrinth um den der Bot dann immer wieder herum fahren wuerde.
    + * @param caller Verhaltensdatensatz
    + * @param check Funktion, die bei True das Verhalten beendet; bei Uebergabe von 0 endlos
      */

    -void bot_solve_maze(Behaviour_t *caller);
    +void bot_solve_maze(Behaviour_t *caller,int8 (*check)(void));

     /*!
      * Das Verhalten findet seinen Weg durch ein Labyrinth, das nach gewissen Grundregeln gebaut ist
    Index: C:/eclipse/workspace/ct-Bot/solve_maze_cancel.txt
    ===================================================================
    Index: C:/eclipse/workspace/ct-Bot/Changelog.txt
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/Changelog.txt	(revision 1188)
    +++ C:/eclipse/workspace/ct-Bot/Changelog.txt	(working copy)
    @@ -1,5 +1,9 @@
     CHANGELOG fuer c't-Bot
     ======================
    +2007-07-27 Frank Menzel  [mail@Menzelfr@gmx.net]: Verhalten solve_maze mit Abbruchfunktion versehen; einfach 0 uebergeben wenn es wie bisher endlos laufen soll;
    +                                                  Abbruchfunktion muss true liefern, wenn Verhalten beendet werden soll; so eingebaut in map_go_destination falls
    +                                                  Pfadplaner keinen Weg findet, dann solve_maze solange ausgefuehrt bis Weg zum Ziel frei laut Map
    +
     2007-07-19 Timo Sandmann [mail@xxxxxxxxxxxxxxx]: PC-EEPROM: Bugfix und Doku-Update

     2007-07-13 Achim Pankalla [achim.pankalla@xxxxxx]: PC-EEPROM-Emulation weiter optimiert
    Index: C:/eclipse/workspace/ct-Bot/ui/rc5.c
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/ui/rc5.c	(revision 1188)
    +++ C:/eclipse/workspace/ct-Bot/ui/rc5.c	(working copy)
    @@ -125,7 +125,7 @@
     		#endif

     		#ifdef BEHAVIOUR_SOLVE_MAZE_AVAILABLE
    -			case 5: bot_solve_maze(0); break;
    +			case 5: bot_solve_maze(0,0); break;
     		#else
     			#ifdef BEHAVIOUR_GOTOXY_AVAILABLE
     				case 5: bot_gotoxy(0, 20, 20); break;
    Index: C:/eclipse/workspace/ct-Bot/.settings/org.eclipse.cdt.core.prefs
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/.settings/org.eclipse.cdt.core.prefs	(revision 0)
    +++ C:/eclipse/workspace/ct-Bot/.settings/org.eclipse.cdt.core.prefs	(revision 0)
    @@ -0,0 +1,3 @@
    +#Fri Jul 27 19:11:28 CEST 2007
    +eclipse.preferences.version=1
    +indexerId=org.eclipse.cdt.core.fastIndexer

- Antworten:
  - Re: AW: [ct-bot] Bot_solve_maze mit Abbruchbedingung
    - From: Timo Sandmann

- Referenzen:
  - Re: [ct-bot] Bot_solve_maze mit Abbruchbedingung
    - From: Timo Sandmann

- Voriger (Datum): Re: [ct-bot] Bot_solve_maze mit Abbruchbedingung, Timo Sandmann
- Nächster (Datum): Re: AW: [ct-bot] Bot_solve_maze mit Abbruchbedingung, Timo Sandmann
- Voriger (Thread): Re: [ct-bot] Bot_solve_maze mit Abbruchbedingung, Timo Sandmann
- Nächster (Thread): Re: AW: [ct-bot] Bot_solve_maze mit Abbruchbedingung, Timo Sandmann
- Indizes:
  - Datum
  - Thread