PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Konstante Geschwindigkeit macht mich verrückt



ROBOJOEEY
21.06.2007, 18:00
Hallo zusammen.

Vieleicht finde ich einen Crack unter euch, der mir sagt, warum mein ASURO nich mit einer konstanten geschwindigkeit fahren will. Habe schon mal was zusammengeschrieben, aber leider macht er lustige Sachen anstatt konstant zu fahren
](*,)
Ich wäre sehr dankbar wenn mir jemand ein paar tipps geben könnte.



#include "asuro.h"
#include <stdlib.h>


void speed(unsigned char wegl)
{
unsigned char speed;
int wegl;
speed=wegl;
if(wegl<80)speed++;
else{speed--;}
return (speed);
}

int main(void)
{
unsigned char sped, flagl=0, flagr=0;
unsigned int data[2]; //Speicher Bereitstellen
int wegl, wegr, diff, time, timeb;
int speedLeft,speedRight;

Init();
MotorDir(RWD,RWD);
StatusLED(GREEN);
speedLeft = speedRight = speed;


while(TRUE)
{
wegl=0; wegr=0;
for(time=1; time<500; time++) // Zeitschleife 1 Sekunde
{
OdometrieData(data);
if ((data[0] < 550) && (flagl == 1)) {flagl = 0; wegl++;}
if ((data[0] > 650) && (flagl == 0)) {flagl = 1; wegl++;}
if ((data[1] < 550) && (flagr == 1)) {flagr = 0; wegr++;}
if ((data[1] > 650) && (flagr == 0)) {flagr = 1; wegr++;}
diff=wegr-wegl;
if (diff>0) speedRight--; // fahre geradeaus
else if (diff<0) speedLeft--;
else
{
speedRight=speed;
speedLeft=speed;
}
if (speedRight<0) {speedRight=0;}
if (speedLeft<0) {speedLeft=0;}

MotorSpeed(speedLeft,speedRight);
SerWrite(wegl, sizeof(wegl));
Sleep(76); // 1 Millisekunde pause
}

if(PollSwitch()>0)
{
for (timeb=1;timeb<500;timeb++)
{
if(PollSwitch()>0)
{
MotorDir(BREAK,BREAK);
BackLED(ON,ON);
Sleep(76);
}
}
}

}

return 0;
}

radbruch
21.06.2007, 18:58
Hallo

Erstmal herzlich willkommen im RN-Forum.

Dein Programm sieht ja nicht schlecht aus. Allerdings stimmen bei deinem asuro die Motordrehrichtungen scheinbar nicht (Auslieferfehler des asuros). Mich stört das im Moment nicht, weil mein asuro grad auch falschrum läuft. Besser wäre es aber, wenn du die Motorleitungen drehen würdest.

Zu deinem Programm:
Ich habe die Funktion speed() entfernt, weil sie nicht verwendet wird. Die Variable sped heist jetzt speed, der SerWrite()-Befehl wurde auskommentiert. Ebenso das include der stdlib.h, die wird von asuro.h automatisch eingebunden(?). Jetzt kann ich dein Programm fehlerfrei übersetzen und, oh Wunder, scheinbar funktioniert es sogar mit meinem asuro (der ganz spezielle Odo-Scheiben drauf hat):



#include "asuro.h"
//#include <stdlib.h>

int main(void)
{
unsigned char flagl=0, flagr=0;
unsigned int data[2]; //Speicher Bereitstellen
int wegl, wegr, diff, time, timeb;
int speed=200, speedLeft,speedRight;

Init();
MotorDir(RWD,RWD);
StatusLED(GREEN);
speedLeft = speedRight = speed;


while(TRUE)
{
wegl=0; wegr=0;
for(time=1; time<500; time++) // Zeitschleife 1 Sekunde
{
OdometrieData(data);
if ((data[0] < 550) && (flagl == 1)) {flagl = 0; wegl++;}
if ((data[0] > 650) && (flagl == 0)) {flagl = 1; wegl++;}
if ((data[1] < 550) && (flagr == 1)) {flagr = 0; wegr++;}
if ((data[1] > 650) && (flagr == 0)) {flagr = 1; wegr++;}
diff=wegr-wegl;
if (diff>0) speedRight--; // fahre geradeaus
else if (diff<0) speedLeft--;
else
{
speedRight=speed;
speedLeft=speed;
}
if (speedRight<0) {speedRight=0;}
if (speedLeft<0) {speedLeft=0;}

MotorSpeed(speedLeft,speedRight);
//SerWrite(wegl, sizeof(wegl));
Sleep(76); // 1 Millisekunde pause
}

if(PollSwitch()>0)
{
for (timeb=1;timeb<500;timeb++)
{
if(PollSwitch()>0)
{
MotorDir(BREAK,BREAK);
BackLED(ON,ON);
Sleep(76);
}
}
}

}

return 0;
}

(längere Programme bitte immer im code-Tag posten)

Mein asuro fährt damit fast geradeaus (etwas langsam wegen meinem Vorgelege). Wenn ich ihn in der Luft halte und ein Rad mit der Hand abbremse, wird auch das andere Rad gebremst. Prima! Auch deine Odo-Erfassung und die PollSwitch()-Auswertung sind pfiffig und auf Anhieb gut gelöst. Du scheinst mir ein kleiner Hacker zu sein. O:)

Gruß

mic

Xtreme
21.06.2007, 19:06
Nicht schlecht gemacht! Ich kanns zwar nicht testen, aber vom "Gefühl" her würde ich das Zeitfenster für die Abfrage der Odo Werte kleiner machen, va. für größere Geschwindigkeiten.

ROBOJOEEY
21.06.2007, 19:50
Erst mal danke für die schnellen Antworten.

So wie das Programm von Radbruch umgestellt wurde ist schon ganz gut allerdings fehlt jetzt komplett die komponente mit der konstanten Geschwindigkeit.

radbruch
21.06.2007, 20:28
allerdings fehlt jetzt komplett die komponente mit der konstanten Geschwindigkeit.
Ups, stimmt. Das habe ich völlig verdrängt. Ein einfacher Ansatz:



#include "asuro.h"
//#include <stdlib.h>

int main(void)
{
unsigned char flagl=0, flagr=0;
unsigned int data[2]; //Speicher Bereitstellen
int wegl, wegr, diff, time, timeb;
int speed, speedLeft, speedRight;
int speedSoll, speedDiff;

Init();
MotorDir(RWD,RWD);
StatusLED(GREEN);
speedSoll=200;
speedLeft = speedRight = speed = speedSoll;

while(TRUE)
{
wegl=0; wegr=0;
for(time=1; time<500; time++) // Zeitschleife 1 Sekunde
{
OdometrieData(data);
if ((data[0] < 550) && (flagl == 1)) {flagl = 0; wegl++;}
if ((data[0] > 650) && (flagl == 0)) {flagl = 1; wegl++;}
if ((data[1] < 550) && (flagr == 1)) {flagr = 0; wegr++;}
if ((data[1] > 650) && (flagr == 0)) {flagr = 1; wegr++;}
diff=wegr-wegl;
if (diff>0) speedRight--; // fahre geradeaus
else if (diff<0) speedLeft--;
else
{
speedRight=speed;
speedLeft=speed;
}

// Summe links+rechts mit 2*soll vergleichen und die Differenz addieren
speedDiff=(2*speedSoll-(speedLeft+speedRight))/2;
speedLeft+=speedDiff;
speedRight+=speedDiff;

StatusLED(GREEN); // gelb=beschleunigen, rot=bremsen, gruen=sollspeed?
if (speedDiff > 0) StatusLED(YELLOW);
if (speedDiff < 0) StatusLED(RED);

MotorSpeed(speedLeft,speedRight);
//SerWrite(wegl, sizeof(wegl));
Sleep(76); // 1 Millisekunde pause
}

if(PollSwitch()>0)
{
for (timeb=1;timeb<500;timeb++)
{
if(PollSwitch()>0)
{
MotorDir(BREAK,BREAK);
BackLED(ON,ON);
Sleep(76);
}
}
}

}

return 0;
}

speedSoll wird gerecht zwischen beiden Motoren aufgeteilt. Ob das so funktioniert kann ich leider nicht feststellen. Eine ernsthaftere Lösung sollte die Wege über der Zeit messen und danach die Motoren regeln. Aber das kann man nicht so auf die Schnelle zusammenbasteln...

Eigentlich warte ich noch auf den unvermeidlichen(?) Hinweis auf die erweiterten Funktionen der aktuellen asuro-Lib. Damit gehts zwar auch, aber man lernt eben mehr, wenn man es selbst macht.

Gruß

mic

Sternthaler
22.06.2007, 18:48
Na klar muss jetzt der Hinweis auf die Lib kommen.
Aber diesmal ist es so, dass dort keine Lösung für eine konstante Geschwindigkeit vorhanden ist. Ja gibt es denn so was? ;-)
Die dort vorhandenen Funktion Go() und Turn() sorgen 'nur' für ein saubers geradeausfahren und eine kontrollierte Drehung. (Allerdings wird dort sehr gut versucht die Vorgabe einzuhalten.)

Ist aber nicht so, dass diese Forum nix zur Geschwindigkeitskonstantfaht hergibt. Suchen ist aber angesagt, da ich den Thread aktuell auch nicht kenne. (Ich bin nicht sicher, aber müsste von waste oder stochri sein.)

radbruch
22.06.2007, 19:16
Ja gibt es denn so was?
Weil ihr euch alle auf die Bezeichnung MotorSpeed() eingeschossen habt. Wenn es MotorPower() heisen würde, wäre der Unterschied deutlich und der Bedarf einer echten MotorSpeed()-Funktion sofort erkennbar.

Ich hatte das auch mal versucht, aber der Code ist noch voller Bugs:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=245126

ROBOJOEEY
22.06.2007, 20:02
Ich mabe das veränderte Programm von Mic ausprobiert und finde, dass es richtig gut gelungen ist. Besonders die Pfiffige lösung mit der Konstanten Geschwindigkeit finde ich gut.

// Summe links+rechts mit 2*soll vergleichen und die Differenz addieren
speedDiff=(2*speedSoll-(speedLeft+speedRight))/2;
speedLeft+=speedDiff;
speedRight+=speedDiff;

Offensichtlich ein Könner am werk :-)

Leider sieht man unteschiede beim bergauf und begabfahren. Liegt das ab der Motorleistung oder an was anderem???

Die StatusLED zeigt zwar gelb , grün und rot an aber es flackert durcheinander.

Würde mich über weitere Tipps freuen.

radbruch
22.06.2007, 22:23
Hallo

Danke für die Blumen. O:)

Es ist eben keine echte Regelung. Die Werte in MotorSpeed() geben nur die Leistung an, die die Motoren erhalten. Nicht berücksichtigt werden die Motoreigenschaften, Gängigkeit der Getriebe, Ausrichtung der Räder etcetc. Das Flackern kommt vermutlich von der Trägheit des asuros, dadurch wird er schubweise beschleunigt/gebremst.

Meinem Ketten-asuro ist es egal ob er bergauf oder bergab fährt. Auch meine Odo-Scheiben sind für dieses Programm denkbar ungeeignet. Ich habe also keine Ahnung, wie sich ein "normaler" asuro damit verhält.

Was ich deutlich sehen kann ist das Ende der time-Schleife. Ich vermute, das ist sowieso ein Bug, denn die Hauptschleife des Programms wird in der Time-Schleife 500mal ausgeführt und dann, nach der Tastenabfrage, mit wegr=wegl=0 erneut gestartet. Ich meine, dieses Rücksetzen der Wegregister kann ich bei meinem asuro am Fahrverhalten sehen.

Gruß

mic

damaltor
22.06.2007, 22:57
habe deinen post mal etwas angepasst. funktioniert das programm denn jetzt?