- 12V Akku mit 280 Ah bauen         
Seite 7 von 11 ErsteErste ... 56789 ... LetzteLetzte
Ergebnis 61 bis 70 von 104

Thema: ASURO ... ein kleiner Wettbewerb

  1. #61
    Anzeige

    Powerstation Test
    Guten Abend,

    kann mir jemand sagen, was dieser Befehl in Storchi Source macht?
    z.B.

    #define links45 { turn(180); Msleep(500);turn(135);Msleep(500);}

    Vielen Dank schonmal..

  2. #62
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    das bedeutet, dass überall im quelltext wo "links45" steht,

    turn(180); Msleep(500);turn(135);Msleep(500);

    ausgeführt wird.
    der befehl define sagt aus das das erste wort nach define (turn45) vor dem kompilieren dur das ersetzt wird, as dahinter steht (alles zwischen den {}).

    das ist gut, wenn man nur ein paar befehle hat, für die es sich nicht lohnt, eine ganze funktion zu schreiben.

    wird diese befehlsfolge allerdings öfter benutzt, sollte man eine funktion schreiben, um speicher zu sparen.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  3. #63
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hätte ich nicht besser erklären können.

    Kleine Fehlerteufel-Anmerkung noch zu den { } Klammern. Auch die werden zum Glück beim kompilieren mitgenommen und übersetzt.
    Warum zum Glück?
    Code:
    if (x == y)
      links45;
    else
      was_anderes;
    
    würde sonst folgenden Code ergeben:
    if (x == y)
      turn(180);
    Msleep(500);
    turn(135);
    msleep(500);
    else
      was_anderes;
    
    Jetzt wäre nur noch das 'turn(180)' hinter dem if x==y gültig und wir würden wegen des noch folgenden 'else' einen Compiler-FEHLER bekommen. Im schlimmsten Fall würde der logische Ablauf in unserem Programm falsch sein wenn wir z.B. nur folgendes programmieren:
    
    if (x == y)
      links45;
    mache_hier_weiter;
    
    Jetzt bekommen wir KEINEN Fehler, aber hinter dem if ist wiederum nur das turn(180) und der Rest vom define (Msleep(500); turn(135); Msleep(500);) wird IMMER ausgeführt.
    Tipp: #define Name { IMMER mit Klammern schreiben. }

    Edit: 18.12.2006 Sternthaler. Wenn ich schon pingelich bin, dann gehören natürlich auch Klammern zum if.
    Lieber Asuro programieren als arbeiten gehen.

  4. #64
    Hallo,
    brauch nochmal Hilfe.
    Also das sind 2 Schleifen, soweit ist mir klar, aber was macht sie ganz genau in Storchi programm?
    Verzögerung in zehntel sekunden ausrechnen?

    Code:
    //delay in 1/10 sec
    void wait(int zehntel)
    {
       int i,temp2;
       for(i=0;i<zehntel;i++)
          for(temp2=0;temp2<100;temp2++) Sleep(72);
    }

  5. #65
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    Nein, du gibts einfach die Zeit die du warten möchtest in Zehntel Sekunden ein und dann macht der Asuro so lange gar ncihts.

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  6. #66
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.142
    Blog-Einträge
    3
    Nachdem ich das jetzt schon eine Weile beobachte, muss ich jetzt doch mal antworten:

    #define links45 { turn(180); Msleep(500);turn(135);Msleep(500);}

    Eine Rechtsdrehung um 180°+135° = 315° ist wie eine Linksdrehung um 45° ( 360°-45° = 315° ).

    Mein ASURO hat die Eigenschaft, dass er je nach Richtung unterschiedlich weit dreht. Die Kallibrierroutine ist aber nur für die Rechtsdrehung ( glaub ich mich zu erinnern ). Deshalb habe ich die Linksdrehung über eine Rechtsdrehung realisiert.

    Ein weiteres Problem der Turn ( und Go ) Routine ist, dass man die Bewegungen eigentlich mit einer programmgesteuerten Bremsphase versehen müsste. Schaltet man die Motoren schnell ab, bewegt sich der Roboter noch ein Stückchen weiter, was zu einem Fehler in der Sollposition führt.
    Das ist eine Unsauberkeit der Routinen, die man irgendwan mal beheben könnte. Damals im Wettberwerb ging es aber darum, möglichst schnell das Ziel zu erreichen, deshalb sind solche Feinheiten unter den Tisch gefallen.

    Gruss,
    sto - chri

  7. #67
    Neuer Benutzer Öfters hier
    Registriert seit
    30.12.2006
    Beiträge
    19
    Hier mal ein kleines Video meines Asuros: http://www.zippyvideos.com/5870203996486466/video3/

    Die main-Funktion ist nicht besonders interessant, da nur eine Aneinanderreihung von Go und Turn...

    Und hier poste ich mal die modifizierten Go und Turn Funktionen der asuro.c. Im Großen und Ganzen entsprechen diese den originalen aus der erweiterten Asuro-Lib auf Sourceforge. Aber vor allem bei der Turn habe ich einiges an den Parametern geändert (mit Abbremsfunktion). Ansonsten habe ich meist noch die Variablentypen und die Reihenfolge angepasst.
    Code:
    void Go(int distance, unsigned char speed)
    {
    	unsigned int enc_count = abs(distance);
    	unsigned int tot_count = 0;
    	signed char diff = 0;
    	unsigned char l_speed = speed, r_speed = speed;
    
    	// mm -> ticks
    	enc_count /= 2;			// only for 12 fields gearwheel
    	
    	// set direction
    	if(distance < 0) MotorDir(RWD,RWD);
    	else MotorDir(FWD,FWD);
    	
    	// reset encoder
    	Encoder_Set(0,0);
    	
    	// set speed 
    	MotorSpeed(l_speed,r_speed);
    	
    	// do until destination reached
    	while(tot_count < enc_count) 
    	{
    		tot_count += encoder[LEFT];
    		
    		// calculate speed difference
    		diff = encoder[LEFT] - encoder[RIGHT];
    		
    		// reset encoder
    		Encoder_Set(0,0);
    		
    		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;
    		}
    		
    		// set new speeds
    		MotorSpeed(l_speed,r_speed);
    		Sleep(36);
    	}
    	// Stop
    	MotorSpeed(0,0);
    	MotorDir(BREAK,BREAK);
    	Msleep(200);
    }
    
    
    void Turn(int degree, unsigned char speed)
    {
    	unsigned int enc_count;
    	unsigned int tot_count = 0;
    	int diff = 0;
    	unsigned char l_speed = speed, r_speed = speed;
    	
    	// degree -> tick
    	enc_count = (unsigned int) (((long)abs(degree) * (long)4080) / (long)10000);
    	
    	// set direction
    	if(degree < 0) MotorDir(RWD,FWD);
    	else MotorDir(FWD,RWD);
    	
    	// reset encoder
    	Encoder_Set(0,0);
    	
    	// set speed
    	MotorSpeed(l_speed,r_speed);
    
    	// do until angel reached
    	while(tot_count < enc_count) 
    	{
    		tot_count += encoder[LEFT];
    		
    		// calculate speed difference
    		diff = encoder[LEFT] - encoder[RIGHT];
    		
    		// reset encoder
    		Encoder_Set(0,0);
    		
    		// calculate new speed
    		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;
    		}
    		
    		// set new speed, with slow down
    		MotorSpeed(l_speed - (unsigned char) ((unsigned int)(l_speed) / enc_count),r_speed - (unsigned char) ((unsigned int)(r_speed) / enc_count));
    		Sleep(36);
    	}
    	// stop
    	MotorSpeed(0,0);
    	MotorDir(BREAK,BREAK);
    	Msleep(200);
    }
    Ist zwar noch immer nicht ganz 100%, aber das liegt wohl an der Ungenauigkeit der Odometrie. Ich werde versuchen es noch etwas zu verbessern; mal schauen, was ich noch erreichen kann.

  8. #68
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Klasse. Ich hoffe, mein 1. Versuch wird auch bald hier zu sehen sein.

  9. #69
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.142
    Blog-Einträge
    3
    Hallo Stallion,
    Glückwunsch zum Nikolaushaus.
    Der ASURO fährt ganz gut in dem Video. Interresanterweise fährt er rückwärts.
    Im Video kann man die Striche nicht so gut erkennen, vielleicht kannst Du so ein Bild mit mehreren hintereinandergezeichneten ASUROs wie Sternthaler posten, dann kann man erkennen, wie gut der ASURO seine Position hält.
    Wenn's gut funktioniert, wären ja vielleicht sogar kompliziertere Gemälde denkbar.

    Gruss,
    stochri

  10. #70
    Neuer Benutzer Öfters hier
    Registriert seit
    30.12.2006
    Beiträge
    19
    Zitat Zitat von stochri
    Interresanterweise fährt er rückwärts.
    Ja, ist dieser Bug, den alle neueren Asuros haben. Und ich war bisher zu faul die Kabel der Motoren umzulöten, damit er in die richtige Richtung fährt. Sollte aber eigentlich keinen großen Unterschied machen.

Seite 7 von 11 ErsteErste ... 56789 ... LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress