TcH
01.06.2008, 11:54
Hallo
Ich habe mir jetzt vor paar Tagen den RP6 geholt (hatte anfänglich auch ein defektes USB Interface...) und bin jetzt fleißig am programmieren.
Momentan schreibe ich ein Programm mit einer Statemachine, was den Roboter durch den Raum manövrieren soll, ohne irgendwo anzuecken.
#include "RP6RobotBaseLib.h"
#define STATE_NONE 0
#define STATE_MOVE 1
#define STATE_ROTATE 2
#define STATE_HALT 3
#define STATE_CHANGE_DIRECTION 4
#define STATE_CHECK_FOR_OBSTACLE 5
#define STATE_INITIALIZE 6
uint8_t state;
uint8_t velocity;
void state_machine(void)
{
// Statusvariablen
int8_t is_moving = false;
int8_t is_rotating = false;
switch(state)
{
// Initialisieren
case STATE_INITIALIZE:
{
// Microcontroller initialisieren
initRobotBase();
// Motorencoder initialisieren
powerON();
// Entfernungssensoren aktivierencv
setACSPwrMed();
state = STATE_CHECK_FOR_OBSTACLE;
break;
}
// Fahren
case STATE_MOVE:
{
//move(velocity, FWD, DIST_MM(100), true);
//state = STATE_CHECK_FOR_OBSTACLE;
// Roboter fährt nicht
if(!is_moving)
{
move(velocity, FWD, DIST_MM(50), false);
is_moving = true;
state = STATE_MOVE;
}
// Roboter fährt bereits
else
{
// prüfen, ob Fahrvorgang abgeschlossen ist
if(isMovementComplete())
{
is_moving = false;
state = STATE_CHECK_FOR_OBSTACLE;
}
}
break;
}
// Rotieren
case STATE_ROTATE:
{
//rotate(velocity, LEFT, 45, true);
//state = STATE_CHECK_FOR_OBSTACLE;
// Roboter rotiert nicht
if(!is_rotating)
{
rotate(velocity, LEFT, 45, false);
is_rotating = true;
state = STATE_ROTATE;
}
// Roboter rotiert bereits
else
{
// Rotation ist abgeschlossen?
if(isMovementComplete())
{
is_rotating = false;
state = STATE_CHECK_FOR_OBSTACLE;
}
}
break;
}
// Kollision ermittlen
case STATE_CHECK_FOR_OBSTACLE:
{
// Hindernis gefunden?
if(obstacle_left || obstacle_right)
{
// rotieren...
setLEDs(0b111111);
state = STATE_ROTATE;
}
else
{
// fahren...
setLEDs(0b000000);
state = STATE_MOVE;
}
break;
}
}
}
int main(void)
{
// Anfangsstate festlegen...
state = STATE_INITIALIZE;
// Geschwindigkeit setzten
velocity = 200;
// Hauptschleife
while(true)
{
// gesamtes System updaten...
task_RP6System();
// State Machine durchlaufen
state_machine();
}
return 0;
}
Folgendes Problem habe ich: der Roboter soll, nachdem die Bewegungsroutine abgeschlossen ist prüfen, ob Hindernisse vor ihm liegen - er macht es aber nicht...
Warum kommt es in
case STATE_MOVE:
{
//move(velocity, FWD, DIST_MM(100), true);
//state = STATE_CHECK_FOR_OBSTACLE;
// Roboter fährt nicht
if(!is_moving)
{
move(velocity, FWD, DIST_MM(50), false);
is_moving = true;
state = STATE_MOVE;
}
// Roboter fährt bereits
else
{
// prüfen, ob Fahrvorgang abgeschlossen ist
if(isMovementComplete())
{
is_moving = false;
state = STATE_CHECK_FOR_OBSTACLE;
}
}
break;
}
nie zu
if(isMovementComplete())
{
is_moving = false;
state = STATE_CHECK_FOR_OBSTACLE;
}
Nochmal kurz die aktuelle (fehlerhafte VErhaltensbeschreibung des Roboters)
Er fährt einfach nur gerade durch, ohne Rücksicht auf Verluste ;)
(Die Sensoren vernachlässigt er (diese Funktionieren aber einwandfrei!))
mfG TcH
Ich habe mir jetzt vor paar Tagen den RP6 geholt (hatte anfänglich auch ein defektes USB Interface...) und bin jetzt fleißig am programmieren.
Momentan schreibe ich ein Programm mit einer Statemachine, was den Roboter durch den Raum manövrieren soll, ohne irgendwo anzuecken.
#include "RP6RobotBaseLib.h"
#define STATE_NONE 0
#define STATE_MOVE 1
#define STATE_ROTATE 2
#define STATE_HALT 3
#define STATE_CHANGE_DIRECTION 4
#define STATE_CHECK_FOR_OBSTACLE 5
#define STATE_INITIALIZE 6
uint8_t state;
uint8_t velocity;
void state_machine(void)
{
// Statusvariablen
int8_t is_moving = false;
int8_t is_rotating = false;
switch(state)
{
// Initialisieren
case STATE_INITIALIZE:
{
// Microcontroller initialisieren
initRobotBase();
// Motorencoder initialisieren
powerON();
// Entfernungssensoren aktivierencv
setACSPwrMed();
state = STATE_CHECK_FOR_OBSTACLE;
break;
}
// Fahren
case STATE_MOVE:
{
//move(velocity, FWD, DIST_MM(100), true);
//state = STATE_CHECK_FOR_OBSTACLE;
// Roboter fährt nicht
if(!is_moving)
{
move(velocity, FWD, DIST_MM(50), false);
is_moving = true;
state = STATE_MOVE;
}
// Roboter fährt bereits
else
{
// prüfen, ob Fahrvorgang abgeschlossen ist
if(isMovementComplete())
{
is_moving = false;
state = STATE_CHECK_FOR_OBSTACLE;
}
}
break;
}
// Rotieren
case STATE_ROTATE:
{
//rotate(velocity, LEFT, 45, true);
//state = STATE_CHECK_FOR_OBSTACLE;
// Roboter rotiert nicht
if(!is_rotating)
{
rotate(velocity, LEFT, 45, false);
is_rotating = true;
state = STATE_ROTATE;
}
// Roboter rotiert bereits
else
{
// Rotation ist abgeschlossen?
if(isMovementComplete())
{
is_rotating = false;
state = STATE_CHECK_FOR_OBSTACLE;
}
}
break;
}
// Kollision ermittlen
case STATE_CHECK_FOR_OBSTACLE:
{
// Hindernis gefunden?
if(obstacle_left || obstacle_right)
{
// rotieren...
setLEDs(0b111111);
state = STATE_ROTATE;
}
else
{
// fahren...
setLEDs(0b000000);
state = STATE_MOVE;
}
break;
}
}
}
int main(void)
{
// Anfangsstate festlegen...
state = STATE_INITIALIZE;
// Geschwindigkeit setzten
velocity = 200;
// Hauptschleife
while(true)
{
// gesamtes System updaten...
task_RP6System();
// State Machine durchlaufen
state_machine();
}
return 0;
}
Folgendes Problem habe ich: der Roboter soll, nachdem die Bewegungsroutine abgeschlossen ist prüfen, ob Hindernisse vor ihm liegen - er macht es aber nicht...
Warum kommt es in
case STATE_MOVE:
{
//move(velocity, FWD, DIST_MM(100), true);
//state = STATE_CHECK_FOR_OBSTACLE;
// Roboter fährt nicht
if(!is_moving)
{
move(velocity, FWD, DIST_MM(50), false);
is_moving = true;
state = STATE_MOVE;
}
// Roboter fährt bereits
else
{
// prüfen, ob Fahrvorgang abgeschlossen ist
if(isMovementComplete())
{
is_moving = false;
state = STATE_CHECK_FOR_OBSTACLE;
}
}
break;
}
nie zu
if(isMovementComplete())
{
is_moving = false;
state = STATE_CHECK_FOR_OBSTACLE;
}
Nochmal kurz die aktuelle (fehlerhafte VErhaltensbeschreibung des Roboters)
Er fährt einfach nur gerade durch, ohne Rücksicht auf Verluste ;)
(Die Sensoren vernachlässigt er (diese Funktionieren aber einwandfrei!))
mfG TcH