[JAVA] [Der weltweit größte Schüler Robocon] Über das FRC-Programm ~ Über die PID-Regelung ~

Dieser Artikel ist Teil des Artikels hier. Schauen Sie sich das bitte zuerst an.

FIRST Zunaechst.

Es geht um PID-Regelung.

彡 (゚) (゚) "Ich kenne die PID-Regelung bereits! Ich möchte nicht"

Für diejenigen, die sagen: [Behandlung der PID-Regelung in WPILib](Behandlung der PID-Regelung in #WPILib). Es unterscheidet sich sehr vom normalen Schreiben eines Programms, also ...

Ich denke, es ist schwer zu verstehen, dass die PID-Regelung für Sie neu ist. Bitte nehmen Sie, was Sie sagen, und lesen Sie es, indem Sie denken, dass es so ist.

Selbst wenn Sie den detaillierten Mechanismus nicht kennen, denke ich, dass Sie den Code anwenden können, und wenn Sie ihn berühren, werden Sie verstehen (angemessen)

Was ist PID-Regelung?

Ich denke, es gibt N Artikel, also überlasse ich es dir () Folgendes fand ich leicht zu verstehen.

Wenn Sie jedoch den Verstand einer feinen Integration nicht verstehen, ist es sowieso schwierig, so leicht. Die Differenzierung ist eine Operation, um den Grad der Wertsteigerung (Gradient in der Grafik) zu ermitteln. Integral ist die Summe der Differenzen vom Zielwert in der PID-Regelung (der Bereich zwischen dem Zielwert und dem gemessenen Wert in der Grafik).

Das ist ziemlich prägnant Was ist PID-Regelung?

Dies kann in der zweiten Hälfte schwierig sein Motor-PID-Regelungsmethode

Dies kann schwierig sein, ohne Mathematik und Begriffe zu kennen Ich werde die PID-Regelung auf leicht verständliche Weise erklären

Handhabung der PID-Regelung in WPILib

Nachdem Sie die PID-Regelung verstanden haben, ist dies eine programmatische Geschichte.

Vorher möchte ich die Begriffe aussortieren. Wenn Sie es mit einer Klimaanlage vergleichen

Temperatursensor, Eingangsteil Der Ausgangsteil, in den die Luft gesendet wird

Kp, ki, kd usw. gewinnen

Wird genannt.

Basic

In WPILib wird die PID-Regelung von einer Klasse namens "PIDController" ausgeführt.

Legen Sie einen Zielwert wie "pidController.setPoint (Sollwert)" fest und verschieben Sie ihn.

Was Sie also brauchen, sind die Verstärkungs-, Eingangs- und Ausgangsteile. Dies wird im Konstruktor festgelegt.

new PIDController(kp, ki, kd, SourceModule, OutputModule)

Das "InputModule" muss der Eingabeteil sein, der die Schnittstelle "PIDSource" erbt, und das "OutputModule" muss der Ausgabeteil sein, der den "PIDOutput" erbt. Ich muss noch etwas tun, aber ich werde es später vorstellen.

Ablauf der PID-Regelung

Die PID-Regelung in WPILib wird in 0,05 Sekunden pro Schleife ausgeführt, indem ein anderer Thread eingerichtet wird. (Diese Schleife ist übrigens alle 0,20 Sekunden)

Jede Schleife empfängt den aktuellen Wert vom Eingabeteil, berechnet darauf basierend und gibt ihn an den Ausgabeteil aus.

Über den Eingabeteil

Verwenden Sie die Funktion "double pidGet ()" von "PIDSource", um den aktuellen Wert vom Eingabeteil zu erhalten. Natürlich ist PIDSource eine Schnittstelle, daher müssen Sie diese Funktion überschreiben. Wenn es sich um einen Encoder handelt, verwenden Sie eine Funktion, die den Abstand zurückgibt. Wenn es sich um einen Kreisel handelt, verwenden Sie eine Funktion, die den Winkel zurückgibt, und geben Sie ihn als "double" -Typ zurück.

Alternativ müssen Sie "void setPIDSourceType (PIDSourceType pidSource)" oder "PIDSourceType getPIDSourceType ()" überschreiben. PIDSourceType ist jedoch

PIDSourceType.java


public enum PIDSourceType {
  kDisplacement,
  kRate
}

Um ehrlich zu sein, hat es keinen Sinn, also lassen Sie es uns angemessen überschreiben.

Über den Ausgabeteil

Verwenden Sie bei der Ausgabe im Ausgabeteil die Funktion "void pidWrite (double output)" von "PID Output". Natürlich ist PIDOutput eine Schnittstelle, daher müssen Sie diese Funktion überschreiben. Ersetzen Sie den Motor durch das Argument "Ausgabe".

** Die Zuordnung muss innerhalb dieser Funktion geschlossen werden ** Wenn Sie versehentlich in diesem Thread zuweisen, sinkt das PID-Regelsystem bei Zuweisung alle 0,20 Sekunden erheblich.

Verwendung von PIDController

Ich werde es verwenden, wenn es möglich wird, eine Instanz zuzuweisen und zu verwenden.

Stellen Sie den Zielwert (Sollwert) mit pidController.setSetpoint (doppelter Sollwert) ein Wenn Sie es mit pidController.enable () aktivieren, funktioniert es.

Übrigens, wenn der Sollwert einfach den Wert des Eingabeteils mit "pidGet ()" übergibt, wird er durch ** absolute Koordinaten ** ersetzt, basierend auf dem initialisierten Zustand des Eingabeteils.

Am Beispiel des Fahrwerksmotors Wenn der Encoder am Startpunkt initialisiert wird, wird der Zielwert als Entfernung basierend auf dem Startpunkt behandelt, unabhängig davon, wie viel er sich bewegt.

Wenn Sie den Encoder initialisieren, gehen Sie 1 m vorwärts und dann 2 m nach unten Wenn Sie "pidController.setSetpoint (-2.0)" eingeben, wird es 3 m von dort fallen.

Damit es richtig funktioniert Ersetzen Sie "pidController.setSetpoint (-1.0)" oder genauer "pidController.setSetpoint (1.0 --2.0)".

Ergänzung

Wenn Sie den Roboter gerade fahren möchten, benötigen Sie zwei PID-Regler für das Fahrwerk. Es ist notwendig, die für das Vorwärtsbewegen und die für das Nicht-Seitwärtsschieben zu trennen.

LAST Schließlich.

Ich denke, es war ziemlich schwer zu verstehen, weil ich nicht gut erklären konnte. Es tut mir Leid. Ich war müde, als ich schrieb (Entschuldigung) Auch wenn Sie es nicht verstehen, ist es ziemlich gut. Dann.

Vorheriger Artikel ⇒ Hauptbeziehungen Nächster Artikel ⇒ Laufwerksbezogen

Recommended Posts

[Der weltweit größte Schüler Robocon] Über das FRC-Programm ~ Über die PID-Regelung ~
[Der weltweit größte Schüler der Mittel- und Oberstufe, Robocon] Über das FRC-Programm ~ Über Begriffe usw. ~
[Der weltweit größte Schüler der Mittel- und Oberstufe, Robocon] Über das FRC-Programm ~ Grabber related ~
[Der weltweit größte Schüler der Mittel- und Oberstufe, Robocon] Über das FRC-Programm ~ Lift related ~
[Der weltweit größte Schüler der Mittel- und Oberstufe, Robocon] Über das Programm bei FRC ~ Main related ~
Über das weltgrößte Robocon FRC-Programm für Schüler ~ Climb related ~