PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bumper betätigt - RP6 ignoriert moveAtSpee Befehl



Ezalo
21.08.2010, 19:43
Hallo,

habe eine kleines Programm geschrieben um mich mal langsam einzuarbeiten. Habe ein Bumper Programm geschrieben, erst sollten nur je nach gedürckten Bumder die StatusLED's aufleuchten. Das hat auch prima funktioniert :D

Also wollte ich ein kleines Kollisionsprogramm beginnen, erstmal nur mit dem linken Bumper. Betätige ich den linken Bumper, gehen zwar die StatusLED's an aber der RP6 hält nicht wie gewollt an. Er fährt die 1,5 Sekunden vorwärts und fährt dann gleich Rückwärts.

Wo habe ich da einen Denkfehler? :D


#include "RP6RobotBaseLib.h" //bindet die RP6RobotBaseLib.h ein

int main (void){
initRobotBase(); //initialsiert den Robby
powerON(); //aktiviert die Encoder usw.
while(1){
task_Bumpers(); //fragt alle 50ms die Bumper ab und speichert den Wert in "bumper_left" und "bumper_right"
if(bumper_left != false){ //wenn linker bumper betätigt...
setLEDs(0b111000); //schalte SL4, SL5 und SL6 ein
moveAtSpeed(0,0); //Stop
mSleep(1500); //1,5 Sekunden warten
move(60,BWD,DIST_MM(300),BLOCKING); //fahre 30cm Rückwärts
mSleep(800); //... für 0,8 Sekunden
rotate(60,RIGHT,180,BLOCKING); //um 180° nach Rechts drehen
}
else{
setLEDs(0b000000); //schalte alle LEDs aus
changeDirection(FWD); //Motor Drehrichtung auf Vorwärts setzen
moveAtSpeed(80,80); //Fahre Vorwärts bis Bumper gedrückt wird
}
task_RP6System(); //fragt immer wieder die Encoder usw. ab
}
return 0;
}

MfG

Ezalo

Magelan1979
21.08.2010, 20:23
Das liegt wahrscheinlich an der Lib. Schau Dir mal die RP6RobotBase.lib an. Die task_RP6System ruft die task_motionControl auf. Und aus deinem Speed (0,0) wird dann ...

... mright_des_speed < 22) mright_des_speed = 22;

Ich glaube zum anhalten gibt es den Befehl stop()

Ezalo
21.08.2010, 20:34
Ich schau mal nach, habe das "moveAtSpeed(0,0);" auch schon mit "stop();" ersetzt gehabt, gleicher effekt ^^

Ezalo
21.08.2010, 20:45
Und aus deinem Speed (0,0) wird dann ...

... mright_des_speed < 22) mright_des_speed = 22;

Wie soll ich das jetzt genau verstehen?


// Move Distance right:
if(motion_status.move_L) {
if(mright_dist >= preStop_L) { // Stop a bit before the desired distance for ..
mright_des_speed = 0; // ... better accurancy.
right_i = 0;
mright_power = 0;
motion_status.move_L = false;
}
else if(mright_dist >= preDecelerate_L) { // Start to decelerate?
mright_des_speed /= 2;
if(mright_des_speed < 22) mright_des_speed = 22;
}
}

meinst du diese Stelle in der Lib?

Ich mach doch aber garkeinen "move rechts" befehl oder?

Vorher stand hier:


move(60,BWD,DIST_MM(300),BLOCKING); //fahre 30cm Rückwärts
folgendes

changeDirection(BWD);
moveAtSpeed(60,60);
mSleep(800);

was er dann aber auch übersprungen hatte und nach den 1,5 Sekunden gewendet hat.

Magelan1979
22.08.2010, 06:29
Ohh, ich hätte mir mal alles durchlesen sollen. Ist glaub ich eher dafür gedacht, dass der Robo geradeausfährt.

Andere Frage: Hast Du es mal mit Kontrollausgaben nach dem BumperEvent probiert?

Magelan1979
22.08.2010, 07:21
Nächste Runde:

Vieleicht muss nach dem stop oder MovateAtSpeed(0,0) auch nur nochmal die task_RP6System(); aufgerufen werden

