PYTHON → ROBOTIQUE · 15

Séance 15 · Partie B · Algorithmique et maths

Simulation
physique.

Avant de construire un robot, on le simule. Avant de lancer une fusée, on la simule. La méthode tient en une phrase : « la position dans un instant = la position maintenant + la vitesse × l’instant ».

Durée : 2 séances · Objectifs : vitesse et accélération comme taux de variation, méthode d’Euler, pas de temps, chute libre, frottements, rebonds, un robot qui freine, ressort et oscillations.

Ce que vous saurez faire à la fin
  • Simuler n’importe quel mouvement dont on connaît l’accélération.
  • Choisir un pas de temps et comprendre son effet sur la précision.
  • Comparer une simulation à la formule exacte quand elle existe.
  • Simuler un robot avec inertie, ce qui explique pourquoi il dépasse sa cible.

Physique de collège suffisante : vitesse = distance / temps. Le reste est construit ici.

01 / Euler

Vitesse constante : le mouvement le plus simple

À vitesse v pendant dt, on avance de v × dt.

C’est exact ici, quel que soit dt, parce que v ne change pas.

Toute la simulation physique consiste à répéter cette ligne, avec une vitesse qui change.

01 / Euler

Accélération : la vitesse change aussi

La méthode d’Euler

L’accélération est le taux de variation de la vitesse, comme la vitesse est celui de la position. Deux lignes, dans cet ordre : mettre à jour v avec a, puis x avec v. C’est la méthode d’Euler (1768), la plus simple des méthodes d’intégration numérique. Elle est approchée : entre deux pas, on suppose la vitesse constante alors qu’elle change. L’erreur diminue avec dt. En prépa, vous apprendrez que cette méthode résout des équations différentielles, et que cette version « v d’abord, puis x » (Euler semi-implicite) est bien meilleure que « x d’abord » pour la physique.

01 / Euler

Le pas de temps : précision contre coût

Lire le tableau

Diviser dt par 10 divise l’erreur par 10 environ : Euler est d’ordre 1. Mais cela multiplie le nombre de pas par 10. Pour un jeu vidéo à 60 images/s, dt = 1/60 suffit. Pour une trajectoire de sonde spatiale, on utilise des méthodes d’ordre 4 (Runge-Kutta) qui divisent l’erreur par 10 000 quand dt est divisé par 10. Un robot réel a un pas de temps imposé : celui de sa boucle de contrôle (souvent 10 à 100 ms).

02 / Forces

Les forces s’ajoutent : frottement de l’air

Newton en une ligne

a = F / m : l’accélération est la somme des forces divisée par la masse. Le simulateur n’a pas besoin de connaître la trajectoire, seulement les forces à chaque instant. Ajoutez une force, la trajectoire change toute seule. La vitesse limite est atteinte quand le frottement compense le poids : un parachutiste tombe à 200 km/h sans parachute, 20 km/h avec. Le v * abs(v) donne un signe correct dans les deux sens (frottement quadratique).

02 / Forces

En deux dimensions : le tir balistique

Ce que la simulation révèle

Sans frottement, 45° est optimal et 30° donne la même portée que 60° (symétrie, formule v₀² sin(2α)/g). Avec frottement, l’angle optimal descend vers 35–40°, et il n’existe aucune formule fermée : la simulation est le seul moyen d’obtenir ce résultat. C’est le cas de presque tous les problèmes réels. On a utilisé max(range, key=...) pour chercher le meilleur angle par force brute : 40 simulations, instantané.

02 / Forces

Rebonds : gérer un événement

Une suite géométrique cachée

Chaque rebond multiplie la vitesse par e, donc la hauteur par e² et la durée du vol par e. Les intervalles forment une suite géométrique de raison e = 0,8 : la simulation le retrouve à 1 % près. Somme des intervalles = durée totale avant l’arrêt = finie, bien qu’il y ait une infinité de rebonds (série géométrique, prépa). Le test if y < 0 détecte un événement : un robot qui touche un mur, un bouton pressé. La gestion d’événements dans une boucle à pas fixe est une compétence centrale.

03 / Robot

Un robot n’est pas un point : il a de l’inertie

Le dépassement

