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.