TD7 : Cinématique inverse
Contenu du TD
Cinématique inverse à deux éléments
Commencez par faire un programme qui fait de la cinématique inverse à deux éléments en utilisant les formules vues en cours. Un squelette de programme est fourni (IK2.c) ; il s'occuppe de l'affichage du modèle et de la conversion des coordonnées écran en coordonnées liées au modèle.Ce que vous devez faire: dans les
fonction mouse
et motion
, calculer les
angles du modèle (theta[0]
et theta[1]
) en
fonction des coordonnées où l'utilisateur a cliqué (xp, yp).
Faites attention à ne pas passer trop de temps sur ce premier programme, qui n'est qu'une introduction et qui ne comporte pas de difficultés techniques, et gardez suffisamment de temps pour le coeur du sujet.
Cinématique inverse à N éléments
Faites maintenant un programme de cinématique inverse sur un bras articulé à N éléments. Les paramètres sont les angles des rotations des éléments du bras (N rotations, dont les angles sont rangés dans le vecteurTheta
).
Le squelette de programme (IKn.c) fourni s'occupe de l'affichage du
modèle et de la conversion des coordonnées écran en coordonnées du
modèle. La fonction à écrire est computeCoordinates
.
Le corrigé est en ligne : il
contient à la fois un programme qui marche (IKn
) et trois
versions buggées (IKn_bug1
, IKn_bug2
et IKn_bug3
). Vous pouvez expérimenter avec les versions
buggées, chercher les bugs, et ainsi voir les effets de quelques
changements infimes (à chaque fois, il n'y a qu'une ou deux lignes de
modifiées).
Si vous ne trouvez pas les bugs, utilisez la commande diff
.
Le calcul de la décomposition SVD se fait en utilisant une
librairie (inclue par le Makefile). Si vous le souhaitez, vous
pouvez aussi regarder dans les Numerical
Recipes in C, (sec. 2.6)ou
encore la librairie
LinAlg (très pratique,
elle contient même une fonction pseudoinverse
qui fait
tout le TD, mais elle est écrite en C++).
La fonction essentielle dans la librairie fournie
s'appelle svdcmp
:
void svdcmp(float **a, int m, int n, float w[], float **v);La matrice à décomposer est placée dans
a
(matrice m*n
). Après décomposition, les valeurs
singulières sont dans le vecteur w
, et la
matrice n*n
v
contient V. La matrice U
(matrice m*n
) a été placée dans a, qui est détruite. On a
donc, après appel de svdcmp
:
a = a * diag(w) * v (m,n) = (m,n) * (n,n) * (n,n)Le reste du code est une application directe du cours.
Si vous avez fini avant les autres
- Reprenez le code de skinning que vous avez réalisé pour le TD2, et adaptez-le à ce bras articulé, pour ajouter de la peau au bras.
- Ajoutez les contraintes angulaires : chaque articulation ne peut se plier que sur [-pi/2;pi/2].