c't Projekte - c't-Bot und c't-Sim - Mailinglisten

c't-Bot und c't-Sim


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

AW: [ct-bot] neues Verhalten bot_drive_line_shortest_way...

Absender: Frank Menzel
Datum: Do, 15.01.2009 21:00:51
In-reply-to: <695B84F6-97CA-4611-A7C4-17B68E889766@xxxxxxxxxxxxxxx>


Hallo Timo,
habe nun schon den einen ToDo-Punkt erledigt: Es muss am Ende einer
Linie nun nicht mehr ein Gruen-Umkehrfeld kommen sondern ein
Überwachungsverhalten erkennt jetzt die Drehrichtungsumkehr. Kann via
Define umgeschaltet werden. 
Die grünen Felder sind hierbei, bis auf das Zielfeld, außer Funktion. 
Gruß, Frank

-----Ursprüngliche Nachricht-----
Von: ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx
[mailto:ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx] Im Auftrag von Timo
Sandmann
Gesendet: Dienstag, 13. Januar 2009 23:58
An: Entwicklung rund Mailingliste c't-Bot
Betreff: Re: [ct-bot] neues Verhalten bot_drive_line_shortest_way...

Hallo Frank,

das Verhalten ist jetzt im SVN, bei mir funktioniert es nun im Sim.  
Bin gespannt, wie es bei dir aussieht. Auf dem echten Bot muss ich das  
noch mal genauer testen. Ich habe das Verhalten leicht umbenannt, weil  
der Name sonst zu lang für die RemoteCall-Liste war. Ein paar ToDo- 
Punkte habe ich schon mal an den Anfang des Codes geschrieben, ebenso  
beim Linienfolger.
Vielen Dank für das Verhalten und den ganzen Testaufwand wegen der Bugs.

Grüße,
Timo

