PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rückwärts Kurve



Martinius11
28.01.2010, 17:53
Hi ich bräuchte mal hilfe beim programmieren.könnte mir jemand mal ein
beispiel Programm schreiben das der Rp6 gerade ausfährt und wenn irgend
ein ereigniss kommt für 10 sek eine rückwärts kurve fährt.

suicide
28.01.2010, 18:39
#define INIT 0
#define CRUISE 1
#define ESCAPE 2
#define OBSTACLE_LEFT 1
#define OBSTACLE_RIGHT -1
#define OBSTACLE_FRONT 1

uint8_t dir_of_obstacle;
uint8_t state = INIT;

void bumpersStateChanged(void)
{
if(bumper_left && bumper_right) // beide bumper
{
state = ESCAPE;
dir_of_obstacle = OBSTACLE_FRONT;
}
else if(bumper_left) // linker bumper
{
state = ESCAPE;
dir_of_obstacle = OBSTACLE_LEFT;
}
else if(bumper_right) // rechter bumper
{
state = ESCAPE;
dir_ob_obstacle = OBSTACLE_RIGHT;
}
}


/************************************************** ***************************/
// Main:

int main(void)
{
initRobotBase();
mSleep(200);

// Set Bumpers state changed event handler:
BUMPERS_setStateChangedHandler(bumpersStateChanged );

powerON(); // Turn on Encoders, Current sensing, ACS and Power LED.

// Main loop
while(true)
{
task_RP6System();
switch(state){
case INIT: state = CRUISE;
break;

case CRUISE:
direction(fwd);
moveAtSpeed(80,80);
break;

case ESCAPE:
direction(bwd);
moveAtSpeed(20+(10*direction_of_obstacle*-1), 20+(10*direction_of_obstacle));

startStopwatch1();
while(getStopwatch1() < 10000){
task_RP6System();
}
state = CRUISE;
break;
}

}
return 0;
}

So in etwa könnte es klappen. Der RP6 fährt erstmal fein gradeaus. Wenn einer der Bumper gedrückt wird, wird state auf ESCAPE gesetzt und dir_ob_obstacle auf einen Wert der dem Bumper entspricht. Danach wird der Rückwärtsgang eingelegt und Normalgeschwindigkeit (ich hab für den Rückwärtsgang mal 20 angenommen da er ja immerhin 10sec fahren soll) + bzw. - die Differenz zwischen linker und rechter Kette als Geschwindigkeit gesetzt. Habs alle nich getestet da ich keine Lust hatte den Compiler anzuwerfen (bzw. zu installieren) und mein RP6 eh grad beim großen C ist.

Grüße,
Jan

Martinius11
30.01.2010, 09:47
Danke erst mal
aber könntest du mir noch ein programm schreiben indem er einfach nur eine rückwärts Kurve macht ,deren dauer mit mSleep oder ähnlichem.

Danke

KingTobi
30.01.2010, 09:53
Hat er doch?! Die letzte Case Bedingung

Martinius11
30.01.2010, 10:11
ja schon aber ich meine wirklich genau so auch mal 10 min.

KingTobi
30.01.2010, 10:15
Jetzt doch 10 Minuten?
Die Zeit wird durch die 10000 bestimmt.

Martinius11
30.01.2010, 15:44
Aha jetzt verstehe ich was du meinst , ich dachte der kern des programmes
liegt in der moveAtSpeed funktion und nicht im status abfragen. ](*,) ](*,)

KingTobi
30.01.2010, 15:54
Sieht so aus als wenn du noch nicht eine Sekunde damit verbracht hast dir mal die Dokumentation zum RP6 anzuschauen!

Martinius11
30.01.2010, 16:21
hey das find ich beleidigent und auserdem konnt ich dort nichts finden um eine rückwärts kurve für eine bestimmte zeit zu fahren :-k

KingTobi
30.01.2010, 16:28
Man sollte ALLES lesen und nichts "mal eben überfliegen".
Gut dir mal 4.6.3 und 4.6.9 an.

suicide
31.01.2010, 09:58
Hi Martinius,

es ist doch egal ob der RP6 eine Rückwärtskurve, eine Vorwärtskurve oder senkrecht in die Luft fahren soll. Das Problem liegt darin, einen Fahrbefehl für eine bestimmte Zeit ausführen zu lassen. Wenn du mit mSlep() arbeitest, bleiben die Funktionen des Roboters für die 10min einfach mal tot da der Ablauf für diese Zeit angehalten wird und z.b. die Sensorik des RP6 nicht abgefragt werden kann.

Ich hätte den Code vielleicht noch etwas besser dokumentieren sollen.

startStopwatch1();
while(getStopwatch1() < 10000){
task_RP6System();
}
startet eine Stoppuhr (startStopwatch1()) die in ms hoch zählt. Solange diese Stoppuhr noch keine 10000ms gezählt hat, wird einfach nur die task_RP6System() aufgerufen. Dadurch kann der RP6 weiterhin auf seine Sensorik horchen.
Wenn du 10min warten möchtest wären das 600000ms. Ich weiss grad nicht ob die Stoppuhr so weit zählen kann. Steht aber in der Dokumentation oder in den Quellen der RP6lib. Wenn die Stoppuhr nicht so weit zählen kann, dann ruf die oben gezeigte while()-Schleife einfach 60 mal auf. (60x10000=??? na?)
Ich hoffe das hilft weiter.

Achso, der Einwand von King Tobi war durchaus angebracht. In der Dokumentation steht eine Menge zu den Funktionen des RP6. Dann ist in den Beispielen noch ne Menge zu finden und wenn das alles nichts hilft gibt es ja noch die RP6Lib in der man direkt in die Quellen gucken kann.

Grüße,
Jan

Thund3r
31.01.2010, 12:47
Hallo

@KingTobi Dieses Forum ist da um Fragen zu klären und zu lernen! Kommentare wie deine sind beleidigend, erzielen keinen Nutzen und solltest du dir lieber sparen!

Gruß Thund3r

Martinius11
02.02.2010, 18:03
Aber wenn ich das richtig verstanden habe definiere ich allgemein für das
programm die zeit die die MoveAtSpeed funktion anhält ,doch was kann
ich tun wenn ich für jede andere moveAtSpeed eine neue Zeit definieren
will?

suicide
02.02.2010, 19:16
Du kannst nach jedem moveAtSpeed Aufruf eine beliebig definierte Zeit warten und den RP6 fahren lassen. Du könntest auch einen Zufallswert warten, für den Spass halt ;-)