PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro: Odometrieproblem (anfänger)



childen
20.01.2006, 23:31
Hallo

Ich habe jetzt seit gestern meinen Asuro fertig und damit fangen meine Probleme schon an.
Nachdem ich mich ein bisschen mit der asurolib v26 auseinander gesetzt hab, kam folgendes stück code zustande, was den Roboter eigendlich nur geradeaus fahren lassen soll und sobald er an eine Tischkannte kommt, (im dunklen Raum und heller Platte) anhalten, zurücksetzen und wenden soll.

Das 1. Problem ist das nach kurzem im Kreis fahren (anstatt geradeaus) die beiden Motoren stillstehen. Das 2. Problem ist das Ab beginn der if Abfrage die Variablen encoder[RIGHT] und encoder[LEFT] immer gleich 0 sind.


#include "asuro.h" // bitte die neue Datei benutzen
// asuro.h und asuro.c vom 31.03.05 oder neuer

int main(void)
{
unsigned int ldon[2];
unsigned int ldoff[2];
int fahr=0;
int diff=0;
int ldiff=0;
Init();
Encoder_Init();
Encoder_Start();
StartSwitch();
MotorDir(FWD,FWD);
MotorSpeed(175,175);
while (!switched && fahr==0) {
SerWrite("going\n\r",9);
MotorDir(FWD,FWD);
diff=encoder[RIGHT]-encoder[LEFT];
MotorSpeed(175+diff,175-diff);
FrontLED(OFF);
LineData(ldoff);
FrontLED(ON);
LineData(ldon);
ldiff=ldon[0]-ldoff[0];
SerWrite("\nLinks:",8);
PrintInt(encoder[LEFT]);
SerWrite("\nRechts:",9);
PrintInt(encoder[RIGHT]);
if (ldiff<100)
{
SerWrite("stopped!\n\r",12);
MotorSpeed(0,0);
MotorDir(RWD,RWD);
MotorSpeed(175,175);
SerWrite("Moveing back\n\r",16);
Encoder_Set(0,0);
Encoder_Start();
while (encoder[RIGHT] < 24)
{
diff=encoder[RIGHT]-encoder[LEFT];
MotorSpeed(175+diff,175-diff);
PrintInt(encoder[RIGHT]);
}
MotorDir(BREAK,RWD);
SerWrite("Turning\n\r",11);
Encoder_Set(0,0);
Encoder_Start();
while (encoder[RIGHT] < 50)
{
diff=encoder[RIGHT]-encoder[LEFT];
MotorSpeed(175+diff,175-diff);
PrintInt(encoder[RIGHT]);
}
}
}
MotorSpeed(0,0);
while(1);
return 0;
}

MSSputnik
21.01.2006, 12:58
Hallo,

mir gefallen ein paar sachen an deinem Programm nicht. - Sorry

A) Du verwendes während der Regelschleife SerWrite. Da ist jedliches Timing dahin d.h. die Regelung wird ncht mehr in definierten Abständen ausgeführt und auch zu langsam hinereinander. Da passieren bei mir auch immer komische dinge.

B) Du berechnest ldiff aus einer Differenz zwischen der Helligkeit von ein und ausgeschalteter FrontLED. Kann es sein das die Differenz immer <100 ist und somit die Edomentriecounter immer auf 0 gesetzt werden.

C) Fang doch mal klein an. Wenn du nur die Geradeausfahrt programmierrst, fährt dein ASURO dann gerade aus?

ungefähr so
while (!swithced) {
diff = encoder[LEFT]-encoder[Right];
Motorspeed(175-diff,175+diff); // Alternativ (175+diff,175-diff) (siehe unten)
MSleep(100);
}
Damit solle er nur gerade aus fahren. Wenn du allerdings (was auch bei Dir der fall sein könnte) einen Vorzeichenfehler bem MotorSpeed drin hast, fährt er einen Kreis.

Martin