Im Thread hab ich den Überblick über das Simulationsmodell nicht gefunden.
Sollte das Ganze so aussehen ?
Druckbare Version
Im Thread hab ich den Überblick über das Simulationsmodell nicht gefunden.
Sollte das Ganze so aussehen ?
Mit dem Übersichtsbild zum Gesamtsystem wird es sicher leichter klar.
Ich sehe noch nicht, welche Bedingungen wie kritisch sind für eine instabile Fahrt. Es gibt Einflüsse durch die Regelung wie Steilheit und Verzögerungen. Die Regelung sollte bei einer Abweichung vielleicht auch nur verlangsamend auf den ausgewählten Motor wirken. Es gibt die Länge des Auslegers mit den Sensoren, die vielleicht nur in die Steilheit eingeht und natürlich das von Waste schon angekündigte D-Verhalten, das die Fahrt stabilisieren wird. Sollte man versuchen die Einflüsse im Gesamtbild darzustellen?
Zur allgemeinen Veranschaulichung des D-Verhaltens habe ich hier einen Link:
Bei dem hier dargestellten Linienfolger ist in zwei kurzen Filmen das Verhalten mit und ohne D Regler gezeigt. Es ist eine allgemeine Darstellung über den gesamten Aufbau und es wird nicht im Detail auf die Regelparameter eingegangen. http://elm-chan.org/works/ltc/report_j.html
Manfred
Filme:
Nur P Regelung http://members.jcom.home.ne.jp/felm/ltc4.mpg
Mit D Regelung http://members.jcom.home.ne.jp/felm/ltc5.mpg
Eine kleine Einführung in die Regelungstechnik.
Hier habe ich einen recht guten
"Online-Kurs für Neulinge in diesem Metier die sich zunächst ein grundlegendes Verständnis für dieses Gebiet aneignen möchten"
gefunden. http://www.meilhaus.com/regeltechnik/
Hallo waste!
Habe den Wertebereich vergrößert, geht jetzt von 1/1000 bis 1. Wenn's immernoch nicht reicht muss halt noch eine 0 drangehangen werden.
Kannst du mir mal die Einstellungen sagen, bei denen die Kiste springt? Klingt wirklich nach nem Bug...
Die Background.bmp kann man ja beliebig editieren; meinst du das so wie im Anhang?
Das mit dem auf analog Umschalten der Sensoren habe ich noch nicht ganz verstanden...könnte man das ev. dadurch in Griff bekommen die Sensoren sehr nah beieinander zu plazieren (Sensorabstand)?
Und auf euer 'Drängen' hin ( ;) ) habe ich mal nen RoboSim-Thread aufgemacht: https://www.roboternetz.de/phpBB2/vi...=107585#107585
Grüße; ähM_Key
Hallo ähM_Key,
die Sprungfunktion zum Testen der Bahnregelung muss meiner Meinung nach als Sprung in der Krümmung der Bahn realisiert werden.
Also auf Deutsch:
- Rechteck
-Sexeck
- 8-Eck usw. sind gute Tests für die Bahnverfolgung.
Die neue Bahn von Dir hat zwar einen Sprung, aber ich habe irgendwie das Gefühl ein Knick ist der richtige Test.
Gruss,
stochri
Hm, verstehe. Paint ist dein Freund :D
Wenn der minimale Radius wesentlich kleiner als der Abstand der Sensoren von der Achse ist, müsste man das in vielen englischen Dokumentation als 'overshooting' bezeichnete 'über die Bahn hinausschießen' mit in die Software implementieren, da sonst die Bahn sehr leicht verloren gehen kann.
Gruß, ähM_Key
Der Sprung auf der Gerade ist schon richtig im Beispiel von ähM_Key, aber nur eine Linie von links nach rechts. Man startet den Lauf, der Roboter trifft auf den Sprung und zeichnet die Sprungantwort. So habe ich mir das vorgestellt.
Ich habe es schon selbst mit einer Background.bmp versucht, aber da stürzt das Programm ab.
Übrigens ward ihr recht fleissig. Auf die anderen Beiträge gehe ich nach der F1 ein. Bis später.
Waste
Übermale am besten die alte oder verwende Background_leer.bmp als Vorlage, damit es funktioniert. Das Bild muss ein Auflösung von 600*600 und 24 Bit haben!Zitat:
Zitat von waste
Die angepassten ini-Werte für den Background im Anhang sind:
robox=100
roboy=305
roboalpha=0
MK
ok, mit Paint hat es geklappt. Vorher hatte ich ein anderes Zeichenprogramm verwendet.
Im Anhang sind 2 Beispiele ausgeführt. Einmal stabil und das 2. instabil. In der Art kann man die Einstellungen sehr gut überprüfen.
Waste
Hallo Manfred,
eine interessante WebSite mit dem putzigen Linienfolger!
Kannst du eigentlich Kanji lesen? Oder hast du auch noch die englische Seite gefunden. :)
http://elm-chan.org/works/ltc/report.html
Übrigens verwendet er auch die on/off Methode beim Liniensensor zur Kompensation des Umgebungslicht.
Waste
Hallo stochri,
hier nochmal die Kennlinie des Liniensensors:
Bild hier
Interessant, deine Überlegungen zu dem Thema! Hier ein paar Anmerkungen von meiner Seite: Die Reibung geht nur als Verstärkungsänderung (K-Faktor) in das Simulationsmodell ein, da bei höherer Reibung nicht mehr die volle Höchstgeschwindigkeit erreicht wird. Die Zeitkonstante des PT1 bleibt bestehen.
Der Begrenzer muss vor den Antrieb, also bei der PWM sein.
Der Soll/Ist-Vergleich kommt gleich nach dem Sensor. Der Sollwert ist 0, also keine Abweichung.
Ich habe ein Modell aus meiner Sicht angehängt und zum Vergleich das Blockschaltbild mit den für die Simulation relevanten Blöcken. Ich hoffe es wird dadurch verständlicher.
Waste
@ ähM_Key
Im Moment springt in RoboSim nichts mehr, war wohl ein sporadisches Problem meines Rechners.
Den analogen Sensor stelle ich mir so vor wie die Kennlinie in meinem vorigen Beitrag. Die Kennlinie auf eine trapezähnliche Funktion vereinfachen, dass ein linearer Anstieg bis 5mm Abstand, konstanter Wert bis 10mm und wieder linear abfallend bis 15mm übrig bleibt. Das wäre eine Kennlinie für 2 Dioden im Abstand von jeweils 7.5mm zur mittleren LED, wie beim Asuro.
Notfalls nur eine einzige lineare Steigung oder Dreieck, wenn die erste Funktion nicht geht.
Waste
Hallo Waste,
Müsste dem Modell entsprechen, welches ich geziechnet habe.Zitat:
Die Reibung geht nur als Verstärkungsänderung (K-Faktor) in das Simulationsmodell ein, da bei höherer Reibung nicht mehr die volle Höchstgeschwindigkeit erreicht wird. Die Zeitkonstante des PT1 bleibt bestehen.
Allerdings hat das ja, die von Dir mal früher erwähnten Schwachpunkte, dass es keinen Unterschied zwischen Bremsen und Beschleunigen macht.
Ausserdem funktioniert es natürlich auch nicht bei Geschwindigkeiten bei weniger als 1/5tel der Maxiamlgeschwindigkeit.
Falls der Regler später weiter runterregeln will, wird das Modell stark von der Realität abweichen.
Oh ja, das war in der ersten Zeichnung noch falsch.Zitat:
Der Begrenzer muss vor den Antrieb, also bei der PWM sein.
Bei meinem Modell läßtt sich die Geschwindigkeit als Sollgröße vorgeben. Dein Modell und meines lassen sich mathematisch exakt ineinander umformen, sofern man die Tatsachen nutzt, dass Du das Innere Deines Reglers noch nicht genau spezifiziert hast.. Was hältst Du davon die Geschwindigkeit als Sollgröße zu verwenden ?Zitat:
Der Soll/Ist-Vergleich kommt gleich nach dem Sensor. Der Sollwert ist 0, also keine Abweichung.
In Deinem Modell wird die Geschwindigkeitsdifferenz integriert, mathmatisch läßt sich der Integrator vor die Differenz ziehen und in 2 Integratoren aufspalten. Ich fände es anschaulicher, wenn die Integration dem Antriebstrang zugeschlagen wird, weil ja in der Realität jedes einzelne Rad den Weg integriert und es keinen Integrator gibt, der die Geschwindigkeitsdifferenz integriert.
Danke für die Liniensensorkennlinie.
Gruss,
stochri
Hier die graphische Darstellung der Äquiivalenz der beiden Modelle.
Zitat:
Bei meinem Modell läßtt sich die Geschwindigkeit als Sollgröße vorgeben. Dein Modell und meines lassen sich mathematisch exakt ineinander umformen, sofern man die Tatsachen nutzt, dass Du das Innere Deines Reglers noch nicht genau spezifiziert hast..
In Deinem Modell wird die Geschwindigkeitsdifferenz integriert, mathmatisch läßt sich der Integrator vor die Differenz ziehen und in 2 Integratoren aufspalten. Ich fände es anschaulicher, wenn die Integration dem Antriebstrang zugeschlagen wird, weil ja in der Realität jedes einzelne Rad den Weg integriert und es keinen Integrator gibt, der die Geschwindigkeitsdifferenz integriert.
Mannomann, heute war ich sowas auf dem Schlauch gestanden, das gibt es normalerweise nicht. Bin den ganzen Tag einer Diskrepanz nicht auf die Spur gekommen. Jetzt endlich habe ich es gefunden. Ich wollte heute eigentlich mit dem Bodediagramm weiter machen und erklären was ein stabile Regelung ausmacht, welche Eigenschaften kritisch sind, usw. Beim Erstellen der open loop gain hatte ich dann die Diskrepanz in der Verstärkung mit den von Hand gerechneten Werten. Das musste natürlich zuerst geklärt werden.
Nachdem ich es jetzt herausgefunden habe, muss ich auch folgende Aussage von mir korrigieren:
Das stimmt so nicht, das war mein Denkfehler. Für die Stabilität ist die differenzielle Steilheit also die Steigung ausschlaggebend und da ändert sich bei grösserer Reibung nichts. Das kann man sehr schön an dem Diagramm von stochri sehen. Ich habe den Ausschnitt noch mal als Bild angehängt. Man sieht sehr deutlich, dass sich zwar die Geschwindigkeit mit stärkerer Reibung ändert, aber die Steigung bleibt erhalten, die Kurve wird nur parallel nach unten versetzt. Nachdem das geklärt ist, kann es vermutlich morgen weiter gehen.Zitat:
Die Reibung geht nur als Verstärkungsänderung (K-Faktor) in das Simulationsmodell ein, da bei höherer Reibung nicht mehr die volle Höchstgeschwindigkeit erreicht wird.
@ stochri
Ich wüsste jetzt nicht, wie man bei einem Linienfolger die Geschwindigkeit als Sollwert verwenden kann. Der Asuro soll ja genau der Linie folgen und Abweichungen von der Linie sofort ausregeln. Die Abweichung ist eine Wegstrecke und keine Geschwindigkeit. Ich glaube du verwechselst da was. Natürlich kann man zusätzlich eine Geschwindigkeitsregelung einbauen, aber die ist extra zu betrachten.
Die Simulation für die Stabilität, die ich machen will, basiert auf der Analyse des dynamischen Verhaltens. Da werde ich nicht nur im Zeitbereich analysieren, sondern auch im Frequenzbereich. Dafür habe ich das Modell erstellt und es möglichst einfach gehalten. Es sind nur die für die Simulation relevanten Eigenschaften enthalten.
Hoffentlich gibt es morgen nicht noch einmal so ein Problem wie heute, sonst verzweifle ich. Aber das öffentlich machen von so einer Projektarbeit hat schon was für sich. Bevor man es schreibt, wird es nochmal überprüft und dabei werden doch noch kleine Fehler entdeckt. Ohne der Veröffentlichung hätte ich den Unterschied vermutlich übersehen. Es zwingt einen schon zu genauer Arbeit.
Gruss Waste
Hallo Waste,
Um das zu verdeutlichen habe ich Dein Modell im obigen Post abgezeichnet und die Regelerstruktur in Deinen Regler eingezeichnet. Ich dachte das wär so am besten verständlich.Zitat:
Ich wüsste jetzt nicht, wie man bei einem Linienfolger die Geschwindigkeit als Sollwert verwenden kann. Der Asuro soll ja genau der Linie folgen und Abweichungen von der Linie sofort ausregeln. Die Abweichung ist eine Wegstrecke und keine Geschwindigkeit.
Die rot gezeichnete Strukur beschreibt folgendes.
Der linke Motor wird mit einem festen PWM-Wert angesteuert ( das ist sozusagen die Sollgröße und kann bei Bedarf veränderte werden )
Der rechte Motor wird vom Regler gesteuert
( Wenn ich mich nicht täusche enspricht das sogar einem Deiner Linienfolgeprogramme. )
Die Sollgröße ( Abweichung von der Linie ) in Deinem Modell wird wie Du schon beschrieben hast auf 0 gesetzt ( sinnvolerweise ). Das heisst, man kann die Subtraktionsstelle streichen und durch * -1 ersetzen.
Zu den rot gezeichneten Antriebsträngen:
der Integrator lässt sich verschien, weil folgendes gilt:
intgral(v1-v2)=integral(v1)-integral(v2)
Was die Umformung der Reglerstruktur angeht, bin ich mir ziemlich sicher. Vielleicht habe ich noch nicht die richtige sprachliche Erklärung gefunden.Zitat:
Ich glaube du verwechselst da was. Natürlich kann man zusätzlich eine Geschwindigkeitsregelung einbauen, aber die ist extra zu betrachten.
Den Frequenzgang dieser Modellstruktur zu analysieren sollte machbar sein, es entspricht Deinem Modell.Zitat:
Die Simulation für die Stabilität, die ich machen will, basiert auf der Analyse des dynamischen Verhaltens. Da werde ich nicht nur im Zeitbereich analysieren, sondern auch im Frequenzbereich. Dafür habe ich das Modell erstellt und es möglichst einfach gehalten.
Viele Grüße,
stochri
Also erst nochmal zu der Kennlinie:Zitat:
Zitat von waste
Ich habe das so interpretiert, das auf der X-Achse die Abweichung der mittleren LED zur Mitte der Strecke angegeben wird, und auf der Y-Achse die gemessenen Analogwerte der Sensoren in Prozent oder was auch immer. Dabei wird bei einem Sensor der negative Wert genommen.
Ich bin der Meinung, dass der wieder abfallende Teil der Kurve ( > |10mm| ) sowieso nicht nutzbar ist, weil der Roboter nicht weiß, wo er ist, also das Abfallen bei Abweichungen von > |10mm| könnte genausogut < |5mm| bedeuten. (Ich hoffe das war heilweg's verständlich; die Betragszeichen sind sicherlich nicht korrekt, aber ihr wisst ja was ich meine)
Wie funktioniert das bisher? Denkfehler meinerseits?
Desshalb wäre ich dafür, nicht direkt die Daten der Sensoren als Input für den Regler zu verwenden, sondern das ganze erst mal zu 'linearisieren', also aus der Kennlinie die wirkliche Abweichung zu errechnen. Ist meiner Meinung nach sauberer, als das dann dem Regler zu überlassen.
Sicher wäre es kein Problem so eine Kennlinie in RoboSim mit einzubauen, aber wie gesagt, ich bezweifle, dass das so gut ist.
Um einem analogen Sensor nahe zu kommen, kann man ja die Sensoranzahl beliebig erhöhen und den Sensorabstand auf 1 setzen. Mehr macht sowieso keinen Sinn, da die Bahn nur pixelweise aufgelöst ist; natürlich könnte man auch das verändern, ist aber dann mit nicht ganz unerheblichem Programmieraufwand verbunden.
Grüße; ähM_Key
@ ähM_Key
Ich probier es mal mit der Sensoranzahl erhöhen und Abstand auf 1 Pixel. Wenn das klappt ist es ausreichend.
Waste
Hallo ähM_Key,
Ich denke, Du hast richtig gedacht. Es ist einfach so, wenn die Liniensensoren des Asuro mehr als 1cm abweichen, hat der ASURO die Linie verloren.Zitat:
Ich bin der Meinung, dass der wieder abfallende Teil der Kurve ( > |10mm| ) sowieso nicht nutzbar ist, weil der Roboter nicht weiß, wo er ist, also das Abfallen bei Abweichungen von > |10mm| könnte genausogut < |5mm| bedeuten. (Ich hoffe das war heilweg's verständlich; die Betragszeichen sind sicherlich nicht korrekt, aber ihr wisst ja was ich meine)
Wie funktioniert das bisher? Denkfehler meinerseits?
Der enge Fangbereich ist das große Problem bei der ASURO-Linienverfolgung.
Gruss,
stochri
In dieser Fortsetzung geht es um die Stabilitätskriterien von Regelschleifen, dazu wird das Bodediagramm der Schleife erstellt.
Vorher nochmal eine Zusammenstellung der Kennwerte der einzelnen Komponenten:
Antrieb statisch: 0.002 m/s
PT1-Block (differenzielle Steilheit des Antriebs): 0.0027 m/s
PT1-Block Zeitkonstante: 120ms (wegen des geringeren Trägheitsmoments beim Drehen)
Integrator: 1s
Sensor Hebelwirkung: 77/103 = 0.75
Sensor Empfindlichkeit: 14 pro mm
Totzeit durch AD-Wandler: 1.6ms
Der Regler wird vorerst nur mit der Verstärkung von 1 angesetzt, um zu sehen was die Schleife alleine macht. Es wird dazu das Bodediagramm der "open loop gain", also der Verstärkung in der Schleife erstellt. Siehe dazu auch Bild "open_loop_gain.gif". In dem Bild sind Amplituden- und Phasengang (grüne Linien) der Verstärkung aufgetragen. Die gestrichelte Linie ist die Phase. Ein Kriterium für die Stabilität der Schleife ist der Phasenrand und der Amplitudenrand. Diese sind violett eingezeichnet. Der Phasenrand ist die Phase bei Verstärkung = 1 (entspricht 0dB). Der Amplitudenrand ist die Dämpfung wenn die Phase durch 0 geht. Es ist verständlich, dass die Schleife schwingen würde, wenn bei 0 Grad eine Verstärkung > 1 wäre. In unserem Fall ist der Amplitudenrand 25dB und der Phasenrand etwa 27 Grad. Das ist nicht sehr viel, aber stabil. Die Regel lautet: Eine geschlossene Regelschleife arbeitet genau dann stabil, wenn der Phasenrand positiv ist. Wie stabil es ist, können wir auch an der Sprungantwort sehen.
Die Sprungantwort ist eine Analyse im Zeitbereich und zeigt die Antwort des Systems auf einen Sprung am Führungswert. Wie unser System reagiert, sieht man in Bild "Sprungantwort.gif". Es schwingt schon deutlich über und pendelt auch eine Zeitlang aus. Jetzt stellt sich die Frage, wie geht man vor, um den Regler einzustellen. Würde man im Regler die Verstärkung erhöhen, also nur P-Anteil erhöhen, dann ist aus dem Bodediagramm leicht zu erkennen, dass der 0dB-Durchgang der Verstärkung zu höheren Frequenzen rutscht (nach rechts) und der Phasenrand abnimmt. Bei einem P-Anteil von 18 (entspricht 25dB) würde die Schleife sogar schwingen (kein Phasen- und Amplitudenrand mehr). Also müssen wir zuerst den Phasenrand erhöhen, damit die Schleife stabiler wird und danach können wir, sofern genügend Phasenspielraum vorhanden ist, die Verstärkung erhöhen um eine schnellere Ausregelung zu bekommen.
Dazu schauen wir uns erstmal die Übeltäter an. Zum einen ist es der Integrator, der konstant die Phase um -90 Grad dreht und zum anderen ist es der PT1-Block, der mit seiner Zeitkonstante von 120ms den Frequenzgang wie in Bild "PT1_fg.gif" hat. Die Grenzfrequenz liegt bei 1.3Hz, da hat die Phase bereits 45 Grad gedreht. Was man dagegen macht, wird im nächsten Beitrag erklärt. Ich kann leider nur 3 Bilder pro Beitrag zeigen, deshalb geht es im nächsten Beitrag weiter.
Waste
Fortsetzung folgt.
Wenn man nun genau das Gegenteil von dem, was der PT1-Block macht, in den Regler integriert, dann wäre alles wieder in Butter. Das geht mit einem Differenzierglied. Im Bild "D-Anteil.gif" ist der Frequenzgang des Differenzierglieds (rote Kurve) gezeigt, der genau den Frequenzgang des PT1-Blocks (grüne Kurve) kompensiert. Im Regler wird das mit einem D-Anteil realisiert, der eine Zeitkonstante von 120ms hat.
Jetzt wollen wir mal sehen, wie sich das auf den Phasenrand und auf die Sprungantwort ausgewirkt hat. Siehe dazu die Bilder "olg2.gif" und "Sprungantwort2.gif". Na, das sieht doch gut aus! Der Phasenrand ist jetzt 85 Grad und es ist auch noch Raum für eine Erhöhung des P-Anteils. Aber schöner noch ist die Sprungantwort mit D-Anteil (rote Kurve). Zum Vergleich ist auch noch das Einschwingen ohne D-Anteil (grüne Kurve) eingezeichnet.
Im nächsten Beitrag versuchen wir noch am P-Anteil zu drehen.
Bis dann.
Waste
Fortsetzung folgt
Ich störe ja ungern deine genialen Ausführungen, aber es gibt ein kleines Update von RoboSim!
https://www.roboternetz.de/phpBB2/vi...=107941#107941
Grüße; ähM_Key
Ah, danke, jetzt sehe ich erst deinen Thread.
Werd es gleich testen.
Gruss Waste
Hallo zusammen,
da ich zum weiteren verfolgen des Threads erst den Keller nach meinen alten Regelungstechnikunterlagen durchsuchen musste, hat's etwas gedauert bis ich den Ausführungen von waste wieder folgen konnte.
Nachdem ich so die Bode- und Zeitdiagramme wieder halbwegs verstehe, habe ich vor allem (über mein geliebtes EXCEL) zugesehen, das auch bei mir ein negativ wirkender D-Anteil stärker wirkt.
Ausserdem hat waste schön dargelegt, das die Regelzeit so um 120 ms betragen wird.
Entsprechend habe ich (schon wieder im EXECL) das Verhältniss von Ti (Nachstellzeit) und Ta (Abtastzeit) darauf angepasst.
waste hat wohl richtig gerechnet.
Die Grafiken im EXECL 'Tabelle2' zeigen im oberen Bild eine von mir in der Strecke erzeugte Störung (und deren Ausreglung). Im unteren Teil kann man auch noch gut sehen, dass die Motorgeschwindigkeiten dafür sehr sanft geregelt werden. Das macht sich auch sehr schön in der recht ruhigen Fahrt vom Asuro bemerkbar.
Klasse dieser Thread!
Schöne Grüße von Sternthaler
ACHTUNG: auch hier ist wieder der rechte Motor mit 50 höher betrieben in MotorSpeed.
Fortsetzung:
Der D-Anteil bewirkt ein Vorhalten der Ansteuerung um die Verzögerung in der Regelstrecke auszugleichen. In unserem Fall kennen wir die Zeitkonstante des Antriebs und können dem Regler genau sagen wie er vorhalten muss. Das Vorhalten hat allerdings Grenzen, denn sonst bräuchte man unbegrenzt Power.
Jetzt optimieren wir nochmal den Regler, indem der P-Anteil um den Faktor 3 erhöht wird. Das ist für die Stabilität kein Problem, da genügend Phasenreserve im vorigen Beispiel war. Sehen wir uns dazu die Sprungantwort an (grüne Kurve V(s) im Bild "unbegrenzt.gif"). Das Einschwingen hat sich nochmal um den Faktor 3 verbessert. Achtung, die Zeitskala ist jetzt 0.5s anstatt 2s wie im vorigen Beitrag. Die Optimierung nach dem Bodediagramm könnte man noch weiter ausreizen, aber wie schon angesprochen sind uns da von anderen Seiten her Grenzen gesetzt. Das sieht man in den darüber angeordneten Kurven. Die rote Kurve V(v) bedeutet die Geschwindigkeit und die violette Kurve V(m) die Ansteuerspannung. Man sieht, für diese Beschleunigung bräuchte man kurzzeitig 100V als Ansteuerspannung für den Motor. Die haben wir leider nicht.
Aber wie sieht es in der Realität aus, wenn die Ansteuerung die Befehle des Reglers, auf das was möglich ist, begrenzt. Im Bild "begrenzt.gif" sieht man das Dilemma, das flotte Einschwingen ist wie eine Seifeblase zerplatzt. Und es kommt noch dicker! Wenn man beim Asuro nur die PWM-Ansteuerung für die Regelung verwendet, dann ist der Asuro beim Herunterregeln der Geschwindigkeit im Freilauf. Das liegt an der Ansteuerschaltung. Die Auswirkung ist in Bild "Freilauf.gif" zu sehen. Der Freilauf ist an der abfallenden Spannung (violett) im Bereich 70ms bis 240ms zu sehen. Zu dem Zeitpunkt ist die Ansteuerung hochohmig und es ist die Gegen-EMK des Motors zu sehen. In dem Bereich wird der Asuro nur durch die Reibung gebremst. Die Bremsphase ist dadurch sehr viel länger geworden.
Wie man sieht, ist so eine Dimensionierung eines Reglers noch von Randbedingungen abhängig. Man kann nicht alles mit einer Regelung kompensieren bzw. verbessern. Irgendwo sind durch die Mechanik und Elektronik die Grenzen gesetzt. Um weitere Verbesserungen zu erzielen, muss dort angesetzt werden. Glücklicherweise wird durch den D-Anteil bei Korrekturen immer voll ausgesteuert, so dass man beim Asuro zum Bremsen "BREAK" verwenden kann. Das macht allerdings die Ausführung des Reglers im Programm etwas komplizierter. Notfalls kann auch noch Rückwärts mit einbezogen werden, aber ob das sinnvoll ist, müssen erst noch Praxistests zeigen.
Tipp an Regelschleifenbauer anderer Projekte, womöglich lesen welche mit. Diese Erkenntnisse gelten auch für andere Positions- oder Lageregelungen, wie z.B. beim Quattrocopter. Die Ansteuerung der Motoren sollte für eine effektive Regelung mit genügend Reserven ausgestattet sein und aktiv bremsen können. Desweiteren ist auf eine sorgfältige Auswahl der Motoren bezüglich des Trägheitsmoments zu achten. Man sollte sich genau überlegen, ob ein Brushless Aussenläufer die richtige Wahl ist. In der Hinsicht sind bestimmt Glockenankermotoren die beste Wahl.
Im nächsten Beitrag wird eine vorläufige Parametrierung des Reglers festgelegt und dann geht es an die Umsetzung in Code.
Waste
Fortsetzung folgt
Fortsetzung:
Heute geht es darum, wie man vom Bodediagramm auf die Parameter Kp, Ki und Kd für den Regler kommt.
Ich habe nochmal die Sprungantwort auf die Begrenzung optimiert. Ich musste dazu den D-Anteil etwas zurücknehmen, damit das Einschwingen besser wird. Die Sprungantwort ist im Bild "PD1.gif" als grüne Kurve zu sehen. Das zugehörige Bodediagramm ist im Bild "olg3.gif". Die rote Kurve ist die "open loop gain" und die grüne Kurve ist die Verstärkung des Reglers. Zusätzlich habe ich noch einen I-Anteil hinzugefügt, da die Verstärkung des P-Anteils nicht ausreichen wird, um auch enge Kurven zu fahren. Eine Verstärkung von nur 3 kann die Ansteuerung (PWM) um maximal 3*60 = 180 verändern, weil der Sensor max. nur 60 liefert und das reicht nicht aus um das innere Rad soweit zu drosseln, dass auch sehr enge Kurven gefahren werden können. Ursprünglich war ich der Meinung der P-Anteil würde höher sein und da kann ich auf den I-Anteil verzichten, also brauch nur einen PD-Regler zu realisieren, aber das hat sich jetzt zerschlagen, ich muss doch einen PID-Regler machen. Das hat jetzt den Vorteil, dass auch der I-Anteil in die Erklärung mit einbezogen wird. Der I-Anteil ist im Bodediagramm links an dem Abfall der grünen Kurve bis ca. 1Hz zu sehen.
Die Parameter für den PID-Regler sind folgendermassen definiert:
Kp ist die Verstärkung des P-Teils
Ki = 1/Ti (Ti ist die Zeitkonstante des Integrators)
Kd = Td (Td ist die Zeitkonstante des Differenzierglieds)
Die Zeitkonstanten können zum einen aus der Simulationsschaltung direkt bestimmt werden als auch aus dem Bodediagramm. Dazu sind in dem Bild "regler_bode.gif" die Anteile des Reglers P, I und D einzeln dargestellt um die Zeitkonstanten herauszufinden. Die Zeitkonstanten errechnen sich aus den 0dB-Durchgängen der I- und D-Kurve. Der D-Anteil ist die rote Kurve, die kreuzt bei 0.712Hz die 0dB-Linie, d.h. fd=0.712Hz.
Damit ist: Kd = Td = 1/(2*pi*fd) = 0.225
Der I-Anteil ist die hellblaue Kurve, die kreuzt bei 1.59Hz die 0db-Linie, d.h. fi=1.59Hz.
Damit ist: Ki = 1/Ti = 2*pi*fi = 10
Der P-Anteil ist einfach, das ist die violette Kurve. Wie schon früher festgestellt ist Kp = 3 das entspricht den 9.5dB.
Somit sind die Parameter des Reglers bestimmt und es kann im nächsten Beitrag mit der Umsetzung in Code weitergehen.
Waste
Fortsetzung:
Heute geht es darum, wie das bisherige Wissen in einen Code umsetzt wird.
Hierzu eine Zusammenstellung der Formeln. Wer eine Herleitung der Formeln will, kann sich im WWW informieren, es gibt darüber genügend Literatur.
Begriffsdefinitionen:
Formeln zur Berechnung:
- W = Sollwert
X = Istwert
Xw = Regelabweichung
Y = Stellgrösse
Yp = P-Anteil von Y
Yi = I-Anteil von Y
Yd = D-Anteil von Y
Kp = Proportionalbeiwert
Ki = Integrierbeiwert
Kd = Differenzierbeiwert
dt = Taktzeit des Reglers
- Xw = W - X
Yp = Kp * Xw
Yi = Ki * (Isum + Xw * dt)
Isum: ist die Summe aller vergangenen (Xw * dt) Berechnungen
Yd = Kd * (Xw - Xwalt)/dt
Xwalt: ist der Xw-Wert des letzten Zyklus
Y = Yp + Yi + Yd
Zum besseren Verständnis habe ich in das Blockschaltbild die benützten Kürzel eingetragen (siehe Bild). Der Regler ist jetzt detailierter dargestellt.
Der Sollwert W ist in unserem Fall Null. Der Istwert X ist der ausgelesene Wert des Liniensensors. Die berechnete Stellgrösse Y ist die Korrektur, die auf den PWM-Wert zur Ausregelung gebracht wird. Man hat die Wahl, entweder die Stellgrösse Y je zur Hälfte im entgegengesetzten Sinn auf beide Motore zu geben oder nur einen Motor zu verlangsamen oder zu beschleunigen. Auf das Vorzeichen muss geachtet werden, sonst regelt er nicht aus.
So, jetzt kann mit dem Programmieren losgelegt werden! Wer will es selbst versuchen?
Mit den Parametern aus dem letzten Beitrag hat man alles, was man dazu braucht.
Kp = 3; Ki = 10; Kd = 0.225;
dt = 0.0016
Während Ihr inzwischen fleissig programmiert, werde ich mein vorläufiges Programm noch auf Vordermann bringen, um es hier reinstellen zu können.
Tipps:
Mit etwas Geschick kann man auf floating point verzichten und man kommt mit Integer aus.
Sorgfalt ist geboten um Überläufe zu verhindern.
Beim D-Anteil kommt prinzipbedingt ein sehr hoher Wert in der Berechnung vor. Die Weitergabe an den PWM-Wert muss begrenzt werden, aber der Rest darf nicht verworfen werden, sonst stimmt das Verhalten nicht mehr.
Waste
Fortsetzung folgt
Ohhh, liegt es am guten Wetter ?
Ich kann mir nicht vorstellen das sich da keiner traut.
Aber ich werde mal meine Versuche mit PD-Regler (mit float und long) mit deinen Werten umschreiben
Fortsetzung:
Hier ist mein Programm. Es ist soweit kommentiert, dass jeder damit klar kommen sollte.
Ergänzende Hinweise:Code:/*******************************************************************************
*
* Description: Asuro Linienverfolgung mit PID-Regler
* Version 1: Korrektur auf beide Motoren verteilt
* Autor: Waste 26.8.05
*
*****************************************************************************/
#include "asuro.h"
#include <stdlib.h>
unsigned char speed;
int speedLeft,speedRight;
unsigned int lineData[2];
int x, xalt, don, doff, kp, kd, ki, yp, yd, yi, drest, y, y2, isum;
void FollowLine (void)
{
unsigned char leftDir = FWD, rightDir = FWD;
FrontLED(OFF);
LineData(lineData); // Messung mit LED OFF
doff = (lineData[0] - lineData[1]); // zur Kompensation des Umgebungslicht
FrontLED(ON);
LineData(lineData); // Messung mit LED ON
don = (lineData[0] - lineData[1]);
x = don - doff; // Regelabweichung
isum += x;
if (isum > 16000) isum =16000; //Begrenzung um Überlauf zu vermeiden
if (isum < -16000) isum =-16000;
yi = isum/625 * ki; //I-Anteil berechnen
yd = (x - xalt)*kd; // D-Anteil berechnen und mit
yd += drest; // nicht berücksichtigtem Rest addieren
if (yd > 255) drest = yd - 255; // merke Rest
else if (yd < -255) drest = yd + 255;
else drest = 0;
if (isum > 15000) BackLED(OFF,ON); // nur zur Diagnostik
else if (isum < -15000) BackLED(ON,OFF);
else BackLED(OFF,OFF);
yp = x*kp; // P-Anteil berechnen
y = yp + yi + yd; // Gesamtkorrektur
y2 = y/2; // Aufteilung auf beide Motoren
xalt = x; // x merken
speedLeft = speedRight = speed;
MotorDir(FWD,FWD);
if ( y > 0) { // nach rechts
StatusLED(GREEN);
speedLeft = speed + y2; // links beschleunigen
if (speedLeft > 255) {
speedLeft = 255; // falls Begrenzung
y2 = speedLeft - speed; // dann Rest rechts berücksichtigen
}
y = y - y2;
speedRight = speed - y; // rechts abbremsen
if (speedRight < 0) {
speedRight = 0;
}
}
if ( y < 0) { // nach links
StatusLED(RED);
speedRight = speed - y2; // rechts beschleunigen
if (speedRight > 255) {
speedRight = 255; // falls Begrenzung
y2 = speed - speedRight; // dann Rest links berücksichtigen
}
y = y - y2;
speedLeft = speed + y; // links abbremsen
if (speedLeft < 0) {
speedLeft = 0;
}
}
leftDir = rightDir = FWD;
if (speedLeft < 20) leftDir = BREAK; // richtig bremsen
if (speedRight < 20) rightDir = BREAK;
MotorDir(leftDir,rightDir);
MotorSpeed(abs(speedLeft),abs(speedRight));
}
int main(void)
{
unsigned char sw;
Init();
MotorDir(FWD,FWD);
StatusLED(GREEN);
speed = 150;
kp = 3; ki = 10; kd = 70; // Regler Parameter kd enthält bereits Division durch dt
sw = PollSwitch();
if (sw & 0x01)
{ki=20;}
if (sw & 0x02)
{speed = 200;}
if (sw & 0x04)
speed = 100;
if (sw & 0x08)
kd = 35;
if (sw & 0x10)
kd = 70;
if (sw & 0x20)
kd = 140;
FrontLED(ON);
LineData(lineData);
speedLeft = speedRight = speed;
while(1){
FollowLine();
}
return 0;
}
Ich habe den Differenzierbeiwert kd gleich durch dt geteilt, damit ich mit Integer rechnen kann.
kd/dt = 0.225/0.0016 = 140
Mit diesem Wert zittert (schwingt) der Asuro leicht. Als gute Werte haben sich 40 bis 70 herausgestellt. Da fährt der Asuro schön stabil. In der main Routine kann man die Parameter verändern, wenn man nach dem Einschalten des Asuros eine der Tasten drückt bis die Motore anlaufen. Da kann man verschiedene Einstellungen testen.
Das Zittern bei kd=140 liegt vermutlich an dem zu grossen Getriebespiel. Meinen Asuro kann ich etwa 2mm hin und her schwenken ohne dass sich die Motoren mitdrehen. Dadurch ergibt sich eine zusätzliche Totzeit , die das Schwingen erklären könnte. Ganz sicher bin ich mir aber nicht, das müsste man noch genauer untersuchen. Aber mit kleineren kd-Werten funktioniert der Regler wunderbar. Bei Kd=70 ist er sehr schnell und stabil. Bei kd=35 ist er schon deutlich langsamer aber immer noch sehr stabil. Bei noch kleineren Werten sieht man schon leichtes Nachschwingen.
Die Regelabweichung ist in meinem Programm x anstatt Xw. Da der Sollwert 0 ist, habe ich gleich den Istwert x für die Berechnungen genommen. Ansonsten sollten die Variablen mit meinem letzten Beitrag übereinstimmen.
Der I-Anteil wird durch Begrenzen von Isum auch begrenzt. Bei ki=10 ist der Grenzwert 256, das ist praktisch Vollausschlag an den Motoren. Mehr braucht man nicht, es könnte sogar eine niedrigere Begrenzung sinnvoll sein, um bei S-Kurven nicht auszurasten.
Der D-Anteil kann sehr hohe Werte annehmen, die in einem Zyklus gar nicht verwertet werden können. Um dennoch das richtige Verhalten des Reglers zu erreichen, wird der nicht verwertete Rest in der Variable "drest" gespeichert und bei den nächsten Zyklen wieder berücksichtigt.
Das Programm ist auch noch komplett mit hex-File in einer zip-datei angehängt. Probiert es mal aus. Da mein Asuro mit den grösseren Akkus etwas schwerer ist als im Original, können sich bei Euch etwas andere Ergebnisse herausstellen. Ich selber werde auch noch mit den Parametern spielen und einige Freiheitsgrade testen.
Waste
Als vorhin nachhause kam, habe ich dein fertiges Programm gesehen. Das musste ich doch sofort testen.
Soweit ich es bisher sehen kann ist die Regelung, ausgezeichnet.
Ich habe bei 100,150 und 200 keine Fehler bemerkt. Kein zittern oder ausbrechen !
Meine Linie ist ein 3m langer schwarzer Klebestreifen 24mm breit auf einer Sperrholzplatte 120+80 cm. Kurvenradius 140 mm.
Ich habe auch 4 AA Akkus auf meinem Asuro von denen zwei hinten überstehen. Er wiegt 270 Gramm. Auf dem Vorderrad, ein durchbohrter KugelKnopf mit 14mm Durchmesser liegen nur noch 20 Gramm.
SUPER,
läuft perfekt auch beim meinen 'krummen' Motoren!
Weitere Komentare nach Programm-Analyse. (siehe Uhrzeit)
GANZ Viele Grüße von Sternthaler
Ui, da hat einer ne Nachtschicht eingelegt. :)
Es freut mich, dass es bei Euch auch so gut funktioniert.
Ich bin auch noch am Testen, es gibt noch so viele Varianten durchzuspielen.
Gruss Waste
Hier mein Testergebnis:
1. In schnell gefahrenen Kurven flog der Asuro noch raus. Eine Verbesserung brachte eine Erhöhung von kp und dafür ein Veringern von ki. Die optimalsten Werte für meinen Asuro sind nun:
kp=5; ki=5; kd=70;
2. Ich habe kurze Schwankungen (im 4er Takt) bei den Sensordaten festgestellt. Dies brachte durch die Differenzierung starke Auschläge auf die Ansteuerung auch bei Geradeausfahrt. Dadurch wurde die Fahrt unnötig gebremst. Abhilfe schaffte eine Filterung der Sensordaten über 4 Zyklen.
Mit diesen beiden Verbesserungen fährt nun mein Asuro auch mit Vollgas über meinen Testparcours.
Das neue Programm incl. hex-file habe ich angehängt.
Gruss Waste
Hi waste!
Zu deinem Proggi: Uiuiuiuiui!! Der Asuro fährt seine Bahnen sauberst ab, wackelt kein einziges Mal und gibt an den richtigen Stellen Gas! Richtig richtig gut!!!
An einigen Stellen bricht er manchmal noch aus (ich hab in meiner Bahn einige ca. 120° - 150° Ecken eingebaut), aber er fährt sauberst durch die Gegend. Der Rest dürfte über eine Anpassung der Regelparameter zu machen sein.
Ich guck mir das Proggi auch nochmal genauer an, wenn: ZEIT!
Jupp, hast ja wahrscheinlich auch gemerkt, daß ich zu dem PID Regler im Laufe der Wochen nix geschrieben habe, gleiches Argu: ZEIT! Ist gerade Jobsuche angesagt, von daher fahr ich fast jeden Tach durch die Gegend.
Sobald die Phase aber wieder vorbei ist, guck ich mir das Proggi mal genauer an, schaut echt interessant aus und läuft phänomenal gut!
(Damit machst du auf dem Robocup glaub ich fast jeden platt - *grins* - Asuro wins vs 1000 Euro Bot - stellt euch das mal vor ;D )
Hallo payce!
Ja, lange nichts mehr von Dir gehört. Schön, dass Dir das Programm gefällt.
Der Sinn der Sache war für mich, einmal auch in Mechatronik einen klassischen Regler von Grund auf zu entwerfen. Wenn ich schon mitreden will, dann sollte ich es auch einmal gemacht haben. :) In Mechatronik hatte ich nämlich noch keine Erfahrung, im Gegensatz zur Elektronik wo ich schon zig Regler entworfen hatte. Ich habe es nun auch nach der Methode, wie in der Elektronik üblich durchgezogen. Für manche bestimmt zu aufwendig und detailiert, denn Mechaniker gehen da üblicherweise sehr viel pragmatischer ran. Da gibt es Tabellen und Einstellregeln nach denen ausgewählt und eingestellt wird. Wenn es hilft, ist es ok, aber ich wollte es verstehen.
Ein schöner Nebeneffekt ist natürlich, dass es auch noch gut funktioniert. Zudem ist es ein Reglerbeispiel mit dem man spielen kann und sich das geänderte Verhalten beim Ändern der Parameter sichtbar machen kann.
Der nächste Schritt wäre jetzt noch der Fuzzy-Regler. Vielleicht findet sich dazu ein Fuzzy-Experte.
Gruss Waste
@Waste
Das Programm (Line_PID.zip) funktioniert bei mir sehr gut.
Gruß Winne
@Waste
Ich habe meinen Asuro mit Deinen Programm beim Linienverfolgen gefilmt. Die Filme + Code kann man sich dann von meiner Homepage saugen.
Gruß Winne
Hallo Winne!
Schöne Videos!
Hab auch eins gemacht. Meins ist allerdings nicht so schön, aber die Geschwindigkeit kommt deutlich raus. Der Asuro fährt den Testkurs mit Vollspeed.
Hier der Link: http://dl4.rapidshare.de/files/46471...0/DSCN2854.MOV
Gruss Waste
@ waste
Ok, ich habe mir das Video angesehen!
Gruss Winne
Hi!
Bin zu faul zum suchen...wie schnell fährt der Asuro eigentlich? ca. 30cm/s?
Wie breit ist so eine Spur auf der getestet wurde? 1,5cm?
Weil unser Roboter fährt nur etwas langsammer auf einer 1,5cm breiten Spur mit einem minimalen Radius von 15cm. Die Überlegung war erst mal, dass man den Abstand Achse-Sensoren nicht größer als ungefähr 15cm macht, um in engen Kurven das innere Rad nicht rückwärts drehen lassen zu müssen, um auf der Spur zu bleiben. Ist das soweit richtig gedacht?
Aber nun zur eigentlichen Frage, und zwar die Anordnung der Sensoren, wobei wir Reflexkoppler CNY70 (also digitale Auswertung) verwenden wollen. Der Asuro hat eine 'Sehbreite' von 1,5cm, was ich etwas wenig finde.
Meint ihr 8 Sensoren mit einem Abstand von jeweils 1cm ('Sehbreite'=7cm, Auflösung bei 1,5cm Spur 0,5cm) sind angemessen und schnell (nat. mit darauf angepasstem PID-Regler) oder sollte man es eher dem Asuro annähern und die Sensoren dichter Packen und dann eine geringere 'Sehbreite' für eine höhere Auflösung in Kauf nehmen?
Ich hoffe das Problem heilwegs verständlich dargestellt zu haben; mehr als 8 Sensoren kommen an sich nicht in Frage.
Grüße; ähM_Key