-         

Ergebnis 1 bis 5 von 5

Thema: Kreis fahren

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    61
    Beiträge
    674

    Kreis fahren

    Anzeige

    Ich habe versucht, die Funktion Go(...) auf eine Funktion Circle(...) umzuwandeln, funktioniert bisher allerdings nicht. ASURO dreht nur nach rechts am Punkt. Wo liegt der Fehler?

    Code:
    #include "myasuro.h" // #define MY_GO_CORRECTIVE_ACTION  15 // siehe unten
    #include "asuro.h" // dort sind LEFT und RIGHT festgelegt
    
    void Circle (int distance, int speed, int diameter, int direction)
    {
      const float HALFWidth_ASURO = 51.5; // Halber Radabstand des ASURO
      float outer_diameter = (float) diameter + HALFWidth_ASURO;
      float factor = outer_diameter / (float) diameter;
        
      uint32_t enc_count;
      int tot_count = 0;
      float diff = 0;
      int l_speed = speed, r_speed = speed;
    
      // calculation tics/mm
      enc_count=abs(distance)*10000L;
      enc_count/=MY_GO_ENC_COUNT_VALUE;
      EncoderSet(0,0); // reset encoder
    
      MotorSpeed(l_speed,r_speed);
      if (distance<0) MotorDir(RWD,RWD);
      else MotorDir(FWD,FWD);
    
      while (tot_count<enc_count)
      {
        if(direction==RIGHT) // Rechtskreis
    	{
    	  tot_count += encoder[LEFT]/factor; 
    	  diff = (float) encoder[LEFT]/factor - (float) encoder[RIGHT]*factor;
    	}
        if(direction==LEFT) // Linkskreis
    	{
    	  tot_count += encoder[RIGHT]/factor; 
    	  diff = (float) encoder[RIGHT]/factor - (float) encoder[LEFT]*factor;
    	}	
    	
     	if (diff > 0)
        { //Left faster than right
          if ((l_speed > speed) || (r_speed > 244)) l_speed -= MY_GO_CORRECTIVE_ACTION;
          else r_speed += MY_GO_CORRECTIVE_ACTION;
        }
        if (diff < 0)
        { //Right faster than left
          if ((r_speed > speed) || (l_speed > 244)) r_speed -= MY_GO_CORRECTIVE_ACTION;
          else l_speed += MY_GO_CORRECTIVE_ACTION;
        }
        EncoderSet(0,0); // reset encoder
        MotorSpeed(l_speed,r_speed);
        Msleep(1);
      }
      MotorDir(BREAK,BREAK);
      Msleep(200);
    }
    
    int main()
    {
      Init();
      EncoderInit(); 
      StatusLED (YELLOW);
     
      Circle(5000,200,700,LEFT);
       
      StatusLED (GREEN); 
     
      while (1);
      return 0;
    }

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    hast du irgedwo RIGHT und LEFT definiert?
    kleinschreibung ist cool!

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    01.11.2006
    Beiträge
    433
    die sind irgendwo in der asruo.h definiert (war zumindest früher so ^^)

    wie schauts mit MY_GO_CORRECTIVE_ACTION aus?

    ich hab mal bei mir verschieden werte eingesetzt:

    bei 1 fährt er eine gerade strekce auf und ab und dreht an den endenimmer.
    bei 2 wird das ganze 3 eckig, ab 20 macht er gar nichts mehr.

    aber mit nem wert von 15 gehts eingetlich einigermaßen.

    edit:

    hier maln video
    (habs mit der handykamera gemacht.
    >>> der player hier <<< sollte des aber eigneltich abspielen können)
    Angehängte Dateien Angehängte Dateien
    ...

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    61
    Beiträge
    674
    Danke für den Test, sieht richtig gut aus! Die Konstante MY_GO_CORRECTIVE_ACTION habe ich in myasuro.h eingeführt anstelle des fixen Wertes 10 in Go(...) und Turn(...). LEFT und RIGHT sind in asuro.h festgelegt. Ich hatte den Wert 3 eingestellt für MY_GO_CORRECTIVE_ACTION, das war offenbar kein brauchbarer Wert. Vielleicht sollte man aus den Parametern der Funktion Circle einen optimalen Wert für die Geschwindigkeitskorrektur ableiten. Zusätzlich hatte ich Probleme mit der Hell-Dunkel-Erkennung des Odometriesystems.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    61
    Beiträge
    674
    Man könnte das Thema auch über eine Polygon-Funktion mit ganz vielen Vertices angehen. Ich habe mal etwas entwickelt:
    Code:
    #include "myasuro.h" /* #define MY_GO_CORRECTIVE_ACTION 3 */
    #include "asuro.h"
    
    void GoP (int distance,int speed)
    {
      uint32_t enc_count;
      int tot_count = 0;
      int diff = 0;
      int l_speed = speed, r_speed = speed;
    
      // calculation tics/mm
      enc_count=abs(distance)*10000L;
      enc_count/=MY_GO_ENC_COUNT_VALUE;
      EncoderSet(0,0); // reset encoder
    
      MotorSpeed(l_speed,r_speed);
      if (distance<0) MotorDir(RWD,RWD);
      else MotorDir(FWD,FWD);
    
      while (tot_count<enc_count)
      {
        tot_count += encoder[RIGHT]; //im Original LEFT ehenkes
        diff = encoder[LEFT] - encoder[RIGHT];
        if (diff > 0)
        { //Left faster than right
          if ((l_speed > speed) || (r_speed > 244)) l_speed -= MY_GO_CORRECTIVE_ACTION;
          else r_speed += MY_GO_CORRECTIVE_ACTION;
        }
        if (diff < 0)
        { //Right faster than left
          if ((r_speed > speed) || (l_speed > 244)) r_speed -= MY_GO_CORRECTIVE_ACTION;
          else l_speed += MY_GO_CORRECTIVE_ACTION;
        }
        EncoderSet(0,0); // reset encoder
        MotorSpeed(l_speed,r_speed);
      }
    }
    
    void TurnP (int degree,int speed)
    {
      long enc_count;
      enc_count=abs(degree)*MY_TURN_ENC_COUNT_VALUE;
      enc_count /= 360L;
    
      int tot_count = 0;
      int diff = 0;
      int l_speed = speed, r_speed = speed;
    
      EncoderSet(0,0);    // reset encoder
    
      MotorSpeed(l_speed,r_speed);
      if (degree<0) MotorDir(RWD,FWD);
      else MotorDir(FWD,RWD);
    
      while (tot_count<enc_count)
      {
        tot_count += encoder[LEFT];
        diff = encoder[LEFT] - encoder[RIGHT];
        if (diff > 0)
        { //Left faster than right
          if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
          else r_speed += 10;
        }
        if (diff < 0)
        { //Right faster than left
          if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
          else l_speed += 10;
        }
        EncoderSet(0,0);    // reset encoder
        MotorSpeed(l_speed,r_speed);
      }
    }
    
    
    
    void RegularPolygon (int NumberVertices, int LengthSide, int speed, int direction)
    {
      int i;
      for(i=0;i<NumberVertices;++i)
      {
        GoP (LengthSide,speed);
        if (direction==RIGHT)
    		TurnP ( 360L/NumberVertices,speed);
    	else
    		TurnP (-360L/NumberVertices,speed);
      }
      MotorSpeed(0,0);
    }
    
    int main(void)
    {
      Init();
      EncoderInit(); 
      StatusLED (YELLOW);
     
      RegularPolygon(6,150,175,LEFT);
       
      StatusLED (GREEN); 
     
      while (1);
      return 0;
    }

Berechtigungen

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