Marc Silanus

Azolla : le plus court chemin entre deux points …

Posted on 28 janvier 2017

C'est bien connu, le plus court chemin entre deux points, c'est la ligne droite !

Dans cet article, je vous propose de mettre en application cet adage dans Azolla, un simulateur robotique 2D. Il s'agit ici de faire aller le robot sur une cible déposée sur le monde. Pour cela, nous allons comparer les coordonnées du robot et de la cible et faire avancer le robot dans la direction de la cible jusqu'à ce que leurs coordonnées soient égales (ou presque).

  • Les coordonnées du robot sont accessibles par la méthode :
    • getposition(numrobot)
  • Les coordonnées de la cibles sont accessibles par la méthode :
    • gettarget(numcible)

L'orientation du robot est accessible par la méthode

    • getangle(numrobot)

Le robot doit donc tourné pour prendre la direction de la cible, ici, d'un angle α.

Attention, les angles sont donnés en radian et sont orientés dans le sens horaire et non pas trigonométrique.

Le calcul de l'angle α fait appel aux formules trigo bien connues dans un triangle rectangle :

L'utilisation de la méthode atan de la classe math permettra d'accéder à l'angle α.

Les angles sont orientés et compris entre 0 et 2Pi, il faut donc s'assurer de leur conformité :

  • Si α < 0 : α = α + 2Pi (orientation dans le mauvais sens)
  • Si α > 2Pi : α = 2Pi - α (1 tour complet + l'angle)
function azolla.main(azolla)

    xt,yt=azolla:gettarget(0)
    xr,yr=azolla:getposition(0)
    orientRobot=azolla:getangle(0)

    angle=math.atan((yt-yr)/(xt-xr))
    
    if(angle<0) then
        angle=2*math.pi+angle
    end

    if(angle>2*math.pi) then
        angle=angle-2*math.pi
    end

    turn = true
    while (turn) do        
        azolla:setspeed(5,-5)
        if ((azolla:getangle(0)-angle<0.01 and azolla:getangle()-angle>-0.01)) then
            turn=false
        end
        azolla:stepforward()
    end

    trouver = false
    while (not trouver) do
        xr,yr=azolla:getposition(0)
        
        if ((xr<xt+5) and (xr>xt-5) and (yr<yt+5) and (yr>yt-5)) then
            trouver=true
        else
            azolla:setspeed(40,40)
        end
        azolla:stepforward()
    end
    
end

Si vous déplacez le robot à droite de la cible, vous remarquerez que s'il s'aligne bien avec la cible, il se dirige en sens contraire. Dans ces conditions, on a xr > xt et donc xt - xr <0 donc l'angle α est négatif. On corrige le problème en testant le cas ou xr > xt :

angle=math.atan((yt-yr)/(xt-xr))
    
if(angle<0) then
    angle=2*math.pi+angle
end

if(xr>xt) then
    angle=angle+math.pi
end

if(angle>2*math.pi) then
    angle=angle-2*math.pi
end

Quelques améliorations peuvent être apportées comme définir le sens de rotation pour que le robot s'aligne avec la cible en fonction de sa position initial par le plus court chemin. Actuellement, il tourne toujours vers la droite :

azolla:setspeed(5,-5)

Vous pouvez également modulariser le programme en écrivant une fonction tourner(angle) puis une fonction allerA(cible) pour permettre au robot de se diriger vers plusieurs cibles successivement.

A vous de jouer ...

Commentaires (0) Trackbacks (0)

Désolé, le formulaire de commentaire est fermé pour le moment

Trackbacks are disabled.