Optimisation du suiveur de ligne


9

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 utiliserkpproportjeonunel+...

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.kpkjek

Je serais également heureux si quelqu'un me suggérait un autre algorithme d'optimisation avancé pour améliorer le robot suiveur de ligne.


Je ne sais pas quelle terminologie vous utilisez, mais dans la terminologie des systèmes de contrôle, votre "différence" est la valeur d'erreur et (pour autant que je sache) votre "valeur_erreur" est la commande de contrôle.
TimWescott

Bonjour, La variable , par exemple, est votre gain proportionnel. Connaissez-vous la théorie du contrôle? Kp
leCrazyEngineer

@leCrazyEngineer Je ne me souviens pas de la majeure partie de cette question car c'était comme il y a 3 ans. Je n'ai aucune idée de la théorie du contrôle non plus. Peut-être que les gars qui ont répondu auraient une idée.
météores

Réponses:


8

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:

Direction différentielle

Votre roue gauche doit donc voyager à SL=rθ et votre roue droite doit voyager à SR=(r+b)θ.

Pour maintenir la même vitesse globale S0, 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 ifl'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?


selon vous "vous devez simplement calculer de nouvelles valeurs basées sur la valeur d'erreur, car une valeur positive et une valeur négative devraient avoir des effets opposés et symétriques sur les moteurs." mais comment puis-je déterminer quel moteur doit obtenir l'effet de l'erreur?
météores

@AnkitShah Ils le font tous les deux. J'espère que ma mise à jour l'expliquera un peu mieux.
Mark Booth

Merci @Mark Booth qui a vraiment expliqué les choses. Je n'ai pas assez de représentants. sur le site pour voter positivement mais c'était vraiment bien expliqué.
météores

Heureux d'avoir pu aider @AnkitShah - Si vous modifiez votre question pour lever une partie de l'ambiguïté (par exemple, si vous utilisez une direction différentielle ou ackermann), vous obtiendrez un vote positif d'au moins moi et peut-être d'autres aussi. Il ne faut pas longtemps pour obtenir 15 répétitions si vous écoutez les suggestions des gens.
Mark Booth

Merci @Mark existe-t-il d'autres algorithmes qui aident à réduire l'erreur et permettent au bot de se déplacer plus facilement et de suivre la ligne?
météores

3

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 errordans 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 comme response = 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.


Ceci est le lien vers mon code arduino que proposez-vous. www1.datafilehost.com/d/5dcbdd4e
météores du

Cela dépend, qu'est-ce que le robot fait mal?
Ian
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.