-
        

Ergebnis 1 bis 8 von 8

Thema: Programmierung collision... Problem !

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.09.2006
    Beiträge
    14

    Programmierung collision... Problem !

    Anzeige

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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    26
    Beiträge
    522
    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    03.09.2006
    Beiträge
    14

    Gelöst

    Hi,
    ich habe es geschaft , 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 ?
    Code:
    #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" ???

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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    03.09.2006
    Beiträge
    14
    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

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    32
    Beiträge
    1.514
    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:

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

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    07.11.2008
    Alter
    22
    Beiträge
    47
    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:

    Code:
    #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.Ser Code ist nicht getestet habs nur mal grad in den Editor gehauen.
    Ich war´s nicht!!


  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    32
    Beiträge
    1.514
    Ich glaube Dateien direkt einbinden kann man nicht
    ...indirekt aber schon

    Über Header Files genau wie bei der RP6Library.

    MfG,
    SlyD

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    03.09.2006
    Beiträge
    14
    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

Berechtigungen

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