Ajout du grapheur matplotlib + Qt5

This commit is contained in:
Philippe Roy 2023-01-14 07:49:53 +01:00
parent 420067c9f7
commit ce0cdc735f
14 changed files with 131 additions and 15 deletions

View File

@ -42,6 +42,10 @@ Les bibliothèques suivantes ne sont pas incluses par défaut dans l'environneme
- [**Pylint**](https://pylint.pycqa.org) : vérificateur du code Python
- [**pySerial**](https://pyserial.readthedocs.io) : communication sur le port série
- [**pyFirmata**](https://pyfirmata.readthedocs.io) : protocole Firmata (protocole générique de communication entre un logiciel et un microcontrôleur)
- [**Matplotlib**](https://matplotlib.org) : grapheur (visualisation de données)
- [**pyQt5**](https://www.riverbankcomputing.com/software/pyqt/) : interface graphique utilisateur (GUI)
<!-- - [**whell**](https://pyfirmata.readthedocs.io) : format de paquet Python -->
Il faut donc les installer localement (dans UPBGE), les étapes sont :
- **GNU/Linux** : La configuration ici présente est UPBGE installé sur ~ avec Python 3.9 :
@ -50,10 +54,14 @@ Il faut donc les installer localement (dans UPBGE), les étapes sont :
- Installer Pylint : $ ./pip install pylint -t ~/UPBGE-0.30-linux-x86_64/3.0/python/lib/python3.9/site-packages
- Installer pySerial : $ ./pip install pyserial -t ~/UPBGE-0.30-linux-x86_64/3.0/python/lib/python3.9/site-packages
- Installer pyFirmata : $ ./pip install pyfirmata -t ~/UPBGE-0.30-linux-x86_64/3.0/python/lib/python3.9/site-packages
- Installer Matplotlib : $ ./pip install matplotlib -t ~/UPBGE-0.30-linux-x86_64/3.0/python/lib/python3.9/site-packages
- Installer PyQt5 : $ ./pip install PyQt5 -t ~/UPBGE-0.30-linux-x86_64/3.0/python/lib/python3.9/site-packages
- **Windows** : La configuration ici présente est UPBGE installé sur le bureau utilisateur (prenom.nom) avec la distribution Anaconda installée :
- Avec Anaconda Navigator ouvrir un terminal Powershell
- Installer Pylint : pip install pylint -t C:\Users\prenom.nom\Desktop\UPBGE-0.30-windows-x86_64\3.0\python\lib\site-packages
- Installer pySerial : pip install pyserial -t C:\Users\prenom.nom\Desktop\UPBGE-0.30-windows-x86_64\3.0\python\lib\site-packages
- Installer pyFirmata : pip install pyfirmata -t C:\Users\prenom.nom\Desktop\UPBGE-0.30-windows-x86_64\3.0\python\lib\site-packages
- Installer Matplotlib : pip install matplotlib -t C:\Users\prenom.nom\Desktop\UPBGE-0.30-windows-x86_64\3.0\python\lib\site-packages
- Installer PyQt5 : pip install PyQt5 -t C:\Users\prenom.nom\Desktop\UPBGE-0.30-windows-x86_64\3.0\python\lib\site-packages

View File

@ -9,7 +9,7 @@ import time
# @project: Blender-EduTech
# @lang: fr
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
# @copyright: Copyright (C) 2022 Philippe Roy
# @copyright: Copyright (C) 2022-2023 Philippe Roy
# @license: GNU GPL
###############################################################################

View File

@ -4,7 +4,7 @@
# @project: Blender-EduTech
# @lang: fr
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
# @copyright: Copyright (C) 2022 Philippe Roy
# @copyright: Copyright (C) 2022-2023 Philippe Roy
# @license: GNU GPL
###############################################################################

1
monte_charge/twin_plot.py Symbolic link
View File

@ -0,0 +1 @@
/home/phroy/Bureau/seriousgames/blender-edutech/git/digital_twin/twin_plot.py

View File

@ -9,7 +9,7 @@ import time
# @project: Blender-EduTech
# @lang: fr
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
# @copyright: Copyright (C) 2020-2022 Philippe Roy
# @copyright: Copyright (C) 2020-2023 Philippe Roy
# @license: GNU GPL
###############################################################################
@ -102,16 +102,31 @@ def mot (cont):
if scene.objects['System']['run']:
obj = cont.owner
vitesse = 0.05
pas_portail = 2.35619/0.3 # pas echelle 1:1 = 2.35619 -> pas à l'échelle de la maquette (0,3) : 2.35619/0.3 = 7,85396
pas_engrenage = math.pi/7 # z = 14
pas_portail = 2.35619/0.3 # pas echelle 1:1 = 2.35619 -> pas à l'échelle de la maquette (0,3) : 2.35619/0.3 = 7,85396 FIXME à enlever
pas_engrenage = math.pi/7 # z = 14 FIXME à enlever
obj_engrenage = scene.objects['Engrenage']
obj_portail = scene.objects['Portail']
obj_portail['x']= scene.objects['Portail'].localPosition.x # Affichage de la position du portail
# obj_portail['x']= scene.objects['Portail'].localPosition.x # Affichage de la position du portail
speed= obj['speed'] # 0,5 en tour / seconde -> course de 500 mm en 4s
speed= 0.1
scene.objects['System']['scale']=0.33
# speed= obj['speed'] # 0,2 en tour / seconde -> course de 500 mm en 20s
gear_radius = ((obj_engrenage['diameter'])/2) *(1/scene.objects['System']['scale']) # diametre : 40 mm et scale : 0,0033
if obj['close']:
print ("speed :", speed)
print ("gear_radius :", gear_radius)
print ("Vitesse engrenage : ", speed * 2 * math.pi*(1/60), pas_engrenage*vitesse)
print ("Vitesse portail : ", speed * 2 * math.pi * gear_radius*(1/60), pas_portail*vitesse)
print ("Ratio Vitesse portail/ Vitesse engrenage : ",( speed * 2 * math.pi * gear_radius*(1/60))/(speed * 2 * math.pi *(1/60)), pas_portail/pas_engrenage)
# Ouvrir
if obj['open']:
obj_engrenage.applyRotation((0, 0, -pas_engrenage*vitesse), True)
obj_portail.applyMovement((-pas_portail*vitesse, 0, 0), True)
obj_engrenage.applyRotation((0, 0, -speed * 2 * math.pi), True)
obj_portail.applyMovement((-speed * math.pi * gear_diameter, 0, 0), True)
# obj_engrenage.applyRotation((0, 0, -pas_engrenage*vitesse), True)
# obj_portail.applyMovement((-pas_portail*vitesse, 0, 0), True)
# Modele 3D -> Arduino
if scene.objects['System']['twins']:
@ -123,8 +138,11 @@ def mot (cont):
# Fermer
# else: # Pas de priorité
if obj['close']:
obj_engrenage.applyRotation((0, 0, pas_engrenage*vitesse), True)
obj_portail.applyMovement((pas_portail*vitesse, 0, 0), True)
obj_engrenage.applyRotation((0, 0, speed * 2 * math.pi*(1/60)), True)
obj_portail.applyMovement((speed * 2 * math.pi * gear_radius*(1/60), 0, 0), True)
# obj_engrenage.applyRotation((0, 0, pas_engrenage*vitesse), True)
# obj_portail.applyMovement((pas_portail*vitesse, 0, 0), True)
# Modele 3D -> Arduino
if scene.objects['System']['twins']:

View File

@ -41,8 +41,19 @@ brochage={}
def commandes():
# # Mise en place : Fermeture
# print ("Version sans sécurité : sans réouverture")
# print ("Mise en place : Fermeture")
# while fdc_f() ==False :
# gyr(True)
# mot_o(False)
# mot_f(True)
# mot_f(False)
# gyr(False)
# Ecrire votre code ici ...
gyr(True) # Activer le gyrophare
test()
while True:
pass

View File

@ -4,7 +4,7 @@
# @project: Blender-EduTech
# @lang: fr
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
# @copyright: Copyright (C) 2020-2022 Philippe Roy
# @copyright: Copyright (C) 2020-2023 Philippe Roy
# @license: GNU GPL
###############################################################################

View File

@ -1,7 +1,7 @@
import bge # Bibliothèque Blender Game Engine (UPBGE)
from twin_threading import thread_cmd_start, thread_cmd_stop, thread_cmd_end # Multithreading
from twin_serial import jumeau, jumeau_stop, serial_close # Liaison série
# import twin_serial # Liaison série
from twin_plot import test # Visualisation données
import time
###############################################################################

View File

@ -0,0 +1 @@
/home/phroy/Bureau/seriousgames/blender-edutech/git/digital_twin/twin_plot.py

76
twin_plot.py Normal file
View File

@ -0,0 +1,76 @@
import bge # Bibliothèque Blender Game Engine (UPBGE)
import sys
import matplotlib
matplotlib.use('Qt5Agg')
rom PyQt5 import QtCore, QtGui, QtWidgets
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
###############################################################################
# twin_plot.py
# @title: Visualisation des données
# @project: Blender-EduTech
# @lang: fr
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
# @copyright: Copyright (C) 2023 Philippe Roy
# @license: GNU GPL
###############################################################################
# UPBGE scene
scene = bge.logic.getCurrentScene()
# Récupérer le brochage du jumeau réel
# system=importlib.import_module(scene.objects['Doc']['system']) # Système
# pin_config = system.get_pin_config()
###############################################################################
# Fenêtre avec la Toobar
###############################################################################
class MplCanvas(FigureCanvasQTAgg):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
super(MplCanvas, self).__init__(fig)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
sc = MplCanvas(self, width=5, height=4, dpi=100)
sc.axes.plot([0,1,2,3,4], [10,1,20,3,40])
# Create toolbar, passing canvas as first parament, parent (self, the MainWindow) as second.
toolbar = NavigationToolbar(sc, self)
layout = QtWidgets.QVBoxLayout()
layout.addWidget(toolbar)
layout.addWidget(sc)
# Create a placeholder widget to hold our toolbar and canvas.
widget = QtWidgets.QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
self.show()
###############################################################################
# Visualisation
###############################################################################
##
# Test
##
def test():
# FIXME : mettre le multithreading
# app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
# app.exec_()

View File

@ -9,11 +9,11 @@ from serial.tools.list_ports import comports # Détection du port automatique
###############################################################################
# twin_serial.py
# @title: Gestion de la laison série
# @title: Gestion de la liaison série
# @project: Blender-EduTech
# @lang: fr
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
# @copyright: Copyright (C) 2022 Philippe Roy
# @copyright: Copyright (C) 2022-2023 Philippe Roy
# @license: GNU GPL
###############################################################################

View File

@ -10,7 +10,7 @@ import time
# @project: Blender-EduTech
# @lang: fr
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
# @copyright: Copyright (C) 2020-2022 Philippe Roy
# @copyright: Copyright (C) 2020-2023 Philippe Roy
# @license: GNU GPL
###############################################################################

1
volet_roulant/twin_plot.py Symbolic link
View File

@ -0,0 +1 @@
/home/phroy/Bureau/seriousgames/blender-edutech/git/digital_twin/twin_plot.py