Couper les moteurs à la cible ne suffit pas : le robot a une vitesse, et le frottement met du temps à l’arrêter. Il dépasse. Un vrai robot doit anticiper : freiner avant. Le contrôleur est la fonction commande : elle lit l’état (x, v) et décide de la force. Toute la partie E consiste à écrire de bonnes fonctions commande.

03 / Robot

Un contrôleur proportionnel : freiner en approchant

Trois comportements

kp faible : pas de dépassement mais lent. kp fort : rapide mais oscille autour de la cible. Ajouter un terme en −kd·v (freiner d’autant plus qu’on va vite) supprime l’oscillation : c’est un contrôleur PD. Il manque un « I » pour compenser une erreur qui persiste (une pente, par exemple) : ce sera le PID complet de la séance 29. Vous venez de simuler en 30 lignes ce que fait un drone pour tenir sa position.

03 / Robot

Le ressort : quand la physique oscille toute seule

Pourquoi l’énergie est (presque) conservée

Un ressort sans frottement oscille éternellement : l’énergie passe de la forme « ressort tendu » à « masse en mouvement » et retour. Avec Euler « x d’abord », l’énergie augmenterait à chaque tour et la simulation exploserait. Avec « v d’abord » (ce qu’on fait ici), elle reste bornée : c’est une méthode symplectique, découverte bien après Euler, et c’est celle des simulateurs de systèmes solaires. Un accéléromètre ou une suspension de voiture sont des masses-ressorts ; les vibrations d’un robot aussi.

04 / Défis

Défi ★ — Le freinage d’urgence

Consigne

Un robot roule à 1,5 m/s. Un obstacle apparaît à 1 m. Ses moteurs peuvent produire une force de freinage de 3 N pour une masse de 2 kg, mais le freinage ne commence qu’après un temps de réaction de 0,1 s. Simuler et dire s’il percute l’obstacle, et à quelle vitesse. Quelle distance minimale de détection faut-il pour s’arrêter à temps ? (Chercher par essais successifs, puis avec une dichotomie sur la distance.)

Correction
def percute(distance, v0=1.5, f=3.0, m=2.0, reaction=0.1):
    x, v, t = 0.0, v0, 0.0
    while v > 0:
        a = -f / m if t >= reaction else 0.0
        v = max(0.0, v + a * dt)
        x += v * dt
        t += dt
        if x >= distance:
            return v
    return 0.0

print("Obstacle à 1 m   :", round(percute(1.0), 2), "m/s à l'impact (0 = arrêt avant)")
print("Obstacle à 0.8 m :", round(percute(0.8), 2), "m/s à l'impact")
bas, haut = 0.0, 5.0
while haut - bas > 0.001:
    mil = (bas + haut) / 2
    if percute(mil) > 0: bas = mil
    else: haut = mil
print("Distance de détection minimale :", round(haut, 3), "m")
print("Formule : v0*réaction + v0²/(2a) =", round(1.5 * 0.1 + 1.5 ** 2 / (2 * 1.5), 3))

À 1 m, le robot s’arrête juste avant l’obstacle (à 10 cm) ; à 0,8 m il le percute à ≈ 0,55 m/s. Distance minimale ≈ 0,9 m. La dichotomie sur une simulation est un outil puissant : on ne sait pas inverser la simulation, mais on sait chercher. Ici une formule existe (distance de réaction + distance de freinage) et confirme.

04 / Défis

Défi ★★ — Orbite

Consigne

Un satellite subit l’attraction de la Terre : accélération de norme GM/r² dirigée vers le centre (GM = 3,986 × 10¹⁴ m³/s²). Le placer à r = 7000 km avec une vitesse tangentielle v. Simuler 2 heures avec dt = 1 s.

1. Pour quelle v l’orbite est-elle circulaire (r reste constant à 0,1 % près) ? Formule : v = √(GM/r).
2. Avec v × 1,2 : l’orbite devient une ellipse. Mesurer le rayon maximal.
3. Avec v × 1,5 : le satellite revient-il ? (Vitesse de libération : v × √2.)

