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é)
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
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é.
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.
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.
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.
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.
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)
.
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