Ezalo
22.08.2010, 07:46
Zum 1. Post: Meine Kontrollausgabe sind doch theo. die LED's die angehen oder nicht?

Zum 2. Post: Da eine "task_RP6System();" Befehl einzufügen bringt leider keine Änderung. Problem besteht also leider immernoch.

radbruch
22.08.2010, 08:06
Hallo

Könntest du noch deinen geänderten Code zeigen? Oder ist das ganz oben immer noch aktuell?

Gruß

mic

[Edit]
Ich hoffe, das funzt so in etwa:

#include "RP6RobotBaseLib.h" //bindet die RP6RobotBaseLib.h ein

int main (void)
{
initRobotBase(); //initialsiert den Robby
powerON(); //aktiviert die Encoder usw.
//fragt alle 50ms die Bumper ab und speichert den Wert in "bumper_left" und "bumper_right"
task_Bumpers();

while(1)
{
if(bumper_left != false) //wenn linker bumper betätigt...
{
setLEDs(0b111111); //schalte SL4, SL5 und SL6 ein
moveAtSpeed(0,0); //Stop
while(!isMovementComplete()) // Weiterfahren bis Antriebe auf null
task_RP6System();
mSleep(1500); //1,5 Sekunden warten

setLEDs(0b011011); //schalte SL4 SL5 ein
move(60,BWD,DIST_MM(300),NON_BLOCKING); //fahre 30cm Rückwärts
while(!isMovementComplete()) // Weiterfahren bis Ziel erreicht
task_RP6System();
mSleep(800); //... für 0,8 Sekunden

setLEDs(0b001001); //schalte SL4 ein
rotate(60,RIGHT,180,NON_BLOCKING); //um 180° nach Rechts drehen
while(!isMovementComplete()) // Weiterfahren bis Drehung fertig
task_RP6System();
}
else
{
setLEDs(0b000000); //schalte alle LEDs aus
changeDirection(FWD); //Motor Drehrichtung auf Vorwärts setzen
moveAtSpeed(80,80); //Fahre Vorwärts bis Bumper gedrückt wird
}
task_RP6System(); //fragt immer wieder die Encoder, ACS, Bumpers und Motorfunktionen ab
}
return 0;
}(ungetestet)

Ezalo
22.08.2010, 08:17
Mit der Änderung von Magelan:


#include "RP6RobotBaseLib.h" //bindet die RP6RobotBaseLib.h ein

int main (void){
initRobotBase(); //initialsiert den Robby
powerON(); //aktiviert die Encoder usw.
while(1){
task_Bumpers(); //fragt alle 50ms die Bumper ab und speichert den Wert in "bumper_left" und "bumper_right"
if(bumper_left != false){ //wenn linker bumper betätigt...
setLEDs(0b111000); //schalte SL4, SL5 und SL6 ein
moveAtSpeed(0,0); //Stop
task_RP6System();
mSleep(1500); //1,5 Sekunden warten
move(60,BWD,DIST_MM(300),BLOCKING); //fahre 30cm Rückwärts
rotate(60,RIGHT,180,BLOCKING); //um 180° nach Rechts drehen
}
else{
setLEDs(0b000000); //schalte alle LEDs aus
changeDirection(FWD); //Motor Drehrichtung auf Vorwärts setzen
moveAtSpeed(80,80); //Fahre Vorwärts bis Bumper gedrückt wird
}
task_RP6System(); //fragt immer wieder die Encoder usw. ab
}
return 0;
}

Magelan1979
22.08.2010, 08:42
Schlag mich nicht wenn meine EInwürfe nicht funktionieren. Sind alles nur kreative (Denk)Ansätze die ich in den Raum schmeiße

Ezalo
22.08.2010, 08:50
Ist das etwa so rübergekommen? Dann tut mir das leid. War nicht so beabsichtigt.

Ezalo
22.08.2010, 09:04
Danke für deine Idee radbruch.
Aber leider funktioniert das so auch nicht. Er fährt immernoch nach den 1,5 Sekunden rückwärts ohne davor anzuhalten.

radbruch
22.08.2010, 09:18
So vielleicht:

