heise online | · | c't | · | iX | · | Technology Review | · | Telepolis | · | mobil | · | Security | · | Netze | · | heise open | · | heise resale | · | Autos | · | c't-TV | · | Jobs | · | Kiosk

Aktuelles Heft #### Support Hotline & FAQ Tipps & Tricks Treiber & BIOS Firmenkontakte #### Download Software zu c't Software-Verzeichnis c't-Projekte Testbilder & Vorlagen #### Service Tipp-Datenbank c't-CD-Register Internettarife Telefontarife Virenschutz #### Magazin Heftarchiv c't specials English Pages Benchmarks Red. Stuff Leserforum c't-Bildmotive URLs aus c't Schlagseite #### Aktionen Browsercheck Krypto-Kampagne Schulen ans Netz Netz gegen Kinderporno TV/Radio-Termine #### Info Abo & Heft Veranstaltungen Mediadaten Kontakt Impressum Kleinanzeigen und Veranstaltungen
| 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: AW: [ct-bot] Verhalten behaviour_goto_pos -> transport_pillar_behaviour Absender: Frank Menzel Datum: Di, 23.10.2007 20:53:32 In-reply-to: <3F1E1A2A-53A5-48F5-8C4E-C966ADCA6381@xxxxxxxxxxxxxxx>
    Hallo,
    anbei mal mein Verhalten zum Hin- und Herfahren zwischen 2 Positionen
    bzw. Farbpads, welches auch die verschiedenen bisherigen Fahrverhalten
    unter einem Dach vereint.
    Hier habe ich mal das goto_pos Verhalten standardmäßig eingestellt, was
    auch auf dem echten gut funktioniert und zum Testen dienen soll.
    Der Patch ist erst mal als Testversion zu sehen, bin auf Reaktionen sehr
    gespannt.
    Folgendes Vorgehen:
    Bot startet ja auf einem Farbpad und diesen nun in Richtung des anderen
    Farbpads ausrichten. Mit "9" wird in diese Richtung gefahren und das
    Farbpad dann automatisch erkannt. Ab nun übernimmt das eingestellte
    Fahrverhalten und der Bot fährt mit diesem von Start- zur Zielpos. hin
    und her. Bei Ankunft sieht er sich nach einem Objekt zum Einfangen um,
    fängt dieses mit catch_pillar ein und bringt es zur anderen Position.
    Mit der "7" kann auch einen beliebige andere Position, die nicht auf
    einem Farbpad liegt, definiert werden. Mit Ändern der Defines ist noch
    anderes möglich, siehe Quellcode.
    Hier kann, wie gesagt, das neue Verhalten goto_pos schön getestet werden
    und es kommt ebenfalls das neue cancel-Verhalten zum Einsatz (Wandfolger
    läuft los bei Start auf Linie und bei Zielpos beendet).

    Soweit erst mal für Heute...
    Gruß, Frank Menzel

    -----Ursprüngliche Nachricht-----
    Von: ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx
    [mailto:ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx] Im Auftrag von Timo
    Sandmann
    Gesendet: Dienstag, 23. Oktober 2007 07:22
    An: Entwicklung rund um den c't-bot
    Betreff: Re: AW: [ct-bot] Verhalten behaviour_goto_pos

    Hallo Frank,

    Am 22.10.2007 um 20:06 schrieb Frank Menzel:
    > Hallo Timo,
    > ohne auf die Koordinaten selbst zu schauen, sah es optisch sehr genau
    > aus.
    > Falls Du genaue Koordinaten haben möchtest, muß ich morgen gucken...

    ja, würde mich mal interessieren, wie es auf einem anderen Bot und
    anderem Untergrund usw. aussieht. Ich hätte es schon gern, wenn der
    Fehler im mm- und nicht im cm-Bereich liegt. Das eilt aber nicht ;-)

    Gruß 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/behaviour_transport_pillar.c
    ===================================================================
    --- C:/botneu/ct-Bot/bot-logic/behaviour_transport_pillar.c	(revision 0)
    +++ C:/botneu/ct-Bot/bot-logic/behaviour_transport_pillar.c	(revision 0)
    @@ -0,0 +1,545 @@
    +/*
    + * 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_transport_pillar.c
    + * @brief 	Bot startet von einem Farb-Startpad und entdeckt die Welt, bis er auf ein anderes
    + *          Farbpad stoesst. Er faehrt nun zwischen den beiden Farbpads hin und her, sammelt bei
    + *          Ankunft auf einem Farbpad ein in der Naehe befindliches Hindernis in sein Transportfach ein
    + *          und bringt dieses zum anderen Farbpad. Auf seinem Weg zur Abladestelle oder waehrend des
    + *          Entdeckens der Welt zur Farbpadsuche weicht er Hindernissen geschickt aus.
    + *          Es kann mittels des Wand-Explore Verhaltens nur mittels der Farbpads gefahren werden ohne sich
    + *          Koordinaten zu merken, womit er nicht unbedingt zielgerichtet von einem zum anderen Farbpad
    + *          fahren kann. Mittels Zuschalten der Verwendung der MAP-Koordinaten werden die Koords der Pads
    + *          gemerkt und sich dorthin ausgerichtet. Es kann nun mit einem Fahrverhalten zwischen beiden hin- und
    + *          hergefahren werden, wobei entweder der Wandfolger dient oder auch andere Fahrverhalten
    + *          Anwendung finden (Auswahl jeweils per Define).
    + *          Der Verhaltensstart erfolgt entweder via Remotecall oder Taste 9. Befindet sich der Bot auf einem Farbpad, so kann
    + *          via Taste 7 dieses als Zielpad definiert werden (Simfarben werden automatisch erkannt; Real ist dies schwierig, daher
    + *          manuell definierbar)
    + *
    + * @author 	Frank Menzel (menzelfr@xxxxxxx)
    + * @date 	23.10.2007
    +*/
    +#include "bot-logic/bot-logik.h"
    +#include <math.h>
    +#include "math_utils.h"
    +#include "map.h"
    +
    +#ifdef BEHAVIOUR_TRANSPORT_PILLAR_AVAILABLE
    +
    +
    +  // auskommentieren wenn mit Farbpads und ohne Koordinaten gefahren werden soll trotz vorhandener Map
    +  // Weltkoordinaten trotzdem mitgefuehrt zum Drehen genau zur anderen Position
    +  #define USE_KOORDS
    +
    +  // zum Startbeginn explorert der Bot die Welt und erkennt damit ein bekanntes Farbpad automatisch
    +  // soll dies nicht automatisch erfolgen, dann define auskommentieren; mittels Taste 7 kann dann manuell
    +  // das Ziel-Farbpad definiert werden wenn sich der bot auf ein entsprechendes befindet
    +  // wegen den realen Schwierigkeiten mit Farben nur im Sim standardmaessig
    +  #ifdef PC
    +    #define AUTOSEARCH_PADCOL
    +  #endif
    +
    +
    +  // bei Ankunft auf Zielposition wird Klappe auf und zu gemacht; geht natuerlich nur wenn Servoverhalten an sind
    +  #ifdef BEHAVIOUR_SERVO_AVAILABLE
    +    #define SHOW_CLAPS_ON_DEST
    +  #endif
    +
    +  /* ******************************************************************
    +   * ab hier die moeglichen Fahrverhalten, ausgewaehlt je nach Define
    +   * ******************************************************************
    +   */
    +
    +  // Solve_Maze als Explorerverhalten nehmen, natuerlich nur wenn verfuegbar
    +  #ifdef BEHAVIOUR_SOLVE_MAZE_AVAILABLE
    +    //#define GO_WITH_SOLVE_MAZE
    +  #endif
    +
    +  // Fahren nach Karte wenn verfuegbar
    +  #ifdef BEHAVIOUR_MAP_GO_DESTINATION_AVAILABLE
    +   //#define GO_WITH_MAP_GO_DESTINATION    // auskommentieren wenn nicht nach Karte gefahren werden soll
    +   #undef  GO_WITH_SOLVE_MAZE          // nach Karte den Wandfolger entdefinieren
    +  #endif
    +
    +  // Fahren mittels goto_pos Verhalten
    +  #ifdef USE_KOORDS   // geht nur mit Koordinaten selbst, nicht mit Fahren  nach Farbe
    +   #ifdef BEHAVIOUR_GOTO_POS_AVAILABLE
    +     #define   GO_WITH_GOTO_POS    // auskommentieren wenn nicht mit Goto_pos Verhalten gefahren werden soll
    +     #undef  GO_WITH_SOLVE_MAZE          // nach Karte den Wandfolger entdefinieren
    +     #undef  GO_WITH_MAP_GO_DESTINATION
    +   #endif
    +  #endif
    +
    +  //trotz aktiviertem Pillarverhalten nur Hin- und Herfahren ohne Dosen einzufangen
    +  //#define NO_PILLAR_BEHAVIOUR
    +
    +  // zusaetzlich zu den Liniensensoren muessen die Farben laut Abgrundsensoren passen; damit
    +  // werden beim Realbot Fehlausloesungen vermieden beim Fahren nach Farbe
    +  //#define CHECK_BORDERSENS_FOR_COL
    +
    +static uint8 state=0;
    +
    +
    +  // Weltkoordinaten zum Speichern der Start- und Zielposition, zwischen denen Hin- und Hergefahren wird
    +  static float startpad_x=0;
    +  static float startpad_y=0;
    +  static float destpad_x=0;
    +  static float destpad_y=0;
    +
    +  static float target_x=0;	/*!< Zwischenzielkoordinaten X des xy-Fahrverhaltens */
    +  static float target_y=0;	/*!< Zwischenzielkoordinaten Y des xy-Fahrverhaltens */
    +
    +  // sichere Sensorwerte (aus Verhalten moeglich)
    +  static int16 pLeft=0;
    +  static int16 pRight=0;
    +
    +
    +
    +/*!
    + * Check, ob die Koordinate xy innerhalb eines Radius-Umkreises befindet; verwendet um das
    + * Zielfahren mit gewisser Toleranz zu versehen
    + * @param x x-Ordinate
    + * @param y y-Ordinate
    + * @param destx Ziel-x-Ordinate
    + * @param desty Ziel-y-Ordinate
    + * @return True wenn xy im Umkreis liegt6
    + */
    +#ifdef USE_KOORDS
    +  uint8 koord_in_circle_world (float x, float y, float destx, float desty) {
    +		//Punktdifferenzen
    +		float distx=destx-x;
    +		float disty=desty-y;
    +		uint16 radquad=0;   // Vergleichs-Radiusabstand im Quadrat
    +
    +		// bin ich auf Linie, kann Genauigkeit hoeher sein
    +		radquad=8100;
    +
    +		// Fahre ich gerade mit Linienfolger, dann Umkreis kleiner
    +		#ifdef BEHAVIOUR_FOLLOW_LINE_AVAILABLE
    +		  if (behaviour_is_activated(bot_follow_line_behaviour))
    +		    radquad=900;   // 3cm Umkreis
    +		#endif
    +
    +		// Ist Abstand im Radiusabstand, dann ist der Punkt innerhalb des Umkreises
    +		// gerechnet mit Quadratzahlen, sparen der Wurzel
    +		return (distx*distx + disty*disty) < radquad; // 9cm Umkreis des Bots
    +
    +  }
    +#else
    +  //hier wird immer die Farbe des Zielpads eingetragen, welche es zu erreichen gilt
    +  static uint16 destpad_value=0;
    +
    +  // Farbe der Abgrundsensoren; im Sim identisch der Liniensensoren
    +  #ifdef CHECK_BORDERSENS_FOR_COL
    +    static uint16 destpad_bvalue=0;
    +  #endif
    +
    +#endif
    +
    +  //Startpad1 wird mit Farbe bei Start belegt und Startpad2 fuer das andere Pad
    +  static uint16 STARTPAD_COL1=0;
    +  static uint16 STARTPAD_COL2=0;  // weiss geht somit nicht
    +
    +  static uint8 key_pressed=0;     // Kennung ob Taste gedrueckt fuer man. Zielvorgabe
    +
    +  //real haben die Bordersensoren andere Werte als die Liniensensoren, daher hier mitfuehren
    +  #ifdef CHECK_BORDERSENS_FOR_COL
    +    static uint16 STARTPAD_BCOL1=0;
    +    static uint16 STARTPAD_BCOL2=0;  // weiss geht somit nicht
    +  #endif
    +
    +  // Farbe des selbst definierbaren Zielpads; wird zusaetzlich zu den bekannten Standardfarben gecheckt wenn <> 0
    +  static uint16 PAD_MYCOL=0;
    +
    +  //kurze Wartezeit wenn bot auf Zielposition
    +  #define DELAY_ROLLTIME  800
    +
    +
    +
    +
    +
    +
    +/* Liefert True wenn sich Bot auf Pad mit dem Wert value_pad befindet
    + * @param value_pad   zu checkender Farbwert der Liniensensoren
    + * @param value_bpad  zu checkender farbwert der Bordersensoren
    + */
    +uint8 check_pad(uint16 value_pad,uint16 value_bpad) {
    +	#define COL_TOL 5
    +
    +	// beide Liniensensoren muessen auf der Zielfarbe sein oder nur einer, wenn der andere dafuer Linie erkennt
    +	uint8 ret = (sensLineL>=value_pad-COL_TOL && sensLineL<=value_pad+COL_TOL &&
    +	       sensLineR>=value_pad-COL_TOL && sensLineR<=value_pad+COL_TOL);
    +
    +	if (!ret)
    +	  ret= (sensLineL>=value_pad-COL_TOL && sensLineL<=value_pad+COL_TOL && sensLineR >= LINE_SENSE) ||
    +	       (sensLineR>=value_pad-COL_TOL && sensLineR<=value_pad+COL_TOL && sensLineL >= LINE_SENSE);
    +
    +	if (ret) {
    +       #ifdef CHECK_BORDERSENS_FOR_COL
    +	    // Bordersensoren nur auswerten wenn das Zielpad schon gefunden wurde
    +	    if (STARTPAD_COL2>0) {
    +	      ret = ((sensBorderL>=value_bpad-COL_TOL && sensBorderL<=value_bpad+COL_TOL) ||
    +	        (sensBorderR>=value_bpad-COL_TOL && sensBorderR<=value_bpad+COL_TOL));
    +	    }
    +	  #endif
    +
    +	  }
    +	return ret;
    +}
    +
    +/* Abbruchbedingung des Explorers wenn bereits Start- und Ziel(pad)koordinaten festgelegt sind
    + * und er sich immer von einer zur anderen bewegt; wurde die Zielkoord per Hand festgelegt, so
    + * gibt es keine Padfelder rot/ gruen und es muss beendet werden wenn sich der bot diesen Koords
    + * annaehert
    + * true wenn sich bot auf einem Startfeld befindet
    + */
    +uint8 bot_on_pad(void) {
    +  // es gilt: es sind immer die anderen Koords zu checken, wo ich mich nicht im Umkreis befinde oder fuer
    +  // Farbpads: immer den anderen checken wo ich gerade nicht drauf bin, solange laeuft der Explorer
    +    if (STARTPAD_COL2==0) {
    +    	// noch kein Ziel definiert bzw. gefunden; mit bekannten Farb-Pad-Werten auf Linien-Sensorebene
    +    	// vergleichen; Bordersensoren egal
    +    	return  (check_pad(STARTPAD1,0)||check_pad(STARTPAD2,0)||check_pad(GROUND_GOAL,0)||
    +    	          (PAD_MYCOL>0 && check_pad(PAD_MYCOL,0)))? True : False;
    +
    +    }
    +    else
    +    {   // Zielpad/- koordinaten hier bereits festgelegt
    +		// Wenn Umkreispunkt erreicht in Weltkoordinaten Schluss bei Koordinatenverwendung
    +		#ifdef USE_KOORDS
    +		  return koord_in_circle_world(x_pos,y_pos,target_x,target_y)?True:False;
    +		#else
    +		  // finden keine Koordinaten Verwendung, dann nur nach Farbpads fahren
    +		  #ifdef CHECK_BORDERSENS_FOR_COL
    +		    return check_pad(destpad_value,destpad_bvalue)?True:False;
    +		  #else
    +		    return check_pad(destpad_value,0)?True:False;
    +		  #endif
    +		#endif
    +    }
    +}
    +
    +
    +
    +
    +/* Start-Abbruchbedingung des Explorer Verhaltens zur Suche nach dem Ziel-Farbpad; dieses laeuft solange,
    + * bis der Explorer ueber ein anderes bekanntes Farbfeld faehrt oder per Taste das Farbpad definiert wurde
    + */
    + uint8 destpad_found(void) {
    +
    +
    +   #ifdef AUTOSEARCH_PADCOL  // automatische Suche eingeschaltet
    +  	// Check ob Bot auf einem bekannten Farbpad rot/blau/gruen oder Linienfarbe steht,
    + 	// welche nicht der Farbe zum Startzeitpunkt entspricht
    + 	if (bot_on_pad() && !check_pad(STARTPAD_COL1,0)) {
    +		  STARTPAD_COL2   = sensLineL; // einfach mal linken genommen
    +		  #ifdef CHECK_BORDERSENS_FOR_COL
    +		    STARTPAD_BCOL2 = (sensBorderL + sensBorderR) / 2;  // Mittelwert beider Abgrundsensoren
    +		  #endif
    +		  #ifndef USE_KOORDS
    +		    destpad_value=STARTPAD_COL2;
    +		    #ifdef CHECK_BORDERSENS_FOR_COL
    +		      destpad_bvalue = STARTPAD_BCOL2;
    +		    #endif
    +		  #endif
    +		 // Weltkoordinaten speichern fuer Drehung genau zu diesen Koordinaten
    +		  destpad_x=x_pos;destpad_y=y_pos;
    +
    +		  return True;
    +  	}
    +  	#endif
    + 	return False;  // nicht auf einem Startpadfield
    + }
    +
    +
    +/* Endebedingung des Explorerverhaltens
    + * @return True wenn Endebedingung erfuellt
    + */
    +uint8 check_end_exploring(void) {
    +	if (key_pressed) {
    +		key_pressed=0;
    +		return True;
    +	}
    +	return (STARTPAD_COL2==0) ? destpad_found():bot_on_pad();
    +}
    +
    +
    +
    +
    +void bot_transport_pillar_behaviour(Behaviour_t *data){
    +#define BOT_CHECK_STARTPAD 0
    +#define BOT_EXPLORE        1
    +#define INITIAL_TURN       2
    +#define GOTO_NEXTPAD       3
    +//#define EXPL_LINE          4
    +#define BOT_ON_PAD         5
    +#define GET_PILLAR         6
    +#define UNLOAD_PILLAR      7
    +#define BOT_ROLL           8
    +#define CHECK_DSENSORS     9
    +#define CHECK_LINE_FOLLOW  10
    +#define UNLOAD             11
    +
    +
    +	switch (state){
    +
    +		case BOT_CHECK_STARTPAD:
    +		    // Startkoords und Startpad setzen
    +		    state=BOT_EXPLORE;
    +
    +		    // Start-Farbpad belegen mit Farbwert
    +		      STARTPAD_COL1 = sensLineL;  // linken nehmen
    +		      #ifdef CHECK_BORDERSENS_FOR_COL
    +		        STARTPAD_BCOL1 = (sensBorderL + sensBorderR) / 2;  // Mittelwert beider Abgrundsensoren
    +		      #endif
    +		      // Start-Weltkoordinaten speichern
    +		      startpad_x=x_pos;startpad_y=y_pos;
    +			break;
    +
    +		case BOT_EXPLORE:
    +		    // Solange exploren bis anderes bekanntes Farbpad gruen oder rot gefunden oder Zielkoords/Pad
    +		    // manuell gesetzt wurde;
    +		    // wird bot zu Beginn bei Koordinatenverwendung auf Linie gesetzt, dann geht follow_line los
    +
    +		    state = BOT_ROLL;  // Pad gefunden oder waehrend der Fahrt Taste 7 -> ausrollen lassen
    +		     #ifdef BEHAVIOUR_FOLLOW_LINE_AVAILABLE
    +		     #ifdef USE_KOORDS
    +			  if (sensLineL >= LINE_SENSE || sensLineR >= LINE_SENSE) {
    +			  	#ifdef BEHAVIOUR_AVOID_BORDER_AVAILABLE
    +		              deactivateBehaviour(bot_avoid_border_behaviour);
    +	            #endif
    +
    +			    // Linienfolger uebernimmt
    +			    bot_follow_line(data);
    +
    +			    // Linienfolger deaktivieren, wenn bot im Zielbereich angekommen ist, welcher ja dann manuell
    +			    // fuer die Zielkoordinaten definiert werden muss
    +		        // das cancel-Verhalten laeuft als Paralelverhalten; sobald Linienfolger beendet ist,
    +		        // wird dieses auch beendet
    +		        bot_cancel_behaviour(data, bot_follow_line_behaviour, check_end_exploring);
    +
    +			    break;
    +			   }
    +			 #endif  // nach koordinaten fahren
    +			 #endif  // Linienfolger ueberhaupt an
    +
    +			#ifdef GO_WITH_SOLVE_MAZE
    +			  bot_solve_maze(data);
    +			  // Abbruchverhalten starten und aktiv belassen trotz Inaktivitaet des Explorerverhaltens
    +			  bot_cancel_behaviour(data, bot_solve_maze_behaviour, check_end_exploring);
    +
    +			#else
    +			  #ifdef GO_WITH_MAP_GO_DESTINATION
    +			    // nach Karte kann ich nur fahren, wenn auch Zielpad schon bekannt ist sonst follow_wall
    +			    if (STARTPAD_COL2==0) {
    +			         bot_follow_wall(data,check_end_exploring);
    +			    }
    +			    else
    +			    {
    +			      bot_gotodest_map(data);
    +			    }
    +			  #else
    +			    #ifdef BEHAVIOUR_GOTO_POS_AVAILABLE
    +
    +			      // nach Karte kann ich nur fahren, wenn auch Zielpad schon bekannt ist sonst follow_wall
    +			      if (STARTPAD_COL2==0) {
    +			         bot_follow_wall(data,check_end_exploring);
    +			      }
    +			      else
    +			      {
    +			      bot_goto_pos(data,target_x,target_y,999);
    +			      }
    +			    #else
    +			      // hier koennte man noch andere Explorerverhalten einbinden und verwenden
    +			      bot_follow_wall(data,check_end_exploring);
    +			    #endif
    +			  #endif
    +
    +			#endif
    +
    +			break;
    +
    +        case BOT_ROLL:
    +             deactivateBehaviour(bot_cancel_behaviour_behaviour); // deaktivieren falls noch aktiv
    +             // Bot erst mal ausrollen lassen
    +             #ifndef SHOW_CLAPS_ON_DEST
    +               // nicht warten wenn kurz Klappe auf und zu geht; ist bereits genug Verzoegerung
    +               bot_delay(data, DELAY_ROLLTIME);	// kurzzeitig nix tun
    +             #endif
    +             state = CHECK_DSENSORS;
    +             break;
    +
    +        case CHECK_DSENSORS:
    +             // sichere Sensorenwerte ermitteln wenn Verhalten aktiv
    +            // #ifdef BEHAVIOUR_MEASURE_DISTANCE_AVAILABLE
    +              // bot_measure_distance(data,&pLeft,&pRight);
    +             //#else
    +               pLeft=sensDistL; pRight=sensDistR;  // direkt mit Sensorwerten belegen
    +             //#endif
    +             state = BOT_ON_PAD;
    +             break;
    +
    +        case BOT_ON_PAD:
    +              // hier wird entschieden, ob ich ein Objekt suchen muss zum mitnehmen oder wenn ich was im
    +              // Bauch habe, muss dieses entladen werden
    +              // bei Measure-Verhalten liegen hier sichere Messwerte vor
    +              state= (sensTrans==0) ? GET_PILLAR: UNLOAD_PILLAR;
    +
    +           #ifdef SHOW_CLAPS_ON_DEST
    +            if (state==GET_PILLAR) {
    +             bot_servo(data,SERVO1,DOOR_OPEN); // Klappe auf
    +            }
    +           #endif
    +
    +           break;
    +
    +        case GET_PILLAR:
    +           // bin jetzt auf dem Zielpad/ Koords angekommen und starte das Pillarverhalten falls es was zu holen gibt
    +           #ifdef BEHAVIOUR_CATCH_PILLAR_AVAILABLE
    +            #ifndef NO_PILLAR_BEHAVIOUR  // darf nicht explizit augeschaltet sein
    +             bot_catch_pillar(data);
    +            #endif
    +           #endif
    +
    +
    +           state=GOTO_NEXTPAD;
    +           break;
    +
    +       case UNLOAD_PILLAR:
    +           // bin jetzt auf dem Zielpad/ Koords angekommen und starte das Pillar-Unload-Verhalten,
    +           // da ich ja was im Bauch habe
    +           state=GOTO_NEXTPAD;
    +           // evtl. noch etwas vorwaerts fahren, damit Objekt etwas weiter vorn abgestellt wird
    +           // sonst dreht sich bot spaeter schon vorher weg
    +           #ifdef BEHAVIOUR_CATCH_PILLAR_AVAILABLE
    +            #ifndef NO_PILLAR_BEHAVIOUR  // darf nicht explizit ausgeschaltet sein
    +             bot_drive_distance(data,-50,BOT_SPEED_FOLLOW,OPTIMAL_DISTANCE/10);
    +             state=UNLOAD;
    +            #endif
    +           #endif
    +
    +           break;
    +
    +        #ifdef BEHAVIOUR_CATCH_PILLAR_AVAILABLE
    +         #ifndef NO_PILLAR_BEHAVIOUR
    +          case UNLOAD:
    +            state=GOTO_NEXTPAD;
    +            bot_unload_pillar(data);
    +            break;
    +         #endif
    +        #endif
    +
    +		case GOTO_NEXTPAD:
    +		    // hier werden wechselseitig das andere Zielpad/ Koords gesetzt
    + 		   if (target_x==startpad_x && target_y==startpad_y) {
    +			  target_x=destpad_x;target_y=destpad_y;
    + 		    }
    +		    else {
    +			  target_x=startpad_x;target_y=startpad_y;
    +		    }
    +
    +            #ifdef GO_WITH_MAP_GO_DESTINATION
    +              bot_set_destination(map_world_to_map(target_x),map_world_to_map(target_y));
    +            #endif
    +
    +		      // bei fahren nach Farbpads die Zielpadfarbe wechseln; nur ausgewertet, wenn auch nicht
    +		      // nach Koords gefahren wird
    +		      #ifndef USE_KOORDS
    +		        // zuerst fuer Abgrundsensoren
    +		        #ifdef CHECK_BORDERSENS_FOR_COL
    +		          destpad_bvalue= (destpad_value==STARTPAD_COL1)? STARTPAD_BCOL2: STARTPAD_BCOL1;
    +		        #endif
    +		        destpad_value= (destpad_value==STARTPAD_COL1)? STARTPAD_COL2: STARTPAD_COL1;
    +		      #endif
    +			state=INITIAL_TURN;
    +
    +            #ifdef SHOW_CLAPS_ON_DEST
    +              bot_servo(data,SERVO1,DOOR_CLOSE); // Klappe zu
    +            #endif
    +
    +			break;
    +
    +		case INITIAL_TURN:
    +		     // Drehung genau in Richtung Zielkoordinaten, auch wenn ich gerade von einer Wand komme und damit nicht
    +		     // aus der Zielrichtung; Koordinaten auch benutzt beim Fahren nach Farben
    +		     bot_turn(data,calc_angle_diff(target_x-x_pos,target_y-y_pos));
    +		     state = BOT_EXPLORE;
    +
    +			break;
    +
    +		default:
    +			return_from_behaviour(data);
    +			break;
    +	}
    +}
    +
    +
    +/*!
    + * Ruft das Pillarverhalten auf
    + * @param caller	Der obligatorische Verhaltensdatensatz des Aufrufers
    + */
    +void bot_transport_pillar(Behaviour_t * caller){
    +
    +	state=0;
    +
    +	startpad_x=0;startpad_y=0;
    +	destpad_x=0;destpad_y=0;
    +	target_x=-1;target_y=-1;// nicht 0, weil bei 0 auch Startpos losgeht
    +
    +	STARTPAD_COL1=0;STARTPAD_COL2=0;
    +	#ifdef CHECK_BORDERSENS_FOR_COL
    +	  STARTPAD_BCOL1=0;STARTPAD_BCOL2=0;
    +	#endif
    +	switch_to_behaviour(caller,bot_transport_pillar_behaviour,OVERRIDE);
    +}
    +
    +/*!
    + * Routine zum Setzen der Zielkoordinaten auf der Zielposition/ Zielpad
    + * @param x X-World-Zielkoordinate
    + * @param y Y-World-Zielkoordinate
    + */
    +
    +void bot_set_destkoords(float x, float y) {
    +
    +  // Farbe zum Zeitpunkt des Tastendruckes wird als Zielfarbe definiert
    +  // Weiss -wohl nur so im Sim so moeglich- bekommt 1, Hauptsache ungleich 0
    +  // Wess kann nur manuell als Zielfarbe gesetzt werden
    +    STARTPAD_COL2 = sensLineL>0 ? sensLineL : 1;
    +    key_pressed=True;
    +
    +    //STARTPAD_COL2 = sensLineL;  // linken nehmen
    +    #ifdef CHECK_BORDERSENS_FOR_COL
    +      STARTPAD_BCOL2 = (sensBorderL + sensBorderR) / 2;  // Mittelwert beider Abgrundsensoren
    +    #endif
    +
    +
    +    // Weltkoordinaten speichern; diese werden nur verwendet
    +    // um sich auf diese bei Drehung auf Farbpad ausrichten zu koennen
    +    if (x==0 && y==0) {
    +	    destpad_x=x_pos;
    +	    destpad_y=y_pos;
    +	}
    +	else
    +	  {// Koordinaten setzen auf Uebergabekoordinaten
    +       destpad_x=x;
    +       destpad_y=y;
    +	  }
    +}
    +#endif
    Index: C:/botneu/ct-Bot/bot-logic/behaviour_follow_wall.c
    ===================================================================
    --- C:/botneu/ct-Bot/bot-logic/behaviour_follow_wall.c	(revision 1292)
    +++ C:/botneu/ct-Bot/bot-logic/behaviour_follow_wall.c	(working copy)
    @@ -77,7 +77,7 @@
      * Die Funktion muss True (1) zurueckgeben, wenn dem so ist, sonst False (0).
      * Beispiele fuer eine solche Funktion sind check_for_light, is_good_pillar_ahead etc.
      */
    - static int8 (*check_function)(void)=0;
    + static uint8 (*check_function)(void)=0;

     /*!
      * ermittelt Zufallswert je nach Zeitzaehler
    @@ -233,7 +233,7 @@
      * 					einfach NULL uebergeben, wenn keine definiert ist
      * @param caller	Verhaltensdatensatz
      */
    -void bot_follow_wall(Behaviour_t *caller, int8 (*check)(void)) {
    +void bot_follow_wall(Behaviour_t *caller, uint8 (*check)(void)) {
     	// Umschalten zum eigentlichen Verhalten
     	switch_to_behaviour(caller, bot_follow_wall_behaviour, NOOVERRIDE);

    Index: C:/botneu/ct-Bot/bot-logic/bot-logik.c
    ===================================================================
    --- C:/botneu/ct-Bot/bot-logic/bot-logik.c	(revision 1292)
    +++ C:/botneu/ct-Bot/bot-logic/bot-logik.c	(working copy)
    @@ -159,7 +159,7 @@

     	#ifdef BEHAVIOUR_DELAY_AVAILABLE
     		// Delay-Routinen als Verhalten
    -		insert_behaviour_to_list(&behaviour, new_behaviour(200, bot_delay_behaviour,INACTIVE));
    +		insert_behaviour_to_list(&behaviour, new_behaviour(154, bot_delay_behaviour,INACTIVE));
     	#endif

     	#ifdef BEHAVIOUR_CANCEL_BEHAVIOUR_AVAILABLE
    @@ -235,6 +235,10 @@
     		insert_behaviour_to_list(&behaviour, new_behaviour(43, bot_unload_pillar_behaviour,INACTIVE));
     	#endif

    +        #ifdef BEHAVIOUR_TRANSPORT_PILLAR_AVAILABLE
    +			insert_behaviour_to_list(&behaviour, new_behaviour(41, bot_transport_pillar_behaviour, INACTIVE));
    +	#endif
    +
     	#ifdef BEHAVIOUR_FOLLOW_OBJECT_AVAILABLE
     		insert_behaviour_to_list(&behaviour, new_behaviour(40, bot_follow_object_behaviour, INACTIVE));
     	#endif
    Index: C:/botneu/ct-Bot/include/bot-logic/behaviour_transport_pillar.h
    ===================================================================
    --- C:/botneu/ct-Bot/include/bot-logic/behaviour_transport_pillar.h	(revision 0)
    +++ C:/botneu/ct-Bot/include/bot-logic/behaviour_transport_pillar.h	(revision 0)
    @@ -0,0 +1,60 @@
    +/*
    + * 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_simple.h
    + * @brief 	ganz einfache Beispielverhalten
    + * Diese Datei sollte der Einstiegspunkt fuer eigene Experimente sein,
    + * den Roboter zu steuern.
    + *
    + * @author 	Benjamin Benz (bbe@xxxxxxxx)
    + * @date 	03.11.06
    +*/
    +
    +#ifndef BEHAVIOUR_TRANSPORT_PILLAR_H_
    +#define BEHAVIOUR_TRANSPORT_PILLAR_H_
    +
    +#include "ct-Bot.h"
    +#include "bot-logic/bot-logik.h"
    +
    +#ifdef BEHAVIOUR_TRANSPORT_PILLAR_AVAILABLE
    +
    +/*!
    + * Pillarverhalten
    + * @param caller	Der obligatorische Verhaltensdatensatz des Aufrufers
    + */
    +void bot_transport_pillar_behaviour(Behaviour_t *data);
    +
    +/*!
    + * Ruft das Pillarverhalten auf
    + * @param caller	Der obligatorische Verhaltensdatensatz des Aufrufers
    + */
    +void bot_transport_pillar(Behaviour_t * caller);
    +
    +/*!
    + * Routine zum Setzen der Zielkoordinaten auf der Zielposition/ Zielpad
    + * @param x X-World-Zielkoordinate
    + * @param y Y-World-Zielkoordinate
    + */
    +void bot_set_destkoords(float x, float y);
    +
    +
    +#endif
    +
    +#endif /*BEHAVIOUR_SIMPLE_H_*/
    Index: C:/botneu/ct-Bot/include/bot-logic/available_behaviours.h
    ===================================================================
    --- C:/botneu/ct-Bot/include/bot-logic/available_behaviours.h	(revision 1292)
    +++ C:/botneu/ct-Bot/include/bot-logic/available_behaviours.h	(working copy)
    @@ -18,7 +18,7 @@
     //#define BEHAVIOUR_HANG_ON_AVAILABLE	/*!< Erkennen des Haengenbleibens als Notfallverhalten? */
     //#define BEHAVIOUR_GOTO_AVAILABLE	/*!< goto vorhanden? */
     //#define BEHAVIOUR_GOTOXY_AVAILABLE	/*!< gotoxy vorhanden? */
    -//#define BEHAVIOUR_GOTO_POS_AVAILABLE	/*!< goto_pos vorhanden? */
    +#define BEHAVIOUR_GOTO_POS_AVAILABLE	/*!< goto_pos vorhanden? */
     #define BEHAVIOUR_TURN_AVAILABLE	/*!< turn vorhanden? */
     //#define BEHAVIOUR_TURN_TEST_AVAILABLE	/*!< turn_test vorhanden? */

    @@ -28,7 +28,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_AVAILABLE	/*!< Linienfolger vorhanden? */
     //#define BEHAVIOUR_MAP_GO_DESTINATION_AVAILABLE /*!< Fahren zu einem Ziel nach Pfadplanung */

     #define BEHAVIOUR_SERVO_AVAILABLE 	/*!< Kontrollverhalten fuer die Servos */
    @@ -49,6 +49,8 @@

     #define BEHAVIOUR_DELAY_AVAILABLE /*!< Delay-Routinen als Verhalten */

    +#define BEHAVIOUR_TRANSPORT_PILLAR_AVAILABLE /*!< Transport-Pillar Verhalten */
    +
     /* Aufgrund einer ganzen reihe von Abhaengigkeiten sollte man beim Versuch Speicher
      * zu sparen, zuerst mal bei den Hauptverhalten ausmisten, sonst kommen die
      * Unterverhalten durch die Hintertuer wieder rein
    @@ -124,6 +126,11 @@
     	#undef BEHAVIOUR_HANG_ON_AVAILABLE
     #endif

    +#ifdef BEHAVIOUR_TRANSPORT_PILLAR_AVAILABLE
    +	#define BEHAVIOUR_CANCEL_BEHAVIOUR_AVAILABLE
    +	#define BEHAVIOUR_FOLLOW_WALL_AVAILABLE
    +#endif
    +
     #ifdef MCU
     #ifndef SPEED_CONTROL_AVAILABLE
     	// goto_pos geht nur, wenn wir uns auf die eingestellte Geschwindigkeit verlassen koennen
    @@ -173,5 +180,7 @@

     #include "bot-logic/behaviour_cancel_behaviour.h"

    +#include "bot-logic/behaviour_transport_pillar.h"
    +
     #endif	// BEHAVIOUR_AVAILABLE
     #endif	/*AVAILABLE_BEHAVIOURS_H_*/
    Index: C:/botneu/ct-Bot/include/bot-logic/behaviour_follow_wall.h
    ===================================================================
    --- C:/botneu/ct-Bot/include/bot-logic/behaviour_follow_wall.h	(revision 1292)
    +++ C:/botneu/ct-Bot/include/bot-logic/behaviour_follow_wall.h	(working copy)
    @@ -47,7 +47,7 @@
      * 			        einfach NULL uebergeben, wenn keine definiert ist
      * @param caller 	Verhaltensdatensatz
      */
    -void bot_follow_wall(Behaviour_t *caller,int8 (*check)(void));
    +void bot_follow_wall(Behaviour_t *caller,uint8 (*check)(void));

     #ifdef BEHAVIOUR_REMOTECALL_AVAILABLE
     /*!
    Index: C:/botneu/ct-Bot/include/rc5-codes.h
    ===================================================================
    --- C:/botneu/ct-Bot/include/rc5-codes.h	(revision 1292)
    +++ C:/botneu/ct-Bot/include/rc5-codes.h	(working copy)
    @@ -63,11 +63,11 @@
     #ifdef MCU

     	// Dies ist die Standard-Fernbedienung unter anderem fuer den Sim
    -	#define RC_HAVE_HQ_RC_UNIVERS29_334
    +	//#define RC_HAVE_HQ_RC_UNIVERS29_334

     	//#define RC_HAVE_HAUPPAUGE_WINTV
     	//#define RC_HAVE_HAUPPAUGE_MediaMPV
    -	//#define RC_HAVE_CONRAD_PROMO8
    +	#define RC_HAVE_CONRAD_PROMO8
     	//#define RC_HAVE_VIVANCO_UR89
     	//#define RC_HAVE_VIVANCO_UR89_TV_CODE_089
     	//#define RC_HAVE_Technisat_TTS35AI
    Index: C:/botneu/ct-Bot/Changelog.txt
    ===================================================================
    --- C:/botneu/ct-Bot/Changelog.txt	(revision 1292)
    +++ C:/botneu/ct-Bot/Changelog.txt	(working copy)
    @@ -1,8 +1,10 @@
     CHANGELOG fuer c't-Bot
     ======================
    +2007-10-22 Frank Menzel  [Menzelfr@xxxxxxx]: behaviour_transport_pillar: bot faehrt zwischen Start- und Zielpos. hin und her und kann dabei Dosen fangen und transportieren; die bisher diversen Fahrverhalten sind hier unter einem Dach vereint und via Defines waehlbar
    +
     2007-10-23 Timo Sandmann [mail@xxxxxxxxxxxxxxx]: bot-logik.c: Bugfix fuer deactivateCalledBehaviours() und isInCallHierarchy()

    -2007-10-19 Frank Menzel  [Menzelfr@xxxxxxx]: Neues Verhalten behaviour_cancel_behaviour deaktiviert ein anderes Verhalten in Abhaengigkeit einer Check-Funktiondeaktiviert ein anderes Verhalten in Abhaengigkeit einer Check-Funktion
    +2007-10-19 Frank Menzel  [Menzelfr@xxxxxxx]: Neues Verhalten behaviour_cancel_behaviour deaktiviert ein anderes Verhalten in Abhaengigkeit einer Check-Funktion

     2007-10-18 Timo Sandmann [mail@xxxxxxxxxxxxxxx]: interruptbasierten I2C-Treiber und Unterstuetzung fuer Kompass CMPS03 hinzugefuegt

    Index: C:/botneu/ct-Bot/ui/available_screens.h
    ===================================================================
    --- C:/botneu/ct-Bot/ui/available_screens.h	(revision 1292)
    +++ C:/botneu/ct-Bot/ui/available_screens.h	(working copy)
    @@ -35,7 +35,7 @@

     #define SENSOR_DISPLAY_AVAILABLE		/*!< zeigt die Sensordaten an */
     //#define DISPLAY_REGELUNG_AVAILABLE		/*!< Gibt Debug-Infos der Motorregelung aus */
    -//#define DISPLAY_BEHAVIOUR_AVAILABLE		/*!< zeigt Verhalten an */
    +#define DISPLAY_BEHAVIOUR_AVAILABLE		/*!< zeigt Verhalten an */
     //#define MISC_DISPLAY_AVAILABLE			/*!< aehm ja, der Rest irgendwie... */
     #define DISPLAY_ODOMETRIC_INFO			/*!< zeigt Positions- und Geschwindigkeitsdaten an */
     #define DISPLAY_MMC_INFO				/*!< Zeigt die Daten der MMC-Karte an */
    Index: C:/botneu/ct-Bot/ui/rc5.c
    ===================================================================
    --- C:/botneu/ct-Bot/ui/rc5.c	(revision 1292)
    +++ C:/botneu/ct-Bot/ui/rc5.c	(working copy)
    @@ -116,8 +116,13 @@

     		#ifdef BEHAVIOUR_TURN_AVAILABLE
     			case 2: bot_turn(NULL, 90); break;
    -			case 7: bot_turn(NULL, 180); break;
    -			case 9: bot_turn(NULL, -180); break;
    +			#ifdef BEHAVIOUR_TRANSPORT_PILLAR_AVAILABLE
    +			  case 7: bot_set_destkoords(0,0); break;
    +              case 9: bot_transport_pillar(NULL); break;
    +			#else
    +			  case 7: bot_turn(NULL, 180); break;
    +			  case 9: bot_turn(NULL, -180); break;
    +			#endif
     		#endif	// BEHAVIOUR_TURN_AVAILABLE

     		#if defined BEHAVIOUR_CATCH_PILLAR_AVAILABLE
    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 @@
    +#Tue Oct 23 17:37:02 CEST 2007
    +eclipse.preferences.version=1
    +indexerId=org.eclipse.cdt.core.fastIndexer
    Index: C:/botneu/ct-Bot/ct-Bot.h
    ===================================================================
    --- C:/botneu/ct-Bot/ct-Bot.h	(revision 1292)
    +++ C:/botneu/ct-Bot/ct-Bot.h	(working copy)
    @@ -31,7 +31,9 @@
     /************************************************************
     * Module switches, to make code smaller if features are not needed
     ************************************************************/
    -//#define LOG_CTSIM_AVAILABLE		/*!< Logging zum ct-Sim (PC und MCU) */
    +#ifdef PC
    +  #define LOG_CTSIM_AVAILABLE		/*!< Logging zum ct-Sim (PC und MCU) */
    +#endif
     //#define LOG_DISPLAY_AVAILABLE		/*!< Logging ueber das LCD-Display (PC und MCU) */
     //#define LOG_UART_AVAILABLE		/*!< Logging ueber UART (NUR fuer MCU) */
     //#define LOG_STDOUT_AVAILABLE 		/*!< Logging auf die Konsole (NUR fuer PC) */
    @@ -50,7 +52,7 @@

     #define DISPLAY_AVAILABLE	/*!< Display for local control */
     #define DISPLAY_REMOTE_AVAILABLE /*!< Sende LCD Anzeigedaten an den Simulator */
    -#define MEASURE_MOUSE_AVAILABLE			/*!< Geschwindigkeiten werden aus den Maussensordaten berechnet */
    +//#define MEASURE_MOUSE_AVAILABLE			/*!< Geschwindigkeiten werden aus den Maussensordaten berechnet */
     //#define MEASURE_COUPLED_AVAILABLE		/*!< Geschwindigkeiten werden aus Maus- und Encoderwerten ermittelt und gekoppelt */

    @@ -69,9 +71,11 @@

     #define BEHAVIOUR_AVAILABLE /*!< Nur wenn dieser Parameter gesetzt ist, exisitiert das Verhaltenssystem */

    -//#define MAP_AVAILABLE /*!< Aktiviere die Kartographie */
    +#ifdef PC
    +  #define MAP_AVAILABLE /*!< Aktiviere die Kartographie */
    +#endif

    -//#define SPEED_CONTROL_AVAILABLE /*!< Aktiviert die Motorregelung */
    +#define SPEED_CONTROL_AVAILABLE /*!< Aktiviert die Motorregelung */
     //#define ADJUST_PID_PARAMS		/*!< macht PID-Paramter zur Laufzeit per FB einstellbar */
     //#define SPEED_LOG_AVAILABLE 	/*!< Zeichnet Debug-Infos der Motorregelung auf MMC auf */
Antworten: Re: AW: AW: [ct-bot] Verhalten behaviour_goto_pos -> transport_pillar_behaviour From: Timo Sandmann Re: AW: AW: [ct-bot] Verhalten behaviour_goto_pos -> transport_pillar_behaviour From: Timo Sandmann Re: [ct-bot] Verhalten behaviour_goto_pos -> transport_pillar_behaviour From: Timo Sandmann Referenzen: Re: AW: [ct-bot] Verhalten behaviour_goto_pos From: Timo Sandmann Voriger (Datum): Re: [ct-bot] neues Verhalten bot_cancel_behaviour, Timo Sandmann Nächster (Datum): Re: AW: AW: [ct-bot] Verhalten behaviour_goto_pos -> transport_pillar_behaviour, Timo Sandmann Voriger (Thread): Re: AW: [ct-bot] Verhalten behaviour_goto_pos, Timo Sandmann Nächster (Thread): Re: AW: AW: [ct-bot] Verhalten behaviour_goto_pos -> transport_pillar_behaviour, Timo Sandmann Indizes: Datum Thread |

Copyright © 2007 Heise Zeitschriften Verlag | Kritik, Anregungen bitte an c't-WWW | Datenschutzhinweis Impressum