## c't-Projekte - Mailinglisten

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

### [ct-bot] bot-2-bot-Kommunikation -> Senden der Stackdaten

Absender: Frank Menzel
Datum: Di, 17.06.2008 19:24:11

    Hallo,
    habe mich mal etwas mit der bot-2-bot-Kommunikation beschäftigt.
    Rausgekommen ist, dass nun der Stack eines Bots zu den anderen
    Remote-Bots übertragen werden kann und anschließend auf ihnen das
    Stack-Fahrverhalten gestartet wird.
    Das sieht folgendermaßen aus: Mit aktiviertem Stackverhalten wird ein
    Bot rumgefahren und markante Punkte mit der Taste 3 wie bisher auf den
    Stack gespeichert (alternativ kann auch mit aktiviertem Autopush
    gefahren werden). Bei aktivierter Bot-2-Bot Kommunikation kann nun via
    Taste 9 der Stack auf die Remote-Bots übertragen werden und anschließend
    fahren diese den Stack ab.  Wird ein 2. Bot auf dieselbe
    Ausgangsposition wie der 1. Bot gesetzt, so fährt dieser exakt denselben
    Weg ab, den der 1. Bot genommen hat. Leider habe ich nicht 2 reale Bots
    mit Funk um dies zu testen :-( Im sim ist dies schon recht
    beeindruckend, wenn 2 Bots direkt nebeneinander platziert werden, der
    eine dem anderen zum Schluss seinen Weg übermittelt und dann beginnt,
    die Strecke abzufahren. Leider hat jeder Bot für sich seine eigene
    Vorstellung von den Positionen innerhalb seiner eigenen Welt, da es
    keine globale Positionen gibt. Also wird es nicht derselbe Weg sein,
    wenn die Bots nicht auf demselben Ausgangspunkt starten. Bei
    nebeneinander-Start ist es die Bahn daneben aber eben im Sim nicht
    anders machbar und trotzdem aber recht nett anzusehen.

    Bei der Implementierung ist mir aufgefallen, dass wieder ein Array
    gefüllt werden muss mit den Routinen, die ein Bot empfangen kann. Kann
    man hier nicht möglicherweise bereits auf die Remote-Calls zurückgreifen
    ?

    Patch anbei.
    Gruß, Frank Menzel

    Index: C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_drive_stack.c
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_drive_stack.c	(revision 1450)
    +++ C:/eclipse/workspace/ct-Bot/bot-logic/behaviour_drive_stack.c	(working copy)
    @@ -34,6 +34,7 @@
     #include "rc5-codes.h"
     #include "pos_stack.h"
     #include "math_utils.h"
    +#include "bot-2-bot.h"
     #include <stdlib.h>

     static uint8_t drivestack_state = 0;	/*!< Status des drive_stack-Verhaltens */
    @@ -184,7 +185,26 @@
     	last_heading=0;
     }

    +#ifdef BOT_2_BOT_AVAILABLE
     /*!
    + * sendet den aktuellen Stack zu den anderen Bots, die daraufhin den Weg anfahren;
    + */
    +static void send_posstack(void) {
    +	uint8_t succ=0;
    +	int16_t xpos=0;
    +	int16_t ypos=0;
    +
    +	succ=pos_stack_pop(&xpos,&ypos);
    +	while (succ) {
    +	  send_bot_pos_stack(xpos, ypos);
    +	  succ=pos_stack_pop(&xpos,&ypos);
    +	}
    +    /*! Fahrverhalten auf den Remote-Bots starten  */
    +	send_bot_go_stack();
    +}
    +#endif
    +
    +/*!
      * Keyhandler zur Verwendung via Fernbedienung auf dem Display zum Stackanfahren
      */
     #ifdef DISPLAY_DRIVE_STACK_AVAILABLE
    @@ -213,6 +233,14 @@
     		RC5_Code = 0;
     		pos_stack_clear();
     		break;
    +
    +#ifdef BOT_2_BOT_AVAILABLE
    +    case RC5_CODE_9:
    +		/* Positionsstack via bot-2-bot senden und Remote-Stack-Fahrverhalten starten */
    +		RC5_Code = 0;
    +		send_posstack();
    +		break;
    +#endif

     	} // switch
     } // Ende Keyhandler
    @@ -229,7 +257,12 @@
     	display_cursor(3, 1);
     	display_printf("Save/Goto/Del: 3/4/8");
     	display_cursor(4, 1);
    -	display_printf("Start WayPushPos: 5");
    +	#ifdef BOT_2_BOT_AVAILABLE  // Stack senden ermoeglichen wenn bot-2-bot aktiviert ist
    +	  display_printf("WayPushPos/Send: 5/9");
    +	#else
    +	  display_printf("Start WayPushPos: 5");
    +	#endif
    +

     	drivestack_disp_key_handler();	// aufrufen des Key-Handlers
     }
    Index: C:/eclipse/workspace/ct-Bot/Changelog.txt
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/Changelog.txt	(revision 1450)
    +++ C:/eclipse/workspace/ct-Bot/Changelog.txt	(working copy)
    @@ -1,5 +1,7 @@
     CHANGELOG fuer c't-Bot
     ======================
    +2008-06-17 Frank Menzel [Menzelfr@xxxxxxx]: Stackuebertragung und Stackfahren via bot-2-bot
    +
     2008-06-17 Timo Sandmann [mail@xxxxxxxxxxxxxxx]: Neues Verhalten bot_classify_objects(), Details unter bot-logic/behaviour_classify_objects.c

     2008-06-10 Timo Sandmann [mail@xxxxxxxxxxxxxxx]: EEPROM-Emulation an Mac OS 10.5 angepasst, #151
    Index: C:/eclipse/workspace/ct-Bot/ct-Bot.h
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/ct-Bot.h	(revision 1450)
    +++ C:/eclipse/workspace/ct-Bot/ct-Bot.h	(working copy)
    @@ -44,7 +44,7 @@
     //#define KEYPAD_AVAILABLE	/*!< Keypad-Eingabe vorhanden? */

     #define BOT_2_PC_AVAILABLE	/*!< Soll der Bot mit dem PC kommunizieren? */
    -//#define BOT_2_BOT_AVAILABLE	/*!< Sollen Bots untereinander kommunizieren? */
    +#define BOT_2_BOT_AVAILABLE	/*!< Sollen Bots untereinander kommunizieren? */

     //#define TIME_AVAILABLE		/*!< Gibt es eine Systemzeit im s und ms? */

    @@ -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_STACK_AVAILABLE  /*!< Positionsstack vorhanden */
    +#define POS_STACK_AVAILABLE  /*!< Positionsstack vorhanden */

     //#define WELCOME_AVAILABLE	/*!< kleiner Willkommensgruss */

    Index: C:/eclipse/workspace/ct-Bot/include/bot-logic/available_behaviours.h
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/include/bot-logic/available_behaviours.h	(revision 1450)
    +++ C:/eclipse/workspace/ct-Bot/include/bot-logic/available_behaviours.h	(working copy)
    @@ -32,7 +32,7 @@

     #define BEHAVIOUR_SERVO_AVAILABLE 	/*!< Kontrollverhalten fuer die Servos */

    -//#define BEHAVIOUR_DRIVE_STACK_AVAILABLE /*!< Abfahren der auf dem Stack gesicherten Koordinaten */
    +#define BEHAVIOUR_DRIVE_STACK_AVAILABLE /*!< Abfahren der auf dem Stack gesicherten Koordinaten */

     //#define BEHAVIOUR_OLYMPIC_AVAILABLE	/*!< Olympiadenverhalten vorhanden? */

    Index: C:/eclipse/workspace/ct-Bot/include/bot-2-bot.h
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/include/bot-2-bot.h	(revision 1450)
    +++ C:/eclipse/workspace/ct-Bot/include/bot-2-bot.h	(working copy)
    @@ -48,6 +48,8 @@

     #define BOT_CMD_WELCOME		get_command_of_function(add_bot_to_list)
     #define BOT_CMD_STATE		get_command_of_function(set_received_bot_state)
    +#define BOT_GET_STACK  		get_command_of_function(bot_get_stack)
    +#define BOT_GO_STACK  		get_command_of_function(bot_go_stack)

     extern bot_list_entry_t * bot_list;	/*!< Liste aller bekannten Bots */
     extern void (* cmd_functions[])(command_t * cmd);
    @@ -99,6 +101,30 @@
     void set_received_bot_state(command_t * cmd);

     /*!
    + * Sendet den Stackinhalt zu den anderen Bots, welche die Stackdaten wiederum in ihren Stack speichern
    + * @param xpos Stack-x-Koordinate
    + * @param ypos Stack-y-Koordinate
    + */
    +void send_bot_pos_stack(int16_t xpos, int16_t ypos);
    +
    +/*!
    + * Empfangsroutine fuer die Stackdaten
    + * @param *cmd	Zeiger auf Kommando mit Daten
    + */
    +void bot_get_stack(command_t * cmd);
    +
    +/*!
    + * Empfangsroutine zum Start des Stack-Fahrverhaltens
    + * @param *cmd	Zeiger auf Kommando mit Daten
    + */
    +void bot_go_stack(command_t * cmd);
    +
    +/*!
    + * Senderoutine zum Start des Stack-Fahrverhaltens auf den Remote-Bots
    + */
    +void send_bot_go_stack(void);
    +
    +/*!
      * Setzt den eigenen Status auf einen neuen Wert und schickt ihn an
      * alle Bots
      * @param *state	Zeiger auf Status
    Index: C:/eclipse/workspace/ct-Bot/bot-2-bot.c
    ===================================================================
    --- C:/eclipse/workspace/ct-Bot/bot-2-bot.c	(revision 1450)
    +++ C:/eclipse/workspace/ct-Bot/bot-2-bot.c	(working copy)
    @@ -32,11 +32,18 @@
     #ifdef BOT_2_BOT_AVAILABLE
     #include "bot-2-bot.h"
     #include "log.h"
    +#include "bot-logic/bot-logik.h"

     #ifndef DEBUG_BOT2BOT
     #undef LOG_AVAILABLE
     #endif

    +/*! Stackverhalten muss natuerlich aktiviert sein, ist auch nur bei aktiviertem Stack aktiv  */
    +#define SEND_POSSTACK
    +#ifndef BEHAVIOUR_DRIVE_STACK_AVAILABLE
    +  #undef SEND_POSSTACK
    +#endif
    +
     bot_list_entry_t * bot_list = NULL;	/*!< Liste aller bekannten Bots */

     int16_t my_state = BOT_STATE_AVAILABLE;
    @@ -55,6 +62,10 @@
     void (* cmd_functions[])(command_t * cmd) = {
     	add_bot_to_list,
     	set_received_bot_state,
    +	#ifdef SEND_POSSTACK
    +	  bot_get_stack,
    +	  bot_go_stack,
    +	#endif
     };

     /*!
    @@ -196,6 +207,52 @@
     	command_write_to(BOT_CMD_STATE, 0, CMD_BROADCAST, state, NULL, 0);
     }

    +#ifdef SEND_POSSTACK
    +/*!
    + * Empfangsroutine zum Start des Stack-Fahrverhaltens
    + * @param *cmd	Zeiger auf Kommando mit Daten
    + */
    +void bot_go_stack(command_t * cmd) {
    +	bot_list_entry_t * ptr = NULL;
    +	while (1) {
    +		ptr = get_next_bot(ptr);
    +		if (ptr == NULL) break;
    +		bot_drive_stack(NULL);
    +	}
    +}
    +
    +/*!
    + * Empfangsroutine fuer die Stackdaten
    + * @param *cmd	Zeiger auf Kommando mit Daten
    + */
    +void bot_get_stack(command_t * cmd) {
    +	bot_list_entry_t * ptr = NULL;
    +	while (1) {
    +		ptr = get_next_bot(ptr);
    +		if (ptr == NULL) break;
    +		  // fuer jeden Bot den Stack laden, d.h. diese uebermittelte Position
    +          bot_push_pos(cmd->data_l,cmd->data_r);
    +	}
    +}
    +
    +/*!
    + * Sendet den Stackinhalt zu den anderen Bots, welche die Stackdaten wiederum in ihren Stack speichern
    + * @param xpos Stack-x-Koordinate
    + * @param ypos Stack-y-Koordinate
    + */
    +void send_bot_pos_stack(int16_t xpos, int16_t ypos) {
    +	command_write_to(BOT_GET_STACK, 0, CMD_BROADCAST, &xpos, &ypos, 0);
    +}
    +
    +/*!
    + * Senderoutine zum Start des Stack-Fahrverhaltens auf den Remote-Bots
    + */
    +void send_bot_go_stack(void) {
    +	command_write_to(BOT_GO_STACK, 0, CMD_BROADCAST, &my_state, NULL, 0);
    +}
    +#endif
    +
    +
     #ifdef LOG_AVAILABLE
     /*!
      * Gibt die Liste der Bots inkl. Adresse und Status aus
    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 @@
    +#Tue Jun 17 19:09:30 CEST 2008
    +eclipse.preferences.version=1
    +indexerId=org.eclipse.cdt.core.fastIndexer

- Antworten:
  - Re: [ct-bot] bot-2-bot-Kommunikation -> Senden der Stackdaten
    - From: Timo Sandmann

- Voriger (Datum): Re: [ct-bot] Ticket 167, Achim Pankalla
- Nächster (Datum): [ct-bot] Fehler im I2C Datentransfer, Marko Bolowski
- Voriger (Thread): Re: [ct-bot] Ticket 167, Achim Pankalla
- Nächster (Thread): Re: [ct-bot] bot-2-bot-Kommunikation -> Senden der Stackdaten, Timo Sandmann
- Indizes:
  - Datum
  - Thread