- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: Bumper betätigt - RP6 ignoriert moveAtSpee Befehl

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

    Powerstation Test
    Ist das etwa so rübergekommen? Dann tut mir das leid. War nicht so beabsichtigt.

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

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

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

  5. #15
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Also wirklich erklären kann ich das auch nicht:

    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
    			//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)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #16
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2010
    Alter
    35
    Beiträge
    228
    Danke für die Lösung ^^ Warum auch immer die so etwas umständlich sein muss.

  7. #17
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2010
    Alter
    35
    Beiträge
    228
    Code:
    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:
    Code:
    if(blocking)
    		while(!isMovementComplete())
    			task_RP6System();
    Is mir nur gerade so aufgefallen, getestet hab ichs leider nicht.

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

  9. #19
    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

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

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

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

    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
                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;
    }
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Labornetzteil AliExpress