Présentation d'un travail de cinématique 2D avec le robot Poppy Ergo Jr (1ère S)

Ce topic présente le travail de Cinématique 2D par Jérémie Soetens (@jerempoppy), élève de 1èreS participant à l’atelier robotique (lycée Saint Genès, Bordeaux).

##Précision sur son travail

Le but est de prendre un objet posé. Le robot connaît les coordonnées cartésiennes x,y de l’objet. Le programme doit donc calculer les positions des différents moteurs pour placer sa pince en x,y. C’est donc un problème de calcul d’angles à partir des coordonnées cartésiennes. C’est un problème mathématique difficile (dit IK ou cinématique inverse).

L’inverse, calculer x,y connaissant les angles est beaucoup plus facile. Jérémie a donc choisi une voie mathématique faisable pour lui (et pour tous les non spécialistes de l’IK) : calculer des positions x, y en balayant un ensemble de valeurs données pour les angles, et retenir les calculs qui se rapproche le plus des coordonnées x,y désirées (méthode dite de la force brute). Cela représente beaucoup de calculs mais l’ordi est fait pour ça. Les calculs faits par le rapsberry sont d’ailleurs assez rapides et les résultats de Jérémie sont bons. @joel_rivet (son enseignant)

##Une documentation de sa démarche et des équations

Pour pouvoir fonctionner, un robot doit faire appel à un programme pour lui permettre de faire des mouvements. Cependant, pour placer l’extrémité du robot à un point précis, on a besoin d’utiliser ce qu’on appelle la cinématique. Chez les humains c’est quelque chose de complètement innée, tandis que pour un robot, contrairement à ce que l’on peut penser, c’est quelque chose de plus compliqué. Le but du programme est de fournir en entrée les coordonnées d’une position à atteindre, pour ensuite amener l’extrémité du robot à ce point. Nous allons aborder ce qu’on appelle la cinématique directe du robot dans un plan pour ensuite ”l’inverser” et enfin appliquer ce modèle pour notre Poppy Ergo JR.

Table des matières

  1. Cinématique directe
    1.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . … 2
    1.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
    1.3 Généralisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3

  2. Cinématique inverse 3
    2.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
    2.2 Méthode de résolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

  3. Le cas de Poppy Ergo JR 4
    3.1 Le robot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
    3.2 Cinématique directe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
    3.3 Résolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5

Pour voir la suite :
documentation_equation_ Cinématique 2D .pdf (511.0 KB)

##Le code Python

from math import cos, sin, radians, sqrt
from poppy.creatures import PoppyErgoJr

rob = PoppyErgoJr()

#passage en stiff de tout les moteurs
for i in range(1, 7):
    getattr(rob, ("m"+str(i))).compliant = False

#position de depart
rob.goto_position({'m1': 30,'m2': 90,'m3': 0,'m4': -90,'m5': 90,'m6': 60}, 5, wait=True)

#coordonnes a atteindre
X = 20
Y = 10

D = 10
A0 = 0
A2 = 0
for a0 in range(-90, 91):
    for a2 in range(-90, 91):
        x = 9.75*sin(radians(a0)) + 4.75*sin(radians(a0+90)) + 13*sin(radians(a0+90+a2))
        y = 9.75*cos(radians(a0)) + 4.75*cos(radians(a0+90)) + 13*cos(radians(a0+90+a2))
        d = sqrt((X-x)**2 + (Y-y)**2)	
        if d < D:
            A0 = a0
            A2 = a2
            D = d

#verification
print A0, A2, (9.75*sin(radians(A0)) + 4.75*sin(radians(A0+90)) + 13*sin(radians(A0+90+A2))),
print (9.75*cos(radians(A0)) + 4.75*cos(radians(A0+90)) + 13*cos(radians(A0+90+A2)))

#pour le moteur m1, je dois prendre l'angle oppose (d'ou le - devant A0)
#(je ne sais pas pourquoi)
pos = {'m1': -A0,'m2': 90,'m3': 0,'m4': -90,'m5': A2+20,'m6': 60}
rob.goto_position(pos, 3, wait=True)

#repositionement puis fermeture de la pince
rob.m5.goto_position(A2, 2, wait=True)
rob.m6.goto_position(-15, 2, wait=True)

#retour a la position de depart
rob.goto_position({'m1': 30,'m2': 90,'m3': 0,'m4': -90,'m5': 90}, 3, wait=True)

Cinématique_2D_ErgoJr_J_Soetens.py (1.4 KB)

##Une vidéo pour illustrer


@jerempoppy est inscrit sur le forum, donc n’hésitez pas à interagir sur ce topic, il pourra répondre :slight_smile:

9 Likes

Vraiment super : Avec jupyter notebook j’ai juste du changer enfin rajouter print(A0…), parce-que le deuxième print à déjà un parenthèse merci de partager !
Si tu le permets je mettrais cela dans mon github ?
Cordialement Hg

1 Like

En effet, le code est en python 2.7, donc il n’y a pas besoin de parenthèses pour la fonction print, contrairement en python 3.x.
Bien sûr que tu peux le mettre dans ton github !
Cordialement jérémie.

1 Like