Je travaille sur la construction d'un robot suiveur de ligne et je souhaite optimiser ses performances. Il a été suggéré d'utiliser un algorithme PID. J'ai beaucoup lu sur le PID, mais je suis un peu confus concernant les points suivants:
J'ai calculé la valeur d'erreur en utilisant Mais en ce qui concerne le changement de la vitesse du moteur, je ne sais pas quoi utiliser lors de la comparaison de la différence (c'est-à-dire position actuelle - point de consigne) ou de la valeur d'erreur. C'est-à-dire dois-je utiliser
if (difference > 0)
{ //code for changing appropriate motor's speed using error_value }
ou
if (error_value > 0)
{ //code for changing appropriate motor's speed using error_value }
Existe-t-il également une plage spécifiée pour les valeurs des constantes , et ? J'utilise un robot à roues différentielles pour mon suiveur de ligne.
Je serais également heureux si quelqu'un me suggérait un autre algorithme d'optimisation avancé pour améliorer le robot suiveur de ligne.
la source
Réponses:
Lorsque vous utilisez une boucle PID pour diriger à l'aide de la ligne suivante, votre point de consigne sera toujours le même. Vous voudrez toujours que la ligne soit dans la même position par rapport au robot, par exemple au centre de votre capteur.
Donc, si votre capteur de ligne génère une valeur de -1 à 1, 0 étant le centre du capteur, vous souhaiterez que votre point de consigne soit nul (et que la lecture et la différence du capteur soient les mêmes). Si votre capteur de ligne génère une valeur de 0 à 10, vous souhaiterez que votre point de consigne soit 5 (et que votre capteur relise et que la différence soit différente).
Puisque vous dirigez en réglant les roues pour qu'elles tournent à des vitesses différentes, puis pour suivre en douceur une ligne à une vitesse constante, vous voudrez probablement ajuster les vitesses des deux roues en fonction de l'erreur. Par exemple, si vous devez tourner à gauche pour rester sur la ligne, vous ralentirez la roue gauche et accélérerez la roue droite. Plus vous devez tourner, plus vous devrez ralentir la roue intérieure et plus vous devrez accélérer la roue extérieure.
Considérez la situation dans laquelle vous devez vous tournerθ radians vers la gauche pour corriger l'erreur e et votre vitesse actuelle est S0 :
Votre roue gauche doit donc voyager àSL= r θ et votre roue droite doit voyager à SR= ( r + b ) θ .
Pour maintenir la même vitesse globaleS0 , vous avez besoin S0= ( r + b / 2 ) θ , donc la roue gauche devra se déplacer à SL=S0- ( b / 2 ) θ
tandis que la roue droite devra se déplacer à SR=S0+ ( b / 2 ) θ .
Comme votre erreur tend vers zéro, les vitesses de chaque moteur auront également tendance à se rapprocher. À mesure que l'erreur augmente, les écarts de vitesse augmentent également.
Vous pouvez même avoir besoin que votre roue intérieure tourne vers l'arrière si votre capteur vous indique que la ligne se courbe plus étroitement que la distance entre vos roues. Ce sont des complications que vous pouvez résoudre étape par étape à mesure que votre contrôle devient plus sophistiqué.
De plus, puisque votre erreur aura à la fois des valeurs positives et négatives (pour représenter le continuum hors de l'échelle à gauche ... trop à gauche ... sur la ligne ... trop à droite ... hors de l'échelle à droite, alors vous devriez vous n'avez jamais besoin de demander si
if
l'erreur est positive ou négative, vous devez simplement calculer de nouvelles valeurs en fonction de la valeur d'erreur, car une valeur positive et une valeur négative doivent avoir des effets opposés et symétriques sur les moteurs.Notez que pour le suivi de ligne, vous pourrez peut-être vous en tirer avec le terme de gain proportionnel (c'est-à-dire en laissant les autres termes à zéro). La mise en œuvre d'un terme dérivé peut bien vous permettre d'augmenter le terme de gain proportionnel pour obtenir un système plus réactif, mais un terme intégral est peu susceptible de vous aider. Le fait que si votre robot va dans la mauvaise direction, l'erreur augmentera signifie que les mouvements physiques de votre robot agiront de toute façon comme un terme intégral.
Les valeurs spécifiques de P, D et I seront déterminées par la réactivité de votre système. Pour des conseils généraux sur le réglage des paramètres PID, voir ma réponse et d'autres sur Quelles sont les bonnes stratégies pour régler les boucles PID?
la source
Vous voudrez peut-être consulter cette question sur la façon de régler les PID .
On dirait que vous confondez le rôle de
error
dans ce calcul. L'équation PID prend la mesure d'erreur (position réelle - position souhaitée) et détermine la quantité de "réponse" à commander dans le contrôleur (par exemple la force).Donc, au lieu de dire
if (error_value > 0) { }
, vous devriez dire quelque chose commeresponse = get_PID_calculation(error_value)
. Selon la construction de votre véhicule spécifique, cette réponse serait envoyée au moteur d'entraînement en tant que quantité de gaz, la direction comme angle souhaité ou une autre entrée de commande.la source