setLEDs(0b111111); //schalte SL4, SL5 und SL6 ein
//moveAtSpeed(0,0); //Stop
stop();
while(!isMovementComplete()) // Weiterfahren bis Antriebe auf null
task_RP6System();
mSleep(1500); //1,5 Sekunden warten

Ezalo
22.08.2010, 09:24
Das kann doch net sein ^^ Das ist doch nun eigentlich nen recht simples Programm oder?

Mit "stop();" da einfügen kommt leider kein unterschied zustande.

radbruch
22.08.2010, 10:04
Also wirklich erklären kann ich das auch nicht:


#include "RP6RobotBaseLib.h" //bindet die RP6RobotBaseLib.h ein

int main (void)
{
initRobotBase(); //initialsiert den Robby
powerON(); //aktiviert die Encoder usw.
//fragt alle 50ms die Bumper ab und speichert den Wert in "bumper_left" und "bumper_right"
task_Bumpers();

while(1)
{
if(bumper_left != false) //wenn linker bumper betätigt...
{
setLEDs(0b111111); //schalte SL4, SL5 und SL6 ein
//moveAtSpeed(0,0); //Stop
//stop();
//powerOFF(); // abwürg
// folgender Code ist aus emergencyShutdown(0);
mleft_power = 0; // aktuelle Power
mright_power = 0;
OCR1AL = 0; // PWM auf null
OCR1BL = 0;
setLEDs(0b011111); //schalte SL6 aus
//while(!isMovementComplete()) // Weiterfahren bis Antriebe auf null
//task_RP6System();
mSleep(1500); //1,5 Sekunden warten
//powerON(); // und weiter

setLEDs(0b011011); //schalte SL4 SL5 ein
move(60,BWD,DIST_MM(300),NON_BLOCKING); //fahre 30cm Rückwärts
while(!isMovementComplete()) // Weiterfahren bis Ziel erreicht
task_RP6System();
mSleep(800); //... für 0,8 Sekunden

setLEDs(0b001001); //schalte SL4 ein
rotate(60,RIGHT,180,NON_BLOCKING); //um 180° nach Rechts drehen
while(!isMovementComplete()) // Weiterfahren bis Drehung fertig
task_RP6System();
}
else
{
setLEDs(0b000000); //schalte alle LEDs aus
changeDirection(FWD); //Motor Drehrichtung auf Vorwärts setzen
moveAtSpeed(80,80); //Fahre Vorwärts bis Bumper gedrückt wird
}
task_RP6System(); //fragt immer wieder die Encoder, ACS, Bumpers und Motorfunktionen ab
}
return 0;
}(getestet)

Ezalo
22.08.2010, 10:10
Danke für die Lösung ^^ Warum auch immer die so etwas umständlich sein muss.

Ezalo
22.08.2010, 18:48
move(60,BWD,DIST_MM(300),NON_BLOCKING); //fahre 30cm Rückwärts
while(!isMovementComplete()) // Weiterfahren bis Ziel erreicht
task_RP6System();
Ist doch eigentlich sinnlos es so zu schreiben oder?
Da in der RP6-Lib:

if(blocking)
while(!isMovementComplete())
task_RP6System();

Is mir nur gerade so aufgefallen, getestet hab ichs leider nicht.

radbruch
22.08.2010, 19:19
Ja, so ist es sinnlos. So sinnlos wie blockierende Funktionen in der Task-Umgebung des RP6. Sinnvoll wird es erst, wenn alle while-Schleifen entfernt sind und task_RP6System(); nur noch einmalig in der Hauptschleife aufgerufen wird.

radbruch
23.08.2010, 12:33
Hallo

Ich bin mir nicht sicher ob das wirklich "besser" ist:


#include "RP6RobotBaseLib.h" //bindet die RP6RobotBaseLib.h ein

