PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Quadkopter stabilisieren



kounst
24.09.2009, 15:42
Hallo,

ich baue an einem Quadkopter. Die Regelung übernimmt ein stm32 mit 2 Murata enc-03 Gyros. Die Motorregler werden mit 500Hz über I2C angesteuert.
Ich hab versucht die Regelung mit einem PID Regler zu machen aber der I und der D Anteil macht mir Kopfzerbrechen. Das Beste Regelverhalten hab ich bisher nur mit P-Regler ohne I und D erreicht. Fliegt auch durchaus kontrollierbar(eigentlich erstaunlich)..- aber da ist noch Verbesserungpotential!

Wär' toll wenn mir jemand einen Tipp geben könnte!

- kounst

Willa
24.09.2009, 20:45
Hi! Die Begriffe "P", "I", und "D" sind für Regelungstechniklaien wie mich ziemlich mehrdeutig. Beschreib doch mal was du mathematisch mit den Werten aus den Gyroskopen machst. Vielleicht fällt mir dann was auf.

kounst
24.09.2009, 21:53
ok,

also für die roll achse wäre das: (für nick natürlich genauso)

roll_error = roll_vorgabe - gyro;
roll_stellwert = K_p * roll_error + rollerrot_int / K_i + K_d * (roll_error - last_roll_error); //die einzelnen Summanden entsprechen P, I und D.
last_roll_error = roll_error;

motor_links = kollektiver_pitch + roll_stellwert + gier;
motor_rechts = kollektiver_pitch - roll_stellwert + gier

diese berechnung wird alle 500µs wiederholt an die Motoren gesendet.
Wie bereits erwähnt fliege ich momentan mit K_i und K_d = 0 es ist also nur der Teil K_p *roll_error wirksam

Willa
24.09.2009, 22:13
Hi! Sieht eigentlich gut aus... Ich habe bei meinem Projekt vielfach versucht den D-Anteil zu verrechnen, aber das hat nie geklappt. Meistens war das Differential viel zu verrauscht und hat alles eher schlechter gemacht. Darauf kann man aber auch gut verzichten.
Wie groß sind denn die Faktoren bei dir? Bei mir z.B. ist K_p = 0.4 und K_i = 0.003 (nur mal um das Verhältnis darzustellen).
Mein Copter fliegt mit ausschließlich K_p eher schlecht. K_i ist auf jeden Fall notwendig damit er seinen Winkel konstant hält. Wie möchtest du denn überhaupt steuern? Wie einen Modellhubi (=winkelgeschwindigkeit) oder möchtest du mit dem Stick den Winkel direkt vorgeben? Hast du irgendwas unternommen um den Drift der Gyros abzufangen? Ansonsten sollte das mit k_i nur wenige Sekunden gutgehen (besonders bei den Murata Gyros...)
Ich habe zwei Modes programmiert, die ich im Flug umschalten kann:
Winkelgeschw. Steuerung:
A=Gyro-Knüppel
B=B+A
Motorsoll=A+B

Winkelsteuerung (eigenstabil):
A=Gyro
B=B+A
C=B-Knüppel
Motorsoll=A+C
Hoffe ich konnte helfen...

kounst
24.09.2009, 22:47
Hey,
dass das Rauschen vom Gyro ein Problem beim D anteil macht hab ich schon mal irgendwo gelesen..- ich hoffe bzw hatte gehofft das ich das problem beseitigen könnte.
In meinen Regelkreis geht der ADC-Wert vom Gyro nicht direkt ein sondern ein mittelwert aus 16 ADC Werten. Wozu hat man den son fetten Micro;-)
Der Vergleich der verstärkungsfaktoren fällt jetzt etwas schwer weil ich meine Regelabweichung so berechne: roll_error = roll_vorgabe/16 - gyro /64
und mein K_p = 30 -> also auf das gyro signal bezogen ergibt sich etwa 0,47
da wär ich ja von deinem Wert nicht so weit weg. Beim I Anteil konnte ich bisher keinen finden der das Regelverhalten verbessert hätte also flieg ich mit K_i = 0 (also ohne integrierenden Anteil)
Du hast natürlich Recht das ich einen I- Anteil bräuchte wegen der bleibenden Regelabweichung- aber ich vermutlich weil die Regelstrecke selbst integrierend ist komme ich eigentlich ganz gut ohne aus. Ich möchte den Quadkopter wie einen Heli steuern!
Gegen den Gyrodrift hab ich nix gemacht - ich wüste auch nicht was ich da machen kann- das könnte natürlich tatsächlich der grund sein warum ich mit dem der suche nach einem guten K_i wenig erfolgreich was!

also A entspricht dann wohl meinem roll_error und B roll_error_int?!

Willa, ich hab gesehen das du in deinem Blog angekündigt hast den Quellcode hochzuladn. Das würd mich jetzt sehr interessieren. Auch wie du die Regelung mit Gyro und ACC verknüpft hast..

Willa
24.09.2009, 23:15
Hi!
Also den Drift kannst du entweder mit nem ACC weg bekommen, oder du ziehst in jedem Durchgang vom Integral etwas ab (wenn es größer null ist) oder rechnest was dazu (wenn kleiner null). Dadurch kann der Copter dann zwar nicht 100% gerade bleiben, aber es funktioniert schon nicht schlecht.
Mit dem Mittelwertbilden würde ich vorsichtig sein... Ein schöner analoger Tiefpass vor dem ADC (fg ~ 40Hz) wirkt meiner Erfahrung nach viel besser als digitale Filterung im µC.
Das mit dem Quelltext ist so eine Sache... Ich möchte den nicht einfach per Copy + paste irgendwo hinstellen, sondern eine runde story draus machen. Mit erklärungen, so dass es wirklich jeder verstehen kann. Aber das benötigt natürlich Zeit.....

kounst
24.09.2009, 23:33
Das mit dem etwas abziehen bzw addieren muss ich morgen mal ausprobieren.
Einen analogen Tiefpass hab ich auch eingebaut. Bei der Grenzfrequenz hab ich 150Hz(bei den Mikrokopterern abgekupfert ;-))
Ich glaub nicht das der digitale Filter ein Problem darstellt. aber evtl sollt ich mit der Grenzfrequenz vom Tiefpass noch weiter runter.. du fliegst mit 40Hz?
Ja das mit dem Quellcode ist klar - hatte nur gehofft weil du den ja schon am 2. 9 angekündigt hat. aber no pressure;-)

Danke für deine Anregungen!

recycle
25.09.2009, 01:54
@Willa


Also den Drift kannst du entweder mit nem ACC weg bekommen, oder du ziehst in jedem Durchgang vom Integral etwas ab (wenn es größer null ist) oder rechnest was dazu (wenn kleiner null). Dadurch kann der Copter dann zwar nicht 100% gerade bleiben, aber es funktioniert schon nicht schlecht.
Der Teil mit dem ADC leuchtet mir ein, aber warum es hilft in jeden Durchgang etwas vom Integral zu subtrahieren oder addieren?
Ohne hierfür einen Sensor, z.B. ACC auszuwerten kann man dann doch eigentlich immer nur einen konstanten Wert abziehen oder hinzufügen. Die Integration selber ist nichts anderes als in jedem Durchgang den (positiven oder negativen) Messwert zu addieren.

D.h. anstatt:
SummeMesswerte = SummeMesswerte + Messwert
rechnet man:
SummeMesswerte = SummeMesswerte + (Messwert-x)

D.h. eigentlich rechnet man schon im ersten Durchgang falsch und man rechnet keinen Drift raus, sonder verzögert nur, dass das Integral durch Aufsummieren der Fehler aus dem Rahmen läuft.
Das bezahlt man aber halt damit, dass man schon mit falschen Werten rechnet, selbst wenn gar kein Drift da ist.
Wäre es da nicht besser, den Faktor mit dem das Integral in die Regelung eingeht niedriger zu machen?

In einem anderen Thread hast du geschrieben, dass das Integral aufgrund der sich addierenden Fehler irgendwann völlig falsch wird und man es dann auf 0 zurücksetzen muss.

D.h. z.B.
SummeMesswerte = SummeMesswerte + Messwert
If SummeMesswerte > X then SummeMesswerte = 0
If SummerMesswerte < -X then SummeMesswerte = 0

Eigentlich müsste man das was der obige Teil bezwecken soll hier doch besser erreichen können.
Wenn man hier X kleiner macht, erreicht man auch, dass das Integral nicht soweit aus dem Ruder läuft, verfälscht aber nicht jeden einzelnen Messwert.

Nachdem ich deinen Beitrag dazu in dem anderen Thead gelesen habe, habe ich mal als Regelung für mein Chassis das auf 2 Rädern stehen soll (Balancierener Roboter) angewendet.
D.h.:
SummeGyro = SummeGyro + Gyro
If SummeGyro > X then SummeGyro = 0
If SummeGyro < -X then SummeGyro = 0

Die Summe der Gyro-Messwerte ist die einzige Grösse die ich Auswerte und als PWM auf die Motoren gebe, d.h. meine Regelung hat eigentlich nur einen I-Anteil.
Das Ding steht damit teilweise über eine Minute auf der Stelle ohne umzukippen.
(Warum weiss ich auch nicht, tuts aber ;-) )

Um einen Quadrocopter stabil in der Luft zu halten reicht das sicher nicht.
Ich könnte mir aber gut vorstellen, dass es für "kounst" als zusätzlicher I-Anteil hillft den Copter ruhiger zu halten.

Wobei man hier mit "Nur I-Anteil" vielleicht auch wieder vorsichtig sein muss. Die Summe der Gyrosignale über die Zeit, sprich Integral oder I-Anteil - entspricht ja eigentlich dem Winkel, also der Grösse die man regeln will. Damit wäre es dann ja irgendwie auch der P-Anteil.

Wenn man den Winkel regeln will, wäre das eigentliche Gyro-Signal sprich die Winkelgeschwindigkeit - irgendwie auch der D-Anteil.
Oder sehe ich das wieder völlig falsch? Regelungstechnik werde ich nie kapieren.

Willa
25.09.2009, 08:32
Hallo Recycle!

aber warum es hilft in jeden Durchgang etwas vom Integral zu subtrahieren oder addieren?
Ohne hierfür einen Sensor, z.B. ACC auszuwerten kann man dann doch eigentlich immer nur einen konstanten Wert abziehen oder hinzufügen. Die Integration selber ist nichts anderes als in jedem Durchgang den (positiven oder negativen) Messwert zu addieren. D.h. eigentlich rechnet man schon im ersten Durchgang falsch und man rechnet keinen Drift raus, sonder verzögert nur, dass das Integral durch Aufsummieren der Fehler aus dem Rahmen läuft.
Das bezahlt man aber halt damit, dass man schon mit falschen Werten rechnet, selbst wenn gar kein Drift da ist.
In der Theorie hast du eigentlich Recht, in der Praxis hat sich das Vorgehen aber bewährt. Durch das Abziehen eines konstanten (pos oder neg) Wertes vom Integral bekommt man einen Teil der realen Bewegung nicht mit. Diesen Teil sieht aber der Pilot sehr wohl. Der Drift wird also vom Piloten ausgesteuert.
Man kann übrigens auch das Integral in jedem Durchgang mit dem Faktor 0.99999 multiplizieren... Sollte auch gehen.

Wäre es da nicht besser, den Faktor mit dem das Integral in die Regelung eingeht niedriger zu machen?

In einem anderen Thread hast du geschrieben, dass das Integral aufgrund der sich addierenden Fehler irgendwann völlig falsch wird und man es dann auf 0 zurücksetzen muss.
Wenn man den Faktor niedriger macht, hat es keine regelnden Eigenschaften mehr. Du musst folgendes beachten beim Drift: Er hat fatale Folgen für einen Copter, denn das Integral gibt die Winkelgeschwindigkeit vor. Wenn das Integral nun gaaaaaaanz langsam wegläuft (z.B. beim Wert "10" rumkriecht), dann heisst dass, das der Copter die ganze Zeit eine Winkelgeschwindigkeit hat. Es wird quasi doppelt integriert wenn man sagt dass die zu regelnde Größe der Winkel ist (oder...?).


SummeGyro = SummeGyro + Gyro
If SummeGyro > X then SummeGyro = 0
If SummeGyro < -X then SummeGyro = 0
Dieser Code würde bewirken, dass der Copter sich erst wehrt nach vorne gekippt zu werden, dann aber plötzlich die nach vorne gekippte Lage schlagartig akzeptiert und von nun an nach vorne gekippt bleiben will.

Regelungstechnik werde ich nie kapieren. Das geht mir genauso... Da unterhalten sich ja die richtigen ;-D

recycle
25.09.2009, 18:13
Hallo Willa,


Durch das Abziehen eines konstanten (pos oder neg) Wertes vom Integral bekommt man einen Teil der realen Bewegung nicht mit. Diesen Teil sieht aber der Pilot sehr wohl. Der Drift wird also vom Piloten ausgesteuert.

Ok, d.h. die Regelung ist nicht dazu gedacht den Copter selbstständig in der waagerechten zu halten und der Drift der Gyros muss auch gar nicht rausgerechnet werden.
Die Regelung soll den Copter eigentlich soweit beruhigen, dass er für den Piloten steuerbar wird.
Den Drift der Gyros und sicherlich auch noch so einige Einflüsse durch Wind usw. gleicht der Pilot dann aus.


Man kann übrigens auch das Integral in jedem Durchgang mit dem Faktor 0.99999 multiplizieren... Sollte auch gehen

Das ist ja dasselbe was ich mit "den Faktor mit dem das Integral in die Regelung eingeht niedriger machen" gemeint habe.
Der wesentliche Unterschied ist, er Faktor wirkt proportional. D.h. wenn das Integral gross wird, bewirkt der Faktor viel, wenn es klein ist, ändert der Faktor wenig.
Der Idealfall wäre ja sicherlich, wenn der Copter still und waaherecht in der Luft "klebt" und das Gyro nicht driftet. Dann ergäbe das Gyro-Integral 0.
An dieser Stelle hinzugehen und in jedem Durchlauf einen konstanten Wert abzuziehen, bzw. hinzuzufügen, sollte theoretisch eher schädlich sein.
Praktiisch schadet es vermutlich nicht, weil man damit in der Nähe vom Nullpunkt den konstanten Wert in einen Durchlauf dazu addiert, das Integral dann das Vorzeichen wechselt und dadurch schon im nächsten Durchlauf derselbe Wert wieder abgezogen wird.
D.h wenn die Regelung schnell genug ist, kommt die ganze Aktion gar nicht bei den Motoren an und schadet daher nicht.
Vielleicht klappt es sogar (mehr oder weniger) zufällig besser als ein Faktor, weil die Reaktion des Copters und die Störgrössen auch nicht linear sind.


Wenn man den Faktor niedriger macht, hat es keine regelnden Eigenschaften mehr.
Nach deiner Beschreibung weiter oben hast du ihn mit Ki=0.003 ja schon so klein gemacht, dass ich mich aus dem Bauch heraus eh wundere, wie der noch was bewirkt.


Er hat fatale Folgen für einen Copter, denn das Integral gibt die Winkelgeschwindigkeit vor.
Das stimmt so glaube ich nicht.
Dem Datenblatt nach misst dein Gyro-Sensor die Winkel-Geschwindigkeit (Angular Rate).
Das Integral aus der Winkelgeschwindigkeit müsste demnach der Winkel sein.


Wenn das Integral nun gaaaaaaanz langsam wegläuft (z.B. beim Wert "10" rumkriecht), dann heisst dass, das der Copter die ganze Zeit eine Winkelgeschwindigkeit hat.
Ich glaube der Drift im eigentlichen Sinne spielt hier gar keine so grosse Rolle. Ein ganz langsames wegdriften wird der Pilot ausgleichen können.
Kritischer sind die Fehler die durch die Berechnung selber entstehen. Du wertest den Gyro ja nur in Intervallen aus. Zwischen den Intervallen passiert ja auch etwas, d.h. die Messwerte sind eigentlich immer etwas falsch. Dann kommt noch ein Messfehler dazu und ein Fehler durch die Digitalisierung des analogen Messwertes.
Bei 40 Hz addierst du alle diese Fehler 40 mal pro Sekunde auf. D.h. dein Integral hat ganz schnell nichts mehr mit der Realität zu tun und sagt dir dein Copter steht auf dem Kopf obwohl er noch wunderbar in der Waage ist.

Es wird quasi doppelt integriert wenn man sagt dass die zu regelnde Größe der Winkel ist (oder...?).
Kommt daraus an, was du machst.
Wenn du wirklich den Winkel als Sollgrösse nimmst, müsstest du die Messwerte des Gyros schon für den P-Anteil integrieren und für den I-Anteil dann das Integrall nochmal integrieren.
Ob du das so machst ist mir noch nicht ganz klar geworden.

Aber auch wenn du das nicht machst, geht das Integral sehr stark in deine Regelung ein.
Wenn der eigentliche Messwert am Gyro die Winkelgeschwindigkeit ist, sagt dir der nur, wie schnell dein Copter kippt.
Wenn dein Copter auf dem Boden liegt, hat er keine Winkelgeschwindigkeit. Der direkte Messwert des Gyros kann also nichts regeln. Dein Integral summiert aber fleissig weiter die Messfehler auf und sagt irgenwann trotzdem, dass der Copter auf dem Kopf steht.

Für den Piloten ist es sicherlich unangenehm, wenn er den Copter wunderbar ruhig hält und die Regelung in aber auf den Kopf drehen möchte ;-)
Mit deiner Addition, bzw. Subtraktion oben, die ja auch 40 mal pro Sekunde durchgeführt wird, stellst du das Integral kontinuierlich Richtung Null zurück.
D.h. der Winkel den das Integral angibt ist eigentlich nach kürzester Zeit immer wieder Null Grad, selbst wenn der Copter auf dem Kopf steht.
Da die Regelung bei Null aber nichts macht, stört das den Piloten nicht sonderlich, weil der den Copter ja manuell in ausgleicht.

D.h. eigentlich stellt dein Integral den Winkel dar. Den stellt es zwar falsch dar, das macht aber nichts, weil die anderen Bestandteile der Regelung und der Pilot den Winkel halten.
Das Integral verlangsamt/verhindert nur sehr schnelle Richtungsänderungen des Copters. Das ist als Pilot aber vermutlich genau die Untzerstützung die man benötigt.

In die Theorie der regelungstechnik passt es dann ja auch wieder rein, denn da soll der I-Anteil ja auch nur die Regelabweichung des P-Anteils reduzioeren und nicht selber den Sollwert halten.



SummeGyro = SummeGyro + Gyro
If SummeGyro > X then SummeGyro = 0
If SummeGyro < -X then SummeGyro = 0
Dieser Code würde bewirken, dass der Copter sich erst wehrt nach vorne gekippt zu werden, dann aber plötzlich die nach vorne gekippte Lage schlagartig akzeptiert und von nun an nach vorne gekippt bleiben will.

Stimmt genau. War auch Sinn meines Tests.
Die Routine hält mein Fahrgestell eine Zeit lang ausrecht. Wenn das dann umkippt oder ich es umkippe, versucht die Routine es in dieser Position zu halten.
Die Lage zu halten ist aber doch glaube ich auch beim Copter gewünscht und das "plötzliche" Kippen eine Frage davon mit welchen Anteil diese Routine - sprich der I-Anteil in die gesamte Regelung und Steuerung durch den Piloten eingeht.
Wenns Ki wie bei dir nur ca. 1% von Kp ist, kann der I-Anteil sich ja nicht sonderlich heftig gegen den P-Anteil und das was der Pilot an der Fernsteuerung sagt wehren.


Das geht mir genauso... Da unterhalten sich ja die richtigen ;-D
Das stimmt auf jedenfall insofern, dass ich deine Sprache verstehe, die Formelsprache der theoretischen Regelungstechniker eher nicht ;-)
Ausserdem hast du das überzeugende Argument, dass dein Copter fliegt, das was du machst also funktioniert.
Dass die Parameter für die meisten Regelungen in der Praxis durch Ausprobieren ermittelt werden, spricht ja nicht unbedingt dafür, dass die ganzen theoretischen Formeln der Regelungstechnik sonderlich hilfreich sind ;-)

Willa
25.09.2009, 18:37
Hallo!

An dieser Stelle hinzugehen und in jedem Durchlauf einen konstanten Wert abzuziehen, bzw. hinzuzufügen, sollte theoretisch eher schädlich sein.
Praktiisch schadet es vermutlich nicht, weil man damit in der Nähe vom Nullpunkt den konstanten Wert in einen Durchlauf dazu addiert, das Integral dann das Vorzeichen wechselt und dadurch schon im nächsten Durchlauf derselbe Wert wieder abgezogen wird.
D.h wenn die Regelung schnell genug ist, kommt die ganze Aktion gar nicht bei den Motoren an und schadet daher nicht.
Bei den Motoren kommen diese kleinen Schwankungen gar nicht an. Denn man addiert/ subtrahiert z.B. den Wert "5". Der Faktor K_i ist bei mir 0.003 und die Motoren bekommen am Ende einen Wert zwischen 0 (aus) und 255 (Vollgas). Die Integralschwankungen sind also so klein, dass die Auflösung der Motoren bei Weitem nicht reicht um eine Drehzahländerung zu bewirken.

Nach deiner Beschreibung weiter oben hast du ihn mit Ki=0.003 ja schon so klein gemacht, dass ich mich aus dem Bauch heraus eh wundere, wie der noch was bewirkt.
Meine Gyros messen Werte zwischen 0 und 1024. Wenn das Ganze mit 500Hz läuft und man den Wert aufintegriert, kannst du dir ausrechnen wie extrem hoch die Integralwerte während einer minimalen Drehung des Copters werden können. Daher der sehr kleine K_i Faktor.

Das stimmt so glaube ich nicht.
Dem Datenblatt nach misst dein Gyro-Sensor die Winkel-Geschwindigkeit (Angular Rate).
Das Integral aus der Winkelgeschwindigkeit müsste demnach der Winkel sein.
Ja, aber wenn du das Integral der Gyroskope direkt auf die Motoren gibst (vereinfacht ausgedrückt), dann steuert das Integral die Winkelgeschwindigkeit. Das ist aber auch sehr Missverständlich mit diesen ganzen Integralen....

Mit deiner Addition, bzw. Subtraktion oben, die ja auch 40 mal pro Sekunde durchgeführt wird, stellst du das Integral kontinuierlich Richtung Null zurück.
D.h. der Winkel den das Integral angibt ist eigentlich nach kürzester Zeit immer wieder Null Grad, selbst wenn der Copter auf dem Kopf steht.
Erstmal kurz um Missverständnisse vorzubeugen: Ich mache das nicht mit der Subtraktion/ Addition. Das habe ich nur kurz mal ausprobiert als mein ACC kaputt war. Man kann dann ca. 10 Sekunden den Knüppel loslassen, danach sollte man den Copter manuell wieder gerade stellen.
Das ist etwas schwer zu erklären warum das trotzdem sehr gut funktioniert... Ich müsste dir mal meinen Copter zeigen und die Messwerte die da raus kommen. Diese Addition/Subtraktion wirkt im Prinzip wie ein Hochpass. Schnelle Änderungen bewirkungen extrem große Änderungen des Gyropegels + Integrals, daher kommen sie (nahezu) unverändert durch und stabilisieren den Copter. Die schnellen Änderungen sind das, was einen Copter instabil fliegen lässt, auf diesen liegt also der Fokus bei der Regelung. Langsame Änderungen (Drift der Gyros, aber auch eine sehr langsame Drehung des Copters) werden durch das +/- herausgefiltert. Die sind aber so langsam, dass ein Mensch die sehr leicht aussteuern kann.

Das stimmt auf jedenfall insofern, dass ich deine Sprache verstehe, die Formelsprache der theoretischen Regelungstechniker eher nicht
Meine Sprache ist aber mangels Fachwissen nicht präzise genug um Missverständnisse vorzubeugen.... Um das zu verhindern müsste ich mich entweder mehr mit der Regelungstechnik auseinandersetzen (da habe ich aber wirklich besseres zu tun...!), oder das ganze an einem Anschauungsobjekt demonstrieren...
Auf jeden Fall eine interessante Diskussion :-D

Ausserdem hast du das überzeugende Argument, dass dein Copter fliegt, das was du machst also funktioniert. Das stimmt wohl, er fliegt ja auch komplett von alleine. Zusammen mit dem ACC erledigt sich das Driftproblem (mit besseren Gyros (MEMS) kann ich aber so oder so praktisch keinen Drift feststellen)

kounst
25.09.2009, 23:27
Hi,

Schnelle Änderungen bewirkungen extrem große Änderungen des Gyropegels + Integrals, daher kommen sie (nahezu) unverändert durch und stabilisieren den Copter.
Das kann ich mir nicht vorstellen. Eigentlich sollte das Integral doch ein langsames Wegdrehen(rollen oder nicken) also die bleibende Regelabweichung kompensieren.
Schnellen Aenderungen sollte eigentlich ein differenzierender Anteil entgegenwirken.

Mein Problem ist das der Kopter stark schwingt und wenn ich die Regelverstaerkung so weit runter drehe das das schwingen weg ist wird die Stuerung zu indirekt.
Meiner Meinung nach sollte der D anteil dafuer sorgen das ich den P Anteil staerker machen kann ohne das der Kopter anfaengt zu schwingen.

Ich werd das ganze jetzt mal ganz ander angehen:
Als erstes nehm ich eine Sprungantwort auf und dann werd ich versuchen mit MatLab die Regelstrecke zu identifieren. Idealisiert vermute ich eine IT2 Strecke. Wenn das klappt sollte ich eigentlich einen wirklich guten Regler bauen koennen.

Willa
25.09.2009, 23:43
Das kann ich mir nicht vorstellen. Eigentlich sollte das Integral doch ein langsames Wegdrehen(rollen oder nicken) also die bleibende Regelabweichung kompensieren.
Damit wir uns nicht missverstehen: Das Integral von dem ich in diesem Moment spreche ist der Wert den man erhält wenn man den Pegel des Sensors über die Zeit integriert.
"Langsames Wegdrehen" ist relativ... Wenn man den Gyropegel direkt und unverändert (nur etwas skaliert) auf den Motor gibt, dann können dadurch extrem schnelle Winkelgeschwindigkeitsabweichungen kompensiert werden. Das Integral ist etwas langsamer, ja, aber es ist immer noch sehr schnell, schneller als ein Mensch steuern kann. Daher ist das Integral in meiner Anwendung bei meinem Copter sehr essentiell.
Ich würde an deiner Stelle eher noch mal versuchen was passiert wenn du die Mittelwertbildung im µC rausnimmst. Nach meiner Erfahrung ist nicht die Regelfrequenz ausschlaggebend für eine gute Regelung, sondern nur die Zeit die vom Erfassen der Ist-Position bis zur Änderung der Motordrehzahl verstreicht. Ein Kollege hat - das habe ich irgendwo schonmal erwähnt - einen sehrsehr kleinen Copter gebaut, der mit nur 50 Hz (!!!) Regelfrequenz perfekt fliegt. Entgegen aller Vorhersagen von Regelungstechnikexperten. Sein Trick: Direkt nach dem Erfassen der Sensorwerte werden die neuen Sollwerte an die Motoren gesendet (per PPM). Höchstwahrscheinlich können die Motoren ihren Schub eh nicht schneller ändern als mit 50 Hz (Beschleunigung + aerodynamische Effekte spielen hier rein). Eines Tages werde ich das noch mal testen. Wir haben an der Hochschule relativ empfindliche Waagen mit einer zeitlichen Auflösung von 9600Hz. Wenn ich nun ein Triggersignal erzeuge, was gleichzeitig die Waage steuert und die Motordrehzahl erhöht, könnte ich diesen Effekt eigentlich messen. Fehlt nur ein bisschen Zeit im Moment.

kounst
26.09.2009, 00:11
Damit wir uns nicht missverstehen: Das Integral von dem ich in diesem Moment spreche ist der Wert den man erhält wenn man den Pegel des Sensors über die Zeit integriert.
ja so hab ichs auch verstanden. offensichtlich funktioniert das bei dir ja - ich hab jetzt jedenfalls vorerst aufgegeben einen Verstärkung für I zu finden die mir mein Regelverhalten verbessert.


Nach meiner Erfahrung ist nicht die Regelfrequenz ausschlaggebend für eine gute Regelung, sondern nur die Zeit die vom Erfassen der Ist-Position bis zur Änderung der Motordrehzahl verstreicht.
Also es ist nicht so das ich mit 500Hz meinen ADC auslese und 16 werte aus den letzten 8ms mittle.
Mein ADC spuckt mir etwa alle 6µs einen neuen wert aus. D.h. der PID regler bekommt durchschnittswerte die aus ADC Werten aus einem Zeitraum von etwa 100µs berechnet wurden.

recycle
26.09.2009, 14:10
Zitat:
Damit wir uns nicht missverstehen: Das Integral von dem ich in diesem Moment spreche ist der Wert den man erhält wenn man den Pegel des Sensors über die Zeit integriert.
ja so hab ichs auch verstanden. offensichtlich funktioniert das bei dir ja - ich hab jetzt jedenfalls vorerst aufgegeben einen Verstärkung für I zu finden die mir mein Regelverhalten verbessert

Ich glaube bei Willa gibt es da einen sehr wesentlichen Unterschied.
Der Gyro selber misst die Winkelgeschwindigkeit und kann niemals eigenständig den Winkel berechnen.
Der Winkel kommt vom ACC und der Gyro den nur sehr kurzfristig halten, bis die Integration so fehlerbehaftet wird, dass der ACC wieder hinzugezogen werden muss.

Du hast keinen ACC musst den Winkel also als Pilot komplett selber halten.
D.h. du bist selber der alleinige P-Anteil deines PID-Reglers.
Wenn du den Masswert des Gyros direkt auswertest, ist das die Winkelgeschwindigkeit, also kein zusätzlicher P-Anteil, sondern der D-Anteil deines PID Reglers.
Die Integration des Messwertes ergibt zwar den Winkel, behält aber alle Eigenschaften einer Integration.
a) Eine Integration ohne bekannten Anfangswert kann niemals den tatsächlichen Winkel ergeben.
b) Durch die Integration werden Messfehler, Digitalisierungsfehler usw. addiert und der Wert den das Integral annimmt läuft immer weiter vom tatsächlichen Winkel weg.

Beides zusammen bedeutet, dass du das Integral immer wieder Richtung Null zurück drücken musst und den Winkel selber halten musst.

Dahjer kann eigentlich nur dass passieren was du beobachtest. Je stärker das Integral in deine Regelung eingeht, desto träger reagiert der Copter auf deine Steuerung als Pilot.
Über den Ki-Faktor lässt sich das glaube ich auch nur sehr schwer dosieren.
Dummerweise ist das Integral ja nur bei kleinen Werten richtig. Dass es gross wird liegt hauptsächlich an den Mess-, und Digitaliesierungsfehlern.

Mit dem Ki-Faktor erreichst du, dass das Integral wenig Wirkung hat solange es den richtigen Winkel wiedergibt und viel wenn es den völlig falschen Winkel wiedergibt. Eigentlich genau das Gegenteil von dem was man braucht.

Versuch mal mit den Werten zu speilen mit denen du das Integral zurück gegen Null drückst.

Sprich wenn du Willas obengenannte Routine nutzt, spiel mit dem X beim addieren der Messwerte:
SummeMesswerte = SummeMesswerte + (Messwert-x)
Oder probiere halt dochmal:
SummeGyro = SummeGyro + Gyro
If SummeGyro > X then SummeGyro = 0
If SummeGyro < -X then SummeGyro = 0
und spiel hier mit den X-Werten.

kounst
27.09.2009, 20:51
Hi,

meine Versuch mit MatLab und einer Sprungantwort die Regelstrecke zu identifizieren war zwar nicht erfolgreich hat mich aber auf den richtigen Weg gebracht. - und gezeigt das willa immer recht hatte.. =D>
Ich hatte immer angenommen das die Rotoren etwa im schwerpunkt den Copter anheben, sicher der Copter also frei drehen kann und deshalb die Strecke integrierend ist.
Aber:
Bei mir zumindest liegt der Schwerpunkt deutlich unter den Propellern. Dadurch ist die Strecke (solange man keine Loopings/Rolle fliegt) eher eine DT2 Strecke.
Weil:
Auf einen Sprung von z.B. Roll(klein genug das der Kopter keine Rolle macht) stellt sich eine schraeglage ein so das ein Gleichgewicht von Rueckstellkraft durch den niedrigen Schwerpunkt und erhoete bzw. verringerte Drehzahl am linken und rechten Rotor ein. Weil die Regelgroesse die Geschwindigkeit ist geht die Sprungantwort also gegen Null. -> D Verhalten und weils schwingungsfaehig ist mindestens 2 fach verzoegernd.

--> man kommt tatsaechlich gut ohne D-Anteil aus ->PI-Regler (Willa hats ja immer gesagt ;-))

LJ-Products.de
07.07.2010, 20:22
Hi Kounst,

könntest du mal beschreiben wie du es nun gelöst hast? oder etwas Code posten?

Bye

kounst
07.07.2010, 22:56
Hi,

tja mit dem PI Regler bin ich auch nicht wirklich weiter gekommen.
Die Sensoren von Murata hab ich zwischenzeitlich durch einen 2achs Sensor von ST ersetzt. Mit denen hatte ich dann probleme mit Resonanzen..

Mich haben also einige Zeit andere Dinge von der Lösung des Regelungsproblems abgelenkt. Außerdem schreib ich grad meine Diplomarbeit..

Ich plane allerdings einen neuen Anlauf zu wagen- diesmal mit sensoren von Invensense (ITG-3200). Die sehen vielversprechend aus!

Du kannst mir gern konkrete Fragen stellen -zu was auch immer dich hier speziel interessiert. Nur das Problem hab ich nicht gelöst. Momentan fliege ich immernoch mit einem reinen P Regler. Geht mit etwas übung erstaunlich gut.

LJ-Products.de
08.07.2010, 05:19
Hi. Zum ersten würde mich interessieren wie du nun das Integral berechnest und was du gegen den Drift machst.

Danke

kounst
08.07.2010, 10:24
Für meinen reinen P Regler hab ich natürlich kein integral. Der Drift scheint bei diesem primitiven Regler auch kein Problem zu sein.

Alles was die Regelung momentan tut ist folgendes:

Messen der Drehgeschwindigkeiten mit den Gyros
Vergleich der Drehgeschwindigkeiten mit dem Sollwert von der Fernsteuerung
neuer Stellwert ist Kp * (Soll - Ist)

