c't Projekte - c't-Bot und c't-Sim - Mailinglisten
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