c't

c't-Projekte - Mailinglisten


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

AW: [ct-bot] Re: erweiterter Linienfolger-neues Verhalten

Absender: Frank Menzel
Datum: Do, 26.02.2009 14:55:27
In-reply-to: <366D687D-4686-4948-9A05-E115BD38992C@xxxxxxxxxxxxxxx>


Index: C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_follow_line_enhanced.c
===================================================================
--- C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_follow_line_enhanced.c	(revision 0)
+++ C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_follow_line_enhanced.c	(revision 0)
@@ -0,0 +1,208 @@
+/*
+ * c't-Bot
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ * This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ */
+
+/*!
+ * @file 	behaviour_follow_line_enhanced.c
+ * @brief 	erweiterter Linienverfolger, der auch mit Unterbrechungen und Hindernissen klarkommt
+ * @author 	Frank Menzel (Menzelfr@xxxxxx) 
+  * @date 	25.02.2009
+ */
+
+
+#include "bot-logic/bot-logik.h"
+
+#ifdef BEHAVIOUR_FOLLOW_LINE_ENHANCED_AVAILABLE
+#include "math_utils.h"
+
+// Merkposition nach Umrunden Hindernis; erst wieder gewisse Strecke fahren bis Linienfolger abgebrochen werden kann fuer Hindernis
+static position_t pos_on_line;
+
+// Statusvariable des Verhaltens
+static uint8_t line_state_enh=0; 
+
+// naechster Verhaltenseinsprung nach cancel
+static uint8_t next_linestate=0;
+
+// Var fuer Positionsberechnung nach Unterbrechung
+position_t point;
+
+// Verhaltenszustaende
+#define START_ENH           0 
+#define START_LINE_ENH      1
+#define CHECK_BREAK_IN_LINE 2 
+#define START_SOLVE_MAZE    3 
+#define TURN_AROUND_HAZARD  4 
+#define GO_AROUND_HAZARD    5 
+#define OTHER_SIDE_ON_LINE  6   
+#define TURN_NEXT_PART      7
+#define SEARCH_LINE         8
+#define END_LINE_ENH        99 
+
+/* Check-Routine zum Erkennen ob sich bot schon auf der Linie befindet
+ * @return True wenn Linie erkannt wurde
+ */
+static uint8_t check_line_sensors(void) {
+	if (sensLineL >= LINE_SENSE || sensLineR >= LINE_SENSE) {
+		line_state_enh = next_linestate; // jeweils naechster Eintrittspunkt
+		return True;
+	}
+	return False;
+}
+
+/* Check-Routine zum Erkennen ob sich linker Liniensensor allein schon auf der Linie befindet; dies waere
+ * ja optimal fuer den Linienfolger, da dieser ja auf linker Kante faehrt; wird verwendet nach Umrunden des
+ * Hindernisses, um sich wieder auf Linie in richtiger Richtung, also vom Hindernis weg, auszurichten
+ * @return True wenn linker Liniensensor allein auf Linie steht
+ */
+static uint8_t check_left_line_sensor(void) {
+	if (sensLineL >= LINE_SENSE && sensLineR <LINE_SENSE) 
+		return True;
+	return False;
+}
+
+/* Check-Routine zum Erkennen, ob sich bot an einer Linienunterberechung befindet oder Hindernis gesehen wird; wird
+ * verwendet zum Abbrechen des Linienfolgers an Unterbrechung oder Hindernis
+ * @return True wenn Unterbrechung erkannt wird oder Hindernis voraus gesehen wird
+ */
+static uint8_t check_sensors(void) {
+  // Unterbrechung wird daran erkannt, wenn sich der Linienfolger wegen keiner Linie mehr voraus nach links dreht und dabei
+  // der rechte Abgrundsensor die unterbrochene Linie erkennt; Unterbrechung darf auch nur ca. maximal 3cm sein 
+  if (sensBorderR >= BORDER_DANGEROUS && sensLineL<LINE_SENSE && sensLineR<LINE_SENSE) {
+		line_state_enh=CHECK_BREAK_IN_LINE; 
+		return True;
+	}
+	
+	// Abstand seit letztem Check ermitteln; nur bei Ueberschreitung des Mindestabstandes seit letzter Hindernisumrundung
+	// darf wegen Hindernis abgebrochen werden, da sonst nach Umrundung und gleichem Hindernis beim Ausrichten des Linienfolgers
+	// dieser sonst gleich wieder moeglicherweise abgebrochen wird
+	uint16_t diff = get_dist(x_pos, y_pos, pos_on_line.x, pos_on_line.y);
+	if ((diff >= 100 * 100) || (pos_on_line.x==0 && pos_on_line.y==0)) {
+	  // Merkpos auf 0, wenn Abstand ueberschritten wurde
+	  pos_on_line.x=0;
+	  pos_on_line.y=0;	
+	  if (sensDistL <= OPTIMAL_DISTANCE || sensDistR <=OPTIMAL_DISTANCE) {
+		line_state_enh=TURN_AROUND_HAZARD; 
+		return True;
+	  }
+	}
+	
+	return False;
+}
+
+
+
+/*! erweiterter Linienfolger, der auch Linienunterbrechungen und Hindernisse handhabt, waehrend der Bot die Linie verfolgt;
+ *  die Linienunterbrechung darf nur relativ klein sein (~3cm), so dass sich beim drehen am Ende der Linie der rechte Abgrundsensor
+ *  ueber den Neubeginn der unterbrochenen Linie drehn muss
+  * @param *data	Verhaltensdatensatz
+ */ 
+void bot_follow_line_enhanced_behaviour(Behaviour_t * data) {
+	switch (line_state_enh) {
+	case START_ENH: // maximal 60cm vorwaerts bis Linie voraus
+	  bot_goto_dist(data, 600, 1); 
+	  next_linestate=START_LINE_ENH;  // Eintritt nachdem Cancel Linie gefunden hat
+	  bot_cancel_behaviour(data, bot_goto_pos_behaviour, check_line_sensors); // Ende der Vorwaertsfahrt wenn Linie erkannt wurde
+	  line_state_enh=END_LINE_ENH;  // Ende falls keine Linie voraus gefunden wird
+	break;		
+			
+	case START_LINE_ENH:              // Einsprung falls sich bot nun auf Linie befindet, weiter mit Linienfolger
+	    bot_follow_line(data);        // Linienfolger laeuft los
+		bot_cancel_behaviour(data, bot_follow_line_behaviour, check_sensors); // Abbruch Linienfolger bei Unterbrechung oder Hindernis
+		line_state_enh=END_LINE_ENH;  // einfach mal auf Ende, bei Cancel Linienfolger wird dort Einsprung gesetzt		
+		break;
+		
+	case CHECK_BREAK_IN_LINE: // Einsprung falls Linienunterbrechung erkannt wurde
+        // Linie geht ja weiter nach Unterbrechung genau dort, wo rechter Abgrundsensor sich befindet; dort also Punkt berechnen und anfahren
+		point = calc_point_in_distance(heading, BORDERSENSOR_POS_FW - 10, -BORDERSENSOR_POS_SW);
+		bot_goto_pos(data, point.x, point.y, 999);
+	    line_state_enh=START_LINE_ENH;  // Linienfolger sollte hier wieder greifen nach Ueberwindung der Unterbrechung
+	break;	
+
+   case TURN_AROUND_HAZARD:  // auf jeden Fall erst mal in Ausgangsrichtung drehen
+        //ToDo: beim Drehen in beide Richtungen ermitteln, ob schon Kante, also Ende, des Hindernisses (Stein auf Linie) gesehen wird und
+        //weil umgehen in diese Richtung kuerzer ist, dortlang drehen und Hindernisumgeher starten; solve_maze geht leider nur wenn bot sich
+        // hier links dreht und dann rechts die Wand hat
+        bot_turn(data, 70);  //Links drehen
+	    line_state_enh=GO_AROUND_HAZARD;  // naechsten Einsprung setzen
+		break;
+
+  case GO_AROUND_HAZARD:  // etwas vorwaerts fahren um von Linie wegzukommen
+        //ToDo_beim Drehen in beide Richtungen ermitteln, ob schon Kante, also Ende, des Hindernisses (Stein auf Linie) gesehen wird und
+        //weil umgehen in diese Richtung kuerzer ist, dortlang drehen und Hindernisumgeher starten
+        bot_goto_dist(data,50,1);  // etwas vorwaerts fahren um von Linie wegzukommen
+	    line_state_enh=START_SOLVE_MAZE;  // naechster Einsprung: Start solve_maze zum Umrunden des Hindernisses
+		break;
+		
+	case START_SOLVE_MAZE:    // Start Verhalten solve_maze zum Umrunden des Hindernisses
+        bot_solve_maze(data); // Start solve_maze 
+        next_linestate=OTHER_SIDE_ON_LINE;  // Eintritt nachdem Cancel Linie erkannt hat
+        // Solve_maze abbrechen, wenn wieder Linie hinter Hindernis erkannt wird
+        bot_cancel_behaviour(data, bot_solve_maze_behaviour, check_line_sensors); 
+     	break;	
+
+	
+	case OTHER_SIDE_ON_LINE:  // Bot steht auf anderer Seite des Hindernisses wieder auf der Linie
+	    // hier muss der bot in die vom Hindernis wegweisende Richtung ausgerichtet werden
+	    // da er links um den Stein gegangen ist, blickt er entweder etwas Richtung Stein oder fast parallel; 
+	    //einfach links wegdrehen, um ungefaehr die richtige Richtung einzunehmen
+  	    
+  	    //Sicherheit einbauen, dass er beim sich auf Linie Ausrichten und Hindernis sehen nicht wieder cancelt
+  	    //Pos merken und erst wieder nach gewissem Abstand Hinderniserkennung mit Abbruch Linienfolger erlauben
+  	    pos_on_line.x=x_pos;
+  	    pos_on_line.y=y_pos; 
+  	    line_state_enh=TURN_NEXT_PART;  // naechster Einsprung weiterdrehen mit Cancelueberwachung
+		bot_turn(data,40);              // etwas links drehen
+		break;	
+
+      case TURN_NEXT_PART:  // weitere Drehung in richtiger Richtung fuer Linienfolger mit Cancelueberwachung
+        //zweiter Teil der Drehung, hier aber Abbruch wenn linker Sensor auf Linie, da dies dann optimal fuer den Linienfolger ist
+		bot_turn(data,20);
+		bot_cancel_behaviour(data, bot_turn_behaviour, check_left_line_sensor); // Abbruch Drehung wenn optimal fuer Linienfolger
+		line_state_enh=SEARCH_LINE;  // naechster Eintrittspunkt
+		break;	
+
+	case SEARCH_LINE:  //etwas vorfahren, um optimale Position fuer Linienfolger zu erreichen, falls er noch nicht optimal steht
+        if (!check_left_line_sensor()) {
+          bot_goto_dist(data,50,1);  // etwas vor bis nur links Linie erkannt wird, dann optimal fuer Linienfolger
+          bot_cancel_behaviour(data, bot_goto_pos_behaviour, check_left_line_sensor); // Vorfahren abbrechen wenn optimal fuer Linienfolger
+        }
+ 		//eigentlich wurde hier alles getan, um den bot optimal fuer den Linienfolger hinzusetezn in die richtige Richtung nach Hindernisumrundung; mit dieser
+ 		//Hoffnung gehts weiter mit dem Linienfolger
+		line_state_enh=START_LINE_ENH;  // naechster Einsprung->Linienfolger geht von vorn los
+		break;	
+
+	default:
+		return_from_behaviour(data);
+		break;
+	}
+
+}
+
+/*! Botenverhalten fuer den erweiterten Linienfolger
+ * @param *caller Verhaltensdatensatz des Aufrufers
+ */ 
+void bot_follow_line_enhanced(Behaviour_t * caller) {
+	switch_to_behaviour(caller, bot_follow_line_enhanced_behaviour, NOOVERRIDE);
+	line_state_enh=0;
+	pos_on_line.x=0;
+	pos_on_line.y=0;
+}
+
+ 
+#endif
Index: C:/eclipse/workspace/ct-Bot/bot-logic/bot-logik.c
===================================================================
--- C:/eclipse/workspace/ct-Bot/bot-logic/bot-logik.c	(revision 1552)
+++ C:/eclipse/workspace/ct-Bot/bot-logic/bot-logik.c	(working copy)
@@ -288,6 +288,11 @@
 		insert_behaviour_to_list(&behaviour, new_behaviour(71, bot_calc_wave_behaviour, INACTIVE));
     #endif
 
+	#ifdef BEHAVIOUR_FOLLOW_LINE_ENHANCED_AVAILABLE
+	  	// erweiterter Linienfolge, der mit Unterbrechungen und Hindernissen klarkommt
+		insert_behaviour_to_list(&behaviour, new_behaviour(71, bot_follow_line_enhanced_behaviour, INACTIVE));	  
+	#endif
+
 	#ifdef BEHAVIOUR_FOLLOW_LINE_AVAILABLE
 		// Verhalten um einer Linie zu folgen
 		insert_behaviour_to_list(&behaviour, new_behaviour(70, bot_follow_line_behaviour, INACTIVE));
Index: C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_follow_line.c
===================================================================
--- C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_follow_line.c	(revision 1552)
+++ C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_follow_line.c	(working copy)
@@ -31,6 +31,7 @@
 #include "bot-logic/bot-logik.h"
 
 #ifdef BEHAVIOUR_FOLLOW_LINE_AVAILABLE
+#include "math_utils.h"
 
 //#define DEBUG_BEHAVIOUR_FOLLOW_LINE // Schalter fuer Debug-Code
 
@@ -421,4 +422,8 @@
 }
 
 #endif	// VERSION
+
+
+
+
 #endif	// BEHAVIOUR_FOLLOW_LINE_AVAILABLE
