PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RoboSim; Software zur Simulation eines linienfolgenden Robos



ähM_Key
21.08.2005, 13:28
Hi!

Dieser Thread (https://www.roboternetz.de/phpBB2/viewtopic.php?t=11818&postdays=0&postorder=asc&start=0) 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 ;) ):

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:
http://home.arcor.de/kleines-helferlein/images/robosim/robosim2.JPG

Und -->HIER<-- (http://home.arcor.de/mecha-tronik/RoboSim.zip) 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?

ähM_Key
22.08.2005, 20:48
Hi!

Kleines Update.

Im oberen Teil wird der aktuelle Sensorwert angezeigt und im unteren die Regelgröße vom PID-Regler. Der untere Balken ist mit einer, ich nenn's jetzt mal übertrieben, 'Auto-Zoom-Funktion' ausgestattet, also immer angepasst an den Maximalwert des Reglers, wesshalb das am Anfang etwas komisch aussehen kann.

Download (http://home.arcor.de/mecha-tronik/RoboSim.zip)

Grüße, ähM_Key

waste
22.08.2005, 23:34
Hallo ähM_Key,

ich hab mal getestet, dabei ist mir folgendes aufgefallen:
Der Robo fährt in dem angehängten Bild geradeaus weiter, obwohl die Regelgrösse voll auf links steht. Stimmt das Verhalten? Es ist nämlich sehr träge. Die Einstellungen der .ini sind hier:

[Konstanten]
vmax=2
pause=100
robox=175
roboy=386
roboalpha=45
radstand=100
radradiuslr=15
radbreitelr=10
achsdicke=7
abstand=50
radradiusm=15
radbreitem=7
nachlauf=10
sensorx=75
sensorymitte=10
sensoranzahl=8
sensoryabstand=6
kp=100
ki=0
kd=0
tast=1000
reg=1000


Übrigens die Einstellung bei der der Robo springt habe ich wieder gefunden. Es ist eigentlich nur kd zusätzlich auf 100 gestellt. Teste mal, ob das bei dir auch ist. Hier die ini:

[Konstanten]
vmax=2
pause=0
robox=175
roboy=386
roboalpha=45
radstand=100
radradiuslr=15
radbreitelr=10
achsdicke=7
abstand=50
radradiusm=15
radbreitem=7
nachlauf=10
sensorx=75
sensorymitte=10
sensoranzahl=8
sensoryabstand=6
kp=100
ki=0
kd=100
tast=1000
reg=1000


Gruss Waste

waste
23.08.2005, 00:53
Ach, ich sehe es jetzt erst, in deiner Geschwindigkeitseinstellung ist ein I-Verhalten von Haus aus drin mit vr:=vr+abs(regel); da hat sich durch meine Änderung auf vr:=vralt+abs(regel); eigentlich gar nichts geändert, da in dem Moment vralt sowieso noch vr ist. Das hatte ich glatt übersehen.
Du hattest schon immer eine Trägheit im System.
Ich denke du solltest von einen Soll-v oder gleich von vmax aus die neue Geschwindigkeit berechnen, dann müsstest die Trägheit folgendermassen einbinden:
v = valt + c*(vsoll + regel -valt)
Ich hoffe das stimmt so, ist schon spät für so komplizierte Berechnungen.

Gruss Waste

ähM_Key
23.08.2005, 10:59
Hi!

Nur kurz, hab nicht viel Zeit.

Vmax=2 ist grundsätzlich nicht zu empfehlen, da der Roboter sich dann unter Umständen 2 Pixel pro Rechenschritt bewegt, und er folglich schlechter auf die Spur reagieren kann. In Wirklichkeit wäre die Auflösung ja noch wesentlich höher.

In deinem Beispiel hat der Roboter die Linie Verloren (auch wenn es im Bild nicht so aussieht, aber das können Rundungsfehler sein), wesshalb das dann alles nicht mehr stimmt; diesen Grenzfall müsste ich mir nochmal genauer ansehen.

Bei der Einstellung mit kd=100 springt bei mir nix, der Robo dreht nur aber noch eine kleine Ehrenrunde :)
Hier sieht man auch sehr gut, dass nur aller 2 Pixel getestet und dann auch dargestellt wird.

https://www.roboternetz.de/phpBB2/download.php?id=3925

Grüße; ähM_Key

Psiyou
24.08.2005, 14:18
Hallo,
hab mir das mal angeschaut. Sieht ja sehr gut aus ;)
Wollte mal fragen ob jemand schon mal mit den so ermittelten Werten seinen Robbi gefuettert hat und ob Sim/Praxsis so in etwas uebereinstimmen. (Hab selber leider noch keinen, plane gerade...)

26.06.2006, 14:12
iiippppppppppppppppppppppppppppppppppppppppppppppp ppppppppppppppppppppppp