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 vecteur Theta).

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