Correction
def orbite(v0, duree=7200):
    x, y = r0, 0.0
    vx, vy = 0.0, v0
    r_min = r_max = r0
    for _ in range(int(duree / dt)):
        r = math.hypot(x, y)
        a = -GM / r ** 3                  # a_x = -GM x / r³ : vecteur vers le centre
        vx += a * x * dt; vy += a * y * dt
        x += vx * dt; y += vy * dt
        r_min, r_max = min(r_min, r), max(r_max, r)
    return r_min / 1000, r_max / 1000

for facteur in (1.0, 1.2, 1.5):
    print(facteur, [round(r) for r in orbite(v_circ * facteur)])

À v circulaire, r reste à 7000 km (± quelques km : l’erreur d’Euler). À 1,2 v, l’apogée monte à 18 000 km. À 1,5 v > √2 v, le satellite ne revient pas. Vous venez de reproduire les lois de Kepler et l’orbite de l’ISS avec 15 lignes. Remarquez -GM / r³ multiplié par x et y : c’est la façon élégante d’écrire un vecteur de norme GM/r² pointant vers le centre.

04 / Défis

Défi ★★★ — Esprit prépa : le pendule et la limite des petits angles

Consigne

Un pendule de longueur L = 1 m obéit à θ'' = −(g/L) sin θ. Au collège et au lycée on approxime sin θ ≈ θ (petits angles) et on obtient une période T₀ = 2π√(L/g), indépendante de l’amplitude.

1. Simuler le pendule exact (avec sin) pour des amplitudes de 5°, 30°, 90°, 170° et mesurer la période.
2. Tracer (en texte) le rapport T/T₀ en fonction de l’amplitude. À partir de quel angle l’approximation est-elle fausse de plus de 1 % ?
3. Que se passe-t-il pour une amplitude de 179,9° ? Et si on donne une vitesse initiale suffisante pour passer par-dessus ?

Correction et ouverture
def periode(theta0_deg):
    theta = math.radians(theta0_deg)
    omega = 0.0
    t = 0.0
    passages = []
    while len(passages) < 3 and t < 60:
        alpha = -(g / L) * math.sin(theta)
        omega += alpha * dt
        theta_avant = theta
        theta += omega * dt
        t += dt
        if theta_avant > 0 >= theta:        # passage descendant par 0
            passages.append(t)
    return passages[2] - passages[1]

T0 = 2 * math.pi * math.sqrt(L / g)
print("T0 =", round(T0, 4))
for a in (5, 30, 60, 90, 120, 150, 170):
    T = periode(a)
    print(f"{a:4}° : T = {T:.4f}  T/T0 = {T / T0:.4f}  " + "#" * int(40 * (T / T0 - 1)))

T/T₀ vaut 1,0005 à 5°, 1,017 à 30°, 1,18 à 90°, 2,4 à 170°. L’approximation dépasse 1 % d’erreur vers 23°. À 179,9°, la période devient énorme : le pendule reste longtemps quasi immobile en haut (équilibre instable). Avec assez de vitesse, il tourne : le mouvement n’est plus périodique au même sens. La période exacte fait intervenir une intégrale elliptique sans formule fermée : la simulation est ici plus puissante que le calcul. Ce problème est un classique d’oral de l’X.

05 / Vérification

Quel est l’ordre correct des mises à jour à chaque pas ?

Deux questions supplémentaires

1. Si on divise dt par 2, que devient l’erreur d’Euler ? Divisée par 2 environ (ordre 1).

2. Pourquoi le robot dépasse-t-il sa cible avec la commande naïve ? Parce qu’il a une vitesse au moment où on coupe les moteurs, et que l’arrêt prend du temps : il faut freiner avant.

Référence

Les mots à retenir

MotDéfinition
Pas de temps dtIntervalle entre deux mises à jour.
Méthode d’Eulerv += a·dt ; x += v·dt.
Ordre d’une méthodeComment l’erreur décroît quand dt diminue.
a = F / mDeuxième loi de Newton.
ÉvénementCondition testée à chaque pas (sol, mur, cible).
ContrôleurFonction qui calcule la commande à partir de l’état.
DépassementAller au-delà de la cible à cause de l’inertie.

Pour continuer

Vous savez simuler le réel

Les simulations deviennent longues : état, forces, contrôleur, trace… Il est temps d’organiser tout cela en objets. Dernière séance de la partie B.

À faire chez soi

← Séance 14SommaireSéance 16 : Programmation orientée objet →