• Aucun résultat trouvé

Alg2 pseudo-code [ 124 ]

les algorithmes de robotique

Algorithm 4 Alg2 pseudo-code [ 124 ]

Sensors : Une méthode de localisation parfaite. Un capteur de détection d’obstacles

Input : Position de départ (qstart), Position du but (qgoal) Initialisation: Point q0

L ← qstart; int i ← 1 ; double distMinT oGoal ← deuclidian (qstart, qgoal)

(1) A partir de qi

L avancer vers le but en suivant la ligne (qstart,qgoal) en mettant à jour distMinT oGoal si deuclidian (x, qgoal) < distMinT oGoal, jusqu’à ce que l’une de ces conditions soient satisfaites :

qgoal atteint, Stop.

Un obstacle est rencontré, i ← i + 1, qi

H ← x, aller à l’étape (2). (2) Contourner l’obstacle à gauche, vérifier si deuclidian (x, qgoal) <

distM inT oGoal, si oui alors distMinT oGoal ← deuclidian (x, qgoal) jusqu’à ce que :

(A) qHi rencontré de nouveau, retourner échec

(B) un nouveau point y est trouvé tel que deuclidian (y, qgoal) < distM inT oGoal et le but est atteignable à partir de y, qi

L ← y, retourner à l’étape (1).

(C) qHj ou qj

L rencontré tel que (j < i), retourner à qi

H et à partir de qi H

contourner l’obstacle à gauche. Cette règle ne peut pas être répétée avant qu’un nouveau qi

L soit défini.

Algorithm 5: DistBug pseudo-code [125]

Sensors : Une méthode de localisation parfaite. Un capteur de détection d’obstacles

Input : Position de départ (qstart), Position du but (qgoal) Initialisation: Point q0

L ← qstart; int i ← 1 ; double distMinT oGoal ← deuclidian (qstart, qgoal) ; double Step ← userData

(1) A partir de qi

L avancer vers le but en mettant à jour distMinT oGoal si deuclidian (x, qgoal) < distMinT oGoal, jusqu’à ce que l’une de ces conditions soient satisfaites :

qgoal atteint, Stop.

Un obstacle est rencontré, i ← i + 1, qi

H ← x, aller à l’étape (2). (2) Contourner l’obstacle à gauche, vérifier si deuclidian (x, qgoal) < distM inT oGoal,

si oui alors distMinT oGoal ← deuclidian (x, qgoal) jusqu’à ce que : (A) qHi rencontré de nouveau, retourner échec

(B) deuclidian (x, qgoal) - F <= 0, c-à-d que le but est visible à partir de x, qLi ← x, retourner à l’étape (1).

(C) deuclidian (x, qgoal) - F <= distMinT oGoal- Step alors qi L ← x, retourner à l’étape (1).

3.1.6 TangentBug

L’algorithme Tangent Bug [126] (voir algorithme6) requiert l’utilisation de cap-teurs de distance. À partir de n’importe quelle position, le robot doit récupérer sa distance par rapport à l’obstacle le plus proche le long d’un rayon r émanant du centre du robot à un angle θ [] tel que :

distance= ϕ(x, θ) = min α∈[O,∞)d(x, x + α cos θ sin θ ) (V.1) tel que x + α cos θ sin θ ∈ ∪iBoundary(Oi) (V.2)

Cette distance permet au robot de calculer les points discontinuités autour d’un obstacle. Les points de discontinuité sont des points situés sur l’obstacle détectés par les rayons des capteurs du robot et dont la valeur de la distance indique u’un intervalle de valeurs est fini et qu’un autre intervalle a commencé.

Pour chaque point de discontinuité, l’algorithme calcule la distance heuristique qui est égale à la distance du robot vers un point de discontinuité et de ce point de discontinuité vers le but :

dheuristic = d(x, Pi) + d(Pi, qgoal) ; où x est la position courante du robot comme défini plus haut et Pi est un point de discontinuité.

À chaque itération, le robot cherche le point ayant la distance heuristique minimale parmi tous les points de discontinuité et se dirige vers ce point.

À partir de ce point, le robot commence à effectuer le contournement d’obstacle en gardant la même direction que celle qu’il a suivi pour aller à ce point. Il calcule maintenant les deux distances dreach et df ollowed et s’arrête lorsque dreach < df ollowed

pour se diriger vers son but de nouveau.

3.2 Identification des abstractions de la famille Bug

Les algorithmes Bug sont très similaires fondamentalement mais diffèrent dans certains points. Il existe deux comportements principaux dans les algos de Bug : éviter les obstacles (obstacle avoidance) et se diriger vers le but (motion to goal).

1. Le comportement Motion-to-Goal. Le robot s’oriente vers son but et avance en suivant la direction qui le mène vers celui-ci. Selon les algorithmes,

V.3 Application sur la famille d’algorithmes Bug

Algorithm 6: TangentBug pseudo-code [126]

Sensors : Une méthode de localisation parfaite. Un capteur de détection d’obstacles

Input : Position de départ (qstart), Position du but (qgoal) Initialisation: Point q0

L ← qstart; int i ← 1 ; double distMinT oGoal ← deuclidian (qstart, qgoal)

(1) A partir de qi

L avancer vers le but, jusqu’à ce que l’une de ces conditions soient satisfaites :

qgoal atteint, Stop.

Un obstacle est rencontré, i ← i + 1, qi

H ← x, aller à l’étape (2). (2) Calculer points de discontinuités autour de l’obstacle rencontré. Parmi les points de discontinuité, chercher le point ayant la distance heuristique minimale et la direction vers ce dernier.

Le robot se déplace jusqu’à ce point jusqu’à ce que la distance heuristique ne diminue plus.

Contourner l’obstacle dans la même direction, jusqu’à ce que : (A) qHi rencontré de nouveau, retourner échec

(B) dreach< df ollowed, qi

L ← y, retourner à l’étape (1).

Motion-To-Goal peut être trivial ou avec un enregistrement de données qui seront utiles pour le reste de l’algorithme comme le cas de l’algorithme Dist-Bug présenté précédemment par exemple. En effet, dans DistDist-Bug le robot doit avancer vers son but en mettant à jour sa distance euclidienne minimale par rapport au but. Cette variable sera utilisée dans la suite de l’algorithme lorsque le robot rencontrera un obstacle pour identifier le meilleur point qui lui permettra de quitter cet obstacle. Nous retrouvons le comportement trivial de Motion-To-Goal dans tous les algorithmes de Bug où il faut que le robot avance simplement vers son but. Le robot s’arrête, quitte ce mode et bascule vers le mode Obstacle-Avoidance dès qu’un obstacle est détecté.

2. Le mode Avoidance : Contrairement à Motion-To-Goal, Obstacle-Avoidance est différent d’un algorithme à l’autre mais se base sur les mêmes étapes pour l’identification d’un leave point. Dans tous les algorithmes de Bug, lorsqu’un obstacle est détecté, le robot enregistre sa position courante et calcule dans certains cas des données supplémentaires qu’il va utiliser tout au long de l’algorithme. En effet, étant donné que l’environnement inconnu, la position du robot permet de savoir s’il a atteint la position de son but en calculant la distance euclidienne par rapport à celui-ci. D’autre part, sa

po-sition est utile lorsqu’il s’agit de retenir la popo-sition d’un point par lequel il est passé. Après l’enregistrement des données, le robot contourne l’obstacle jusqu’à ce que la condition d’évitement d’obstacle définie par l’algorithme soit satisfaite (c.-à-d. leave point identifié) ou lorsque l’algorithme indique que le but est inatteignable. Si la condition de l’algorithme est satisfaite, le robot se dirige vers le leave point identifié, et reprend son chemin vers le but en rebasculant vers le comportement Motion-To-Goal.

Le robot change de comportement si un obstacle est détecté ou si un point potentiel (c.-à-d. leave Point) qui permet de quitter l’obstacle a été identifié. L’iden-tification de ce point potentiel représente le point de variabilité principal des algo-rithmes de Bug. La description informelle de Bug cache la variabilité algorithmique et celle du matériel. La variabilité du matériel a un impact sur la détection d’obs-tacles et sur la localisation en raison de leurs dépendances des capteurs du robot utilisé. Quant à la variabilité algorithmique, elle est liée à l’identification d’un leave point pour quitter l’obstacle rencontré.

En se basant sur une démarche dirigée par les buts et sur une étude détaillée des algorithmes de Bug, on a identifié les abstractions suivantes :

– Motion-To-Goal : Le robot doit pouvoir se positionner face à son but et être capable d’avancer vers celui-ci : faceGoal(Point qgoal), goAhead(double speed)

– Le robot s’arrête : halt()

– La détection d’obstacle sur le chemin du robot : bool obstacleInFron-tOfTheRobot() interroge sur les capteurs sur la présence d’un obstacle en face du robot.

– La position courante : Point getPosition()

– Le contournement d’obstacles consiste à suivre une direction (clockwise ou counter-clockwise) en réduisant l’écart entre la distance du robot par rapport au mur suivi et la distance de sécurité comme le montre la figureV.47. Cette abstraction est appelée wallFollowing(bool direction).

– double getSafeDistance() indique la distance minimale que le robot doit maintenir par rapport à l’obstacle rencontré.

– obstacleOnTheRight(), bool obstacleOnTheLeft() permettent de situer l’obs-tacle le plus proche détecté à gauche ou à droite du robot. Imaginons le cas où les capteurs situés à gauche détectent un obstacle et les capteurs droits

V.3 Application sur la famille d’algorithmes Bug

Figure V.47 –Le contournement d’obstacle : (1) le robot à droite doit tourner à droite pour se rapprocher de l’obstacle et réduire l’écart entre la distance de sécurité et sa distance actuelle par rapport à l’obstacle. (2) le robot à gauche doit tourner à gauche pour s’éloigner de l’obstacle et réduire l’écart entre la distance de sécurité et sa distance actuelle par rapport à l’obstacle

détectent un obstacle, il est important de savoir de quel coté se trouve l’obs-tacle le plus proche. Ces abstractions ne sont pas spécifiques aux capteurs à rayons. Vu qu’elles se présentent sous forme de requêtes qui ne sont pas spécifiques à un type particulier elle peut aussi bien être utilisée pour des capteurs tactiles que pour des capteurs à rayons. Par exemple dans le cas des capteurs à rayons, elles désignent les cadrans à droite et à gauche du robot sur la figureV.48. Ces cadrans peuvent varier selon les champs de vision des capteurs et leurs portées. Cette figure représente le cas où le robot est un point.

Figure V.48 – La détection d’obstacle devant, à gauche et à droite du robot avec des capteurs de distance

– double getRightDistance(), double getLeftDistance() : afin de maintenir une distance de sécurité par rapport au mur qui représente l’obs-tacle, nous devons savoir quelle est la distance par rapport à l’obstacle le

plus proche à gauche ou à droite (selon la direction suivie) comme le montre la figure V.49. La distance retournée est la moyenne des distances détectées par les rayons du capteur gauche (ou droit) du robot par rapport à l’obstacle le plus proche.

Figure V.49 –Exemple de getDistanceRight : la distance retournée est la moyenne des distances détectées parmi tous les rayons émanant du capteur droit du robot

– Trouver un leave Point : identifyLeavePoint(bool direction, Point robotPosition, Point goalPosition). La recherche d’un leave point consiste à contourner l’obstacle tout en vérifiant les conditions définies par l’algorithme pour l’identification de celui-ci. La stratégie d’évitement d’obstacle peut se baser sur une décision locale (choisir le premier point qui répond aux condi-tions de l’algorithme) ou une décision globale (choisir le point parmi tous les points visités qui répond au mieux aux conditions de l’algorithme). Par consé-quent, nous avons identifié une abstraction qui sera appliquée à chaque point visité autour de l’obstacle et qui varie d’un algorithme à un autre : find-LeavePoint(Point robotPosition, Point hitPoint, Point goalPo-sition). Les données enregistrées varient aussi d’un algorithme à l’autre, dans certains algorithmes on n’enregistre que le point de rencontre de l’obstacle. Dans d’autres, on enregistre les points perçus par le robot ayant une distance heuristique minimale. C’est pour cette raison qu’on a identifié l’abstraction computeData(Point RobotPos) Le code de identifyLeavePoint est donné dans l’algorithme 7.