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] Erweiterung Pfadplanung

Absender: Frank Menzel
Datum: Fr, 03.04.2009 18:30:53
In-reply-to: <5901ACA7-72E9-4E23-BFE0-31660246CDAA@xxxxxxxxxxxxxxx>



Hallo Timo,
habe eine neue Routine eingebaut in map.c als Ersatz für das fehlerhafte
map_get_avg. Die Routine check_value_circle prueft im Umkreispunkt, ob
ein bestimmter Vergleichswert unterschritten wird und wenn ja wird die
Routine sofort beendet. Die Pfadplanung habe ich damit ausgestattet und
meistert den Testparcour4 mit übergebener map nun super. Da ja avg über
alle Umkreisfelder geht zur Durchschnittsermittlung, ist diese Routine
nun bei der Hinderniserkennung wohl auch wesentlich schneller.
Damit sollte aus zumindest Punkt 2 der ToDo's in der Pfadplanung
erledigt sein (der Punkt 1 davon ist mir nicht ganz klar):
//TODO:	
Warum Durchschnitt? Fuehrt bei kleinen "Loechern" in der Map zu
Problemen
//TODO: Ganze Zelle sollte als Hindernis eingetragen werden, sobald auch
nur ein Feld der Map als belegt markiert ist!

Gruß, Frank

-----Ursprüngliche Nachricht-----
Von: ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx
[mailto:ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx] Im Auftrag von Timo
Sandmann
Gesendet: Donnerstag, 2. April 2009 14:13
An: Entwicklung rund um den c't-bot
Betreff: Re: [ct-bot] Erweiterung Pfadplanung

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hallo Frank,

Am 01.04.2009 um 20:27 schrieb Frank Menzel:
> Wieso das, bis Du dran?

ja, bin gestern aber nicht mehr dazu gekommen das fertig zu machen.

Gruß,
Timo

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Darwin)

iEYEARECAAYFAknUq+IACgkQDH/BX4067fJhYgCgwCPmVY9AJ96SJildbMEaFHDf
1tsAn20Q6QkFyX3eDl/u8cesr1Nmn7Vm
=oxuK
-----END PGP SIGNATURE-----

_______________________________________________
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_pathplaning.c
===================================================================
--- C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_pathplaning.c	(revision 1574)
+++ C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_pathplaning.c	(working copy)
@@ -51,7 +51,7 @@
 #include "log.h"
 #include "pos_store.h"
 
-//#define DEBUG_PATHPLANING	// Schalter fuer Debugausgaben
+#define DEBUG_PATHPLANING	// Schalter fuer Debugausgaben
 #ifdef MCU
 #undef DEBUG_PATHPLANING
 #endif
@@ -236,7 +236,7 @@
 	min_x = (min_x > 0) ? min_x : 0;
 
 	int16_t ym;
-	int8_t mapavg;
+	//int8_t mapavg;
 
 	// Zellen durchlaufen und aus der hochaufloesenden Weltkarte Hindernisse hier eintragen
 	for (y = max_y; y >= min_y; y--) {
@@ -248,10 +248,10 @@
 //TODO:	Warum Durchschnitt? Fuehrt bei kleinen "Loechern" in der Map zu Problemen
 //TODO: Ganze Zelle sollte als Hindernis eingetragen werden, sobald auch nur ein Feld der Map als belegt markiert ist!
 
-			mapavg = map_get_average(map_to_world_lowres(x), ym, average_val); // probiert: 80 zu viele Hind 60 40 gut, 30 gut, 20 gut weniger auch weniger Hindernisse
-			if (mapavg < map_compare_haz)  // Vergleichswert; damit kann auch auf nur befahrenen Wegen geplant werden bei Wert 30
+			//mapavg = map_get_average(map_to_world_lowres(x), ym, average_val); // probiert: 80 zu viele Hind 60 40 gut, 30 gut, 20 gut weniger auch weniger Hindernisse
+			if (!check_value_circle(map_to_world_lowres(x), ym, 0))  // Vergleichswert; damit kann auch auf nur befahrenen Wegen geplant werden bei Wert 30
 				access_field_lowres((position_t) {x, y}, 1, 1);
-
+ 
 		}
 	}
 