int main (void)
{
uint8_t schritt=0; // Ausweichen in drei Schritten
uint16_t pause=0; // Pausezeit in ms

initRobotBase(); //initialsiert den Robby
powerON(); //aktiviert die Encoder usw.

while(1)
{
task_RP6System();
if(isMovementComplete())
{
if(pause)
{
mSleep(pause);
pause=0;
}
switch(schritt)
{
case 3: setLEDs(0b111111);
mleft_power = 0; // Stop
mright_power = 0;
OCR1AL = 0;
OCR1BL = 0;
pause=1500; //1,5 Sekunden warten
schritt--;
break;

case 2: setLEDs(0b011011);
move(60,BWD,DIST_MM(300),NON_BLOCKING);// Zurück
pause=800; // 0,8 Sekunden warten
schritt--;
break;

case 1: setLEDs(0b001001);
rotate(60,RIGHT,180,NON_BLOCKING);//um 180° nach Rechts drehen
schritt--;
break;

default: setLEDs(0b000000);
changeDirection(FWD);//Motor Drehrichtung auf Vorwärts setzen
moveAtSpeed(80,80); //Fahre Vorwärts bis Bumper gedrückt wird
if(bumper_left) //wenn linker bumper betätigt...
{
schritt=3; // ... ausweichen
}
break;
} // switch
} // if
} // while
return 0; // wird nie ausgeführt
}

Ist ja spannend. Eigentlich dürfte das gar nicht funktionieren. Bei Case default wird der Bumper ausgewertet. Das geschieht aber nur, wenn isMovementComplete() true ist. Offensichtlich wird isMovementComplete() von moveAtSpeed() nicht beeinflußt, deshalb funktioniert auch dies nicht:


setLEDs(0b111111); //schalte SL4, SL5 und SL6 ein
//moveAtSpeed(0,0); //Stop
stop();
while(!isMovementComplete()) // Weiterfahren bis Antriebe auf null
task_RP6System();
mSleep(1500); //1,5 Sekunden warten


isMovementComplete() ist immer true, die while-Schleife mit dem Taskaufruf wird nie ausgeführt! Deshalb hält der RP6 nicht an.

Die Lösung: Man überprüft selbst die PWM-Werte der Antriebe. Diese stehen in mleft_power und mright_power:

#include "RP6RobotBaseLib.h" //bindet die RP6RobotBaseLib.h ein

int main (void){
initRobotBase(); //initialsiert den Robby
powerON(); //aktiviert die Encoder usw.
while(1){
task_Bumpers(); //fragt alle 50ms die Bumper ab und speichert den Wert in "bumper_left" und "bumper_right"
if(bumper_left != false){ //wenn linker bumper betätigt...
setLEDs(0b111000); //schalte SL4, SL5 und SL6 ein
moveAtSpeed(0,0); //Stop

while(mleft_power || mright_power) task_RP6System();

mSleep(1500); //1,5 Sekunden warten
move(60,BWD,DIST_MM(300),BLOCKING); //fahre 30cm Rückwärts
rotate(60,RIGHT,180,BLOCKING); //um 180° nach Rechts drehen
}
else{
setLEDs(0b000000); //schalte alle LEDs aus
changeDirection(FWD); //Motor Drehrichtung auf Vorwärts setzen
moveAtSpeed(80,80); //Fahre Vorwärts bis Bumper gedrückt wird
}
task_RP6System(); //fragt immer wieder die Encoder usw. ab
}
return 0;
}(getestet:)

Gruß

mic

[Edit]
Noch einfacher ist es wohl so:


#include "RP6RobotBaseLib.h" //bindet die RP6RobotBaseLib.h ein

int main (void){
initRobotBase(); //initialsiert den Robby
powerON(); //aktiviert die Encoder usw.
while(1){
task_Bumpers(); //fragt alle 50ms die Bumper ab und speichert den Wert in "bumper_left" und "bumper_right"
if(bumper_left != false){ //wenn linker bumper betätigt...
setLEDs(0b111000); //schalte SL4, SL5 und SL6 ein
move(0,FWD,0,BLOCKING); //Stop
mSleep(1500); //1,5 Sekunden warten
move(60,BWD,DIST_MM(300),BLOCKING); //fahre 30cm Rückwärts
rotate(60,RIGHT,180,BLOCKING); //um 180° nach Rechts drehen
}
else{
setLEDs(0b000000); //schalte alle LEDs aus
changeDirection(FWD); //Motor Drehrichtung auf Vorwärts setzen
moveAtSpeed(80,80); //Fahre Vorwärts bis Bumper gedrückt wird
}
task_RP6System(); //fragt immer wieder die Encoder usw. ab
}
return 0;
}