Guida per installare l’ambiente e usare gli script principali: protocollo-analisi.py, RULACalculator_XSens.py e RULACalculator_Mediapipe.py. Tutto il codice è Python puro, senza CLI avanzate: i parametri si settano in testa ai file.
- Python 3.10 o 3.11 a 64 bit (consigliato 3.10 per Mediapipe). Su Windows usa
py -3.10 -m venv ergo-enve attiva l’ambiente (ergo-env\Scripts\activate). - Dipendenze comuni:
pip install -U pip wheele poipip install numpy opencv-python mediapipe matplotlib openpyxl. - XSens: installa anche i requisiti della cartella
XSens_Code(solomatplotlib):pip install -r XSens_Code/requirements.txt. - Per usare SolvePnP con camera reale, genera
camera_params.npzconCodiceMediapipe_3D/calib_chessboard_from_video.py(serve un video con scacchiera) e aggiorna il path inCodiceMediapipe_3D/process_video_plot.py. - Se preferisci il modello Pose offline
.task, mettilo inpose_landmarker_models/(es.pose_landmarker_heavy.task) e adattaprocess_video_plot.pydi conseguenza; di default usa il modello integrato Mediapipe Pose.
Dati/
SoggettoXX/TaskY/RipetizioneZ/ # video e (opzionale) mvnx
CodiceMediapipe_3D/ # process_video_plot.py e calibrazione
pose_landmarker_models/pose_landmarker_heavy.task (opzionale)
XSens_Code/ # loader XSens
protocollo-analisi.py
RULACalculator_Mediapipe.py
RULACalculator_XSens.py
camera_params.npz (opzionale, se usi SolvePnP)
- Imposta
ROOT_FOLDERinprotocollo-analisi.pysulla ripetizione da analizzare, regolaMAX_FRAMES,FPS_CAPeVISUALIZE. - Esegui
python protocollo-analisi.py. Per ogni video:- Se esiste già un file
_cut(o_cut_60fpsecc.) lo riusa, altrimenti compare la UI per selezionare start (s) ed end (e) e salva<nome>_cut.extaccanto al video. - Se gli FPS superano
FPS_CAP, ricampiona a<nome>_cut_<FPS_CAP>fps.ext. - Calcola RULA con Mediapipe; se nella cartella ci sono
.mvnx, calcola anche RULA XSens.
- Se esiste già un file
- Output: log a console e
rula_output.xlsxdentroROOT_FOLDER(uno sheet per file).
ROOT_FOLDER: cartella della ripetizione (Dati/Soggetto01/Task1/Ripetizione01/...). Il codice scandisce ricorsivamente video (.mp4/.mov/.avi/.mkv) e.mvnx.MAX_FRAMES: limite globale per video e MVNX (None o intero).FPS_CAP: ricampiona se il video ha fps maggiori.VISUALIZE: apre l’animazione 3D (Mediapipe e XSens); chiudi la finestra per proseguire.- La funzione
select_frame_rangemostra i comandi nella UI (play/pause, s/e, frecce, invio per confermare).
- Parametri principali in testa:
CODE_DIR(cartella conprocess_video_plot.py),VIDEO_PATH,FRAMES,STEP,MODEL_COMPLEXITY(0/1/2),USE_PNP(SolvePnP),VISUALIZE. - Vettori nel plot: attiva/disattiva i flag
SHOW_*e, se vuoi, modifica i colori inVECTOR_COLORS. - Keypoint e vettori:
- Mapping Mediapipe → joint ergonomici in
MP_IDXe funzionejoints_from_points(qui puoi cambiare i landmark usati per spalla/gomito/polso/anche/ginocchia/caviglie). - Vettori e assi corporei in
_body_axes_vectors; i vettori mostrati nel plot sono scelti in_vector_map_for_plot. - Il calcolo degli angoli RULA è in
compute_ergo_mediapipe; se cambi i vettori modifica qui le proiezioni.
- Mapping Mediapipe → joint ergonomici in
- Modello Mediapipe: cambia
MODEL_COMPLEXITYoppure personalizza laPoseinCodiceMediapipe_3D/process_video_plot.py(confidenze,enable_segmentation, ecc.). - Esecuzione singola:
python RULACalculator_Mediapipe.py(usa i parametri di default o passa override arun_mediapipeda altri script).
- Parametri:
XSENS_CODE_DIR,MVNX_PATH,FRAMES,VISUALIZE,NECK_DEBUG_FRAMES(stampa metriche collo sui primi N frame). - Vettori nel plot: flag
SHOW_*(assi sagittale/trasverso/frontale, segmenti collo-braccia-gambe). - Mapping XSens: dizionario
XSENS_JOINT_SEG(segmento XSens → joint ergonomico) usa gli ID definiti inXSens_Code/mvn.py(SEGMENT_PELVIS,SEGMENT_RIGHT_FOREARM, ecc.). Cambia qui per usare segmenti diversi (es. usareSEGMENT_RIGHT_HANDcome polso). - Vettori e assi per il calcolo:
_body_axes_vectorsecompute_ergo_xsens; i dati per la visualizzazione sono costruiti incompute_ergo_xsense raccolti inaxes_series. - Esecuzione singola:
python RULACalculator_XSens.py(calcola RULA e, seVISUALIZE=True, mostra lo scheletro XSens con vettori scelti).
0 nose; 1 left eye (inner); 2 left eye; 3 left eye (outer); 4 right eye (inner); 5 right eye; 6 right eye (outer); 7 left ear; 8 right ear; 9 mouth (left); 10 mouth (right); 11 left shoulder; 12 right shoulder; 13 left elbow; 14 right elbow; 15 left wrist; 16 right wrist; 17 left pinky; 18 right pinky; 19 left index; 20 right index; 21 left thumb; 22 right thumb; 23 left hip; 24 right hip; 25 left knee; 26 right knee; 27 left ankle; 28 right ankle; 29 left heel; 30 right heel; 31 left foot index; 32 right foot index.
- Mediapipe:
RULACalculator_Mediapipe.py→MP_IDX(scelta landmark),joints_from_points(costruzione del dizionario),_body_axes_vectorsecompute_ergo_mediapipe(definizione e uso dei vettori),_vector_map_for_plot(quali vettori disegnare). - XSens:
RULACalculator_XSens.py→XSENS_JOINT_SEG(segmenti usati),joints_from_xsens(come derivare mano da polso),_body_axes_vectorsecompute_ergo_xsens(vettori/angoli). Gli ID segmento/giunto di riferimento sono inXSens_Code/mvn.py.
VISUALIZE=Trueblocca l’esecuzione finché non chiudi la finestra Matplotlib.- Se Mediapipe perde i keypoint, prova a ridurre
MODEL_COMPLEXITYo aumentare la qualità del video; per debug rapido puoi stampare i frame mancanti inprocess_video_plot.extract_landmarks. - Per evitare errori Qt di Matplotlib senza icone, entrambe le versioni del calcolatore creano icone minime con
_ensure_mpl_icons().