QXv2 - Quadrokopter
Aus Wiki
Zeile 33: | Zeile 33: | ||
==Die Software== | ==Die Software== | ||
+ | Aktuell beinhaltet das Projekt QXCtrl (Also der Steuerteil) 61 .c und .h Dateien. Darunter sind Module wie Analoge Eingänge, Kalibrierung der Offsets, Motor-Mixer, Lageschätzer, Lageregler, Motor Interface, Einlesen der PPM Informationen (RC Fernbedienung), serielle Schnittstelle und noch ein paar kleinere Sachen. In dem Code stecken bereits etliche Tage Programmierung, trotzdem ist er noch weit weg von irgendwelcher "für andere zumutbare" Software ;-). Diverse Teile fehlen noch oder können nicht eingestellt werden, sondern sind im Code fest vorgegeben (PPM Kanäle zum Beispiel). Reglerparameter lassen sich aber bereits über den Rechner einstellen. Auf der Steuerplatine ist der Anschluss für ein BTM-222 Funkmodul vorgesehen. Das habe ich so früh wie möglich bestückt, da es die Entwicklungsarbeit wesentlich erleichtert. Das Programmieren geht nun über die serielle Schnittstelle und einen Bootloader. Außerdem wurde eine PC-Anwendung geschrieben (Am Anfang noch Kommandozeile) um diverse Kurven von den Flugdaten aufzeichnen zu können. | ||
+ | |||
+ | Die größte Herausforderung jedoch war (wider erwarten) der Brushless Motor Controller. Es hat ein paar Monate gedauert, bis ich überhaupt einen Brushless Motor im Closed-Loop (d.h. mit BEMF Rückführung) am Laufen hatte. Das Problem lag im Prinzip darin, dass ich mit fester Kommutierung versucht habe, die BEMF Spannung zu oszilloskopieren. Womit ich aber nicht rechnete ist, dass der Motor alle 60° kurz einrastete, bevor die nächste Kommutierung kam. Das ist im Prinzip deswegen, weil man genau dann kommutieren muss, wenn der Rotor 30° vor "dem nächsten Magneten" steht. Macht man das nicht, wird der Rotor irgendwann senkrecht auf dem Magneten stehen und abbremsen. Dadurch wird die BEMF Spannung in der offenen Phase allerdings verzerrt. | ||
+ | Nachdem mich ein Brushless-Profi aus dem Internet darauf hinwies, wusste ich bescheid. Man konnte durch geschicktes Abbremsen des Rotors bei einem kleinen PWM Tastgrad den Motor manchmal aus diesem Betriebs"modus" herauslocken. Dann sah man die BEMF Spannung. Als ich das wusste, ging das Implementieren des Closed-Loops Betriebs wie von Geisterhand. Hier und da die entsprechenden Komparatoren aktiviert bzw. deaktiviert, schon lief der Motor schnurrend vor sich hin und ließ sich beschleunigen oder abbremsen. | ||
+ | Das Ganze musste anschließend auf alle 4 angeschlossenen Motoren erweitert werden. Aber auch das war schnell erledigt. | ||
+ | |||
+ | Die kleinste Herausforderung (wider erwarten ;-)) war der Lageschätzer, wie sich herausgestellt hat. Mein Ziel war es dabei, den Lageschätzer des Mikrokopters (dessen Sourcecode frei verfügbar ist) zu verstehen. Wer den Mikrokopter-Sourcecode kennt, weiß, dass das nicht so einfach ist. Trotzdem hat er mir aber geholfen Sachen zu verstehen (unter anderem die Achsenkopplung). Mein Ziel war es '''nicht''' einen Kalman Filter einzubauen. Der ist mir zu gut.. (Nein, in Wirklichkeit übersteigt er nur meinen Wissensstand, aber das muss ja niemand wissen ;-)). | ||
+ | Der Sinn des Lageschätzers ist relativ einfach: Er schätzt die Lage (wer hätte das nun wieder gedacht). Als Grundlage der Schätzung dienen dabei 2 Achsen des Beschleunigungssensor sowie 2 Gyroskope (Drehgeschwindigkeitssensoren). Da der Quadrokopter ein Fluggerät ist, dass in allen 6 Freiheitsgraden bewegt werden kann ist das nicht ganz so einfach. | ||
+ | Der Beschleunigungssensor soll eigentlich die Gravitation benutzen um die Ausrichtung des Quadrokopters zu messen. Da aber während des Fluges Vibrationen auftauchen und der Quadrokopter auch normaler, gewollter Beschleunigungen unterliegt, geht das nicht so ohne Weiteres. | ||
+ | Die Gyroskope werden aufintegriert, in der Hoffnung, dass das Integral ansatzweise dem Neigungswinkel entspricht. Durch analoges Rauschen und Quantisierungsrauschen ist das Integral aber einer sehr begrenzten Zeit unterlegen, in der es einem theoretischen mathematischen Integral entspricht. Bereits nach wenigen Sekunden ist das Integral (ohne Korrektur) soweit in die Ferne integriert, dass der Quadrokopter denkt er hätte sich schon zwei mal um die eigene Achse gedreht. "Blöderweise" versucht der Regler dies auszugleichen, sodass das Resultat nämlich genau ebendies ist: Er dreht sich um die eigene Achse und stürzt unweigerlich ab. | ||
+ | |||
+ | So, was ist also der Plan? Der Plan ist, beide Sensoren zu benutzen. Und zwar am Besten so, dass der Beschleunigungssensor nur langsame Bewegungen ermitteln muss (dann werden nämlich reguläre Vibrationen einfach weggefiltert). Außerdem sollte das Integral der Gyroskope immer nur für "hohe Frequenzen" also die Dynamik des Flugmodells sorgen. Wenn man sich vorstellt, dass man das Gyroskop hochpassfiltert, gibt es nämlich nicht mehr sowas, wie ein Integral-Drift. | ||
+ | Aber wie macht man das jetzt? Das Mikrokopter-Prinzip ist einfach, aber genial. Wir lasse uns das Gyro Integral einfach korrigieren. | ||
+ | Parallel zur Integration machen wir nun ein paar mal in der Sekunde (zum Beispiel 5 mal) über das Gyro-Integral, sowie über den Beschleunigungssensor einen Mittelwert. | ||
+ | Dann berechnen wir die Differenz dieser beiden Werte. Das ist im Prinzip die Drift des Gyroskop-Integrals, wenn man davon ausgeht, dass das (tiefgepasste) Signal des Beschleunigungssensor der "wahre Neigungswinkel" ist (Das ist er natürlich nicht, aber für eine Näherung reicht es). | ||
+ | Diese errechnete Differenz wird nun mit einem einstellbaren Faktor (der einstellt, wie stark das Gyroskop Integral an den Werten des Beschleunigungssensors "hängt". Je höher also, desto träger. Je schwächer, desto mehr Drift) behandelt und ab sofort bei jeder Integration der Gyroskopwerte '''zusätzlich''' auf das Gyro-Integral aufsummiert. | ||
+ | Somit wird der Drift ausgeglichen und das dynamische Gyro-Signal entspricht nun in guter Näherung dem "echten" Neigungswinkel. | ||
+ | |||
+ | Nachdem das alles eingebaut war, kamen nur noch "bekannte" Sachen. Der verwendete Regler ist für Nick- und Rollbewegung ein einfacher PID Regler. Der D Anteil wird nicht numerisch erzeugt, sondern direkt aus dem Gyroskop-Signal gewonnen. Der I Anteil kann auch auf 0 bleiben, allerdings wird der stationäre Endwert nicht erreicht. Das heißt, dass Der Kopter '''nie''' zu 100% gerade in der Luft steht, wenn der Knüppel in Ruhelage ist. Auf der anderen Seite macht der I Anteil das System etwas träger, was nicht immer erwünscht ist. Der Motor-Mixer hat noch mal etwas Grips gekostet. Da die Regler für die Nick- und Rollneigung ja nur eben Stellwerte für Nick und Roll ausgeben, man aber 4 Motoren hat, muss man diese Werte |
Version vom 20:45, 5. Sep. 2010
Features |
Inhaltsverzeichnis |
Einleitung
Ein Quadrokopter ist ein Fluggerät, dessen Flugrichtung und Geschwindigkeit lediglich über 4 (von der Drehzahl oder Neigung) steuerbare Motoren definiert wird. Der Reiz der Quadrokopter liegt darin, dass man ihn ohne mechanisch aufwendige Teile und damit in einem kleinem Maßstab aufbauen kann. In der Regel werden Quadrokopter im "Modellbauformat" gebaut. Die Spannweite der Rotoren beträgt dabei meistens etwa 30cm bis 60cm.
In letzter Zeit sind vermehrt immer mehr Quadrokopter Projekte aufgetaucht. Der Mikrokopter ist dabei gewissermaßen der Vorreiter gewesen. Er benutzt einen 8 Bit AVR Mikrocontroller zum Regeln der Lage und 4 weitere dieser Controller auf den 4 Motorsteller-Modulen. Siehe [1]
Ein anderes Beispiel für einen Quadrokopter ist der ARM-O-Kopter. Wie der Name schon sagt, wird dort für die Steuereinheit ein 32-Bit ARM Prozessor benutzt, der eine weitaus höhere Performance bietet. Hier lassen sich kompliziertere Schätz- und Regelalgorithmen anwenden. Zum Beispiel der Extended Kalman Filter. Siehe [2]
Aus kommerzieller Sicht ist der Quadrokopter sehr zum Aufnehmen von Luftbildern geeignet, da er (bei großer Rotorspanne) sehr stabil in der Luft liegt und wenig Vibrationen erzeugt. Es sind in letzter Zeit immer mehr kleine Unternehmen aufgetaucht, die sich auf derartige Luftbilder spezialisiert haben. Auch im militärischen Bereich hat sich das Konzept bereits herumgesprochen.
Wie auch immer, seitdem ich das erste Video eines fliegenden, per RC-Fernbedienung gesteuerten Quadrokopters gesehen habe, wollte ich unbedingt mal einen nachbauen. Es gibt Quadrokopter Bausätze, die unter anderem auf der Mikrokopter-Homepage zu erwerben sind. Allerdings bleibt da der ganze Programmierspaß auf der Strecke. Außerdem findet man doch immer noch Sachen, die man verbessern oder verkleinern kann. So gingen eins oder zwei Jahr(e) ins Land, bevor ich mich dazu entschloss das Projekt anzugehen. Bereits an den Mikrokopter-Bausatz Preisen, die um die 1000€ liegen, konnte ich schon abschätzen, dass es wenigstens gleichteuer, wenn nicht sogar teurer werden wird. Allerdings ging die Entwicklung bis zu dem jetzigen Zeitpunkt über fast ein ganzes Jahr, sodass sich die monatliche Belastung noch in Grenzen hielt.
Die Anfänge
Wir schreiben den Anfang des Jahres 2009. Ich fing an die Elektronik zu planen. Dabei wollte ich unbedingt die Motorsteuerung der Brushless Motoren nicht auf 4 einzelne Mikrocontroller verteilen, sondern in einem unterbringen. Das klingt nach einem haarigen Unterfangen. Für die Ansteuerung von Brushless Motoren benötigt man immerhin eine Menge Ein- und Ausgänge, die unter anderem für die Nulldurchgangserkennung der BEMF-Spannung (Komparator) und das Ansteuern der MOSFETs (PWM) benutzt werden. Trotzdem, ich habe mal ernsthaft mit mir geredet und ich ließ mich nicht davon abbringen ;-). Nach ein paar Monaten und (gefühlte) hunderte Stunden vor dem Eagle-CAD stand dann die erste Version. Sie bestand aus einem (derzeit brandneuen) ATxmega128A1 von Atmel, der dabei alle 4 Brushless Motoren steuerte und zudem noch die Lage des Quadrokopters geschätzt hat und die Reglerwerte für die Position berechnet hat. Die diversen analogen Eingänge wurden über einen 16fach A/D Wandler von Maxim-IC realisiert.
Schon bald darauf, fing ich aber an eine neue Version zu bauen, da ich nicht ganz zufrieden war mit der bisherigen. Sie war mir immer noch zu groß und außerdem nun fast schon "zu einheitlich". Also zwei einzelne Platinen hätten es doch sein dürfen ;-). Die Linearregler, die die Batteriespannung der LiFePo Akkus auf 3,3V für den Prozessor und dessen Peripherie regelten, wurden außerdem sehr warm, was mich später dazu bewegt hat hier einen Schaltregler einzusetzen. Die neue Version habe ich QXv2 genannt. Wie schon gesagt, besteht sie nun aus zwei Einzelplatinen. Der Steuerteil (obere Platine) ist hier mit einem ATxmega32A4 realisiert, der gewissermaßen der "kleine Bruder" des ATxmega128A1 ist. Auf dem darunterliegenden Motor-Controller ist nach wie vor ein ATxmega128A1 verbaut, der weiterhin für die Bespaßung aller 4 Brushless Motoren sorgt. Die PWM-Stellwerte werden über einen I2C Bus übertragen.
Eine neuere Version gibt es noch nicht.
Jetzt wirds handwerklich
Der Rahmen, auf dem die erste Version lief, war ein bewährtes Alu-Kreuz, auf dem 4 5€ - Brushless Motore montiert waren, deren Lager in regelmäßigen Abständen von ein paar Wochen ständig anfingen zu rappeln. Das Alu Kreuz hat in seinem Leben nicht viel Luft geschnuppert. Ein Video davon kann man [3] sehen. Der Bau des Rahmens ging auch schnell von der Bühne, da ich hauptsächlich auf das Testen der Elektronik aus war. Der Achsabstand betrug 45cm, wenn ich mich nicht irre.
Der zweite Rahmen hingegen sollte zusammen mit der QXv2 kleiner, stabiler, schöner und leichter werden. Er ist aus 2mm Pappelsperrholz hergestellt. Zwei 2mm Platten wurden dabei deckungsgleich übereinandergelegt und in X-Form ausgesägt bzw. geschliffen. Der neue Rahmen wurde mit AHM Motoren bestückt und hatte eine Spannweite von ca. 25cm. Die Motorträger waren aus 4mm Sperrholz realisiert. Am Ende wurde schließlich alles auf Spanten geleimt. In die mittlere Öffnung passt dabei ein 1100mAh LiFePo Akku. Eine Bilderreihe zum Aufbau lässt sich oben rechts unter "Bilder" einsehen.
Die Software
Aktuell beinhaltet das Projekt QXCtrl (Also der Steuerteil) 61 .c und .h Dateien. Darunter sind Module wie Analoge Eingänge, Kalibrierung der Offsets, Motor-Mixer, Lageschätzer, Lageregler, Motor Interface, Einlesen der PPM Informationen (RC Fernbedienung), serielle Schnittstelle und noch ein paar kleinere Sachen. In dem Code stecken bereits etliche Tage Programmierung, trotzdem ist er noch weit weg von irgendwelcher "für andere zumutbare" Software ;-). Diverse Teile fehlen noch oder können nicht eingestellt werden, sondern sind im Code fest vorgegeben (PPM Kanäle zum Beispiel). Reglerparameter lassen sich aber bereits über den Rechner einstellen. Auf der Steuerplatine ist der Anschluss für ein BTM-222 Funkmodul vorgesehen. Das habe ich so früh wie möglich bestückt, da es die Entwicklungsarbeit wesentlich erleichtert. Das Programmieren geht nun über die serielle Schnittstelle und einen Bootloader. Außerdem wurde eine PC-Anwendung geschrieben (Am Anfang noch Kommandozeile) um diverse Kurven von den Flugdaten aufzeichnen zu können.
Die größte Herausforderung jedoch war (wider erwarten) der Brushless Motor Controller. Es hat ein paar Monate gedauert, bis ich überhaupt einen Brushless Motor im Closed-Loop (d.h. mit BEMF Rückführung) am Laufen hatte. Das Problem lag im Prinzip darin, dass ich mit fester Kommutierung versucht habe, die BEMF Spannung zu oszilloskopieren. Womit ich aber nicht rechnete ist, dass der Motor alle 60° kurz einrastete, bevor die nächste Kommutierung kam. Das ist im Prinzip deswegen, weil man genau dann kommutieren muss, wenn der Rotor 30° vor "dem nächsten Magneten" steht. Macht man das nicht, wird der Rotor irgendwann senkrecht auf dem Magneten stehen und abbremsen. Dadurch wird die BEMF Spannung in der offenen Phase allerdings verzerrt. Nachdem mich ein Brushless-Profi aus dem Internet darauf hinwies, wusste ich bescheid. Man konnte durch geschicktes Abbremsen des Rotors bei einem kleinen PWM Tastgrad den Motor manchmal aus diesem Betriebs"modus" herauslocken. Dann sah man die BEMF Spannung. Als ich das wusste, ging das Implementieren des Closed-Loops Betriebs wie von Geisterhand. Hier und da die entsprechenden Komparatoren aktiviert bzw. deaktiviert, schon lief der Motor schnurrend vor sich hin und ließ sich beschleunigen oder abbremsen. Das Ganze musste anschließend auf alle 4 angeschlossenen Motoren erweitert werden. Aber auch das war schnell erledigt.
Die kleinste Herausforderung (wider erwarten ;-)) war der Lageschätzer, wie sich herausgestellt hat. Mein Ziel war es dabei, den Lageschätzer des Mikrokopters (dessen Sourcecode frei verfügbar ist) zu verstehen. Wer den Mikrokopter-Sourcecode kennt, weiß, dass das nicht so einfach ist. Trotzdem hat er mir aber geholfen Sachen zu verstehen (unter anderem die Achsenkopplung). Mein Ziel war es nicht einen Kalman Filter einzubauen. Der ist mir zu gut.. (Nein, in Wirklichkeit übersteigt er nur meinen Wissensstand, aber das muss ja niemand wissen ;-)). Der Sinn des Lageschätzers ist relativ einfach: Er schätzt die Lage (wer hätte das nun wieder gedacht). Als Grundlage der Schätzung dienen dabei 2 Achsen des Beschleunigungssensor sowie 2 Gyroskope (Drehgeschwindigkeitssensoren). Da der Quadrokopter ein Fluggerät ist, dass in allen 6 Freiheitsgraden bewegt werden kann ist das nicht ganz so einfach. Der Beschleunigungssensor soll eigentlich die Gravitation benutzen um die Ausrichtung des Quadrokopters zu messen. Da aber während des Fluges Vibrationen auftauchen und der Quadrokopter auch normaler, gewollter Beschleunigungen unterliegt, geht das nicht so ohne Weiteres. Die Gyroskope werden aufintegriert, in der Hoffnung, dass das Integral ansatzweise dem Neigungswinkel entspricht. Durch analoges Rauschen und Quantisierungsrauschen ist das Integral aber einer sehr begrenzten Zeit unterlegen, in der es einem theoretischen mathematischen Integral entspricht. Bereits nach wenigen Sekunden ist das Integral (ohne Korrektur) soweit in die Ferne integriert, dass der Quadrokopter denkt er hätte sich schon zwei mal um die eigene Achse gedreht. "Blöderweise" versucht der Regler dies auszugleichen, sodass das Resultat nämlich genau ebendies ist: Er dreht sich um die eigene Achse und stürzt unweigerlich ab.
So, was ist also der Plan? Der Plan ist, beide Sensoren zu benutzen. Und zwar am Besten so, dass der Beschleunigungssensor nur langsame Bewegungen ermitteln muss (dann werden nämlich reguläre Vibrationen einfach weggefiltert). Außerdem sollte das Integral der Gyroskope immer nur für "hohe Frequenzen" also die Dynamik des Flugmodells sorgen. Wenn man sich vorstellt, dass man das Gyroskop hochpassfiltert, gibt es nämlich nicht mehr sowas, wie ein Integral-Drift. Aber wie macht man das jetzt? Das Mikrokopter-Prinzip ist einfach, aber genial. Wir lasse uns das Gyro Integral einfach korrigieren. Parallel zur Integration machen wir nun ein paar mal in der Sekunde (zum Beispiel 5 mal) über das Gyro-Integral, sowie über den Beschleunigungssensor einen Mittelwert. Dann berechnen wir die Differenz dieser beiden Werte. Das ist im Prinzip die Drift des Gyroskop-Integrals, wenn man davon ausgeht, dass das (tiefgepasste) Signal des Beschleunigungssensor der "wahre Neigungswinkel" ist (Das ist er natürlich nicht, aber für eine Näherung reicht es). Diese errechnete Differenz wird nun mit einem einstellbaren Faktor (der einstellt, wie stark das Gyroskop Integral an den Werten des Beschleunigungssensors "hängt". Je höher also, desto träger. Je schwächer, desto mehr Drift) behandelt und ab sofort bei jeder Integration der Gyroskopwerte zusätzlich auf das Gyro-Integral aufsummiert. Somit wird der Drift ausgeglichen und das dynamische Gyro-Signal entspricht nun in guter Näherung dem "echten" Neigungswinkel.
Nachdem das alles eingebaut war, kamen nur noch "bekannte" Sachen. Der verwendete Regler ist für Nick- und Rollbewegung ein einfacher PID Regler. Der D Anteil wird nicht numerisch erzeugt, sondern direkt aus dem Gyroskop-Signal gewonnen. Der I Anteil kann auch auf 0 bleiben, allerdings wird der stationäre Endwert nicht erreicht. Das heißt, dass Der Kopter nie zu 100% gerade in der Luft steht, wenn der Knüppel in Ruhelage ist. Auf der anderen Seite macht der I Anteil das System etwas träger, was nicht immer erwünscht ist. Der Motor-Mixer hat noch mal etwas Grips gekostet. Da die Regler für die Nick- und Rollneigung ja nur eben Stellwerte für Nick und Roll ausgeben, man aber 4 Motoren hat, muss man diese Werte