Outils d'utilisateurs

Outils du Site


informatique:asservissement

Ceci est une ancienne révision du document !


Asservissement

“C'est l'asserv” qu'ils disaient. Et si tu ne sais pas ils sont, c'est que ca fait assez longtemps que tu es à UTCoupe !

Plus sérieusement l'asservissement c'est ce qui permet au robot de se déplacer comme on le souhaite. Un exemple est beaucoup plus parlant qu'un long discours alors on commence par la :
Prenons un robot avec deux roues, et deux moteurs. Alimentons les deux moteurs à fond, le robot roule-t-il droit ? Eh bien non, car un des moteurs est un peu moins puissant, ou frotte un peu. Un controle de ce type s'apelle un controle en boucle ouverte : on envoit une commande aux moteurs, et sachant comment ils vont réagir, on peut prévoir ou le robot va aller, l'inverse marche aussi. Toutefois avec l'exemple que j'ai donné plus haut, on comprend que controler un robot de cette manière est inenvisageable dans notre cas : il faut l'asservir.

Un point important à noter est que l'asservissement est bête, on lui donne point auquel le robot doit aller, et il s'y rend le plus vite possible, il ne s'occupe pas d'éviter les obstacles ou autres. C'est à l'IA de décomposer la trajectoire du robot en points qui seront un à un données au robot.

Théorie

Asservir un système c'est le forcer à faire ce que l'on veut faire, dans notre cas, le forcer à aller à l'endroit voulu. Pour cela on utilise un asservissement par PID (Produit Intégrale Dérivée). Dans la suite, on prend l'exemple d'un robot ne pouvant se déplacer que sur une droite (un seul moteur). Voilà le concept :
1. On mesure l'erreur E entre le but et l'etat actuel - la distance dans notre exemple.
2. On calcule l'intégrale E_I et la dérivée E_D de l'erreur.
3. On calcule la commande de sortie C à l'aide des coefficients PID : C = P*E + I*E_I + D*E_D.
4. On applique la commande à la sortie. Dans notre exemple cela peut être une commande de tension ou de vitesse.
5. On répète le processus

C'est un système au final assez simple, qui se configure à l'aide de 3 paramètres positifs P, I et D. Toute la puissance de ce modèle rédisde dans le fait que la commande de sortie peut être à peu près n'importe quoi. Que je commande mon moteur en tension, en vitesse, en accélération ou autre, le modèle sera utilisable, seuls les coefficients PID seront changés.

Pratique

Un asservissement simple

Premièrement en pratique, la boucle d'asservissement est exécutée à une fréquence constante, cela évite d'avoir à mesurer le temps pour calculer les intégrales et les dérivées. De plus cela donne plus de constance au système. On parle par exemple d'asservissement à 200Hz. 200 n'est pas qu'un exemple, c'est une fréquence qui semble correcte pour nous. Bien entendu, plus la fréquence est élevée, mieux c'est (il y aura moins d'erreurs sur intégrales et dérivées, et le système sera plus réactif).

En C, un asservissement peut avoir la tête suivante :

double asserv(double e){
	static double last_e = 0, integral_e = 0;
	double derivative_e = e - last_e;
	integral_e += e;
	last_e = e;
	return P*e + I*integral_e + D*derivative_e;
}

De plus, en pratique, si le temps d'établissement est grand, il se peut que l'intégrale devienne très grande et par conséquent que cela ait un effet négatif sur le système, on apelle cela l'effet de “windup” de l'intégrale. Il existe plusieurs méthodes pour corriger ce problème : ajouter une borne supérieure et inférieure à l'intégrale, ou ne calculer l'intégrale que sur un temps donné (par exemple sur les 5 dernières secondes).

Les coefficients

Le réglage des coefficients d'asserv est assez ardu, il existe de nombreuses méthodes sur internet, qu'elle soient génériques, ou utilisées par les autres équipes de la coupe. Tout ce que je peux dire pour l'instant c'est l'influence des paramètres sur le comportement du système.

Double asservissement

Notre robot peut se déplacer dans un plan, et non sur une droite come dans l'exemple, il va donc falloir asservir indépendamment les deux roues. Ici il y a deux possibilités :
1. Asservir les deux roues indépendamment
2. Asservir en angle/distance
Nous utilisons la deuxieme solution qui consiste a effectuer un asservissement sur la distance et un sur l'angle. Ayant Cd la consigne résultant de l'asservissement en distance et Ca celle de l'asservissement en angle, on peut controler les moteurs comme suit :
Consigne moteur droit Cdroit = Cd + Ca
Consigne moteur gauche Cgauche = Cd - Ca

Cela donne un trajectoire curviligne, ce qui n'est pas toujours ce que l'on veut. En effet si l'erreur en angle est grande, le robot va partir en avant tout en tournant et risque de rentrer dans un mur si cette trajectoire n'était pas prévue. Pour éviter ce genre de comportement, au delà d'une certaine erreur en angle, on l'asservit tout d'abord uniquement en angle puis en angle et distance. Cela permet de faire tourner le robot sur lui même pour s'aligner avec l'objectif avant de se lancer en avant.
Autre point important : en l'etat actuel, l'asservissement ne peut pas reculer. Pour faire reculer le robot il faut lui donner directement des consignes au moteurs. Si l'asserv recoit un point “derriere” le robot, un fera demi-tour avant de s'élancer.

informatique/asservissement.1387132513.txt.gz · Dernière modification: 2013/12/15 19:35 par qchateau