PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : zufälliges Fliehen



danimath
10.08.2011, 15:17
Moin *,

Als Spin-Off zu Anfänger-braucht-Hilfe (https://www.roboternetz.de/community/threads/54300-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.



/* 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

Crystal Eye
10.08.2011, 15:42
Hallo,
also, wie ich hier (https://www.roboternetz.de/community/threads/54300-Anf%C3%A4nger-braucht-Hilfe/page6)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