Comment puis-je utiliser la bibliothèque Arduino PID pour conduire un robot en ligne droite?

19

Je voudrais créer un robot basé sur Arduino avec 2 roues, des encodeurs en quadrature sur chaque roue, une puce de pilote de pont en H (ou contrôleur de moteur) et une roulette. Je souhaite utiliser la bibliothèque PID pour m'assurer que la vitesse est proportionnelle à la distance à parcourir.

Au niveau conceptuel, (en supposant que les moteurs ne répondent pas de manière identique aux niveaux PWM), comment puis-je implémenter le contrôle PID pour qu'il se déplace en ligne droite et à une vitesse proportionnelle à la distance restant à parcourir?

Robert
la source
Cette question a également sa place ici, car elle est spécifiquement basée sur la bibliothèque Arduino PID .
Anindo Ghosh

Réponses:

18

Détails

En regardant l' exemple de base PID, je pense que vous avez juste besoin d'instancier deux copies du contrôleur PID, une pour chaque roue, encodeur et pwm:

PID leftPID(&InputLeft, &OutputLeft, &SetpointLeft,2,5,1, DIRECT);
PID rightPID(&InputRight, &OutputRight, &SetpointRight,2,5,1, DIRECT);

Ensuite, dans votre loop()équivalent, il vous suffit de lire les deux encodeurs, de passer chaque valeur d'encodeur à la valeur appropriée PIDet d'écrire finalement les deux valeurs PWM.

Pour l'instant SetpointLeftet SetpointRightpeut en fait pointer vers la même valeur, mais les définir séparément comme ceci vous permet d'ajouter la capacité de tourner plus tard.

Concepts

Bien que cela puisse fonctionner pour le cas de base, sa suffisance dépend vraiment de la précision dont vous avez besoin pour que votre ligne droite soit.

Dead Reckoning

Étant donné que vous avez des encodeurs sur chaque roue, si vous exécutez deux boucles PID et comparez l' erreur suivante de chaque roue , vous pouvez potentiellement calculer votre erreur d'abbé maximale sur la distance, en supposant que vos roues ne glissent pas. Si cette erreur est inférieure à vos besoins, il vous suffit de compter à plat .

Cependant, si vos roues ont tendance à glisser, vous pouvez avoir caché l'erreur suivante que votre système de contrôle ne peut pas détecter et vous aurez besoin d'un moyen pour détecter un glissement ou calculer la position indépendamment de vos encodeurs de roue, puis utiliser un logiciel de niveau supérieur pour corriger exigé les positions / vitesses des roues pour maintenir une ligne droite.

Détermination de la position relative

Comme le suggère John , vous pouvez peut-être utiliser un accéléromètre pour déterminer la position, mais étant donné leur précision et l'effet des erreurs accumulées au fil du temps, il est préférable d'utiliser les données de l'accéléromètre pour détecter et corriger le patinage des roues.

En robotique mobile, les techniques de filtrage de Kalman sont couramment utilisées pour fusionner les données de plusieurs sources, comme un accéléromètre et les encodeurs de roue pour mieux déterminer la position actuelle.

Quoi que vous fassiez avec la détermination de la position relative cependant, au fil du temps la position que vous vous croyez être en va dériver loin de votre position physique réelle.

Détermination de position absolue

La seule façon de contourner cela est d'avoir un point de référence en dehors du cadre de référence de votre véhicule.

Un roomba, par exemple, utilise généralement un calcul à l'estime pour se déplacer dans une pièce, mais chaque fois qu'il doit s'arrimer, il recherche un faisceau de lumière infrarouge envoyé par le quai de chargement. Lorsque le roomba se déplace de manière aléatoire à travers ce faisceau, il le détecte, se verrouille sur le faisceau et le suit jusqu'à sa source. En combinaison avec ses capteurs de choc, il peut se positionner avec précision sur les contacts de charge.

Pour votre robot, il peut avoir une position d'origine, où il peut revenir et détecter qu'il se trouve à cet endroit connu. À ce stade, il sait exactement où il se trouve et peut indiquer à quelle distance se trouve sa position calculée par rapport à sa position réelle.

Une autre option, si vous avez besoin que votre robot voyage en ligne droite sur des centaines de mètres, serait de passer à une technique différente, comme l'ajout d'un bouclier GPS Arduino .

Une combinaison de techniques

En fin de compte, selon vos exigences de précision, vous devrez peut-être utiliser une combinaison de ces techniques.

Si un faisceau de guidage est possible, vous pourrez peut-être faire ce que vous voulez très simplement avec une technique de suivi de ligne invisible . Si vous devez vous déplacer dans une ligne droite arbitraire dans une zone contrainte, alors comme le roomba, vous pourrez peut-être utiliser une paire de faisceaux de guidage (à angle droit l'un par rapport à l'autre) pour vous permettre de corriger votre position synthétisée dans un axe cartésien chaque fois que le robot passe l'un des faisceaux.

Il y a beaucoup d'options ici, et ce que vous choisirez dépendra de ce dont vous avez besoin.

Mark Booth
la source
1

Si vous n'utilisez pas un seul essieu pour conduire les deux roues, les seules solutions que je peux voir sont d'ajouter un accéléromètre à 3 axes ou un autre capteur pour détecter l'orientation du robot et ajuster les signaux à chaque moteur en conséquence.


la source
0

Comme indiqué ci-dessus, vous commencez par dire à chaque roue de se déplacer à la même vitesse, puis le PID s'assure qu'elles tournent à cette vitesse. Mais ce ne sera PAS parfait. Vous devez continuer à vérifier et à corriger les erreurs (1), lisez et comparez périodiquement les nombres de codeurs à deux roues et accélérez légèrement une roue si nécessaire pour obtenir les nombres égaux. et (2) les encodeurs ne sont JAMAIS parfaits, vous avez besoin d'un accéléromètre et d'une boussole.

Vous regardez un filtre de Kalman. si vous souhaitez combiner des données d'encodeur, de boussole et d'accéléromètre pour vous donner le cap.

user3150208
la source
0

Ce lien donne un bon exemple sans deux calculs PID. Vous pouvez également implémenter imu / boussole pour mesurer le chemin droit

acs
la source