Séance 14 · Partie B · Algorithmique et maths
Vecteurs et
trigonométrie.
« Avance de 30 cm, tourne de 45°, avance de 20 cm. » Où est le robot ? Pour répondre, il faut les maths du déplacement : coordonnées, angles, vecteurs, rotations. Vous les apprendrez ici avant de les voir au lycée.
Durée : 2 séances · Objectifs : repère et coordonnées, vecteurs (somme, norme, produit scalaire), sinus/cosinus/atan2, rotation, odométrie d’un robot, un peu de cinématique inverse.
Ce que vous saurez faire à la fin
- Calculer la position d’un robot après une suite de déplacements.
- Trouver l’angle vers une cible et la distance qui la sépare.
- Faire tourner un point, un vecteur, une forme.
- Comprendre comment un robot à deux roues estime sa position.
Pas de prérequis en trigonométrie : tout est introduit par le cercle et vérifié par le code.
01 / Repère
Un point, c’est deux nombres
Convention pour tout le cours :
- x vers la droite (est), y vers le haut (nord).
- Unité : le centimètre.
- Un angle se mesure depuis l’axe x, dans le sens anti-horaire (trigonométrique).
Attention : sur un écran, y va vers le bas. Sur une carte, vers le haut. Une inversion de signe classique.
Pythagore, d’où ça vient
Le déplacement de p à q se décompose en dx horizontal et dy vertical, perpendiculaires. La distance est l’hypoténuse. d² = dx² + dy². La fonction hypot est plus sûre que sqrt(dx*dx + dy*dy) pour les très grands ou très petits nombres (pas de débordement intermédiaire).
01 / Repère
Un vecteur, c’est un déplacement
Point ou vecteur ?
Les deux sont des couples de nombres, mais le sens diffère : un point est une position, un vecteur est un déplacement. Point + vecteur = point. Point − point = vecteur. On ne fait pas point + point. Cette distinction évite beaucoup d’erreurs ; en séance 16 on en fera deux classes différentes. Le vecteur unitaire (norme 1) donne « la direction sans la longueur » : très utile pour dire « avance de k cm vers là ».
02 / Angles
Le cercle : cosinus et sinus sont des coordonnées
Prenez le cercle de rayon 1. Le point à l’angle θ a pour coordonnées (cos θ, sin θ). C’est la définition.
- θ = 0° : (1, 0), vers l’est.
- θ = 90° : (0, 1), vers le nord.
- cos² + sin² = 1 : Pythagore sur le cercle.
Pour un rayon r : (r cos θ, r sin θ). « Avancer de r dans la direction θ » se traduit directement.
Degrés et radians
Le radian est la « vraie » unité : un tour = 2π. Les fonctions cos, sin attendent des radians ; math.radians et math.degrees convertissent. Les 10⁻¹⁶ dans les résultats (cos 90° ≈ 6e-17 au lieu de 0) sont les erreurs de flottants de la séance 13 : comparez avec isclose.
02 / Angles
Dans l’autre sens : quel angle vers la cible ? atan2
atan2(y, x) : l’ordre des arguments
y d’abord, x ensuite. C’est la convention de tous les langages (C, Java, JavaScript…). atan2 regarde les signes des deux pour choisir le bon quadrant et gère x = 0. La fonction normaliser_angle est indispensable : la différence entre 350° et 10° est 20°, pas 340°. Un robot qui l’oublie fait un tour presque complet pour rien.
02 / Angles
Rotation d’un point autour de l’origine
D’où vient la formule
Le point (x, y) est à distance r et angle α : x = r cos α, y = r sin α. Après rotation de θ, il est à l’angle α + θ. Les formules d’addition cos(α+θ) = cos α cos θ − sin α sin θ et sin(α+θ) = sin α cos θ + cos α sin θ donnent x' = x cos θ − y sin θ et y' = x sin θ + y cos θ. En prépa, vous écrirez cela sous forme de matrice 2×2 ; le calcul est identique. C’est aussi ce que fait * sur les nombres complexes : (x + iy)·e^(iθ).
03 / Produit scalaire
Mesurer un angle entre deux vecteurs sans atan2
La formule et son sens
u·v = |u|·|v|·cos(angle). Si les vecteurs pointent dans le même sens, cos = 1 et le produit est maximal ; perpendiculaires, il est nul ; opposés, négatif. C’est l’outil pour répondre à « est-ce devant moi ? », « quelle part de cette force agit dans cette direction ? ». Le produit scalaire est au cœur de la physique (travail d’une force), de l’infographie (éclairage) et des réseaux de neurones (similarité). Le max(-1, min(1, c)) évite qu’un 1.0000000002 dû aux flottants ne fasse planter acos.
04 / Odométrie
Où est le robot ? Suivre ses propres pas
Odométrie
Estimer sa position en cumulant ses déplacements s’appelle l’odométrie (du grec « mesure du chemin »). C’est ce que fait tout robot mobile avec ses encodeurs de roue. Problème : chaque petite erreur (une roue qui patine, un angle mal mesuré) s’accumule et n’est jamais corrigée. Après 10 mètres, le robot peut se croire à 30 cm de sa vraie position. D’où le besoin de recalage par d’autres capteurs (GPS, caméra, lidar) : la fusion de capteurs, un domaine de recherche entier.
04 / Odométrie
Le robot à deux roues : cinématique différentielle
Le modèle
Un robot à deux roues motrices (comme un fauteuil roulant ou la plupart des robots de compétition) n’a que deux commandes : la vitesse de chaque roue. Même vitesse : tout droit. Vitesses différentes : arc de cercle dont le rayon dépend de la différence. Sens opposés : rotation sur place. Les formules ci-dessus (modèle unicycle) seront celles de votre robot en partie E. Remarquez qu’on ne peut pas se déplacer latéralement : c’est une contrainte non holonome, la raison pour laquelle créneau est difficile.
04 / Odométrie
Aller vers une cible : la boucle « viser-avancer »
Un premier contrôleur
À chaque pas : calculer l’angle voulu, l’erreur par rapport au cap, corriger (avec une limite de rotation), avancer. Cette boucle est un contrôleur proportionnel rudimentaire, l’ancêtre du PID de la séance 29. Essayez avec rot_max=5 : la trajectoire devient une courbe. Ajoutez un obstacle : que faire ? C’est la séance 28.
05 / Défis
Défi ★ — Le polygone régulier et la boussole
Consigne
1. Avec les fonctions avancer/tourner de l’odométrie, faire parcourir au robot un hexagone régulier de côté 10 et vérifier qu’il revient au départ. Quel angle à chaque sommet ? Généraliser à n côtés.
2. point_cardinal(angle) : renvoie « N », « NE », « E »… selon l’angle (8 secteurs de 45°, N = 90°).
Correction
def point_cardinal(angle):
noms = ["E", "NE", "N", "NO", "O", "SO", "S", "SE"]
secteur = round(angle / 45) % 8
return noms[secteur]Pour le polygone : angle extérieur = 360/n. Un hexagone : tourner de 60° à chaque sommet. round(angle / 45) choisit le secteur le plus proche ; le % 8 gère les négatifs et les angles > 360.
05 / Défis
Défi ★★ — Le bras à deux segments (cinématique inverse)
Consigne
Un bras robotique a deux segments de longueurs L₁ = 10 et L₂ = 8, articulés par deux moteurs d’angles θ₁ (épaule, par rapport à l’horizontale) et θ₂ (coude, par rapport au premier segment).
1. Cinématique directe : position_main(t1, t2) renvoie (x, y) du bout du bras.
2. Cinématique inverse : angles_pour(x, y) renvoie (θ₁, θ₂) pour atteindre (x, y), ou None si c’est hors de portée. Indice : loi des cosinus, cos θ₂ = (x² + y² − L₁² − L₂²) / (2 L₁ L₂).
3. Vérifier l’aller-retour sur 100 points aléatoires atteignables.
Correction
def position_main(t1, t2):
a1 = math.radians(t1)
a2 = math.radians(t1 + t2)
return (L1 * math.cos(a1) + L2 * math.cos(a2), L1 * math.sin(a1) + L2 * math.sin(a2))
def angles_pour(x, y):
d2 = x * x + y * y
c2 = (d2 - L1 * L1 - L2 * L2) / (2 * L1 * L2)
if not -1 <= c2 <= 1:
return None # hors de portée
t2 = math.acos(c2) # solution « coude vers le haut »
t1 = math.atan2(y, x) - math.atan2(L2 * math.sin(t2), L1 + L2 * math.cos(t2))
return math.degrees(t1), math.degrees(t2)
for _ in range(100):
t1, t2 = random.uniform(-180, 180), random.uniform(0, 180)
x, y = position_main(t1, t2)
sol = angles_pour(x, y)
x2, y2 = position_main(*sol)
assert math.isclose(x, x2, abs_tol=1e-9) and math.isclose(y, y2, abs_tol=1e-9)
print("OK")La cinématique inverse a en général deux solutions (coude en haut / en bas), parfois aucune (trop loin, ou trop près si L₁ ≠ L₂). Pour un bras à 6 axes, c’est un vrai problème de recherche. Le test vérifie la position et non les angles : le second choix de coude donne d’autres angles pour la même position.
05 / Défis
Défi ★★★ — Esprit prépa : odométrie bruitée et dérive
Consigne
Le robot parcourt 20 fois un carré de côté 100 cm. À chaque pas de 10 cm, la distance réelle est bruitée de ±2 % (gaussien) et chaque rotation de 90° est bruitée de ±1°. Simuler 1000 fois ce parcours avec random.gauss et mesurer, à la fin, la distance entre la position estimée (sans bruit) et la position « réelle » (avec bruit).
1. Afficher la moyenne et l’écart-type de cette erreur finale.
2. Comment l’erreur croît-elle avec le nombre de tours ? (Tester 1, 5, 20, 50 tours.) Est-ce linéaire ? En racine ?
3. Que se passe-t-il si le bruit de rotation est biaisé (toujours +1° au lieu de ±1°) ?
Correction et ouverture
def parcours(tours, sigma_d=0.02, sigma_a=1.0, biais_a=0.0):
x = y = 0.0; cap = 0.0
for _ in range(tours):
for _ in range(4):
for _ in range(10):
d = 10 * (1 + random.gauss(0, sigma_d))
x += d * math.cos(math.radians(cap)); y += d * math.sin(math.radians(cap))
cap += 90 + random.gauss(biais_a, sigma_a)
return math.hypot(x, y) # la position idéale est (0, 0)
for tours in (1, 5, 20, 50):
err = [parcours(tours) for _ in range(300)]
print(f"{tours:2} tours : erreur moyenne {statistics.mean(err):6.1f} cm, écart-type {statistics.stdev(err):6.1f}")
print("biais +1° :", statistics.mean(parcours(20, biais_a=1.0) for _ in range(300)))L’erreur croît environ comme √(nombre de pas) pour un bruit centré (marche aléatoire : les erreurs se compensent partiellement) mais linéairement avec un biais (elles s’additionnent). D’où l’importance de calibrer un robot (mesurer et corriger le biais) avant de se soucier du bruit. Ce résultat — √n pour le bruit, n pour le biais — est fondamental en métrologie et en physique statistique ; vous le démontrerez en prépa avec la variance d’une somme de variables indépendantes.
06 / Vérification
Quel angle pour la direction (−1, −1) ?
Deux questions supplémentaires
1. Que conserve une rotation ? Les distances et les angles ; donc les normes et les produits scalaires.
2. Pourquoi normaliser un angle dans ]−180, 180] ? Pour que « l’erreur de cap » soit le plus petit tour à faire, jamais plus d’un demi-tour.
Référence
Les mots à retenir
| Mot | Définition |
|---|---|
| Vecteur | Déplacement (dx, dy) ; s’additionne, se multiplie par un nombre. |
| Norme | Longueur d’un vecteur : √(dx² + dy²). |
| (cos θ, sin θ) | Point du cercle unité à l’angle θ. |
atan2(y, x) | Angle du vecteur (x, y), bon quadrant. |
| Produit scalaire | u·v = |u||v| cos(angle) ; nul si perpendiculaires. |
| Odométrie | Estimation de position par cumul des déplacements. |
| Cinématique inverse | Trouver les angles des moteurs pour une position voulue. |
Pour continuer
Vous savez où est le robot
Mais un robot a une masse, une vitesse, une inertie. Séance suivante : simuler la physique, pas de temps par pas de temps.
À faire chez soi
- Programmer une « tortue » qui trace un cercle par petits segments (avance 1, tourne 1°) et mesurer le périmètre obtenu. Comparer à 2πr.
- Écrire
reflexion(v, normale): le vecteur v réfléchi sur un mur de normale n (formule : v − 2(v·n)n). Faire rebondir une balle dans une boîte. - Sur votre PC, dessiner la trajectoire de
aller_versavec matplotlib.