c't

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