Approche de l'utilisation du PID pour faire avancer un robot différentiel en ligne droite


13

Considérez un robot à entraînement différentiel qui a deux roues motorisées avec un encodeur attaché à chacune pour la rétroaction. Supposons qu'il existe une fonction pour chaque moteur à courant continu qui prend un flotteur de -1 à 1 et définit les signaux PWM pour fournir une quantité proportionnelle de puissance à ce moteur. Malheureusement, tous les moteurs ne sont pas créés égaux, donc envoyer à chaque moteur le même signal PWM fait virer le robot à gauche ou à droite. J'essaie de réfléchir à la façon de conduire le robot directement en utilisant les encodeurs attachés à chaque moteur comme entrée d'une boucle PID.

Voici comment je le ferais: je prendrais la différence entre les encodeurs gauche et droit, limiterais l'erreur entre certaines plages, la normaliserais de [-1, 1], puis la mapperais aux puissances du moteur 0 à 1. Donc, si I et D étaient nuls et que nous obtenons une erreur de 1 (donc le moteur gauche a tourné beaucoup plus que le moteur droit), le moteur gauche serait réglé sur 0 et le moteur droit réglé sur 1 (provoquant une la gauche).

Y a-t-il des problèmes avec cela? Quelle est la meilleure approche?

Réponses:


5

Y a-t-il des problèmes avec cela?

Le principal problème est que, bien que la solution que vous proposez corrige instantanément un décalage entre les performances des moteurs, elle ne corrige pas les erreurs accumulées, encore moins les erreurs de position plus complexes telles que l' erreur Abbe (voir plus loin).

Quelle est la meilleure approche?

Il y a plusieurs choses que vous pouvez faire, selon votre tolérance aux erreurs et les efforts que vous souhaitez consacrer à leur correction.

La première étape serait de mettre en place une paire de boucles PID, une pour chaque roue, leur donnant à la fois la même position de demande. Comme je l'ai suggéré dans ma réponse à une question similaire , si vous maintenez les deux roues dans une erreur très serrée à la limite de l'endroit où vous leur demandez d'être, alors il faudra un certain temps pour accumuler suffisamment d'erreur pour provoquer un virage notable.

Il sera également beaucoup plus facile de régler deux boucles PID de niveau moteur indépendantes que de régler un seul système combiné complexe et interdépendant. Pour résister à tout changement du contrôle de niveau supérieur, vous avez vraiment besoin que chaque moteur se comporte aussi similaire que possible à l'autre moteur aussi longtemps que possible, et cela nécessite vraiment des boucles d'asservissement distinctes.

Il existe cependant un certain nombre de complications supplémentaires, et cela dépend de la précision dont vous avez besoin et de l'effort que vous êtes prêt à faire pour les corriger quant à la solution que vous recherchez. Il se peut que Dead Reckoning soit suffisant, ou vous devrez peut-être ajouter une détermination de position relative ou absolue à votre robot.

Un problème est que même si vos roues gauche et droite déplacent toutes les deux 1000 encodeurs, vous pouvez toujours vous retrouver dans une position différente sur deux pistes différentes.

Par exemple, supposons que vous ayez une erreur de suivi maximale de 10 comptes de codeur et que vos moteurs fonctionnent à une vitesse de 10 comptes de codeur par itération de boucle PID. Votre moteur gauche peut bouger de 5,10,10,10 ... 10,5 tandis que votre moteur droit peut avoir un profil de 4,11,10,10 ... 10,5 et même cette légère différence d'accélération au démarrage du mouvement pourrait amener le robot à s'éloigner légèrement dans la mauvaise direction. Non seulement cela, mais plus vous vous déplacez dans cette direction, plus l'erreur augmentera en termes absolus. C'est de cela que nous parlons lorsque nous parlons de l' erreur d'Abbe , et sans modèle cinématique complexe ou une sorte de référence externe, vous ne pourrez jamais le corriger.

Pour plus d'informations, voir ma réponse à une question similaire mais pas tout à fait en double: Comment puis-je utiliser la bibliothèque Arduino PID pour conduire un robot en ligne droite? et ma réponse à l' optimisation Line Follower également liée


2

J'ai un bot avec 2 roues entraînées indépendamment.

J'ai choisi d'utiliser un gyroscope pour le maintenir dans la direction souhaitée, le glissement des bosses et même le ramasser et le tourner sont peu importants car cela corrigera simplement son cap.

J'utilise un seul PID, qui ajoute / soustrait une correction à la vitesse actuelle souhaitée pour chacun des 2 moteurs en fonction de l'erreur dans le cap actuel (direction) telle que déterminée par le gyroscope.

Par exemple, j'ai réglé la vitesse à 50% et le cap à 20 degrés. cela entraînerait normalement les deux moteurs à une puissance de 50%. mais au fur et à mesure que le cap s'éloigne, le PID effectuera des ajustements en ajoutant de la puissance à un moteur et en supprimant un peu de l'autre, de sorte que vous pourriez vous retrouver avec une répartition de puissance de 45% / 55% entre les moteurs pendant que le pid corrige le cap.

Les gyroscopes ont leurs problèmes, même avec un peu de temps passé à calibrer, je trouve toujours que mon gryo a une dérive d'environ 1 degré par minute. Cela peut être dû au fait que la terre tourne de 15 degrés par heure, cela devrait également être envisagé à long terme.

Comme indiqué précédemment, les encodeurs sur roues sont une excellente idée pour savoir jusqu'où vous avez voyagé.


J'aimerais voir votre code pour ça. Je commence le même chemin avec un gyroscope / accéléromètre / magnétomètre mais je suis encore au tout début de simplement essayer de donner un sens aux lectures de ces capteurs.
Ron Smith

Voici un lien vers mon code, je crains qu'il ne soit pas facile à comprendre. github.com/rlsutton1/piBot/blob/master/src/main/java/au/com/…
Robert Sutton
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.