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?
Réponses:
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:
Ensuite, dans votre
loop()
équivalent, il vous suffit de lire les deux encodeurs, de passer chaque valeur d'encodeur à la valeur appropriéePID
et d'écrire finalement les deux valeurs PWM.Pour l'instant
SetpointLeft
etSetpointRight
peut 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.
la source
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
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.
la source
Ce lien donne un bon exemple sans deux calculs PID. Vous pouvez également implémenter imu / boussole pour mesurer le chemin droit
la source