Index: C:/eclipse/workspace/ct-Bot/Changelog.txt
===================================================================
--- C:/eclipse/workspace/ct-Bot/Changelog.txt	(revision 1552)
+++ C:/eclipse/workspace/ct-Bot/Changelog.txt	(working copy)
@@ -1,5 +1,7 @@
 CHANGELOG fuer c't-Bot
 ======================
+2009-02-25 Frank Menzel [Menzelfr@xxxxxx]: neues Verhalten behaviour_follow_line_enhanced; erweiterter Linienfolger um auch mit Unterbrechungen und Hindernissen klarzukommen
+
 2009-02-24 Timo Sandmann [mail@xxxxxxxxxxxxxxx]: Command-Code optimiert
 												 Bugfix fuer HW-SPI und MOUSE_AVAILABLE (#180)
 												 SPI-Code unterstuetzt verschiedene Geschwindigkeiten
Index: C:/eclipse/workspace/ct-Bot/include/bot-logic/behaviour_follow_line_enhanced.h
===================================================================
--- C:/eclipse/workspace/ct-Bot/include/bot-logic/behaviour_follow_line_enhanced.h	(revision 0)
+++ C:/eclipse/workspace/ct-Bot/include/bot-logic/behaviour_follow_line_enhanced.h	(revision 0)
@@ -0,0 +1,50 @@
+/*
+ * c't-Bot
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ * This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ */
+
+/*!
+ * @file 	behaviour_follow_line_enhanced.c
+ * @brief 	erweiterter Linienverfolger, der auch mit Unterbrechungen und Hindernissen klarkommt
+ * @author 	Frank Menzel (Menzelfr@xxxxxx) 
+  * @date 	25.02.2009
+ */
+
+#include "bot-logic/bot-logik.h"
+
+#ifndef BEHAVIOUR_FOLLOW_LINE_ENHANCED_H_
+#define BEHAVIOUR_FOLLOW_LINE_ENHANCED_H_
+
+#ifdef BEHAVIOUR_FOLLOW_LINE_ENHANCED_AVAILABLE
+
+
+
+/*! erweiterter Linienfolger, der auch Linienunterbrechungen und Hindernisse handhabt, waehrend der Bot die Linie verfolgt;
+ *  die Linienunterbrechung darf nur relativ klein sein (~3cm), so dass sich beim drehen am Ende der Linie der rechte Abgrundsensor
+ *  ueber den Neubeginn der unterbrochenen Linie drehn muss
+ *  @param *data	Verhaltensdatensatz
+ */ 
+void bot_follow_line_enhanced_behaviour(Behaviour_t * data);
+
+/*! Botenverhalten fuer den erweiterten Linienfolger
+ * @param *caller Verhaltensdatensatz des Aufrufers
+ */ 
+void bot_follow_line_enhanced(Behaviour_t * caller); 
+
+#endif	// BEHAVIOUR_FOLLOW_LINE_ENHANCED_AVAILABLE
+#endif	/*BEHAVIOUR_FOLLOW_LINE_ENHANCED_H_*/
+
Index: C:/eclipse/workspace/ct-Bot/include/bot-logic/available_behaviours.h
===================================================================
--- C:/eclipse/workspace/ct-Bot/include/bot-logic/available_behaviours.h	(revision 1552)
+++ C:/eclipse/workspace/ct-Bot/include/bot-logic/available_behaviours.h	(working copy)
@@ -30,6 +30,7 @@
 #define BEHAVIOUR_SCAN_AVAILABLE	/*!< Gegend scannen vorhanden? */
 //#define BEHAVIOUR_SOLVE_MAZE_AVAILABLE	/*!< Wandfolger vorhanden? */
 #define BEHAVIOUR_FOLLOW_LINE_AVAILABLE	/*!< Linienfolger vorhanden? */
+#define BEHAVIOUR_FOLLOW_LINE_ENHANCED_AVAILABLE /*!< erweiterter Linienfolger, der auch mit Unterbrechungen und Hindernis klarkommt */
 
 #define BEHAVIOUR_SERVO_AVAILABLE 	/*!< Kontrollverhalten fuer die Servos */
 
@@ -125,6 +126,13 @@
 	#undef BEHAVIOUR_DRIVE_STACK_AVAILABLE
 #endif
 
+#ifdef BEHAVIOUR_FOLLOW_LINE_ENHANCED_AVAILABLE
+  #define BEHAVIOUR_FOLLOW_LINE_AVAILABLE
+  #define BEHAVIOUR_GOTO_POS_AVAILABLE
+  #define BEHAVIOUR_CANCEL_BEHAVIOUR_AVAILABLE
+  #define BEHAVIOUR_SOLVE_MAZE_AVAILABLE
+#endif
+
 #ifdef BEHAVIOUR_FOLLOW_LINE_AVAILABLE
 	#define BEHAVIOUR_DRIVE_DISTANCE_AVAILABLE
 	#define BEHAVIOUR_TURN_AVAILABLE
@@ -233,6 +241,7 @@
 
 #include "bot-logic/behaviour_solve_maze.h"
 #include "bot-logic/behaviour_follow_line.h"
+#include "bot-logic/behaviour_follow_line_enhanced.h"
 
 #include "bot-logic/behaviour_olympic.h"
 
Index: C:/eclipse/workspace/ct-Bot/include/bot-logic/behaviour_follow_line.h
===================================================================
--- C:/eclipse/workspace/ct-Bot/include/bot-logic/behaviour_follow_line.h	(revision 1552)
+++ C:/eclipse/workspace/ct-Bot/include/bot-logic/behaviour_follow_line.h	(working copy)
@@ -51,5 +51,7 @@
  * @param *caller Verhaltensdatensatz des Aufrufers
  */
 void bot_follow_line(Behaviour_t * caller);
+
+
 #endif	// BEHAVIOUR_FOLLOW_LINE_AVAILABLE
 #endif	/*BEHAVIOUR_FOLLOW_LINE_H_*/
Index: C:/eclipse/workspace/ct-Bot/ui/rc5.c
===================================================================
--- C:/eclipse/workspace/ct-Bot/ui/rc5.c	(revision 1552)
+++ C:/eclipse/workspace/ct-Bot/ui/rc5.c	(working copy)
@@ -152,7 +152,9 @@
 			case 4: bot_follow_object(NULL); break;
 		#endif	// BEHAVIOUR_CATCH_PILLAR_AVAILABLE
 
-		#if defined BEHAVIOUR_SOLVE_MAZE_AVAILABLE
+		#if defined BEHAVIOUR_FOLLOW_LINE_ENHANCED_AVAILABLE
+		    case 5: bot_follow_line_enhanced(NULL); break;
+		#elif defined BEHAVIOUR_SOLVE_MAZE_AVAILABLE
 			case 5: bot_solve_maze(NULL); break;
 		#elif defined BEHAVIOUR_FOLLOW_LINE_AVAILABLE
 			case 5: bot_follow_line(NULL); 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 @@
+#Wed Feb 25 11:19:09 CET 2009
+eclipse.preferences.version=1
+indexerId=org.eclipse.cdt.core.fastIndexer
Index: C:/eclipse/workspace/ct-Sim/ctSim/model/ParcoursLoader.java
===================================================================
--- C:/eclipse/workspace/ct-Sim/ctSim/model/ParcoursLoader.java	(revision 1550)
+++ C:/eclipse/workspace/ct-Sim/ctSim/model/ParcoursLoader.java	(working copy)
@@ -240,6 +240,42 @@
 		0f - LINEWIDTH/2,	-0.5f,				0f,	// Linie runter zum Ausgangspunkt
 	};
 	