Der Drift sorgt nur dafür das die Drehgeschwindigkeit 0 nicht mehr in der Mitte auf dem Knüppel liegt. Der Effekt ist aber so gering das ich das noch nicht beobachten konnte.

LJ-Products.de
08.07.2010, 20:17
Ok das werde ich dann morgen mal probieren. Danach möchte ich gern auch den I-Anteil hinzufügen. Hier wäre es vielleicht gut wenn mir Willa was dazu sagen könnte oder auch gern jemand anderes.

Bye

kounst
08.07.2010, 22:15
vielleicht magst du ja mal den stand deines projekts vorstellen?! Da ich demnächst ein redesign von meinen Kopter mache könnt ich etwas inspiration gebrauchen :-)
Du bekommst hier sicher auch den ein oder anderen Hinweis wenn du dein Projekt beschreibst...

LJ-Products.de
08.07.2010, 23:46
Klar kein Thema:

Zu meinen Quadcopter:
- Rahmen besteht aus 10x10x1mm Alu-Vierkant
- Länger der einzelnen Ausleger ca. 35cm
- 2 Centerplatten (10x10x0,5cm)

-Motoren sind Robbe Roxxy 2527-34 mit 1045 Props
-Als Regler verwende ich 4x BL-CTRL 1.2
-Empfänger ist ein DSL4Top Typ: MK
-Gesamtgewicht ohne Lipo: Ca.850g

-Sensorik sind einmal: LPR530AL 2-Achs Gyro und ADXL335 3-Achs ACC
-Als Controller benutze ich einen Mega644p und geproggt wird in Bascom.

So nun mal grob mein Programmablauf:

Als Interrupt habe ich den DSL4Top dran hängen, um das Summensignal auszulesen. (Ca. alle 10ms)

Meine Hauptschleife besteht aus:
1. ADC Werte von Gyro, ACC und Bat auslesen (Wobei momentan nur die Gyro-Werte verwendet werden.

2. Summensignal auswerten
Hierzu hab ich mal ein paar Fragen.
Da ich ja das Summensignal mit einen Timer auslese, bekomme ich die Dauer der einzelnen Impulse der Kanäle. Für Kanal1(GAS) zind es z.B. Min Wert = 57988; Max Wert = 60622.

Meine Berechnung schaut folgendermaßen aus:

"ACHTUNG BASCOM CODE"

'Berechnung für Channel 1 (Gas)
If Empf(1) > 57987 Then
Empf_tmp(1) = Empf(1) - 58080
Empf_tmp(1) = Empf_tmp(1) / 10
End If

If Empf_tmp(1) > 255 Then
Empf_tmp(1) = 255
End If

Soll_motor_gas = Empf_tmp(1)

If Soll_motor_gas < 0 Then
Soll_motor_gas = 0
End If

"ENDE BASCOM CODE"

Ich bin mir nun nicht sicher, ob ich so das Signal richtig auswerte?!?



3. P-Regler habe ich so:
Stellwert_nicken = Gyro_x - Soll_x_funke * Kp (Wobei bei mir momentan der Kp den Faktor 0.3 hat)

4. Motorsoll Mixer
Hier werden die einzelnen Sollwerte aus Regler und Funke gemixt.

5. Daten an die BL-Ctrl senden

6. Wiederhole 1-6

So das ist nun mein Programm ganz grob beschrieben. Hoffe es ist verständlich.
Leider komme ich aber mit der Regelung (Gyro und ACC Auswertung) nicht hin. Vom fliegen kann ich momentan noch nicht sprechen, eher ein "Rumgehüpfe"

Hoffe ihr könnt mir da weiter helfen.

PS: Den ITG3200 habe ich auch noch bei mir rumliegen im Falle der LPR taugt nix.

Bye

kounst
09.07.2010, 00:18
Bei der Auswertung des Summensignals ist mir nicht klar warum du da so große Zahlen hast. Vor allem müsste max doch etwa doppelt so groß sein wie min?! Schließlich bewegen sich die Signale zwsichen 1 und 2 ms. Oder ist das die Zeit seit dem 1. Kanal?
Vermutlich kann dir da ein blick in Willas Tricopter Sourcen gut weiterhelfen. Der programmiert auch in BASCOM und verwendet auch einen Atmel MC.
http://shrediquette.blogspot.com/

Ich hab bei mir die Auswertung des Summensignals inzwischen durch ne serielle Schnittstelle ersetzt. Die ACT Empfänger (du hast ja auch einen) haben diese DSL Schnittstelle das ist nix anderes. Dafür kann ich dir wenn du magst auch code geben. Ist aber in C.

Den gleichen 2 achs Gyro wie du verwende ich auch. Wie gesagt hab ich probleme mit Schwingungen weil der wohl recht kleine Resonanzfrequnzen verwendet. Das hab ich mit ner ziehmlich rechenintensiven digitalen Filterung einigermaßen in Griff bekommen. Man sieht ihn trotzdem noch zappeln.. deswegen der Plan mit den ITG-3200 Gyro.
Aber vielleicht ist dein Rahmen schwingungsmäßig besser und es klappt bei dir einfach..