- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Bewegung anhalten

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2007
    Beiträge
    16

    Bewegung anhalten

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    dies ist mein erster Eintrag in dem Forum, da ich erst letzte Weinachten den RP6 bekommen habe.
    Ich habe warscheinlich eine einfache Anfängerfrage. Ich habe meinen Roboter mit dem Befehl moveAtSpeed(100,100) auf die Reise geschickt, jetzt habe ich ein Hinderniss und nun soll er anhalten. Das mit der if-schleife und den Sensoren habe ich schon, ich bin mir auch sicher das er bis dahin kommt, da die Ausgabe geht, aber ich finde keinen Befehl um ihn anzuhalten. Dies habe ich schon ausprobiert:
    Code:
    moveAtSpeed(0,0)
    stop()
    beides geht aber nicht. Meine Frage ist nun kurzgefasst:

    Wie heist der Befehl um meinen Roboter anzuhalten?

    Stratege993

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    32
    Beiträge
    384
    Wenn du die von dir eben beschriebenen funktionen verwendest musst du dazu auch "task_motionControl();" in der hauptschleife aufrufen. Wenn du dann "task_motionControl()"; verwedest musst du auch nach "initRobotBase();" "powerON();" aufrufen um die Encoder anzuschalten. Wenn du das alles so machst solltest du mit der Funktion "stop();" den RP6 anhalten können.

    mfg
    Erik

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2007
    Beiträge
    16
    Also ich finde nicht das Problem ich stelle mal den ganze Qulltext rein ist ja nicht so interressant:
    Code:
    #include "RP6RobotBaseLib.h"
    uint8_t ok=0;
    
    void senkrecht (void)
    {
    	writeString_P("achtung");	
    	stop();
    	task_motionControl();
    	while(ok == 0) //nicht wundern das die schleife nie endet
    	{
    		statusLEDs.LED5 = obstacle_left;	//Hinderniss Links
    		statusLEDs.LED2 = obstacle_right; //Hinderniss rechts
    		updateStatusLEDs();		
    	}
    }
    
    int main(void)
    {
    	initRobotBase();
    	powerON();
    	setACSPwrHigh();
    	
    	moveAtSpeed(100,150);	//erste Bewegung
    	startStopwatch1();	//Zeitnhemer bis andere Richtung
    	
    	while(true)	
    	{
    		task_motionControl();
    		task_ACS();
    		if (getStopwatch1() >= 3000)	//rechts herum
    		{
    			stopStopwatch1();
    			moveAtSpeed(150,100);
    			setStopwatch1(0);
    			startStopwatch2();
    		}
    		if (getStopwatch2() >= 3000)	//links herum
    		{
    			stopStopwatch2();
    			moveAtSpeed(100,150);
    			setStopwatch2(0);
    			startStopwatch1();
    		}
    		if (obstacle_left || obstacle_right)
    		{
    			senkrecht();
    		}
    	}
    	return 0;
    }
    Also bitte nicht wundern, dass die eine Schleife nie endet, da wird später noch weiter gemacht, dass der Roboter sich senkrecht zur Wand ausrichtet.
    Das Schlengellienienfahren bewirkt das ein größerer Bereich gemessen wird.
    Stratege993

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    32
    Beiträge
    384
    Ich kann jetzt auch keinen Fehler erkennen. Du könntest mal Probieren das task_motionControl aus der senkrecht funktion in die endlosschleife der funktion tun.

    mfg
    Erik

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2007
    Beiträge
    16
    Habe das Problem. Man musss den Befehl initRobotBase() in jede Funktion einzeln reinschreiben.
    Jetzt meine Frage, kann man sagen das es für alle Funktionen gild mit blos einer Zeile, damit man es net bei jeder Funktion reinschreiben muss?
    mfg Stratege993

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    32
    Beiträge
    384
    Also ich habs eben bei mir ausprobiert, wenn ich task_motionControl in die Schleife von senkrecht packe gehts.

    mfg
    Erik

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    32
    Beiträge
    384
    also, dass man in jeder Funktion den Controller neu initialisieren muss wäre mir neu aber wenn es so geht is ja in Ordnung . Aber wie gesagt ich hab nur die motion control verschoben und es geht auch.

    Code:
     #include "RP6RobotBaseLib.h"
    uint8_t ok=0;
    
    void senkrecht (void)
    {
       writeString_P("achtung");   
       stop();
       
       while(ok == 0) //nicht wundern das die schleife nie endet
       {
    	  task_motionControl();
          statusLEDs.LED5 = obstacle_left;   //Hinderniss Links
          statusLEDs.LED2 = obstacle_right; //Hinderniss rechts
          updateStatusLEDs();      
       }
    }
    
    int main(void)
    {
       initRobotBase();
       powerON();
       setACSPwrHigh();
       
       moveAtSpeed(100,150);   //erste Bewegung
       startStopwatch1();   //Zeitnhemer bis andere Richtung
       
       while(true)   
       {
          task_motionControl();
          task_ACS();
          if (getStopwatch1() >= 3000)   //rechts herum
          {
             stopStopwatch1();
             moveAtSpeed(150,100);
             setStopwatch1(0);
             startStopwatch2();
          }
          if (getStopwatch2() >= 3000)   //links herum
          {
             stopStopwatch2();
             moveAtSpeed(100,150);
             setStopwatch2(0);
             startStopwatch1();
          }
          if (obstacle_left || obstacle_right)
          {
             senkrecht();
          }
       }
       return 0;
    }

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Leute,

    die Funktion "initRobotBase();" gehört an den Anfang von Main, sollte sonst nirgendwo mehr aufgerufen werden. Das gleiche gilt für "powerON();", damit die Sensoren Strom kriegen.

    Die Funktion "task_motionControl();" muss in der Hauptschleife regelmäßig aufgerufen werden. Wenn man auch Sensoren verwenden will, sollte man stattdessen "task_RP6System();" in der Hauptschleife aufrufen. Darin ist dann auch die Motorenkontrolle enthalten.
    Die Hauptschleife sollte nicht durch irgendwelche Funktionen aufgehalten werden! Damit kann sie ja nicht mehr regelmäßig ablaufen und die Sensoren und Motoren funktionieren nicht mehr richtig.
    Wenn man Bumper o.ä. abfragen will und man warten muss, bis sich da etwas tut oder nicht tut, sollte man nur ein Flag setzen und darauf in der Hauptschleife reagieren (z.B. RP6 anhalten). Die Hauptschleife muss immer durchlaufen.

    Gruß Dirk

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2007
    Beiträge
    16
    Ok, aber das blöde ist das der robby nicht gleich beim ersten task_motionControl() anhält, obwohl ich schon davor stop() sagte, sondern man braucht viele durchläufe bis er reagiert. Kann man das irgendwie besser machen?
    Stratege993

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Stratege993,

    die Hauptschleife in Main muss möglichst schnell durchlaufen. Gut wäre, wenn alle Tasks etwa alle 20-30ms wieder dran kämen. Dann gibt es auch keine Verzögerungen. Also: Nie die Hauptschleife unterbrechen oder zu lange Pausen machen.

    Gruß Dirk

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