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..
Druckbare Version
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..
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.
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?
Tipp: #define Name { IMMER mit Klammern schreiben. }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.
Edit: 18.12.2006 Sternthaler. Wenn ich schon pingelich bin, dann gehören natürlich auch Klammern zum if.
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);
}
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
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
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.
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.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);
}
Klasse. Ich hoffe, mein 1. Versuch wird auch bald hier zu sehen sein.
Hallo Stallion,
Glückwunsch zum Nikolaushaus. :Weihnacht
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. O:)
Gruss,
stochri
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.Zitat:
Zitat von stochri