Algorithme de cinématique inverse appliqué à Poppy - Inverse Kinematic algorithm applied to Poppy


#1

Bonjour,

Je suis élève en école d’ingénieur et dans le cadre d’un stage à l’ENSAM de Bordeaux, j’ai travaillé ces deux dernières semaines sur la cinématique inverse de Poppy. Je ai mis en place un algorithme d’inversion cinématique basé sur une méthode itérative dite de Jacobi. J’ai vu sur différents posts (cf. Poppy at Arts et Métiers ; Cinématique Inverse Bras de Poppy) que cette méthode n’a apriori pas encore été mise en place. Je me suis dis que ce travail pourrait intéresser la communauté :blush:

Je suis en train de rédiger un document qui synthétise les problématiques de cette étude et explique pas à pas la méthode de résolution qui peut s’appliquer aussi bien au bras, à la jambe ou d’autres ensembles articulés de Poppy. Une première version est disponible ci-dessous (la partie application au bras de Poppy est en cours de rédaction).

Cinematique inverse Poppy.pdf (2.7 MB)

Pour vérifier le fonctionnement de la méthode, j’ai appliqué cet algorithme à la cinématique du bras de Poppy (ensemble de 4 servomoteurs) que j’ai modélisé sur un logiciel de calcul formel (Mathématica). Voici une petite vidéo pour montrer succinctement le contrôle de la position de la main de Poppy (coordonnées x, y, z) dans le repère du buste grâce à cet algorithme.

Chaque élément cinématiquement indépendant est représenté avec une couleur différente. La main de Poppy se trouve au bout de l’avant-bras représenté en noir.

Maintenant que j’ai terminé de vérifier le fonctionnement de l’algorithme, je vais me lancer sur l’implémentation en Python de cette méthode pour l’essayer sur l’environnement de simulation de Poppy (Vrep, etc.) puis peut-être sur le robot réel.

@Matthieu Je ne sais pas qui s’intéresse plus en particulier à la cinématique inverse de Poppy, si jamais tu as des personnes à m’indiquer ? Pour l’essai sur un Poppy réel, je n’ai plus accès à celui de l’ENSAM car le labo est fermé jusque mi-août, serait-il possible de venir essayer le code Python sur un Poppy de l’INRIA quand je l’aurai fini ?

Je vous tiens au courant de l’avancement, si vous avez des questions ou des critiques/commentaires n’hésitez pas !


#2

Bonnour Xavier,

je m’intéresse aussi beaucoup à cette problématique de la cinématique inverse. J’ai lu ton document qui est bien fait et qui trace bien ton approche. Je n’avais pas réfléchi à inverser la Jacobienne de la cinématique directe. As-tu essayé de demander à ton robot d’aller dans les “singularités” ? Par exemple, d’avoir le bras tendu (le servo moteur 4 à 180deg). La Jacobienne est du coup mal conditionnée et son inversion risque de poser problème (dans le cas du robot, il bouge son coude dans tous les sens).
Je pense que tu dois parler de cette problématique aussi dans ton doc. Je pense qu’il y a moyen de supprimer les bons degrés de liberté (en les figeant) pour arriver à inverser la Jacobienne.

Pour éviter ces problèmes, mon approche est de passer par l’optimisation. C’est à dire d’utiliser des algorithmes d’optimisation pour avoir le meilleur vecteur q qui satisfasse aux contraintes.
L’avantage est que je n’inverse pas la jacobienne. Par itérations successives, je fais q[n+1] = q[n]-K*Jacobienne.
La petite différence ici est que la jacobienne est celle d’une fonction de coût. Le coût peut être proportionnel entre x et x final.


#3

Tu peut venir tester ton algo quand tu veut!

Au labo nous avons un autre stagiaire, @joelortiz, qui a développé la cinématique inverse d’un bras de poppy dans le cadre de l’utilisation de ce bras en tant que prothèse.

Peut être qu’a vous 3 (@joelortiz, @Thot, @Xavier_Mariot) vous devriez ouvrir un dépot commun afin de faire un programme d’IK officiel pour Poppy !


#4

Bonjour Xavier,

Ce genre de travail est effectivement très utile pour les futures manipulations du robot. A propos de l’implémentation en Python, j’ai vu un fichier kinematics.py dans le répertoire racine de pypot https://github.com/poppy-project/pypot/blob/master/pypot/kinematics.py
Je sais pas trop ce que fait le code mais il y a des histoires de matrice Jacobiennes.


#5

C’est en fait un des premiers problèmes que j’ai rencontré en testant l’algorithme sur le logiciel de calcul formel car j’avais pris comme position initiale le bras tendu complètement à l’horizontale cf. schéma cinématique ci-dessous.

En fait, si l’on définit un volume dans l’espace qui représente l’ensemble des positions que peut atteindre la main de Poppy, ce problème se pose sur les surfaces de ce volume c.à.d. les limites de ce que peut réaliser géométriquement le bras.

Concrètement dans le formalisme mathématique que j’utilise dans la résolution cela se traduit par le fait que la pseudo-inverse de la jacobienne J ne peut plus être calculée par la formule présentée dans le document (la matrice J*Jt n’est pas inversible localement) et ce sur l’ensemble des surfaces de ce volume. Ce problème est résolu en faisant légèrement varier la position du bras de manière aléatoire ce qui rend à nouveau la Jacobienne numériquement inversible.

