TP Porte

Présentation

Un robot à deux roues veut entrer dans une maison. Pour cela, on a placé deux balises sur les murs (les points \(A\) et \(B\)). On suppose que l’on connaît la position de ces balises dans le monde \(\{w\}\), et que le robot les détecte à dans son propre repère \(\{r\}\) (par exemple à l’aide d’une caméra).

On sait que le centre d’une porte \(P\) se trouve à une distance de 2m le long du mur à partir de \(A\) et \(B\). L’objectif est que le robot atteigne une position cible \(X\).

Pour ce faire, on propose de passer par un point de dégagement \(P_{ext}\), puis de franchir la porte, et enfin de se rendre vers la cible \(X\).

Note: on connaît donc \({}^w A, {}^w B, {}^r A, {}^r B\) et \({}^w X\).

À vous de jouer!

Prise en main

Téléchargez l’archive tp_door.zip
Lisez les instructions ci-dessous

Téléchargez l’archive et installez les dépendances suivantes:

Afin d’installer les dépendances, lancez la commande suivante:

pip install pygame numpy

Exécutez main.py, vous devriez voir une scène similaire à l’image ci-dessous. Si vous appuyez sur ESPACE, la scène va se re-générer aléatoirement:

Vous éditerez le fichier main.py (et uniquement celui-ci). Remarquez qu’en changeant x_speed et rot_speed, il est possible de modifier la vitesse du robot. Essayez de changer ces valeurs, et observez l’effet sur le robot.

Avant de nous occuper de la porte, nous allons commencer par créer une fonction de navigation. programmer la fonction de navigation. Nous allons écrire une fonction navigate_to qui prend en paramètre un point cible dans le repère du robot. Ajoutez la fonction suivante dans main.py:

def navigate_to(P_robot):
    """
    Reçoit en entrée un point dans le repère robot, et produit la vitesse cible pour que le
    robot navigue vers ce point

    - Si le point n'est pas en face du robot, on tourne pour s'aligner avec lui
    - Sinon, on avance tout droit pour l'atteindre
    """
    return 0, 0

Dans la boucle principale de main.py, on testera note fonction de cette manière:

x_speed, rot_speed = navigate_to(A_robot)

Implémentez le code de navigate_to afin de produire des vitesses permettant de se rendre vers le point passé en paramètre dans le repère du robot. Si la cible n’est pas alignée, le robot tournera sur lui-même, sinon il ira tout droit.

Si tout se passe bien, le robot devrait alors se diriger vers le point \(A\).

Changements de repère

Nous allons maintenant créer la fonction T_frame_wall suivante:

def T_frame_wall(A_frame, B_frame):
    """
    À partir des coordonnées du point A et B, construit la matrice de transformation
    homogène 2D (3x3) permettant de passer du repère mur au repère dans lequel les
    points A et B ont été observés
    """
    pass

Implémentez maintenant cette fonction. Pour un repère \(\{ f \}\), elle prend en paramètre \({}^f A\) et \({}^f B\) et doit retourner la matrice de transformation \({}^f T_m\), permettant de transformer un point du repère mur en un point dans \(\{ f \}\).

Le fichier utils.py contient des outils pour manipuler les repères.

Utilisez cette fonction pour calculer alors T_world_wall et T_robot_wall dans robot_tick.

Vous pouvez désormais calculer la position de \(X\), \(P_{in}\) et \(P_{ext}\) dans le repère robot.

Passer la porte!

Implémentez le code permettant au robot de:

Afin de franchir la porte.

Note: Comme indiqué dans le code de base, l’appel à simulator.tick indique si une réinitialisation (appui sur ESPACE) a eu lieu