Am 10.01.2009 um 11:35 schrieb Frank Menzel:
> Hi Timo,
> also ich geb's jetzt auf. Was bei mir wunderbar läuft, ist bei Dir  
> genau
> andersrum. Keine Ahnung mehr warum. Auch eben habe ich noch mal bei  
> mir
> laufen lassen ohne Probleme...
> Meine Sim-Devel Version ist schon ein paar Wochen alt (letzter Eintrag
> laut changelog vom 21.11.), hat sich doch dort ja weiter nichts getan
> oder?
> Schade eigentlich:-(
>
> Gruß, Frank
>
> -----Ursprüngliche Nachricht-----
> Von: Timo Sandmann
> Gesendet: Samstag, 10. Januar 2009 00:36
> An: Frank Menzel
> Betreff: Re: [ct-bot] neues Verhalten bot_drive_line_shortest_way...
>
> Hi Frank,
>
> Am 09.01.2009 um 21:51 schrieb Frank Menzel:
>> Hallo Timo,
>> wie sieht's denn mit dieser Version bei Dir aus? Bei mir läuft sie
>> prima.
>
> mit Version 3 des Linienfolgers dreht der Bot regelmäßig auf freier
> Strecke / gerader Linie um und fährt wieder zurück. Genauer gesagt
> kommt er von der Linie ab und sucht sie dann und fährt danach in die
> falsche Richtung :-/
> Mit Version 2 passiert das nicht, auch die Kreuzungen wurden in meinem
> Testlauf korrekt erkannt, aber damit hängt er sich wieder an den
> Grünflächen auf und dreht dort endlos hin- und her.
>
> Welche Sim-Version verwendest du eigentlich, die Aktuelle vom Devel-
> Zweig?
>
>> Kann ich leider mit Deinem genannten Prog nicht aufzeichnen, weil
>> dieses wohl nur beim Mac läuft. Ich arbeite unter Windows und ein
>> anderes gutes Prog dafür habe ich noch nicht gefunden:-(
>
> Bei uns in der Uni wird unter Windows immer "Camtasia Studio" zur
> Vorlesungsaufzeichnung benutzt, das ist aber glaube ich ziemlich
> teuer. Vor X Jahren hab ich mal "Snag It" benutzt, das konnte damals
> auch Video aufzeichnen, wenn ich mich recht erinnere.
>
> Grüße,
> Timo


_______________________________________________
ct-bot-entwickler Mailingliste
ct-bot-entwickler@xxxxxxxxxxxxxxxxx
http://www.heise.de/bin/newsletter/listinfo/ct-bot-entwickler
Index: C:/botneu/ct-Bot/bot-logic/bot-logik.c
===================================================================
--- C:/botneu/ct-Bot/bot-logic/bot-logik.c	(revision 1534)
+++ C:/botneu/ct-Bot/bot-logic/bot-logik.c	(working copy)
@@ -288,6 +288,8 @@
 	#ifdef BEHAVIOUR_LINE_SHORTEST_WAY_AVAILABLE
 		// Linie folgen ueber Kreuzungen hinweg zum Ziel, kuerzester Weg befindet sich danach im Stack
 		insert_behaviour_to_list(&behaviour, new_behaviour(69, bot_line_shortest_way_behaviour, INACTIVE));
+		// Ueberwacherverhalten auf Fahren in entgegengesetzte Richtung bekommt hohe Prio, um vor bot_turn zu kommen
+		insert_behaviour_to_list(&behaviour, new_behaviour(169, bot_check_reverse_direction_behaviour, INACTIVE));
 	#endif
 
 	#ifdef BEHAVIOUR_OLYMPIC_AVAILABLE
Index: C:/botneu/ct-Bot/bot-logic/behaviour_line_shortest_way.c
===================================================================
--- C:/botneu/ct-Bot/bot-logic/behaviour_line_shortest_way.c	(revision 1534)
+++ C:/botneu/ct-Bot/bot-logic/behaviour_line_shortest_way.c	(working copy)
@@ -40,7 +40,7 @@
 #include "rc5-codes.h"
 #include "math_utils.h"
 
-//#define DEBUG_BEHAVIOUR_LINE_SHORTEST_WAY // Schalter fuer Debug-Code
+#define DEBUG_BEHAVIOUR_LINE_SHORTEST_WAY // Schalter fuer Debug-Code
 
 #ifndef LOG_AVAILABLE
 #undef DEBUG_BEHAVIOUR_LINE_SHORTEST_WAY
@@ -50,9 +50,13 @@
 #define LOG_DEBUG(a, ...) {}
 #endif
 
-/*! Version des Linefolgers, die optimal fuer dieses Verhalten ist */
+/*! Version des Linefolgers, der optimal fuer dieses Verhalten ist */
 #define OPTIMAL_LINE_BEHAVIOUR_VERSION 3
 
+/*! Check-Umkehrverhalten soll Drehrichtungswechsel erkennen (fuer Gruenfeld als Umkehrfeld auskommentieren)
+ *  Gruenfeld nicht mehr Umkehrfeld sondern nur noch Zielfeld */
+#define CHECK_REVERSE_BEHAVIOUR
+
 #if FOLLOW_LINE_VERSION != OPTIMAL_LINE_BEHAVIOUR_VERSION
 #warning "Optimal nur mit Version 3 des Linienfolgers"
 #endif
@@ -107,6 +111,25 @@
 /*! zaehlt gruene Felder */
 static uint8_t greencounter = 0;
 
+/*! Merkkoordinaten fuer bereits gefahrene Strecke */
+static int16_t lastpos_x = 0;
+static int16_t lastpos_y = 0;
+
+/*! Pruefung auf gefahrene Strecke notwendig fuer nicht optimalen Linienfolger */
+#if FOLLOW_LINE_VERSION != OPTIMAL_LINE_BEHAVIOUR_VERSION
+  #define DISTCHECK_NEEDED
+#endif
+
+/*!Check-Umkehrverhalten benoetigt ebenfalls Pruefung auf gefahrene Strecke; Define setzen */
+#ifdef CHECK_REVERSE_BEHAVIOUR
+  #define DISTCHECK_NEEDED
+#endif
+
+/*! Schwellwert fuer Pruefung der gefahrenen Strecke in mm 
+ */
+#define CHECK_DISTANCE 60
+#define CHECK_DISTANCE_QUAD (CHECK_DISTANCE * CHECK_DISTANCE)  // Quadrat der gefahrenen Strecke
+
 /* Zustaende des Verhaltens */
 #define GO_TO_LINE	              0
 #define CHECK_LINE	              1
@@ -118,7 +141,101 @@
 #define GOAL_FOUND                7
 #define END					      99
 
+
+
+/*     ************************************************************************* 
+ *     ** Verhalten zum Erkennung einer 180 Grad Drehung **
+ *     *************************************************************************
+*/
+
+#ifdef DISTCHECK_NEEDED
+
+/*! Prueft ob der Bot schon eine bestimmte Strecke gefahren ist seit dem letzten Durchgang
+ * @param  *last_xpoint   letzte gemerkte X-Koordinate
+ * @param  *last_ypoint   letzte gemerkte Y-Koordinate
+ * @return True, wenn Bot schon gewisse Strecke gefahren ist und Map zu checken ist sonst False
+ */
+static uint8_t distance_reached(int16_t * last_xpoint,int16_t * last_ypoint) {
+
+	// Abstand seit letztem Observerlauf ermitteln
+	uint16_t diff = get_dist(x_pos, y_pos, *last_xpoint, *last_ypoint);
+
+	//erst nach gewissem Abstand oder gleich bei noch initialem Wert Mappruefung
+	if (diff >= CHECK_DISTANCE_QUAD) { 
+			
+		*last_xpoint = x_pos;
+		*last_ypoint = y_pos;
+		return True;
+	}
+	return False;
+}
+
+#endif  // nur wenn gefordert
+
+
+#ifdef CHECK_REVERSE_BEHAVIOUR  // nur wenn Verhalten anstatt Gruenfeld verwendet werden soll
+
+static uint8_t reverse_state=0;
+static int16_t last_heading = 0;		/*!< letzte gemerkte Botausrichtung */
+#define CHECK_ANGLE_REV 170           /*!< nach Erreichen dieses Drehwinkels [Grad] wird Richtungsumkehr erkannt */
+
+static uint8_t bot_reverse=0;          /*!<  Kennung dass Bot die Umgedrehte Richtung eingenommen hat nach Richtungsumkehr */
+
+int16_t angle_t=0;
+
 /*!
+ * Verhalten zum Checken  auf Einnehmen der entgegengesetzten Richtung (Linienende)
+ */
+void bot_check_reverse_direction_behaviour(Behaviour_t * data) {
+	switch (reverse_state) {
+	case 0:
+        last_heading = heading;
+		reverse_state = 1;
+		bot_reverse=False;
+		//LOG_DEBUG("-Start Check reverse mit ang %1d",last_heading);
+		/* no break */
+	case 1:
+
+
+		// bei Drehwinkelaenderung und Uberschreitung einer gewissen Groesse (um 180 Grad) feuern
+		angle_t=turned_angle(last_heading);
+		if (angle_t>180) 
+			angle_t=360-angle_t;	
+		
+		if (angle_t > CHECK_ANGLE_REV) {
+			last_heading = heading;
+            LOG_DEBUG("-um Winkel gedreht %1d",angle_t);
+            bot_reverse=True;             // Kennung muss vom Auswerteverhalten  nach Erkennung rueckgesetzt werden
+            return_from_behaviour(data);  // gleich Deaktivierung nach Erkennung entgegengesetzte Richtung
+		}
+		
+		break;
+
+	default:
+		// kommt eigentlich nie hierher, da es solange aktiv ist bis Deaktivierung eintritt (Notaus oder Steuerung vom Verhalten selbst)
+		return_from_behaviour(data);
+		break;
+	}
+}
+
+
+/*!
+ * Botenfunktion: Verhalten zum Checken der Botrichtung auf Einnehmen der entgegengesetzten Richtung (Linienende)
+ * @param *caller	Der Verhaltensdatensatz des Aufrufers
+ */
+void bot_check_reverse_direction(Behaviour_t * caller) {
+	  // via Override umschalten; Aufruf erfolgt aller x mm gefahrene Strecke, falls Kurve gefahren wurde zum Setzen des neuen Pruefwinkels
+	  switch_to_behaviour(caller, bot_check_reverse_direction_behaviour, OVERRIDE);
+      reverse_state=0;
+}
+#else
+  // nur leeren Kopf definieren damit bekannt fuer bot_logic
+  void bot_check_reverse_direction_behaviour(Behaviour_t * data) {
+  }
+#endif  
+
+
+/*!
  * Push der Kreuzungsinformationen, etwas tricky dazu der eigentliche Positionsspeicher benutzt
  * @param crosstype	Typ der Kreuzung (jetzt nur 1 Typ, gedacht fuer spaetere Erweiterungen und weil Postyp sowieso 2 Params hat)
  * @param direction	eingeschlagener Weg an der Kreuzung
@@ -164,21 +281,37 @@
 	return True;
 }
 
+
+
+
+
 /*!
  * Prueft ob sich der Bot auf dem definierten Umkehr- Zielfeld befindet (via Default gruen; gut im Simulator verwendbar)
+ * @param goalcheck True falls Aufruf von Zielerkennung kam, False sonst fuer Pruefung auf Umkehrfeld
  * @return True falls Bot sich auf dem Farbfeld befindet sonst False
  */
-uint8_t green_field(void) {
+uint8_t green_field(uint8_t goalcheck) {
 	if (crossing_reached && ((sensLineL > GROUND_GOAL_DEF - 5 && sensLineL
 			< GROUND_GOAL_DEF + 5) || (sensLineR > GROUND_GOAL_DEF - 5
 			&& sensLineR < GROUND_GOAL_DEF + 5))) {
-		greencounter++;
-		if (greencounter > 5)
-			return True;
+#ifdef CHECK_REVERSE_BEHAVIOUR
+        if (goalcheck)  // nur fuer Zielcheck
+          return True;
+#else		
+        if (goalcheck) {  // bei Zielpruefung sofort True
+        	return True;
+        }
+        else {
+		  greencounter++;
+		  LOG_DEBUG("Gruen erkannt counter %1d, l/r %1d %1d",greencounter,sensLineL,sensLineR);
+		  if (greencounter > 5) {  //muss mehrmals hintereinander Gruenfeld erkennen um Fehlausloesungen besser zu vermeiden
+			  greencounter = 0;
+  		      return True;
+		  }
+        }
+#endif
 	}
-
 	return False;
-	greencounter = 0;
 }
 
 /*!
@@ -186,7 +319,7 @@
  * @return True falls bot sich auf dem Zielfarbfeld befindet sonst False
  */
 uint8_t goal_reached(void) {
-	if (green_field() && sensDistL < 300 && sensDistR < 300)
+	if (green_field(True) && sensDistL < 300 && sensDistR < 300)
 		return True;
 
 	return False;
@@ -195,34 +328,7 @@
 
 #if FOLLOW_LINE_VERSION != OPTIMAL_LINE_BEHAVIOUR_VERSION
 
-static int16_t lastpos_x = 0;
-static int16_t lastpos_y = 0;
-
-/*! nach dieser gefahrenen Strecke in mm werden Borderkennungen rueckgesetzt */
-#define CHECK_DISTANCE 30
-#define CHECK_DISTANCE_QUAD (CHECK_DISTANCE * CHECK_DISTANCE)  /*!< Quadrat der gefahrenen Strecke */
-
-
 /*!
- * Prueft ob der Bot schon eine bestimmte Strecke gefahren ist seit dem letzten Observerdurchgang
- * @param  *last_xpoint   letzte gemerkte X-Koordinate
- * @param  *last_ypoint   letzte gemerkte Y-Koordinate
- * @return True, wenn Bot schon gewisse Strecke gefahren ist und Map zu checken ist sonst False
- */
-static uint8_t distance_reached(int16_t * last_xpoint, int16_t * last_ypoint) {
-	// Abstand seit letztem Observerlauf ermitteln
-	uint16_t diff = get_dist(x_pos, y_pos, *last_xpoint, *last_ypoint);
-
-	//erst nach gewissem Abstand oder gleich bei noch initialem Wert Mappruefung
-	if (diff >= CHECK_DISTANCE_QUAD) {
-		*last_xpoint = x_pos;
-		*last_ypoint = y_pos;
-		return True;
-	}
-	return False;
-}
-
-/*!
  * Prueft ob der Bot sich auf einer Kreuzung befindet; weil Abgrundsensoren nicht gleichzeitig ueber Kreuzungslinie erscheinen, werden hier Kennungen fuer
  * die beiden Abgrundsensoren verwendet falls Linie erkannt wurde;Wird innerhalb der naechsten 3cm die andere Seite auch erkannt, so steht Bot auf Kreuzung
  * @return True falls bot sich auf Kreuzung befindet sonst False
@@ -233,12 +339,26 @@
 		lineState = GOAL_FOUND; // Verhalten Ende
 		return True;
 	}
-	if (green_field()) {
+	
+#ifdef CHECK_REVERSE_BEHAVIOUR
+	if (bot_reverse ) { // entgegengesetzte Richtung wurde eingenommen
 		way_back = True;
+		bot_reverse=False;               // Kennung Richtungswechsel wegsetzen
+		LOG_DEBUG("Richtungswechsel-Umkehr");
+		lineState = TURN_ON_GREEN;       // weiter mit Eintritt nach Gruenerkennung
+		//deactivateBehaviour(bot_check_reverse_direction_behaviour);  //Verhaltensueberwachung Richtungsumkehr beenden
+		return True;
+	}
+#else
+	if (green_field(False)) { // Umkehrfeld Gruenfeld erkannt
+		way_back = True;
 		LOG_DEBUG("auf Gruen Umkehr");
-		lineState = TURN_ON_GREEN; // weiter mit Eintritt nach Gruenerkennung
+		lineState = TURN_ON_GREEN;       // weiter mit Eintritt nach Gruenerkennung
 		return True;
 	}
+#endif
+	
+	
 
 	if (sensBorderL > BORDER_DANGEROUS || sensBorderR > BORDER_DANGEROUS) {
 		// Kennungen setzen auf Querlinie erkannt links oder rechts voraus, also wenn Abgrundsensor Linie (vorausgesetzt Abgrund gibt es nicht) erkennt
@@ -266,10 +386,15 @@
 	}
 
 	if (distance_reached(&lastpos_x, &lastpos_y)) {
-		LOG_DEBUG("Abstand gefahren und false");
 		border_side_l_fired = False;
 		border_side_r_fired = False;
+
+#ifdef CHECK_REVERSE_BEHAVIOUR			
+		// Ueberwachungsverhalten zum Check auf entgegengesetzte Richtung
+		bot_check_reverse_direction(0);  
+#endif	
 	}
+	
 
 	return False;
 }
@@ -285,12 +410,31 @@
 		lineState = 99; // Verhalten Ende
 		return True;
 	}
-	if (green_field()) {
+		
+#ifdef CHECK_REVERSE_BEHAVIOUR
+	if (bot_reverse ) { // entgegengesetzte Richtung wurde eingenommen
 		way_back = True;
+		bot_reverse=False;               // Kennung Richtungswechsel wegsetzen
+		LOG_DEBUG("Richtungswechsel-Umkehr");
+		lineState = TURN_ON_GREEN;       // weiter mit Eintritt nach Gruenerkennung
+		deactivateBehaviour(bot_check_reverse_direction_behaviour);  //Verhaltensueberwachung Richtungsumkehr beenden
+		return True;
+	}
+
+    if (distance_reached(&lastpos_x, &lastpos_y)) 
+  	    // Ueberwachungsverhalten zum Check auf entgegengesetzte Richtung starten oder mit neuer Ausrichtung weiterpruefen
+	    bot_check_reverse_direction(0);  	
+	
+#else
+  if (green_field(False)) { // Gruenfeld erkannt
+		way_back = True;
 		LOG_DEBUG("auf Gruen Umkehr");
-		lineState = TURN_ON_GREEN; // weiter mit Eintritt nach Gruenerkennung
+		lineState = TURN_ON_GREEN;       // weiter mit Eintritt nach Gruenerkennung
 		return True;
-	}
+	}	
+	
+#endif // Drehrichtungsumkehr mit Verhalten ueberwachen
+	
 	return False;
 }
 #endif	// OPTIMAL_VERSION
@@ -341,14 +485,14 @@
 		// cancel nur fuer die Linienfolger, die nicht Kreuzungen oder Abgrund erkennen
 		// der optimale Linienfolger 3 macht dies von sich aus
 #if FOLLOW_LINE_VERSION != OPTIMAL_LINE_BEHAVIOUR_VERSION
-		// fuer Cancel-Check_Verhalten letzten Positionen, also Botpos, belegen
-		lastpos_x = x_pos;
-		lastpos_y = y_pos;
-
 		// ebenfalls Kennungen initialisieren fuer Endeerkennung der Kreuzungen
 		border_side_l_fired = False;
 		border_side_r_fired = False;
 #endif
+        // fuer Cancel-Check_Verhalten letzten Positionen, also Botpos, belegen
+		lastpos_x = x_pos;
+		lastpos_y = y_pos;
+		
 		bot_cancel_behaviour(data, bot_follow_line_behaviour, check_crossing);
 
 		lineState = CHECK_BORDER; // naechster Zustand
@@ -501,11 +645,13 @@
 		break;
 
 	case TURN_ON_GREEN: // hierher nach Erkennung des Gruenfeldes mit Richtungsumkehr
-		LOG_DEBUG("Gruen erkannt und Umkehr");
 		deactivateBehaviour(bot_cancel_behaviour_behaviour); // Cancelverhalten fuer Linienfolger beenden
 		BLOCK_BEHAVIOUR(data, 500); // evtl. etwas warten
 		lineState = CHECK_LINE;
+#ifndef CHECK_REVERSE_BEHAVIOUR		// hat ja bereits die entgegengesetzte Richtung eingenommen und damit wieder in Ausgangs-Zielrichtung	
 		bot_turn(data, 180);
+		LOG_DEBUG("Umkehr erkannt und bot_turn");
+#endif
 		break;
 
 	case GOAL_FOUND:
Index: C:/botneu/ct-Bot/Changelog.txt
===================================================================
--- C:/botneu/ct-Bot/Changelog.txt	(revision 1534)
+++ C:/botneu/ct-Bot/Changelog.txt	(working copy)
@@ -1,5 +1,7 @@
-CHANGELOG fuer c't-Bot
+CHANGELOG fuer c't-Bot
 ======================
+2009-01-14 Frank Menzel [Menzelfr@xxxxxx]: bot_line_shortest_way nun auch ohne Gruenumkehrfelder; hierzu gibt es neues Ueberwachungsverhalten fuer Richtungsumkehr
+
 2009-01-13 Frank Menzel [Menzelfr@xxxxxxx]: Neues Verhalten bot_line_shortest_way und hierfuer neuer Linienfolger; Linienfolger mit Versionen auswaehlbar
 
 2009-01-13 Timo Sandmann [mail@xxxxxxxxxxxxxxx]: Wichtiger Bugfix fuer timer_ms_passed(): Es gibt jetzt je nach gewuenschter Aufloesung timer_ms_passed_8(), timer_ms_passed_16() und timer_ms_passed_32(), siehe include/timer.h
Index: C:/botneu/ct-Bot/ct-Bot.h
===================================================================
--- C:/botneu/ct-Bot/ct-Bot.h	(revision 1534)
+++ C:/botneu/ct-Bot/ct-Bot.h	(working copy)
@@ -53,7 +53,7 @@
 #define MEASURE_MOUSE_AVAILABLE			/*!< Geschwindigkeiten werden aus den Maussensordaten berechnet */
 //#define MEASURE_COUPLED_AVAILABLE		/*!< Geschwindigkeiten werden aus Maus- und Encoderwerten ermittelt und gekoppelt */
 
-//#define POS_STORE_AVAILABLE  /*!< Positionsspeicher vorhanden */
+#define POS_STORE_AVAILABLE  /*!< Positionsspeicher vorhanden */
 
 //#define WELCOME_AVAILABLE	/*!< kleiner Willkommensgruss */
 
Index: C:/botneu/ct-Bot/include/bot-logic/available_behaviours.h
===================================================================
--- C:/botneu/ct-Bot/include/bot-logic/available_behaviours.h	(revision 1534)
+++ C:/botneu/ct-Bot/include/bot-logic/available_behaviours.h	(working copy)
@@ -57,7 +57,7 @@
 
 //#define BEHAVIOUR_DRIVE_AREA_AVAILABLE /*!< flaechendeckendes Fahren mit Map */
 
-//#define BEHAVIOUR_LINE_SHORTEST_WAY_AVAILABLE /*!< Linienfolger ueber Kreuzungen zum Ziel */
+#define BEHAVIOUR_LINE_SHORTEST_WAY_AVAILABLE /*!< Linienfolger ueber Kreuzungen zum Ziel */
 
 /* Aufgrund einer ganzen reihe von Abhaengigkeiten sollte man beim Versuch Speicher
  * zu sparen, zuerst mal bei den Hauptverhalten ausmisten, sonst kommen die
Index: C:/botneu/ct-Bot/include/bot-logic/behaviour_line_shortest_way.h
===================================================================
--- C:/botneu/ct-Bot/include/bot-logic/behaviour_line_shortest_way.h	(revision 1534)
+++ C:/botneu/ct-Bot/include/bot-logic/behaviour_line_shortest_way.h	(working copy)
@@ -71,6 +71,11 @@
 void bot_line_shortest_way_backward(Behaviour_t * caller);
 
 /*!
+ * Verhalten zum Checken  auf Einnehmen der entgegengesetzten Richtung (Linienende)
+ */
+void bot_check_reverse_direction_behaviour(Behaviour_t * data);
+
+/*!
  * Display zum Verhalten
  */
 void bot_line_shortest_way_display(void);
Index: C:/botneu/ct-Bot/.settings/org.eclipse.cdt.core.prefs
===================================================================
--- C:/botneu/ct-Bot/.settings/org.eclipse.cdt.core.prefs	(revision 0)
+++ C:/botneu/ct-Bot/.settings/org.eclipse.cdt.core.prefs	(revision 0)
@@ -0,0 +1,3 @@
+#Thu Jan 15 20:46:02 CET 2009
+eclipse.preferences.version=1
+indexerId=org.eclipse.cdt.core.fastIndexer