danimath
10.08.2011, 16: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
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