+	/**
+	 * Linie -- mit Unterbrechung vertikal
+	 * besteht aus 2 untereinander liegenden Teillinien
+	 */
+	public static final float[] LINE_BREAK_VERT = {
+		0f +LINEWIDTH/2 , 0.5f               ,0f,	// Start oben rechts
+		0f -LINEWIDTH/2 , 0.5f               ,0f,	// kurze Linie nach links
+		0f -LINEWIDTH/2 , 0.0f + LINEWIDTH/2 ,0f,	// Linie runter bis oberhalb Mitte
+		0f +LINEWIDTH/2	, 0.0f + LINEWIDTH/2 ,0f,	// Linie nach rechts
+		0f +LINEWIDTH/2	, 0.5f               ,0f,	// Linie wieder nach oben
+
+		0f +LINEWIDTH/2 , 0.0f - LINEWIDTH/2 ,0f,	// Start rechts unterhalb Mitte
+		0f -LINEWIDTH/2 , 0.0f - LINEWIDTH/2 ,0f,	// kurze Linie nach links
+		0f -LINEWIDTH/2 , -0.5f               ,0f,	// Linie ganz runter 
+		0f +LINEWIDTH/2 , -0.5f               ,0f,	// kurze Linie unten nach rechts
+		0f +LINEWIDTH/2 , 0.0f - LINEWIDTH/2 ,0f,	// Linie wieder hoch bis unterhalb Mitte
+	};
+	
+	/**
+	 * Linie -- mit Unterbrechung horizontal
+	 * besteht aus 2 nebeneinander liegenden Teillinien
+	 */ 
+	public static final float[] LINE_BREAK_HOR = {
+		-0.5f           , 0.0f + LINEWIDTH/2 ,0f,	// Start links oberhalb Mitte 
+		-0.5f           , 0.0f - LINEWIDTH/2 ,0f,	// kurze Linie links runter
+		0f -LINEWIDTH/2 , 0.0f - LINEWIDTH/2 ,0f,	// Linie nach rechts bis links von Mitte
+		0f -LINEWIDTH/2	, 0.0f + LINEWIDTH/2 ,0f,	// kurze Linie hoch
+        -0.5f			, 0.0f + LINEWIDTH/2 ,0f,	// Linie wieder nach Links
+		
+        0f +LINEWIDTH/2 , 0.0f + LINEWIDTH/2 ,0f,	// Start Linie oberhalb Mitte rechts
+		0f +LINEWIDTH/2 , 0.0f - LINEWIDTH/2 ,0f,	// Kurze Linie runter
+		0.5f            , 0.0f - LINEWIDTH/2 ,0f,	// Linie bis ganz rechts
+		0.5f            , 0.0f + LINEWIDTH/2 ,0f,	// kurze Linie rechts hoch
+		0f +LINEWIDTH/2 , 0.0f + LINEWIDTH/2 ,0f,	// Linie wieder links bis kurz vor Mitte
+	};
+	
 	/** Wand-Hoehe */
 	private static final float WALL_HEIGHT = 0.2f;
 
@@ -618,6 +654,14 @@
 						createLine(x, y, LINE_CROSSING_T_ROT_CLOCKWISE,
 								getAppearance(this.parcoursMap[x][y]));
 						break;
+					case '!':
+						createLine(x, y, LINE_BREAK_VERT,
+								getAppearance(this.parcoursMap[x][y]));
+						break;
+					case '%':
+						createLine(x, y, LINE_BREAK_HOR,
+								getAppearance(this.parcoursMap[x][y]));
+						break;
 					}
 
 			}
Index: C:/eclipse/workspace/ct-Sim/ctSim/model/Parcours.java
===================================================================
--- C:/eclipse/workspace/ct-Sim/ctSim/model/Parcours.java	(revision 1550)
+++ C:/eclipse/workspace/ct-Sim/ctSim/model/Parcours.java	(working copy)
@@ -627,6 +627,8 @@
 				case '}':
 				case 'T':
 				case '~':
+				case '!':
+				case '%':
 					parcoursMapSimple[x][y] = 0;
 					break;
 				default:
Index: C:/eclipse/workspace/ct-Sim/Changelog.txt
===================================================================
--- C:/eclipse/workspace/ct-Sim/Changelog.txt	(revision 1550)
+++ C:/eclipse/workspace/ct-Sim/Changelog.txt	(working copy)
@@ -1,5 +1,7 @@
 Changelog fuer c't-Sim
 ======================
+2009-02-25 Frank Menzel [menzelfr@xxxxxx]: Linienunterbrechungen ermoeglicht mit den Zeichen ! und %
+
 2009-02-15 Timo Sandmann [mail@xxxxxxxxxxxxxxx]: Map-Anzeige um Debug-Linien und heading-Anzeige erweitert
 
 2008-12-16 Timo Sandmann [mail@xxxxxxxxxxxxxxx]: Individuelle Subcommands fuer Bot-2-Bot-Kommunikation implementiert.