Index: C:/eclipse/workspace/ct-Bot/Changelog.txt
===================================================================
--- C:/eclipse/workspace/ct-Bot/Changelog.txt	(revision 1574)
+++ C:/eclipse/workspace/ct-Bot/Changelog.txt	(working copy)
@@ -1,5 +1,7 @@
 CHANGELOG fuer c't-Bot
 ======================
+2009-04-03 Frank Menzel [Menzelfr@xxxxxx]: neue Routine in map.c check_value_circle zum Einsatz in pathplaning; Routine ersetzt fehlerhaftes map_get_average und bricht schon ab falls Hindernis im Umfeld erkannt wird
+
 2009-03-31 Timo Sandmann [mail@xxxxxxxxxxxxxxx]: Map-2-Sim-Code ueberarbeitet, Sim kann jetzt die komplette Karte anfordern
 
 2009-03-27 Frank Menzel [Menzelfr@xxxxxx]: Pfadplanungsverhalten erweitert: schraeges Fahren und Planung nur auf befahrenem Gebiet ermoeglicht sowie Einzeichnen des Pfadweges (rot) via MAP_2_SIM_AVAILABLE
Index: C:/eclipse/workspace/ct-Bot/ct-Bot.h
===================================================================
--- C:/eclipse/workspace/ct-Bot/ct-Bot.h	(revision 1574)
+++ C:/eclipse/workspace/ct-Bot/ct-Bot.h	(working copy)
@@ -59,7 +59,7 @@
 
 #define ADC_AVAILABLE		/*!< A/D-Konverter */
 
-//#define MOUSE_AVAILABLE	/*!< Maus Sensor */
+#define MOUSE_AVAILABLE	/*!< Maus Sensor */
 
 #define ENA_AVAILABLE		/*!< Enable-Leitungen */
 #define SHIFT_AVAILABLE		/*!< Shift Register */
@@ -72,7 +72,7 @@
 
 #define POS_STORE_AVAILABLE		/*!< Positionsspeicher vorhanden */
 
-//#define MAP_AVAILABLE			/*!< Aktiviert die Kartographie */
+#define MAP_AVAILABLE			/*!< Aktiviert die Kartographie */
 //#define MAP_2_SIM_AVAILABLE	/*!< Sendet die Map zur Anzeige an den Sim */
 
 //#define SPEED_CONTROL_AVAILABLE /*!< Aktiviert die Motorregelung */
Index: C:/eclipse/workspace/ct-Bot/include/bot-logic/available_behaviours.h
===================================================================
--- C:/eclipse/workspace/ct-Bot/include/bot-logic/available_behaviours.h	(revision 1574)
+++ C:/eclipse/workspace/ct-Bot/include/bot-logic/available_behaviours.h	(working copy)
@@ -34,7 +34,7 @@
 
 #define BEHAVIOUR_SERVO_AVAILABLE 	/*!< Kontrollverhalten fuer die Servos */
 
-//#define BEHAVIOUR_PATHPLANING_AVAILABLE /*!< Pfadplanungsverhalten  */
+#define BEHAVIOUR_PATHPLANING_AVAILABLE /*!< Pfadplanungsverhalten  */
 //#define BEHAVIOUR_DRIVE_STACK_AVAILABLE /*!< Abfahren der auf dem Stack gesicherten Koordinaten */
 
 //#define BEHAVIOUR_OLYMPIC_AVAILABLE	/*!< Olympiadenverhalten vorhanden? */
@@ -58,7 +58,7 @@
 
 #define BEHAVIOUR_DELAY_AVAILABLE /*!< Delay-Routinen als Verhalten */
 
-//#define BEHAVIOUR_DRIVE_AREA_AVAILABLE /*!< flaechendeckendes Fahren mit Map */
+#define BEHAVIOUR_DRIVE_AREA_AVAILABLE /*!< flaechendeckendes Fahren mit Map */
 
 //#define BEHAVIOUR_LINE_SHORTEST_WAY_AVAILABLE /*!< Linienfolger ueber Kreuzungen zum Ziel */
 
Index: C:/eclipse/workspace/ct-Bot/include/map.h
===================================================================
--- C:/eclipse/workspace/ct-Bot/include/map.h	(revision 1574)
+++ C:/eclipse/workspace/ct-Bot/include/map.h	(working copy)
@@ -101,6 +101,16 @@
 static inline int8_t map_get_point(int16_t x, int16_t y) {
 	return map_get_average(x, y, 0);
 }
+ 
+/*!
+ * prueft ob innerhalb eines Radius-Umfeldes kein Feld den Vergleichswert unterschreitet; Falls doch sofortiges Ende der Routine;
+ * Hindernis wird mit MAP_RADIUS_FIELDS eingetragen
+ * @param x		Welt-X-Koordinate
+ * @param y		Welt-Y-Koordinate
+ * @param compare	Vergleichswert, der nicht unterschritten werden darf
+ * @return      True wenn alle Felder wenigstens den Vergleichswert haben, False wenn mindestens 1 Feld kleiner dem Wergleichswert ist
+ */ 
+uint8_t check_value_circle(int16_t x, int16_t y, int8_t compare);
 
 /*!
  * Berechnet das Verhaeltnis der Felder einer Region R die ausschliesslich mit Werten zwischen
Index: C:/eclipse/workspace/ct-Bot/map.c
===================================================================
--- C:/eclipse/workspace/ct-Bot/map.c	(revision 1574)
+++ C:/eclipse/workspace/ct-Bot/map.c	(working copy)
@@ -663,6 +663,48 @@
 }
 
 /*!
+ * Map-Umfeldpruefung ob ein bestimmter Wert compare ab einer Position xy mit Radius r nicht unterschritten wird
+ * @param x			Map-Koordinate
+ * @param y			Map-Koordinate
+ * @param radius	Radius des Umfeldes
+ * @param compare	Vergleichswert, der nicht unterschritten werden darf 
+ * @return          True wenn alle Felder wenigstens den Vergleichswert haben, False wenn mindestens 1 Feld kleiner dem Wergleichswert ist
+ */
+uint8_t check_value_field_circle(uint16_t x, uint16_t y, int8_t radius, int8_t compare) {
+	int8_t dX, dY;
+	int16_t h = muls8(radius, radius);
+	for (dX=-radius; dX<=radius; dX++) {
+		int16_t dX2 = muls8(dX, dX);
+		for (dY=-radius; dY<=radius; dY++) {
+			if (dX2 + muls8(dY, dY) <= h) {
+				// nur innerhalb des Umkreises
+				if (access_field(x + dX, y + dY, 0, 0) < compare) 
+					return False;
+			}
+		}
+	}
+	return True;
+}
+
+/*!
+ * prueft ob innerhalb eines Radius-Umfeldes kein Feld den Vergleichswert unterschreitet; Falls doch sofortiges Ende der Routine;
+ * Hindernis wird mit MAP_RADIUS_FIELDS eingetragen
+ * @param x		Welt-X-Koordinate
+ * @param y		Welt-Y-Koordinate
+ * @param compare	Vergleichswert, der nicht unterschritten werden darf
+ * @return      True wenn alle Felder wenigstens den Vergleichswert haben, False wenn mindestens 1 Feld kleiner dem Wergleichswert ist
+ */
+uint8_t check_value_circle(int16_t x, int16_t y, int8_t compare) {
+	uint8_t r;
+	// in Map mit dem Radius um x/y eintragen
+	for (r=1; r<=MAP_RADIUS_FIELDS; r++) {
+		if (!check_value_field_circle(world_to_map(x), world_to_map(y), r, compare))
+		  return False;
+	}
+	return True;
+}
+
+/*!
  * Aktualisiert die Karte mit den Daten eines Distanz-Sensors
  * @param x		X-Achse der Position des Sensors
  * @param y 	Y-Achse der Position des Sensors
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 @@
+#Thu Apr 02 12:50:09 CEST 2009
+eclipse.preferences.version=1
+indexerId=org.eclipse.cdt.core.fastIndexer