PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : gezielte Strecke innerhalb d. Hauptschleife zurücklegen?



Furzgas
19.01.2010, 15:55
Ist es möglich innerhalb der Hauptschleife eine gewisse Strecke zurückzulegen ohne darauf warten zu müssen bis die Strecke zurückgelegt wurde?
Ich möchte dazwischen immer task_RP6System() aufrufen können, damit die Bewegungen genau bleiben, und nicht immer nach der move() Funktion.

PS.
Ich hoffe ich habe mich verständlich ausgedrückt. O:)

Furzgas
19.01.2010, 21:13
Hmm, um meine Frage zu präzisieren ein Codebeispiel, wie es falsch ist.


while(true)
{
move(60,FWD,DIST_MM(1000),true); //Fährt 1 Meter
task_Bumpers(); //stoppt Roboter ....
}


Der Roboter Fährt einen Meter vorwärts.
Wenn er jedoch nach 20 cm gegen ein Hindernis fährt, bleibt er nicht stehen, sondern seine Motoren drehen weiter solange bis ein Meter zurückgelegt wurde. Erst nach Beendung von move() erkennt task_Bumpers() das ein Bumper gedrückt wurde. :o(
Erst dann werden auch die Motoren gestoppt.
Ich will den Roboter bestimmte Distanzen zurücklegen lassen und trotzdem auf Hindernisse reagieren.

Weiß hier wer einen Lösungsansatz?
Ich könnte mir vorstellen irgendwie den move() Befehl mit blocking false zu verwenden und irgendwie eine Hilfsvariable zu verwenden die sagt wann der Weg zurückgelegt wurde etc. Jedoch fällt mir keine Möglichkeit ein wie ich aus der Hauptschleife raus, die zurückgelegte Strecke herausfinden kann um mein Flag zu setzen, dass die Strecke zurückgelegt wurde.
HILFE! :o)

suicide
20.01.2010, 07:59
Hast du in deinem bumperStateChange Handler auch beschrieben was der Roboter machen soll wenn er gegen ein Hindernis gefahren ist?
Und den Handler auch als bumperStateChange Handler registriert?

Grüße,
Jan

Code entfernt, das Beispiel war quatsch

karmic_koala
20.01.2010, 13:32
hallo,
könntest du vielleicht so ausprobieren:


move(60,FWD,DIST_MM(1000),false);
while(!isMovementComplete) //Solange Bewegung nicht fertig
{
if(bumper_left)
{
//links ausweichen(Bumper)
}
if(bumper_right)
{
//rechts ausweichen(Bumper)
}
if(obstacle_left)
{
//links ausweichen(IR-LEDs)
}
if(obstacle_right)
{
//rechts ausweichen(IR-LEDs)
}
task_RP6System(); //wegen Motor, bumpern
}


Da er bei Hindernisserkennung aber so die move-funktion überschreibt, müsste man zuerst die schon zurückgelegte Strecke(in Encoderschritten, mleft_dist bzw. mright_dist) bei Ausweichmanövern auslesen und danach dementsprechend die noch zurückzulegende abfahren.

viele grüße karmic_koala

Furzgas
20.01.2010, 14:47
Hey, das wäre ne Idee, genau so hab ich mir das vorgestellt!
Jetzt kann auf Hindernisse reagieren. D.h. ihnen ausweichen, wieder zurück auf den Ursprungspfad fahren und den vorgegebenen Weg weiterfahren. (Freu)