Die Programmstruktur des c't-Bot habe ich einige Zeit analysiert. Hier ist die zentrale Routine:
Code:
/* Hauptprogramm des Bots. Diese Schleife kuemmert sich um seine Steuerung. */
int main (void)
{
//...
init(); // enthaelt u.a. bot_behave_init();
//...
/*! Hauptschleife des Bot */
for(;;)
{
//...
// Testprogramm, dass den Bot erst links, dann rechtsrum dreht
#ifdef TEST_AVAILABLE_MOTOR
calls++;
if (calls == 1) motor_set( BOT_SPEED_SLOW, -BOT_SPEED_SLOW);
else if (calls == 501) motor_set(-BOT_SPEED_SLOW, BOT_SPEED_SLOW);
else if (calls== 1001) motor_set( BOT_SPEED_STOP, BOT_SPEED_STOP);
else
#endif
//...
#ifdef BEHAVIOUR_AVAILABLE
bot_behave(); // <--- Diese Funktion sorgt fuer das Verhalten des c't-Bot
#endif
//...
#ifdef MCU
#ifdef BOT_2_PC_AVAILABLE
static int16 lastTimeCom =0;
bot_2_pc_inform(); // Den PC ueber Sensorern und Aktuatoren informieren
if (timer_get_s() != lastTimeCom) // sollte genau 1x pro Sekunde zutreffen
{
lastTimeCom = timer_get_s();
bot_2_pc_listen(); // Kommandos vom PC empfangen
}
#endif
#endif
//...
}
/*! Ende Hauptschleife des Bot */
//...
}
Den Rest kann man auf meiner Homepage nachlesen. Dort habe ich die Zusammenhänge dargelegt. Hier noch bot_behave_init(), das in diesem Fall bot_simple_behaviour aktiviert.
Code:
// Kette:
// main() ---> init() ---> bot_behave_init ---> bot_...
void bot_behave_init(void) /* Initialisert das ganze Verhalten */ (komplett s.o.)
{
// Verhalten zum Schutz des Bots, hohe Prioritaet, Aktiv
insert_behaviour_to_list(&behaviour, new_behaviour(200, bot_avoid_border, ACTIVE));
insert_behaviour_to_list(&behaviour, new_behaviour(100, bot_avoid_col, ACTIVE));
// Verhalten, um Hindernisse besser zu erkennen, relativ hohe Prioritaet, modifiziert nur
insert_behaviour_to_list(&behaviour, new_behaviour( 60, bot_glance, ACTIVE));
//...
// Grundverhalten, setzt aeltere FB-Befehle um, aktiv
insert_behaviour_to_list(&behaviour, new_behaviour( 2, bot_base, ACTIVE));
activateBehaviour(bot_simple_behaviour); // hier waehlt man das gewuenschte Verhalten aus
//...
return;
}
Ich fand dies ziemlich komplex. Da ASURO für Anfänger gedacht ist, wirkt so etwas eher abschreckend. Ob das überhaupt bezüglich Speichergröße beim ASURO machbar ist, weiß ich auch nicht. Aber prinzipiell interessant ist diese Vorgehensweise. Vielleicht lässt sich das vereinfachen.
Lesezeichen