- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Bumper betätigt - RP6 ignoriert moveAtSpee Befehl

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2010
    Alter
    34
    Beiträge
    228

    Bumper betätigt - RP6 ignoriert moveAtSpee Befehl

    Anzeige

    Praxistest und DIY Projekte
    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

    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?

    Code:
    #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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    30.12.2009
    Ort
    Koblenz
    Alter
    44
    Beiträge
    78
    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()
    Ich habe bereits bis Unendlich gezählt. Zweimal, und zurück

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2010
    Alter
    34
    Beiträge
    228
    Ich schau mal nach, habe das "moveAtSpeed(0,0);" auch schon mit "stop();" ersetzt gehabt, gleicher effekt ^^

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2010
    Alter
    34
    Beiträge
    228
    Und aus deinem Speed (0,0) wird dann ...

    ... mright_des_speed < 22) mright_des_speed = 22;
    Wie soll ich das jetzt genau verstehen?

    Code:
    // 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:

    Code:
    move(60,BWD,DIST_MM(300),BLOCKING);  //fahre 30cm Rückwärts
    folgendes
    Code:
    changeDirection(BWD);
    moveAtSpeed(60,60);
    mSleep(800);
    was er dann aber auch übersprungen hatte und nach den 1,5 Sekunden gewendet hat.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    30.12.2009
    Ort
    Koblenz
    Alter
    44
    Beiträge
    78
    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?
    Ich habe bereits bis Unendlich gezählt. Zweimal, und zurück

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    30.12.2009
    Ort
    Koblenz
    Alter
    44
    Beiträge
    78
    Nächste Runde:

    Vieleicht muss nach dem stop oder MovateAtSpeed(0,0) auch nur nochmal die task_RP6System(); aufgerufen werden
    Ich habe bereits bis Unendlich gezählt. Zweimal, und zurück

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2010
    Alter
    34
    Beiträge
    228
    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.

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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:
    Code:
    #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)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2010
    Alter
    34
    Beiträge
    228
    Mit der Änderung von Magelan:

    Code:
    #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;
    }

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    30.12.2009
    Ort
    Koblenz
    Alter
    44
    Beiträge
    78
    Schlag mich nicht wenn meine EInwürfe nicht funktionieren. Sind alles nur kreative (Denk)Ansätze die ich in den Raum schmeiße
    Ich habe bereits bis Unendlich gezählt. Zweimal, und zurück

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests