diff --git a/README.md b/README.md index f1a35fb..c587ddf 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,14 @@ Ropy a fortement été inpiré par [RobotProg](http://www.physicsbox.com/indexro Ce jeu sérieux fait partie du projet open source [Blender-EduTech (Blender/UPBGE pour l'Enseignement Technologique)](https://gitlab.com/blender-edutech). -L'environnement de développement est basé sur : la plateforme de modélisation et d'animation 3D Blender ( https://blender.org ), le langage Python -(https://python.org ) et le moteur de jeu 3D UPBGE ( https://upbge.org ). +![Screenshot](img/screenshot-v2b.jpg) +![Poster](img/poster.png) + +## Téléchargement Les binaires (Game Engine Runtime) sont hébergés sur [apps.education.fr](https://nuage03.apps.education.fr/index.php/s/f5jELp5xifEM5Xx). -![Screenshot](img/screenshot-v2b.jpg) -![Poster](img/poster.png) +## Instructions et missions Le script Python qui permet la commande du robot est le fichier 'rp_cmd.py'. @@ -27,13 +28,13 @@ Les instructions de base sont : - Marquer la case : **rp_marquer()** - Détecter la présence d'un mur devant à un pas : **rp_detect()** -> retourne True en présence d'un mur et False en absence de mur -Les niveaux sont : -- Niveau 1 : Les premiers pas de Ropy -- Niveau 2 : Ma première fonction -- Niveau 3 : Sécuriser Ropy -- Niveau 4 : Partir au bout du monde -- Niveau 5 : Faire face à l'inconnu -- Niveau 6 : Se rendre utile +Il y a 6 missions : +- Mission 1 : Les premiers pas de Ropy +- Mission 2 : Ma première fonction +- Mission 3 : Sécuriser Ropy +- Mission 4 : Partir au bout du monde +- Mission 5 : Faire face à l'inconnu +- Mission 6 : Se rendre utile Du niveau 1 au niveau 5, chaque niveau donne lieu à la découverte d'une nouvelle structure algorithmique. Le niveau 6 correspond à la mission principale, il faudra mobiliser l'ensemble de structures vues précédement. @@ -41,4 +42,20 @@ il faudra mobiliser l'ensemble de structures vues précédement. Ropy est une plateforme pédagogique où d'autres missions pouvent être dévelopées pour mettre en oeuvre des concepts comme la programmation objet, le machine learning ou encore le jumeau numérique. +## Documents pédagogiques + Les applications pédagogique se trouvent dans le [dépôt des documents pédagogiques du projet Blender-EduTech](https://gitlab.com/blender-edutech/blender-edutech-oer-french) . + +## Développement + +L'environnement de développement est basé sur : la plateforme de modélisation et d'animation 3D Blender ( https://blender.org ), le langage Python +(https://python.org ) et le moteur de jeu 3D UPBGE ( https://upbge.org ). + +Le code source, les fichiers blender et les assets sont hébergés sur le dépôt [gitlab](https://gitlab.com/blender-edutech/ropy). + +Ropy peut être un jumeau numérique via la liaison série. Il est donc nécessaire que l'environnement de développement Python d'UPBGE contienne la bibliothèque serial. +Les étapes sont : +- La configuration ici présente est UPBGE installé sous GNU-Linux sur ~ avec Python 3.9 +- Aller dans le répertoire local de Python de UPBBE: "$ cd ~/UPBGE-0.30-linux-x86_64/3.0/python/bin" +- Installer localement (UPBGE) le gestionnaire de paquet pip : $ ./python3.9 -m pip serial" +- Installer localement (UPBGE) la bibliothèque serial : $ pip install serial -t ~/UPBGE-0.30-linux-x86_64/3.0/python/lib/python3.9/site-packages diff --git a/asset/icons/doc/rover/relationship-bounds.svg b/asset/icons/doc/rover/relationship-bounds.svg new file mode 100644 index 0000000..01156c5 --- /dev/null +++ b/asset/icons/doc/rover/relationship-bounds.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/asset/icons/hud/icon_twins.svg b/asset/icons/hud/icon_twins.svg new file mode 100644 index 0000000..0d50049 --- /dev/null +++ b/asset/icons/hud/icon_twins.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/ropy-28.blend b/ropy-28.blend index 8e04574..bb33d85 100644 Binary files a/ropy-28.blend and b/ropy-28.blend differ diff --git a/ropy-29.blend b/ropy-29.blend new file mode 100644 index 0000000..ab0d045 Binary files /dev/null and b/ropy-29.blend differ diff --git a/rp_doc.py b/rp_doc.py index 0e44eac..84d21e9 100644 --- a/rp_doc.py +++ b/rp_doc.py @@ -41,7 +41,7 @@ missions_card=rp_map1.get_missions_card() # Documentation Rover ################################################################################ -rover_card=["forward-card", "turn-card", "delineate-card", "detect-card", "radar-card"] +rover_card=["forward-card", "turn-card", "delineate-card", "detect-card", "radar-card", "twins-card"] rover_card=rover_card+["speed-card", "paint-card", "battery-card", "beacon-card"] # Avancer et reculer @@ -77,6 +77,15 @@ rp_radar_text=" Le radar n'est toujours pas \n opérationnel ! \n\n Mais où est rp_radar_type="mission" card_description.update({"radar-card" : [rp_radar_title, rp_radar_text, rp_radar_type]}) +# Jumeau numérique +rp_twins_title="Jumeau numérique" +rp_twins_text=" En utilisant une liaison série, Ropy peut être le jumeau numérique d'un robot réel. \n" +rp_twins_text = rp_twins_text + " rp_jumeau(port, baud) \n -> Configure et ouvre la liaison série sur le port et à la vitesse spécifiés. \n" +rp_twins_text = rp_twins_text + " rp_jumeau_close() \n -> Ferme la liaison série.\n\n" +rp_twins_text = rp_twins_text + " Messages envoyés (asynchrone) : avancer : 'a', reculer 'r', droite : 'd', gauche 'g', marquer : 'm' et forer : f" +rp_twins_type="standard" +card_description.update({"twins-card" : [rp_twins_title, rp_twins_text, rp_twins_type]}) + # Cards description pour le magasin storecard_description ={} diff --git a/rp_lib.py b/rp_lib.py index 3871ebc..02ad3fc 100644 --- a/rp_lib.py +++ b/rp_lib.py @@ -8,6 +8,7 @@ import time import math import mathutils import random +import serial # Liaison série (jumeau numérique) import rp_map1 as rp_map # Map definition @@ -28,6 +29,13 @@ import rp_map1 as rp_map # Map definition scene = bge.logic.getCurrentScene() debug_mvt = scene.objects['Terrain']['debug_mvt'] +# twins = scene.objects['Terrain']['twins'] +twins=True + +# Paramétrage de la communication avec la carte de communication (Arduino, Micro:bit) +#serial_port='COM5' # Windows +serial_port='/dev/ttyACM0' # GNU/Linux +serial_baud=9600 # 115200 # Sounds audiodev = aud.Device() @@ -197,10 +205,13 @@ def rp_avancer (): if obj['stop']: return False - # Points et console - if (debug_mvt): + # Points, console et jumeau numérique + if debug_mvt: print ("rp_avancer()") scene.objects['Points']['step'] +=1 + if twins: + serial_msg = "a\n" + serial_comm.write(serial_msg.encode()) # Communication série : modele 3d -> carte communication ( arduino | micro:bit ) # Animation rapide if scene.objects['Commands']['speed'] >= 10 and scene.objects['Points']['step']> 2: # A tendance à planter sur les premiers mouvements en rapide + balisage @@ -235,7 +246,7 @@ def rp_avancer (): # rp_tempo (0.1*step) # Animation - if scene.objects['Commands']['speed'] < 10 or scene.objects['Points']['step'] <=2 : + if scene.objects['Commands']['speed'] < 10: start = 1 end = 100 layer = 0 @@ -275,7 +286,7 @@ def rp_avancer (): ## -# Avancer le rover +# Reculer le rover ## def rp_reculer (): @@ -315,10 +326,13 @@ def rp_reculer (): if obj['stop']: return False - # Points et console + # Points, console et jumeau numérique if (debug_mvt): print ("rp_reculer()") scene.objects['Points']['step'] +=1 + if twins: + serial_msg = "r\n" + serial_comm.write(serial_msg.encode()) # Communication série : modele 3d -> carte communication ( arduino | micro:bit ) # Animation rapide if scene.objects['Commands']['speed'] >= 10 and scene.objects['Points']['step']> 2: # A tendance à planter sur les premiers mouvements en rapide + balisage @@ -380,11 +394,14 @@ def rp_gauche (): if obj['stop']: return False - # Points et console + # Points, console et jumeau numérique if (debug_mvt): print ("rp_gauche()") scene.objects['Points']['step'] +=1 step=math.pi/2 # Pas angulaire + if twins: + serial_msg = "g\n" + serial_comm.write(serial_msg.encode()) # Communication série : modele 3d -> carte communication ( arduino | micro:bit ) # Animation rapide if scene.objects['Commands']['speed'] >= 10: @@ -426,11 +443,14 @@ def rp_droite (): if obj['stop']: return False - # Points et console + # Points, console et jumeau numérique if (debug_mvt): print ("rp_droite()") scene.objects['Points']['step'] +=1 step=math.pi/2 # Pas angulaire + if twins: + serial_msg = "d\n" + serial_comm.write(serial_msg.encode()) # Communication série : modele 3d -> carte communication ( arduino | micro:bit ) # Rapide if scene.objects['Commands']['speed'] >= 10: @@ -741,6 +761,11 @@ def rp_batterie (): def rover_colision_montain (back): obj=scene.objects['Rover'] + # Jumeau + if twins: + serial_msg = "c\n" + serial_comm.write(serial_msg.encode()) # Communication série : modele 3d -> carte communication ( arduino | micro:bit ) + # Animation start = 1 end = 120 @@ -796,6 +821,11 @@ def rover_colision_montain (back): def rover_colision_station (back): obj=scene.objects['Rover'] + # Jumeau + if twins: + serial_msg = "c\n" + serial_comm.write(serial_msg.encode()) # Communication série : modele 3d -> carte communication ( arduino | micro:bit ) + # Animation start = 1 end = 120 @@ -959,6 +989,11 @@ def rover_drill (x,y): scene.objects['Sun'].applyMovement((0, 0, 0), True) rp_tempo (0.1) + # Jumeau + if twins: + serial_msg = "f\n" + serial_comm.write(serial_msg.encode()) # Communication série : modele 3d -> carte communication ( arduino | micro:bit ) + # Tuile for i in range (10): if scene.objects['Drill_tile-'+str(i)].visible==False: