Hi!
Dieser Thread war ausschalggebend für die Veröffentlichung der von mir programmierten Software, zur Simulation eines linienfolgenden Roboters.
In der Readme steht eigentlich alles wichtige drinn (leider hier etwas schlecht formatiert), wesshalb ich mir hier die vielen Worte ersparen will (ich programmiere lieber noch ein bissschen ):
Code:
Hallo!
Bei RoboSim handelt es sich um ein Programm, das die Linienverfolgung
eines differential angetriebenen Roboters (2 Motoren, links/rechts) simulieren soll.
In der aktuellen Version mittels eines PID-Reglers.
Das ganze wurde in Delphi 7 geschrieben, die Grafikdarstellung läuft über OpenGL.
Noch etwas vorne weg: Die Auflösung sollte mindestens 1024*768 betragen!
So nun zu den einzelnen Elementen:
Wenn man die RoboSim.exe startet sieht man erstmal im linken Teil die Bahn (grau) und den Roboter,
im rechten Teil die Bedienelemente.
Lauf: egal in welcher Situation, wenn hier der Haken rausgenommen wird, bleibt das Programm stehen
Spur folgen: startet und beendet die Spurverfolgung
Testreihe: öffnet neues Fenster zum starten einer Testreihe; mehr dazu weiter unten
Stopuhr: wenn ausgewählt hält der Roboter an, wenn er wieder im Umkreis der Stelle ankommt,
wo die Stopuhr gestartet wurde, also nach einer Runde; es werden die benötigten
Rechenschritte angezeigt
Regler: für die Geschwindigkeit der Motoren links und rechts, danneben wird der aktuelle Wert angezeigt
die folgenden Elemente beeinflussen die Darstellung
Umrisse: die Umrisse der Achse und der 'Halterung' vom Stützrad
Füllung: füllt die Umrisse aus
Hilfslinie: Linie zwischen den Drehpunkten an den Rädern
Stützrad: selbsterklärend
Löschen: löscht die dargestellten Teile vor dem nächsten Zeichenschritt
Sensoren: selbsterklärend
Hintergrund: die Strecke
...einfach mal probieren, was bei versch. Kombinationen passiert!
Laden: damit kann ein neuer Hintergrund geladen werden; standardmäßig wird beim starten des Programms
erstmal Background.bmp geladen
weißes Feld: wenn dort der Curser drin ist, kann man dern Roboter über die Pfeiltasten steuern;
(vmax=3 sinnvoll)
Reglerwert:
der Button ist nur zum debuggen drinn und zeigt den aktuellen Wert des Reglers an, hat aber
keine Funktion
Zurücksetzen: entspricht Neustarten; setzt alles auf seine Standardwerte zurück, ließt die Ini neu ein,
sinnvoll nach dem Laden eines neuen Hintergrunds
Nun zur RoboSim.ini, der Datei in der man die meisten Voreinstellungen vornehmen kann
vmax=1 ->Maximalgeschwindigkeit der Motoren; wenn 1 dann 1 Pixel pro Rechenschritt
pause=0 ->Wartezeit in ms zwischen jedem Rechenschritt, zum besseren beobachten
robox=175 ->Startwerte für den Roboter
roboy=386
roboalpha=45
radstand=100 ->Dimensionierung des Roboters
radradiuslr=15
radbreitelr=10
achsdicke=7
abstand=50
radradiusm=15
radbreitem=7
nachlauf=10
sensorx=75 ->Abstand der Sensoren von der Achse
sensorymitte=10 ->Abstand der beiden mittleren Sensoren (da alle außenliegend)
sensoranzahl=8 ->Anzahl der Sensoren
sensoryabstand=6->Abstand der restlichen Sensoren voneinander
kp=50 ->P-Anteil für den PID-Regler (alles /1000, also wenn kp=50 dann ist der P-Anteil 0,05)
ki=0 ->I-Anteil
kd=0 ->D-Anteil
tast=1000 ->Abtastzeit
reg=1000 ->Verzögerung der Reaktion
Die Funktionsweise des PID-Reglers und den Einfluss der einzelnen Komponenten kann man am besten
an einem Stück Quelltext erkennen (sensor nimmt Werte von -1 bis +1 an):
yp:=(kp/1000)*sensor;
yi:=yialt+(ki/1000)*(tast/1000)*sensor;
yd:=(kd/1000)*(sensor-sensoralt)/(tast/1000);
yialt:=yi;
sensoralt:=sensor;
regel:=yp+yi+yd;
button6.caption:=floattostr(regel);
vralt:=vr;
vlalt:=vl;
regel:=(reg/1000)*regel;
if regel<0 then begin
vr:=vralt+abs(regel);
if vr>=vmax then begin
vr:=vmax;
vl:=vlalt-abs(regel);
if vl<0 then vl:=0;
end;
end;
if regel>0 then begin
vl:=vlalt+abs(regel);
if vl>=vmax then begin
vl:=vmax;
vr:=vralt-abs(regel);
if vr<0 then vr:=0;
end;
end;
Jetzt nochmal kurz zu der Testreihe:
Damit lassen sich versch. kp, ki, kd und tast Werte testen. Gestoppt wird immer ein Runde
und das ganze dann in der logfile.txt gespeichert. Es geht also darum, mit welchen Einstellungen man
die schnellste Runde fahren kann. Wenn der Haken bei 'nur Bestzeit' gesetzt wird bricht die Simulation
die Runde ab, wenn eine weniger schnelle Runde als die bissher beste gefahren wird. Bei Max schreibt man
den Wert rein, bei dem die Simulation abgebrochen (und mit den nächsten Testwerten fortgefahren)
werden soll. Ansonsten würde der Robo ja ewig umherirren, wenn er z.B. die Linie mal verloren hat.
(Es ist aber auch schon vorgekommen, dass er abgekürzt hat, wessshalb es nicht immer günstig ist
'nur Bestzeit' anzuklicken)
Man sollte im allgemeinen nicht allzuviele Versuche starten (je nach Rechner ca. >250), da es dann
(vielleicht auch wegen meiner schlechten Programmierung) zu Speicherproblemen kommen kann.
Wenn man die Testreihe so schnell wie möglich abgeschlossen haben will, sollte man erst mal 'pause'
in der Ini auf 0 setzen und dann sämtliche Haken bei der Darstellung rausnehmen.
Wer will kann natülich auch eigenen Bahnen zeichen. Also Vorlage kann Background_leer.bmp dienen;
(600*600, 24bit)
Achso, und falls doch jemand Geld damit verdienen möchte, was ich nicht glaube,
dann soll er sich vorher bei mir melden, damit ich auch was davon bekomme ;-)
Bei Fragen/Beschwerden/Verbesserungsvorschlägen/Anmerkungen/Quelltext/... oder wenn euch das Programm
gefallen hat, freue ich mich immer über eine Mail an:
aehM_Key [at] web.de !
Viel Spass!
Grüße; ähM_Key
Screenshot:
Bild hier
Und -->HIER<-- könnt ihr das ganze runterladen!
Natürlich kann auch hier im Thread darüber diskutiert werden!
Grüße; ähM_Key
PS: Man könnte es ja mal als Wettbewerb ausschreiben: Wer findet für diese Strecke die besten Einstellungen für den PID-Regler?
Lesezeichen