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):
Screenshot: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
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?







Zitieren

Lesezeichen