Eviter le piège de l’indécision en Logique Floue
Ce premier ensemble de règles est utile lorsque un robot est confronté à un obstacle de forme concave. Avec des règles de base du déplacement et d’évitement d’obstacle il y a de forte chance que le robot se trouve dans l’incapacité de le contourner. Il va effectuer de menu déplacement de gauche à droite sans jamais s’arrêter ou au contraire à rester bloqué indéfiniment.
Ceci est du au fait que les comportements programmés jusqu’à présents sont des fonctions continues définies à partir des entrées fournies par les capteurs.
Si il existe des points dans l’espace de contrôle des moteurs qui sont négatifs le résultat sera de tourner à gauche. Inversement, si il existe des points dans l’espace de contrôle des moteurs qui sont positifs le résultat sera de tourner à droite. Alors il doit exister un point de cette espace ou la valeur sera nulle. Il est alors impossible d’éviter l’indécision symétrique statique. Un autre cas apparaît lorsque le robot fait face à deux obstacles symétriquement de part et d’autre de sa trajectoire, le robot va reculer puis ré avancer indéfiniment, les obstacles apparaissant et disparaissant de ses capteurs.
Dans ce cas les multiples règles vont s’annuler les uns les autres et bloquer le robot. Le problème dès lors peut être vu comme un défaut de mémoire.
De la mémoire pour un robot :
Supposons que l’on gére l’espace situé devant le robot avec un agent de motivation : La frustration. Si le robot est bloqué on va augmenter la valeur de la frustration et si il est débloqué on va rapidement diminuer sa frustration. On va limiter la valeur de la frustration entre 0 et une limite de saturation. On définit une nouvelle variable (direction_aléatoire) qui va osciller entre des valeur positive et négative. Si la frustration atteint le seuil de saturation on rajoute la valeur de direction aléatoire à la commande des moteurs.
Ceci va permettre au robot de changer de trajectoire et de se sortir du piège.
– IF Front_capteur = prés ALORS delta_frust = 1
– IF Front_capteur != prés ALORS delta_frust = -1
Temp_valeur= Frustration + delta_frust ;
– IF Temp_valeur != saturation ET Temp_valeur >0 ALORS Frustration = Temp_valeur
– IF Temp_valeur = saturation OU Temp_valeur <=0 ALORS Frustration = Frustration
Temp_direction = Direction + Direction_Aléatoire
– IF Frustration = Grande ET Front_capteur = prés ALORS Direction=Temp_direction
– IF Frustration != Grande OU Front_capteur != prés ALORS Direction = Direction
Suivre un mur
Supposons que notre robot possède des capteurs de distances sur les cotés. Ceux ci peuvent nous renseigner sur la distance d’un obstacle mais la encore nous pouvons introduire un peu de mémoire pour déterminer si la distance évolue ou reste fixe.
– Delta_droite = Capteur_Droit - Delta_Droite
– Delta_Gauche = Capteur_Gauche - Delta_Gauche
– Delta_droite = Negatif,Constant,Positif
– Delta_Gauche = Negatif,Constant,Positif
– IF Delta_droite = Constant ET Delta_droite = Negative ALORS Direction = Gauche
– IF Delta_droite != Constant OU Delta_droite != Negative ALORS Direction = Centre
– IF Delta_Gauche =Constant ET Delta_Gauche =Negative ALORS Direction =Droite
– IF Delta_Gauche !=Constant OU Delta_Gauche !=Negative ALORS Direction= Centre
Rejoindre un point de coordonnées (x,y)
En ajoutant des capteurs odométrique au robot (comme ceux équipant une souris d’ordinateur), Il est possible de calculer en permanence la position du robot.
Ce qui nous ouvre de nouvelles possibilités : le robot ne va plus errer au hasard dans la pièce, mais on peut lui demander de réaliser des déplacements bien définis dans un but précis. Pour cela nous allons lui rajouter quelques règles, afin de lui permettre par exemple de rejoindre un point de coordonnée préprogrammé :
Le but à atteindre : Goal(X,Y)
La position du robot : Rob (Xb,Yb)
angle du but par rapport au robot : µgoal
Distance = ((Xb-X)²+(Yb-Y)²)1/2
IF (Xb-X)=0 THEN µgoal =90 ELSE IF ((Xb-X)>0 THEN µgoal = arctan((Y-Yb)/(X-Xb) ELSE µgoal = 180 + arctan((Y-Yb)/(X-Xb)
Az-error = µ-µgoal (µ direction actuelle du robot)
Les règles seraient alors :
1. IF distance = neargoal THEN vitesse = stop
2. IF distance != neargoal THEN vitesse = avTT
3. IF Az-error = zero THEN direction = Centre
4. IF Az-error = TresPositif THEN direction = DroiteTT
5. IF Az-error = Positif THEN direction = Droite
6. IF Az-error = TresNégatif THEN direction = GaucheTT
7. IF Az-error = Négatif THEN direction = Gauche