[JAVA] [Le plus grand élève du secondaire Robocon au monde] À propos du programme FRC ~ À propos du contrôle PID ~

Cet article fait partie de l'article ici. Tout d'abord, jetez un œil à ceci.

FIRST En premier.

Il s'agit de contrôle PID.

彡 (゚) (゚) "Je connais déjà le contrôle PID! Je ne veux pas"

Pour ceux qui disent, [Gestion du contrôle PID dans WPILib](Gestion du contrôle PID dans #WPILib). C'est très différent d'écrire un programme normalement, donc ...

Je pense qu'il est difficile de comprendre que le contrôle PID est nouveau pour vous. Veuillez prendre ce que vous dites et le lire en pensant que c'est comme ça.

Même si vous ne connaissez pas le mécanisme détaillé, vous pouvez écrire le code, et si vous le touchez, vous le comprendrez (approprié)

Qu'est-ce que le contrôle PID?

Je pense qu'il y a N articles, donc je vous laisse () Voici ce que je pensais être facile à comprendre.

Cependant, si vous ne comprenez pas l'esprit de l'intégration fine, c'est difficile de toute façon, si légèrement. La différenciation est une opération pour trouver le degré d'augmentation de la valeur (gradient dans le graphique). Intégrale est la somme des différences par rapport à la valeur cible dans le contrôle PID (la zone entre la valeur cible et la valeur mesurée dans le graphique).

C'est assez concis Qu'est-ce que le contrôle PID?

Cela peut être difficile en seconde période Méthode de contrôle PID du moteur

Cela peut être difficile sans connaître les mathématiques et les termes Je vais expliquer le contrôle PID de la manière la plus simple à comprendre

Gestion du contrôle PID dans WPILib

Maintenant que vous comprenez le contrôle PID, c'est une histoire programmatique.

Avant cela, j'aimerais clarifier les termes. Si vous le comparez à un climatiseur

Capteur de température, pièce d'entrée La partie de sortie où l'air est envoyé

Kp, ki, kd, etc., gain

Est appelé.

De base

Dans WPILib, le contrôle PID est effectué par une classe appelée PIDController.

Définissez une valeur cible telle que «pidController.setPoint (setpoint)» et déplacez-la.

Vous avez donc besoin des parties gain, entrée et sortie. Ceci est défini dans le constructeur.

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

ʻInputModule doit être la partie d'entrée qui hérite de l'interface PIDSource, et ʻOutputModule doit être la partie de sortie qui hérite de PIDOutput. Il y a encore une chose que je dois faire, mais je la présenterai plus tard.

Flux de traitement de contrôle PID

Le contrôle PID dans WPILib est exécuté en 0,05 seconde par boucle en configurant un autre thread. (Au fait, cette boucle est toutes les 0,20 secondes)

À chaque boucle, il reçoit la valeur actuelle de la partie d'entrée, calcule en fonction de celle-ci et la sort vers la partie de sortie.

À propos de la partie d'entrée

Pour recevoir la valeur actuelle de la partie d'entrée, utilisez la fonction double pidGet () de PIDSource. Bien sûr, PIDSource est une interface, vous devez donc remplacer cette fonction. S'il s'agit d'un encodeur, utilisez une fonction qui renvoie la distance, et s'il s'agit d'un gyroscope, utilisez une fonction qui renvoie l'angle et renvoyez-la sous la forme d'un type «double».

Vous devez également remplacer void setPIDSourceType (PIDSourceType pidSource) ou PIDSourceType getPIDSourceType (). Cependant, PIDSourceType est

PIDSourceType.java


public enum PIDSourceType {
  kDisplacement,
  kRate
}

Pour être honnête, cela ne sert à rien, alors remplaçons-le de manière appropriée.

À propos de la partie de sortie

Lors de la sortie dans la partie sortie, utilisez la fonction void pidWrite (double sortie) de Sortie PID. Bien sûr, PIDOutput est une interface, vous devez donc remplacer cette fonction. Remplacez l'argument «sortie» par le moteur.

** L'affectation doit être clôturée dans cette fonction ** Si vous attribuez par inadvertance dans ce fil, le système de contrôle PID diminuera considérablement avec l'affectation toutes les 0,20 secondes.

Comment utiliser PIDController

Je vais l'utiliser lorsqu'il sera possible d'attribuer une instance et de l'utiliser.

Réglez (réglez) la valeur cible (Setpoint) avec pidController.setSetpoint (double setpoint) Si vous l'activez avec pidController.enable (), cela fonctionnera.

Au fait, si Setpoint passe simplement la valeur de la partie d'entrée avec pidGet (), elle sera remplacée par des ** coordonnées absolues ** basées sur l'état initialisé de la partie d'entrée.

Considérant le moteur du train de roulement comme exemple Si l'encodeur est initialisé au point de départ, la valeur cible sera traitée comme la distance basée sur le point de départ, quel que soit son déplacement.

Si vous initialisez l'encodeur, avancez de 1 m, puis souhaitez descendre de 2 m à partir de là Si vous entrez pidController.setSetpoint (-2.0), il perdra 3m à partir de là.

Pour le faire fonctionner correctement Remplacez pidController.setSetpoint (-1.0), ou plus spécifiquement pidController.setSetpoint (1.0 --2.0).

Supplément

Si vous souhaitez faire fonctionner le robot en ligne droite, vous avez besoin de deux commandes PID pour le train de roulement. Il est nécessaire de séparer celui pour avancer et celui pour ne pas se déplacer latéralement.

LAST Finalement.

Je pense que c'était assez difficile à comprendre parce que je n'étais pas doué pour expliquer. Je suis désolé. J'avais sommeil quand j'écrivais (excuse) Même si vous ne le comprenez pas, c'est plutôt bien. Puis.

Article précédent ⇒ Relations principales Article suivant ⇒ Drive related

Recommended Posts

[Le plus grand élève du secondaire Robocon au monde] À propos du programme FRC ~ À propos du contrôle PID ~
[Robocon, le plus grand élève du secondaire au monde] À propos du programme FRC ~ À propos des conditions, etc. ~
[Robocon, le plus grand élève du secondaire au monde] À propos du programme FRC ~ Grabber related ~
[Robocon, le plus grand élève du secondaire au monde] À propos du programme FRC ~ Relatif aux ascenseurs ~
[Robocon, le plus grand élève du secondaire du premier et du deuxième cycle du monde]
À propos du plus grand programme de FRC Robocon pour étudiants du secondaire au monde ~ Climb related ~