-         

Ergebnis 1 bis 2 von 2

Thema: zufälliges Fliehen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164

    zufälliges Fliehen

    Anzeige

    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

  2. #2
    Hallo,
    also, wie ich hier schon geschrieben hatte, finde ich die Idee schon Klasse. Funktionieren tut es auch gut, warum nicht. Ich müsste bei mir auch noch ein paar Variablen reinbauen

    Beste Grüße

    Crystal Eye
    Wer braucht Fenster, um an einem Rechner zu arbeiten?

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •