Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmierung collision... Problem !
Night989
29.12.2008, 15:28
Hi,
ich bin Roboteranfänger und habe zu Weihnachten einen RP6 bekommen.
Die Anleitung ist super aber ich habe ein kleines Problem und ich find den Fehler nicht.
Der Roboter soll auf die 2 Tastsensoren reagieren. Beim rechten soll er nach rechts hinten wegfahren und beim linken umgekehrt. Wenn beide gedrückt werden soll er sich einfach mal auf der stelle drehen.
Mein Problem ist das er nach einem tastendruck immer weiter nach hinten fährt und nicht wie gewünscht nach 0,5 sec wieder nach vorne.... ](*,)
Hier der Code:
#include "RP6RobotBaseLib.h"
void bumper(void)
{
if(getBumperLeft() && getBumperRight())
drehen();
else if(getBumperLeft())
rueckwaerts_links();
else if(getBumperRight())
rueckwaerts_rechts();
}
void vorwaerts(void)
{
changeDirection(FWD);
moveAtSpeed(70,70);
}
void drehen(void)
{
changeDirection(LEFT);
startStopwatch1();
if(getStopwatch1() > 500)
{
vorwaerts();
stopStopwatch1();
setStopwatch1(0);
}
}
void rueckwaerts_links(void)
{
changeDirection(BWD);
moveAtSpeed(40,120);
startStopwatch2();
if(getStopwatch2() > 500)
{
vorwaerts();
stopStopwatch2();
setStopwatch2(0);
}
}
void rueckwaerts_rechts(void)
{
changeDirection(BWD);
moveAtSpeed(120,40);
startStopwatch3();
if(getStopwatch3() > 500)
{
vorwaerts();
stopStopwatch3();
setStopwatch3(0);
}
}
int main(void)
{
initRobotBase();
powerON();
moveAtSpeed(70,70);
while(true)
{
bumper();
task_RP6System();
}
return 0;
}
Gruß Night989 O:)
Das kommt daher, dass die Funktionen drehen(), rueckwaerts_links() und rueckwaerts_rechts() nur dann aufgerufen werden, wenn mind. ein Bumper gedrückt ist. Wenn er aber schon etwas zurückgefahren und deshalb kein Bumper gedrückt ist, wird bumber() durchlaufen, ohne dass irgendwas gemacht wird, weshalb er auch weiter nach hinten fährt/dreht.
Ich kenn mich mit dem RP6 und seiner Lib nicht aus, aber wenn es tatsächlich nötig ist, task_RP6System() periodisch aufzurufen, ist eine State-Machine die einige Lösung, d.h. es gibt die Zustände vorwärts, rechts, links, drehen, und je nachdem in welchen zustand sich der Robby befindet, wird was anderes geacht. Wenn er vorwärts fährt, müssen die Bumper abgefragt und ggf. eine dieser Stopwatches gestartet und der Zustand gewechselt werden. Wenn er gerade am Ausweichen ist, müssen diese Stopwatches abgefagt und falls die entsprechende Zeit abgelaufen ist, müssen sie gestoppt werden und der Robby muss dann wieder vorwärts fahren usw.
MfG Mark
Night989
29.12.2008, 18:47
Hi,
ich habe es geschaft :D, hab nen bischen was geändert^^
Ein kleines Problem gibt es aber immer noch: wenn man die 2 Taster nicht exakt gleichzeitig drückt fährt er eine mischung aus drehen und rückwärts_links/rechts.... wie kann ich das verbessern ?
#include "RP6RobotBaseLib.h"
void bumpersStateChanged(void)
{
if(getBumperLeft() && getBumperRight())
{
move(70, BWD, DIST_MM(300), true);
drehen();
}
else if(getBumperLeft())
rueckwaerts_links();
else if(getBumperRight())
rueckwaerts_rechts();
}
void drehen(void)
{
changeDirection(LEFT);
startStopwatch1();
}
void rueckwaerts_links(void)
{
changeDirection(BWD);
moveAtSpeed(60,120);
startStopwatch2();
}
void rueckwaerts_rechts(void)
{
changeDirection(BWD);
moveAtSpeed(120,60);
startStopwatch3();
}
void vorwaerts_pruefen (void)
{
if ((getStopwatch1() > 2000) || (getStopwatch2() > 2000) || (getStopwatch3() > 2000))
{
changeDirection(FWD);
moveAtSpeed(70,70);
setStopwatch1(0);
setStopwatch2(0);
setStopwatch3(0);
stopStopwatch1();
stopStopwatch2();
stopStopwatch3();
}
}
int main(void)
{
initRobotBase();
powerON();
moveAtSpeed(70,70);
BUMPERS_setStateChangedHandler(bumpersStateChanged );
while(true)
{
vorwaerts_pruefen();
task_RP6System();
}
return 0;
}
Ich habe bis jetzt aber immer noch keinen Befehl gefunden womit man z.b. gestimmen kann wie lang (Zeit) sich ein Motor dreht.... geht das nur mit "Stopwatch" ???
if(getBumperLeft() && getBumperRight())
{
move(70, BWD, DIST_MM(300), true);
drehen();
}
Hier hätte ich lieber das er eine sec rückwärts fährt, und keine Strecke.
danke für die Antwort ;D
Gruß Night989
EDIT:
ich hab jetzt ein licht-finden-programm geschrieben und das funktioniert auch. jetzt möchte ich in das programm das collisions-programm einfügen, damit er dem licht folgt und wenn er wo gegenstößt darauf reagiert.
müsste machbar sein oder ? ;)
MFG
Night989
02.01.2009, 13:43
schade das bis jetzt keiner geantwortet hat...
wie kann ich eine anweisung eine bestimmte zeit lang laufen lassen z.b. einen motor. mit stopwatch ist es ja ziemlich aufwändig...
und wie kann ich z.b. in mein collisions-programm andere dateien einbinden ??? z.b. eine blinklichtdatei oder auch eine lichtfolgedatei.
in der Anleitung konnte ich lieder sowas nicht finden.
würde mich über jede antwort echt freuen :)
Gruß Night
wie kann ich eine anweisung eine bestimmte zeit lang laufen lassen z.b. einen motor. mit stopwatch ist es ja ziemlich aufwändig...
Ohne eine Stopwatch wird das aber nur gehen, wenn gar nichts anderes gemacht wird. Dann kannste einfach mSleep() verwenden.
Aber mit ner Stopwatch ist das auch nicht sonderlich schwer ...
Nicht getestet - nur kurz in den Texteditor gehauen:
int main(void)
{
//...
START_machIrgendwas();
startStopwatch2();
while(true)
{
if( getStopwatch2() > 2000)
{
STOP_machIrgendwas();
stopStopwatch2();
setStopwatch2(0);
}
task_RP6System();
}
return 0;
}
Das geht natürlich noch schöner und die Stopwatch kann man auch in ne extra funktion reinschreiben.
Oh und Du kannst mit isStopwatchRunning abfragen ob die Aktion schon abgeschlossen ist oder nicht...
MfG,
SlyD
Panzerfan
02.01.2009, 17:52
Hi Night989
Zu deiner ersten Frage hat ja Slyd schon die Antwort gegeben jetzt versuch ich es mal für die zweite: Ich glaube Dateien direkt einbinden kann man nicht aber man kann den Programmcode z.b. eines Blinklichtprogramms in ein anderes Programm reinkopieren und in der main Funktion aufrufen. Zum Beispiel so:
#include "RP6RobotBaseLib.h"
void bumpersStateChanged(void)// das und...
{
if(bumper_left || bumper_right)
{
moveAtSpeed(0,0); // stop moving!
setLEDs(0b010000);
startStopwatch1();
}
}
void blink(void)//... das ist alles aus RP6Base_Move_1.c
{
if(getStopwatch1() > 500) // 500ms
{
statusLEDs.LED2 = !statusLEDs.LED2;
statusLEDs.LED5 = !statusLEDs.LED5;
updateStatusLEDs();
setStopwatch1(0);
}
}
int main(void)
{
initRobotBase();
setLEDs(0b111111);
mSleep(1500);
setLEDs(0b100001);
BUMPERS_setStateChangedHandler(bumpersStateChanged );// von hier bis...
powerON();
changeDirection(FWD);
moveAtSpeed(80,10);//... ist alles aus RP6Base_Move_1.c
uint8_t runningLight = 1;
while(true)
{
blink();
setLEDs(runningLight);// und von hier...
runningLight <<= 1;
if(runningLight > 32)
runningLight = 1;
mSleep(100); // ...bis hier ist alles aus RP6Base_LEDs.c
task_Rp6System();
}
return 0;
}
mfg Panzerfan
P.S:Der Code ist nicht getestet habs nur mal grad in den Editor gehauen.
Ich glaube Dateien direkt einbinden kann man nicht
...indirekt aber schon ;)
Über Header Files genau wie bei der RP6Library.
MfG,
SlyD
Night989
07.01.2009, 16:41
Hi,
ich hab noch bei mir alle Teile für das Ultraschall erweiterungsmodul für den Asuro rumfliegen. Kann ich dieses Erweiterungsmodul auch auf den RP6 draufbauen???
Wäre echt super ;)
Gruß Night989
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.