Moin *,
Als Spin-Off zu Anfänger-braucht-Hilfe. Crystal Eyes Verfahren zum Ausweichen ist natürlich besser als dieses, weil es sich an den Gegebenheiten orientiert, aber trotzdem: Bei einem Hindernis fährt der Robby ein zufällige Distanz zwischen MIN_DIST und MAX_DIST zurück, dreht sich um einen zufälligen Winkel zwischen MIN_ANGLE und MAX_ANGLE und nimmt seine Vorwärtsbewegung wieder auf.
Verbesserungsvorschläge und Kritik sind immer willkommenCode:/* randomesc.c - RP6: umherfahren und Hindernissen * zufaellig ausweichen. * * adu 08 Aug 2011 created * *********************************************************************/ #include "RP6RobotBaseLib.h" #define STATE_START 0 #define STATE_MOVE 1 #define STATE_OBSTACLE 2 #define MOVE_SPEED 80 #define MIN_DIST 50 #define MAX_DIST 300 #define MIN_ANGLE 45 #define MAX_ANGLE 900 uint8_t status; // globale Variable fuer Status /********************************************************* controller */ /* * Funktion zur Bewegungskontrolle */ void controller (void) { int dist, angle, dir; /* * 1. Statusabfrage * ================ */ switch (status) { case STATE_START: stop (); // sollte nicht vorkommen break; case STATE_MOVE: moveAtSpeed (MOVE_SPEED, MOVE_SPEED); if ((obstacle_right || obstacle_left) || (bumper_left || bumper_right)) { status = STATE_OBSTACLE; } break; case STATE_OBSTACLE: stop (); dist = MIN_DIST + random () % (MAX_DIST - MIN_DIST); angle = MIN_ANGLE + random () % (MAX_ANGLE - MIN_ANGLE); dir = random () % 2; if (dir == 0) dir = LEFT; else dir = RIGHT; move (MOVE_SPEED / 2, BWD, DIST_MM (dist), true); rotate (MOVE_SPEED / 2, dir, angle, true); changeDirection (FWD); status = STATE_MOVE; break; } // end switch (status) } /******************************************************* stateChanged */ /* * Funktion zum Erkennen eines Statuswechsels */ void stateChanged (void) { statusLEDs.LED6 = bumper_left; statusLEDs.LED3 = bumper_right; statusLEDs.LED5 = obstacle_left; statusLEDs.LED2 = obstacle_right; updateStatusLEDs(); } /*************************************************************** main */ int main (void) { /* * 1. Variablen * ============ */ /* * 2. inititialisieren * =================== * 2.1. wer dies vergisst ist doof und stinkt * ------------------------------------------ */ initRobotBase (); /* * 2.2. Zustaende setzen * --------------------- */ srandom (1234567); status = STATE_START; /* * 2.3. Handler * ------------ */ ACS_setStateChangedHandler (stateChanged); BUMPERS_setStateChangedHandler (stateChanged); /* * 2.4. hochfahren * --------------- */ powerON (); setACSPwrMed (); status = STATE_MOVE; /* * 3. LEDs pruefen * =============== */ mSleep (1000); setLEDs (0b111111); mSleep (1000); setLEDs (0b000000); mSleep (500); /* * 4. Hauptschleife * ================ */ while (true) { controller (); task_RP6System (); } return 0; }
viele Grüße
Andreas







Zitieren
Lesezeichen