Par ailleurs comme dans l’algorithme la position finale du bras est demandée avec une tolérance (notée IT dans le document) sur la position finale qui permet d’arrêter l’algorithme une fois cette tolérance respectée, les positions limites ne sont jamais exactement atteintes et la stratégie précédente permet à l’algorithme d’aboutir même si lors d’une itération il tombe “malencontreusement” dessus.

Je l’explique succinctement dans le document (cf. page 8 paragraphe 2) ; je vais étoffer ce paragraphe et détaillerai plus le problème dans le deuxième chapitre appliqué au bras de Poppy pour que ce soit plus clair :wink:

Par contre, une chose que l’algorithme ne prend pas encore en compte est si l’on demande une position que le bras ne peut techniquement pas atteindre c.à.d. en dehors du volume défini par les positions possibles du bras. L’algorithme s’arrête parce que j’ai défini un nombre d’itérations de calcul maximum mais la réponse est nécessairement aberrante… Je n’ai pas encore trouvé d’outil qui permette de caractériser systématiquement le volume des positions possibles à partir d’une fonction quelconque de cinématique directe. Si quelqu’un a des infos sur de tels outils je suis intéressé :smile:
Pour le bras on pourrait approximer ce volume par une portion de sphère centrée autour de l’épaule.

@Thot Est ce que tu aurais des liens vers des articles qui expliquent ce genre de méthode ? Ca m’intéresse !

@Nicolas Merci pour l’invitation, je te tiens au courant dès que j’ai quelque chose de testable :wink:

@juju Merci pour l’info, je vais regarder ça pour mon code Python.


#6

Bonjour,

Je reviens vers vous avec l’algorithme codé sous python et une interface console qui permet de contrôler en cinématique inverse le bras gauche de Poppy-Humanoïde sous V-rep. Après quelques difficultées liées au langage (je suis un peu rouillé en python :blush:) cela fonctionne enfin.

Les fonctions qui concernent l’algorithme de cinématique inverse sont applicables à n’importe quel système, même si l’exemple est appliqué au bras de Poppy.
J’utilise les bibliothèques ‘math’ et ‘numpy’ pour l’algorithme de cinématique inverse.

Voici une vidéo montrant le résultat : Poppy simulé sous v-rep commandé à partir d’une console.

Je mettrai à jours le document pdf explicatif dans la semaine qui vient. Voici le code python qui permet d’utiliser les fonctions de cinématique inverse, et de tester le programme exposé dans la vidéo.
kinematics.py (14.0 KB)
Lien github :

C’est la première fois que je publie du “code” donc si vous avez des conseils de rédaction (sur les commentaires incorporés au code, la syntaxe ou autres) je suis preneur :wink:

Je vais continuer à améliorer ce travail. Je vais prochainement ajouter le bras droit et les jambes de Poppy pour pouvoir faire des choses intéressantes ensuite. Pourquoi pas faire marcher Poppy ? :smiley:
Après j’essayerai de faire une interface plus sympa que la console pour commander Poppy si ça peut avoir un intérêt.

Voilà pour le moment, à bientôt.
@Matthieu & @Nicolas : Je déménage lundi prochain de Bordeaux donc ça va être compliqué de venir tester le code sur un vrai poppy à l’INRIA dans le peu de temps qu’il reste. Peut-être Lundi 10 dans la matinée entre 8h et 11h si quelqu’un est là et disponible ? Sinon @JeanLuc l’essayera très probablement fin août à l’ENSAM.


#7

Il n’y a malheureusement pas d’article sur le sujet mais voici un lien vers le fichier que l’on avait fait avec @Manon

J’ai regardé ton fichier, tu calcules la Jacobienne par calcul numérique de la dérivée. Tu verras que dans mon cas, je calcule la jacobienne analytiquement ce qui va beaucoup plus vite (pour 4 degrés de liberté ça se compare mais quand t’en as 25 voire 28 si t’as une centrale inertielle, ça commence à être long)

N’oublie pas le torse, Poppy à un torse de 5 degrés de liberté, il faut en profiter :wink:


#8

c’est interessant mais est-ce que cette cinematique inverse apporte qque chose de plus ?
En fait je pense qu’il faudrait introduire un facteur de qualite dans une cinematique (comme par expemple un facteur de puissance) qui permettrait d’evaluer le cout energie d’un mouvement.
on pourrait imaginer toute sorte de facteur qualite (vitesse , precision, energie) ce qui permettrait d’evaluer ou de choisir la bonne formule de calcul en fonction du resultat recherche.
Par exemple la position des mains pourrait rester la meme dans plusieurs cas, mais celle des bras pourrait etre differente selon que les mains portent quelque chose ou font simplement une activite demandant de la precision…


#9

En effet, on peut minimiser l’énergie dépensée dans le mouvement voire les couples moteurs et c’est souvent comme cela qu’on pense le contrôle optimal. Mais c’est plus une façon de contraindre la géométrie et la dynamique du robot qui est intéressante.
Par exemple, on peut contraindre les mains à une position voulue (pour prendre un objet) et contraindre les coudes à être le plus bas possible, tout en évitant les collisions entre les bras et le tronc.
On peut aussi contraindre les positions des mains en modifiant la forme du tronc articulé, ce qui permet de donner de l’ampleur aux mouvements.
Cela donne de la créativité dans la fonction de contrainte à minimiser.