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.

Code:
/*  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;
}
Verbesserungsvorschläge und Kritik sind immer willkommen

viele Grüße
Andreas