In Fortsetzung der hier gestellten Frage: Quadcopter-Instabilität mit einfachem Start im autonomen Modus ... Ich möchte einige Fragen zur Implementierung einer Basis-PID für einen Quadrotor stellen, der von einem APM 2.6-Modul gesteuert wird. (Ich benutze einen Rahmen von 3DRobotics)
Ich habe das gesamte Steuerungssystem auf nur zwei PID-Blöcke reduziert, einen zur Steuerung des Rollens und einen zur Steuerung der Tonhöhe (Gieren und alles andere ... darüber würde ich später nachdenken).
Ich teste dieses Setup auf einem Rig, das aus einem frei drehenden Balken besteht, wobei ich zwei Arme des Quadrotors festgebunden habe. Die anderen beiden können sich frei bewegen. Ich teste also tatsächlich jeweils einen Freiheitsgrad (Rollen oder Nicken).
Überprüfen Sie das Bild unten: hier markiert A, B den frei drehenden Strahl, auf dem das Setup montiert ist.
Durch vorsichtiges Einstellen der P- und D-Parameter habe ich es geschafft, einen dauerhaften Flug von etwa 30 Sekunden zu erreichen.
Aber mit "aufrechterhalten" meine ich einfach einen Test, bei dem die Drohne nicht zur Seite fällt. Felsstabiler Flug ist immer noch nirgends in Sicht und mehr als 30 Sekunden Flug sieht auch ziemlich schwierig aus. Es wackelt von Anfang an. Wenn es 20 - 25 Sekunden erreicht, beginnt es, sich zur Seite zu neigen. Innerhalb von 30 Sekunden ist es um einen nicht akzeptablen Abstand zur Seite gekippt. Ich finde es bald verkehrt herum
Was den PID-Code selbst angeht, so berechne ich den Proportionalfehler aus einem 'komplementären Filter' von Gyro + Beschleunigungsmesserdaten. Der Integralterm wird auf Null gesetzt. Der P-Term beträgt ungefähr 0,39 und der D-Term liegt bei 0,0012. (Ich verwende die Arduino PID-Bibliothek nicht absichtlich. Ich möchte nur eine meiner eigenen PIDs hier implementieren lassen.)
Überprüfen Sie dieses Video, wenn Sie sehen möchten, wie es funktioniert.
http://www.youtube.com/watch?v=LpsNBL8ydBA&feature=youtu.be [Ja, das Setup ist ziemlich alt! Genau. :)]
Bitte lassen Sie mich wissen, was ich möglicherweise tun kann, um die Stabilität in dieser Phase zu verbessern.
@ Ian: Von den vielen Tests, die ich mit meinem Setup durchgeführt habe, habe ich Diagramme für einige der Tests mit dem Messwert vom seriellen Monitor erstellt. Hier ist eine Beispielablesung von Roll vs 'Motor1 & Motor2 - PWM-Eingang' (die zwei Motoren, die die Roll steuern):
Wie für die Eingabe / Ausgabe:
Eingabe: Roll- und Nickwerte (in Grad), wie durch eine Kombination von Beschleunigungsmesser + Kreisel ermittelt
Ausgabe: PWM-Werte für die Motoren, die mit der motor.write () -Funktion der Servobibliothek ausgegeben werden
Auflösung
Ich habe das Problem gelöst. Hier ist wie:
Der Kern des Problems lag in der Art und Weise, wie ich das Arduino-Programm implementiert habe. Ich habe die Funktion write () verwendet, um die Servowinkel zu aktualisieren, die zufällig nur ganzzahlige Schritte im Argument akzeptieren (oder irgendwie nur auf ganzzahlige Eingaben reagieren, 100 und 100.2 ergeben dasselbe Ergebnis). Ich habe es in "writeMicroseconds ()" geändert, was den Copter erheblich stabiler gemacht hat.
Ich habe die Drehzahl eines Motors addiert, während der andere auf einem konstanten Wert gehalten wurde. Ich habe dies geändert, um die Drehzahl in einem Motor zu erhöhen und gleichzeitig den Gegenmotor zu verringern. Auf diese Weise bleibt der horizontale Gesamtschub unverändert, was mir helfen könnte, wenn ich versuche, das Ding in vertikaler Höhe in den Griff zu bekommen.
Ich habe die Drehzahl auf das Maximum angehoben, weshalb der Quadcopter bei Vollgas die Kontrolle verlor. Es gab keinen Raum für eine Erhöhung der Drehzahl, wenn eine Neigung festgestellt wurde.
Ich stellte fest, dass einer der Motoren von Natur aus schwächer war als der andere, ich weiß nicht warum. Ich habe einen Offset in den PWM-Eingang des Motors hartcodiert.
Danke für all die Unterstützung.
Quellcode:
Wenn Sie interessiert sind, ist hier der Quellcode meiner Bare-Bones-PID-Implementierung: PID-Quellcode
Bitte zögern Sie nicht, es in Ihrer Hardware zu testen. Beiträge zum Projekt sind willkommen.
quelle
Antworten:
quelle
Ich beginne mit der Lektüre dieser Frage: Was sind gute Strategien zum Optimieren von PID-Schleifen?
Wenn ich raten müsste, würde ich sagen, dass Sie ein Problem in der Art und Weise haben, wie Ihr kostenloser Filter aufgebaut ist. Wenn die Quadcopter-Motoren ausgeschaltet sind, sollten Sie den Rahmen vor und zurück kippen und prüfen, ob die angegebenen Roll- / Nickwerte tatsächlich korrekt sind.
Für mich scheint es eine Verzögerung zwischen der Eingabe vom Beschleunigungsmesser und der Ausgabe Ihres Filters zu geben - die Oszillation könnte durch späte Reaktionen auf die Eingabedaten erklärt werden. Das eventuelle Wenden sieht aus wie ein möglicher Integrationsfehler, der sich im Laufe der Zeit ansammelt - mit anderen Worten, während Ihr Quadcopter auf der Seite ist, denkt er tatsächlich, dass er gerade schwebt.
(Update) In Bezug auf Ihre Grafik bedeutet die Tatsache, dass Ihre Motordrehzahlen weiter ansteigen (anstatt ausgeglichen zu bleiben), dass Sie irgendwo einen Fehler haben. Vielleicht wächst Ihr Integralbegriff unbegrenzt, und Sie sollten ein angemessenes Maximum dafür angeben.
quelle
Nun, hier könnte eine Reihe von Dingen vor sich gehen ...
1) Sind Ihre Winkelangaben korrekt? laut? Sie können dies leicht überprüfen, indem Sie Ihr Quad manuell kippen und die herauskommenden Werte überwachen.
2) Ihre eigene PID-Implementierung hat einen Fehler. Sie können die vertrauenswürdige Implementierung verwenden, um Ihren Code zu überprüfen.
3) Requisiten, Motoren falsch herum montiert.
4) ...
quelle