Thymio suit un bord noir
Thymio suit un chemin avec seulement un capteur de fond
Le trajet sur une ligne noire fait partie du répertoire de base de Thymio. A cet effet, les deux capteurs inférieurs sont nécessaires. Cependant, certaines applications1 utilisent un capteur de fond pour la lecture d'informations de côté de la ligne, de sorte que seul un capteur de fond est laissée pour le suivi de la ligne.
La solution élaborée et robuste
Les projets Light Painting et réseau routier utilisent comme piste une ligne, qui a une largeur de 3cm, avec un gradient de «blanc» à «noir» perpendiculaire à la direction d'entraînement. Thymio va maintenant être dirigé de telle sorte que le capteur de fond "voit" toujour un gris moyen. La commande de direction va comme ceci:
- Si la mesure donne la valeur moyenne, alors Thymio est au milieu et doit aller tout droit.
- Si la mesure donne une valeur plus sombre, alors Thymio est trop à droite et doit tourner à gauche.
- Si la mesure donne une valeur plus lumineuse, alors Thymio est trop à gauche et doit tourner à droite.
Cette méthode fonctionne très bien, mais la production (conception et impression) de ces chemins est difficile et fastidieux.
Ça fonctionne également avec une simple ligne noire!
Il serait pratique si le suivi «d'un œil» serait possible avec une simple ligne noire. Le projet Faire de la musique montre qu'il est vraiment possible.
Le capteur de fond ne mesure pas la luminosité d'un point, mais il en moyenne la luminosité dans un champ d'environ 6mm fois 6mm. Si le bord est juste en dessous du capteur, puis une moitié est noire et l'autre moitié blanc: Le capteur mesure un gris moyen. Si le capteur est déplacé vers le «extérieur», la partie noire devient plus petit et le capteur interprète cela comme un toujours plus brillant gris. Si le capteur est déplacé vers le «intérieur», la partie noire devient plus grand et le capteur interprète cela comme un gris toujours plus sombre.
Le graphique ci-dessus montre les valeurs mesurées d'un capteur de fond sur un bord noir: L'axe horizontal indique la position du capteur par rapport au bord. La valeur 0mm signifie que le capteur est exactement sur le bord. A une valeur -5mm le capteur est de 5mm du bord, et à une valeur +5mm, le capteur est de 5mm sur la ligne noire.
Un bord noir et blanc est ainsi interprété par le capteur comme un gradient. Toutefois, la largeur du gradient, en contraste avec le gradient réel ayant une largeur de 30 mm, seulement environ 6 mm.
Un programme VPL pour suivre une ligne avec un capteur de fond
Avec ce VPL program Thymio peut suivre une ligne avec un capteur de fond. Contrairement aux deux programmes suivants la réponse dans les blocs doit être soigneusement défini manuellement.
Un programme Blockley pour suivre une ligne avec un capteur de fond
Avec ce programme Blockly Thymio peut suivre une ligne avec un capteur de fond. Bien que le programme est très court, il fonctionne presque aussi bien que la version texte ci-dessous.
Un algorithme précis et adaptatif pour suivre une ligne avec un capteur de fond
Ainsi, le système de contrôle doit travailler beaucoup plus précis qu'avec un gradient réel. Notre objectif est maintenant d'optimiser l'algorithme de sorte qu'il fonctionne de manière fiable même sur des virages serrés.
Tous les projets mentionnés utilisent l'algorithme suivant (ici légèrement modifié):
onevent prox
p1=prox.ground.delta[1]
devi = p1-525
if abs(devi)<170 then # si la deviation est moins que 170 nous sommes sur la piste
motor.left.target=speed+devi/8
motor.right.target=speed-devi/8
else # nous avons pérdu la piste
motor.left.target=devi/4 # et on tourne à la place
motor.right.target=-devi/4
end
Les valeurs pour la moyenne de 525 et 170 pour le limite du gradient ont (probablement) été adaptée au gradient effectivement utilisé de façon empirique . Afin d'améliorer le processus, ces valeurs doivent être optimisées.
A cet effet, tout d'abord, la constante «525» pour la valeur moyenne est remplacée par la variable mean, et la constante de la déviation maximale «170» est remplacée par la variable vari.
La variable mini est la plus petite et la variable maxi la plus grande valeur jamais enregistrée par le capteur. La valeur vari est calculé comme
$$vari = 0.45 (maxi-mini)$$
et la valeur mean est calculé comme
$$ mean = \frac{maxi + mini}{2}$$.
Les lignes de code correspondant sont insérés dans la lignes suivante:
onevent prox
p1=prox.ground.delta[1]
call math.max(maxi,maxi,p1) #trouve le plus grand p1 --> maxi
call math.min(mini,mini,p1) #trouve le plus petit p1 --> mini
call math.muldiv(vari,45,maxi-mini,100)
mean=(mini+maxi)/2
devi = p1-mean
if abs(devi)<vari then
motor.left.target=speed+devi/8
motor.right.target=speed-devi/8
else
motor.left.target=devi/4
motor.right.target=-devi/4
end
Malheureusement, la valeur devi, qui est utilisé pour contrôler la direction, dépend des divers facteurs externes (tels que la lumiére ambientale, le capteur, le type de surface, etc.). Par conséquent, la variable devi est multipliée par la constante SIGMA2 et normalisée par rapport à la valeur vari:
$$ndev=\frac{SIGMA \cdot devi}{vari}=\frac{SIGMA\cdot (p1 - mean)}{vari}$$
Après le calcul des variables mean et vari a été déplacé vers le sous-programme statistics, on a le code suivant:
onevent prox
p1=prox.ground.delta[1]
callsub statistics
call math.muldiv(ndev,SIGMA,p1-mean,vari)
if abs(ndev)<SIGMA then
motor.left.target=speed+60*ndev/100 # ....=speed+0.6*ndev
motor.right.target=speed-60*ndev/100 # ....=speed-0.6*ndev
else
motor.left.target=1*ndev/2
motor.right.target=-1*ndev/2
end
Le contrôleur proportionnel intégral
La variable pour le contrôle des moteurs est proportionnelle à la déviation de la valeur moyenne. Ce type de régulation est donc appelé p-contrôleur. Le facteur de la proportion ou p-facteur (ici 0,6) doit être déterminée empiriquement: Si Thymio secoue constamment 'à gauche et à droite », alors la valeur est trop grande. Si Thymio 'tombe des courbes », alors la valeur est trop petite.
Il existe une méthode empirique, le test d'oscillation de Ziegler et Nichols pour estimer l'ampleur de la p-facteur d'un p-contrôleur3: Commencez avec un très petit p-facteur, alors incrémenter le p-facteur dans les petites étapes jusqu'à ce que Thymio oscille constamment. La moitié de cette valeur trouvée est un bon point de départ pour d'autres expériences.
Cette version du programme fonctionne très bien. Mais il y a un petit problème: Si le p-facteur est choisi de telle sorte que de Thymio ne vacille pas sur un chemin droit, il ne rattrape pas les virages serrés. Si le p-facteur est fixé de manière à capter les virages serrés, il vacille sur des voies droites.
Remède apporte le soi-disant pi-contrôleur! Un pi-contrôleur utilise une variable de commande supplémentaire ireg, qui est la somme cumulée de toutes les déviations ndev antérieur.
preg=60*ndev/100 #preg=0.6*ndev
ireg=ireg+10*preg/30 #ireg=ireg+0.33*preg
Le soi-disant i-facteur (ici 0.33) a de nouveau été déterminée empiriquement. Ici encore, le test de Ziegler-Nichols donne une estimation: 1/longeur de la période4 de l'oscillation , qui a été acquis au cours de l'essai de oscillation.
Le programme entier
#onevent startup
mini=1023
maxi=0
mean=512
vari=512
ireg=0
speed=100 #or another value
onevent prox
p1=prox.ground.delta[1]
callsub statistics
call math.muldiv(ndev,SIGMA,p1-mean,vari)
if abs(ndev)<SIGMA then
preg=60*ndev/100
ireg=ireg+10*preg/30
motor.left.target=speed+(preg+ireg)
motor.right.target=speed-(preg+ireg)
else
ireg=0
motor.left.target=1*ndev/2
motor.right.target=-1*ndev/2
end
sub statistics
call math.max(maxi,maxi,p1)
call math.min(mini,mini,p1)
if maxi-mini>400 then
call math.muldiv(vari,45,maxi-mini,100)
mean=(mini+maxi)/2
end
Un code complet est ici. Happy coding…