Dans cet atelier, vous allez apprendre à programmer des robots omnidirectionnels (qui peuvent se déplacer dans toutes les directions) afin qu'ils jouent au football.
Pour lancer le simulateur, cliquez sur l'icône sur le Bureau.
Cela ouvrira une fenêtre de simulation dans un navigateur avec un terrain de football, quatre robots, une balle ainsi que l'interface d'arbitrage telle que présentée ci-dessous:
❕ AstuceSi vous fermez le navigateur par inadvertance, l'interface reste accessible en réouvrant le navigateur et en allant à l'adresse
http://127.0.0.1:7070
.
Vous vous trouvez actuellement dans Visual Studio Code, un éditeur de texte que nous allons utiliser pour programmer en Python.
Pour créer un nouveau fichier, il suffit de faire un clic droit dans la zone à gauche, sur le dossier Code, et de cliquer sur New File...
, puis d'entrer le nom du fichier, avec l'extension .py
, car nous programmons ici en Python.
Si la zone n'apparait pas, cliquer sur l'icone :
Pour lancer un programme, cliquer sur le bouton suivant:
Une fenêtre de terminal apparaît alors en bas de l'écran.
Enfin pour couper un programme, cliquer sur la petite poubelle (entourée en rouge ci-dessous) dans la partie terminal
Par la suite, nous utiliserons le système de coordonnées suivant:
ⓘ Info
$x$ et$y$ sont la position (exprimées en mètres)$\alpha$ est une orientation (exprimée en radians)- l'origine du repère (le zéro) est au centre du terrain, comme indiqué sur la figure
📝 ObjectifLe but de cette première partie est de programmer un robot défenseur qui doit empêcher l'équipe adverse de marquer un but.
Ouvrez le fichier defenseur.py
, et exécutez le. Observez le comportement du robot vert #1 lorsque vous déplacez la balle sur le terrain.
ⓘ Info
balle_x
etballe_y
sont les coordonnées de la balle dans le terrain, récupérées par le clientx
,y
etorientation
sont les coordonnées cible (à atteindre) pour notre robotconstants.field_width
est une constante définie dans la bibliothèque RSK, qui correspond à la largeur du terrainmath.radians(-90)
est une fonction de la bibliothèque math qui convertit un angle en degrés en radians- la fonction
goto()
permet de déplacer le robot à la position cible, et l'orienter dans la direction souhaitée
Comme vous pouvez le voir, ce n’est pas un très bon défenseur.
🎮 À vous de jouer !Changez le code de manière à ce que le robot se place dans ses cages, tout en restant en face de la balle.
❕ AstuceVous pourrez utiliser les constantes
constants.field_length
qui correspond à la longueur du terrain.On peut remarquer une latence entre le moment où la balle bouge et le moment où le robot bouge. Pour éviter cette latence, vous pouvez faire le changement suivant:
# Remplacez cette ligne: client.green1.goto((x, y, orientation)) # Par celle-ci: client.green1.goto((x, y, orientation), wait=False)
On aimerait désormais que le robot défenseur ne quitte pas la zone du gardien et reste entre ses poteaux.
Pour cela, nous allons utiliser des conditions. Ouvrez le fichier defenseur_condition.py
. Ce dernier est similaire au code précédent, sauf que le robot ne se déplace pas vers la balle lorsque sa coordonnée
Cela est réalisé à l'aide de la condition if balle_x > 0
.
🎮 À vous de jouer !En vous inspirant de ce code, modifiez le code précédent pour que le robot ne quitte pas la zone du gardien.
❕ AstuceVous pourrez utiliser les constantes
constants.goal_width
qui correspond à la largeur des cages.
Nous avons désormais un gardien qui reste dans ses cages, capable d'arrêter les tirs horizontaux. Cependant, il est possible que l'attaquant fasse des tirs diagonaux, qui seront difficilement arrêtés par notre gardien actuel.
Pour cela, nous pouvons calculer un point d'intersection entre le segment attaquant-balle et la ligne de but, et déplacer notre gardien à ce point.
Nous pourrons utiliser la formule suivante:
$ y_{defenseur} = \frac{y_{balle} - y_{attaquant}}{x_{balle} - x_{attaquant}} \times (x_{cages} - x_{balle}) + y_{balle} $
🎮 À vous de jouer !Modifiez le code précédent de façon à prendre en compte la position de l'attaquant
❕ AstuceVous pourrez récupérer la position de l'attaquant ( par exemple blue#1 ) avec les variables suivantes:
# Position de l'attaquant (bleu 1) attaquant_x = client.blue1.position[0] attaquant_y = client.blue1.position[1]
📝 ObjectifDans cette seconde partie, nous allons programmer un robot attaquant qui doit tenter de marquer des buts. Afin de pouvoir jouer contre notre robot défenseur, nous allons maintenant nous placer du coté bleu.
Pour commencer, nous allons réaliser un tir perpendiculaire aux cages.
Ouvrez le fichier attaquant.py
et exécutez-le. Observez ce que fait le robot bleu #1 lorsque vous déplacez la balle sur le terrain.
🎮 À vous de jouer !Modifiez le code de l'attaquant de manière à ce que le robot tire vers les cages
❕ AstuceDe nouveau, une latence est présente entre le mouvement de la balle et le mouvement du robot. Pour l'éviter, vous pouvez ajouter l'argument
wait=False
à la fonctiongoto()
. En revanche, il faudra alors vérifier que le robot a fini son déplacement avant de tirer:# Placement du robot, test si le robot a fini son déplacement if client.blue1.goto((x, y, orientation), wait=False): # Déclenchement du tir client.blue1.kick()
Nous avons maintenant un robot attaquant capable de tirer de manière perpendiculaire aux cages. Cependant, si le robot n'est pas aligné avec les cages, le tir ne sera pas cadré.
Une première approche pour résoudre ce problème serait de découper le terrains en 3 zones:
- dans la zone rouge, le tir sera effectué à -45°
- dans la zone jaune, le tir sera effectué à 0°
- dans la zone bleue, le tir sera effectué à 45°
🎮 À vous de jouer !Modifiez le code de l'attaquant de manière à ce que le robot tire vers les cages selon 3 couloirs
❕ AstuceRemarque: pour placer un robot à une distance
$d$ d'une balle, avec une orientation de -45°, vous pourrez utiliser un dégagement de$\frac{d}{\sqrt{2}}$ en$x$ et en$y$ , comme indiqué sur la figure suivante:![]()
Pour orientation de 45°, le signe du dégagement en
$y$ est inversé.
Au lieu de se limiter à 3 couloirs, on souhaiterait que le robot tire vers les cages, peu importe son orientation.
Pour cela, nous allons calculer l'orientation du robot par rapport à la position de la balle et des cages.
🎮 À vous de jouer !Modifiez le code de l'attaquant de manière à ce que le robot tire vers les cages, peu importe son orientation
❕ AstuceLes fonctions trigonométriques
math.cos
,math.sin
,math.acos
,math.asin
etmath.atan
sont disponibles dans la bibliothèquemath
.
Dans le cas où la balle se trouve sur la trajectoire du robot, il risque de la percuter et de la déplacer en essayant de se placer pour tirer.
🎮 À vous de jouer !Modifiez le code de l'attaquant de manière à ce qu'il évite les collisions avec la balle
🎮 À vous de jouer dans la cours des grand 🩻 !Il est temps de rassembler tout ce que vous avez appris pour faire un programme prêt à affronter un adversaire. Les terrains n’attendent que vous !