Rapport de projet complet (mauvaise qualité à cause de la compression, version complète sur demande) :

Développement d’une prothèse de pied optimisée pour une athlète élite en ski para-alpin-compressed.pdf


Pour un cours d’orthopédie dans le cadre de mes études à l’ETS, nous avons été missionné de concevoir une prothèse/orthèse pour une jeune étoile montante du ski para canadien : Florence Carrier. Après avoir dressé un cahier des charges, j’ai été chargé du design du premier prototype sur un logiciel très utilisé en Amérique du Nord : Fusion 360.

Voici l’état actuel de la V1 :

Première version du prototype, Fusion360

Première version du prototype, Fusion360

Mon passé en cyclisme m’a poussé à essayer d’intégrer un amortisseur de VTT pour profiter d’une tonne de réglages qui aidera notre skieuse amputée à améliorer ses temps.

Après plusieurs itérations, voici le design final :

Prothèse V4.2, rendu dans Fusion 360

Prothèse V4.2, rendu dans Fusion 360

En gardant la même idée, je suis passé sur un design qui intègre un amortisseur à air. Celui ci nous permet toujours une large gamme de réglages et contribue à la performance de l’athlète.

J’ai aussi créé un programme qui simule la réponse de l’amortisseur que nous avons monté en fonction de tous les facteurs sur lesquelles nous pouvions avoir une influence :

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

# Paramètres physiques
masse = 55  # Masse en kg 
raideur_initiale = 15000  # Raideur initiale du ressort en N/m
amortissement = 1500  # Coefficient d'amortissement en Ns/m
deplacement_initial = 0.01  # Déplacement initial en m (le choc initial, ici un choc de 1cm)
vitesse_initiale = 0  # Vitesse initiale en m/s (au repos)
alpha = 5  # Facteur de non-linéarité pour la raideur
bras_levier = 10  # Rapport entre déplacement de la jambe et de l'amortisseur

# Fonction pour la raideur non linéaire
def raideur_nonlineaire(deplacement):
    return raideur_initiale * (1 + alpha * (deplacement ** 2))

# Fonction pour l'équation différentielle
def amortisseur_nonlineaire(t, y):
    deplacement, vitesse = y
    k = raideur_nonlineaire(deplacement)  # Calcul de la raideur pour la compression actuelle
    acceleration = -(k / masse) * (deplacement * bras_levier) - (amortissement / masse) * vitesse
    return [vitesse, acceleration]

# Conditions initiales
y0 = [deplacement_initial, vitesse_initiale]

# Résolution de l'EDO
temps = (0, 1)  # Simulation sur 1 secondes
solution = solve_ivp(amortisseur_nonlineaire, temps, y0, t_eval=np.linspace(0, 1, 10000))

# Récupération des résultats
temps_simule = solution.t
deplacement = solution.y[0]

# Tracé des oscillations
plt.figure()
plt.plot(temps_simule, deplacement, label="Déplacement (m)")
plt.title("Oscillations d'un amortisseur avec raideur non linéaire")
plt.xlabel("Temps (s)")
plt.ylabel("Déplacement (m)")
plt.grid()
plt.legend()
plt.show()

# Tentative pour ajouter le debattement, je suis pas certain que ça veuille dire qqch

# Définir le débattement maximal (course maximale de l'amortisseur)
debattement_max = 0.05  # 50mm

# Fonction pour la raideur non linéaire avec contrainte de débattement
def raideur_nonlineaire_contrainte(deplacement):
    if abs(deplacement * bras_levier) >= debattement_max:
        # Simuler une butée mécanique (raideur infinie ou très élevée quand on arrive au fond)
        return 1e6  # Raideur très élevée (butée)
    else:
        # Raideur classique non linéaire
        return raideur_initiale * (1 + alpha * (deplacement ** 2))

# Modifier l'équation différentielle pour inclure la nouvelle raideur
def amortisseur_avec_butee(t, y):
    deplacement, vitesse = y
    k = raideur_nonlineaire_contrainte(deplacement)  # Raideur avec contrainte
    acceleration = -(k / masse) * deplacement - (amortissement / masse) * vitesse
    return [vitesse, acceleration]

# Simulation avec cette nouvelle fonction
solution = solve_ivp(amortisseur_avec_butee, temps, y0, t_eval=np.linspace(0, 1, 10000))

# Tracé
temps_simule = solution.t
deplacement = solution.y[0]

plt.figure()
plt.plot(temps_simule, deplacement, label="Déplacement (m)")
plt.title("Oscillations AVEC Butée fin de course + non linéaire")
plt.xlabel("Temps (s)")
plt.ylabel("Déplacement (m)")
plt.grid()
plt.legend()
plt.show()

Réponse de l’amortisseur

Réponse de l’amortisseur