Comment trouver les angles qui atteignent une cible ?
La cinématique inverse cherche les angles d’articulation qui amènent la main sur un point donné. C’est le problème d’un bras à qui l’on dit « va là » : il doit en déduire ses angles.
C’est l’inverse de la leçon précédente, et il est plus délicat : il peut y avoir deux réponses, ou aucune.
À la fin de cette leçon
Remarque
Je peux trouver les angles d’un bras à deux articulations qui atteignent une cible.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Cinématique inverse | trouver les angles à partir de la position voulue | |
| Cible | le point que la main doit atteindre | (40, 10) |
| Atteignable | dans la portée du bras | |
| Arc cosinus | la fonction qui retrouve un angle à partir de son cosinus | math.acos |
| Configuration | un jeu d’angles possible pour une même main |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le second angle vient de la distance
Le triangle formé par la base, le coude et la cible a trois côtés connus : L1, L2 et la distance d de la cible. Un seul angle de ce triangle fixe le pli du coude.
On calcule c = (x² + y² - L1² - L2²) / (2 × L1 × L2). Alors t2 vaut plus ou moins l’arc cosinus de c.
Exemple travaillé : la cible (40 ; 10)
| Étape | Calcul | Résultat |
|---|---|---|
| Carré de la distance | 40 × 40 + 10 × 10 | 1700 |
| Carrés des segments | 30 × 30 + 20 × 20 | 1300 |
| Cosinus du pli c | (1700 - 1300) / 1200 | 0,3333 |
| Second angle t2 | arc cosinus de 0,3333 | 70,53 degrés |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le cosinus et le second angle
docker exec jupyter python3 -c "import numpy as np; c=(40**2+10**2-30**2-20**2)/(2*30*20); print(round(c, 4), round(float(np.degrees(np.arccos(c))), 2))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une cible a souvent deux solutions
Le coude peut se plier d’un côté ou de l’autre : t2 positif ou négatif. Dans les deux cas, la main arrive sur la cible.
Pour chaque t2, on déduit t1 : c’est la direction de la cible, moins l’angle que fait le second segment vu de la base. Le code ci-dessous calcule les deux jeux d’angles, puis vérifie la main.
Exemple travaillé : deux jeux d’angles
| Coude | t1 | t2 | Main |
|---|---|---|---|
| Plié vers le haut (t2 positif) | -13,18 | 70,53 | (40 ; 10) |
| Plié vers le bas (t2 négatif) | 41,25 | -70,53 | (40 ; 10) |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Les deux solutions en Python
import math
L1 = 30
L2 = 20
x = 40
y = 10
c = (x * x + y * y - L1 * L1 - L2 * L2) / (2 * L1 * L2)
for signe in [1, -1]:
t2 = signe * math.acos(c)
t1 = math.atan2(y, x) - math.atan2(L2 * math.sin(t2), L1 + L2 * math.cos(t2))
main_x = L1 * math.cos(t1) + L2 * math.cos(t1 + t2)
main_y = L1 * math.sin(t1) + L2 * math.sin(t1 + t2)
print("coude", signe, ":", round(math.degrees(t1), 2), round(math.degrees(t2), 2))
print("main :", round(main_x, 2), round(main_y, 2))
# Passez x à 60 : que se passe-t-il ?
Une cible hors de portée n’a aucune solution
Si la cible est plus loin que L1 plus L2, aucun angle ne l’atteint. Si elle est plus près que la différence des longueurs, non plus.
Dans ces cas, c sort de l’intervalle de -1 à 1, et l’arc cosinus n’existe pas. Il faut tester c avant de le calculer.
La distance des cibles 1 et 2
docker exec jupyter python3 -c "import numpy as np; print(round(float(np.hypot(40, 10)), 2), 30 + 20, round(float(np.hypot(60, 0)), 2))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup appellent math.acos sans vérifier c. Pour une cible trop loin, Python s’arrête avec une erreur de domaine. Testez d’abord que c est entre -1 et 1, sinon répondez que la cible est hors de portée.