Activité : déplacer un objet à l'aide d'un bras robotisé


Compétences visées par cette activité :

Résoudre un problème par l'expérimentation. Comparer l'approche par l'expérimentation avec avec l'approche par le calcul. Aborder la robotique et la notion de mouvements dans l'espace. Utiliser des théorèmes de géométrie et calculer des angles.


Lien avec les programmes scolaires, voir :

Pour le collège : http://www.poppy-prof.fr/?page_id=4&id=63
Pour ICN en classe de seconde : http://www.poppy-prof.fr/?page_id=4&id=62

Instancier le bras que l'on appellera mini_dof :

In [1]:
from poppy.creatures import Poppy4dofArmMini
In [2]:
mini_dof = Poppy4dofArmMini(simulator='vrep')

Ajouter un cube a coté du mini_dof :

In [3]:
io = mini_dof._controllers[0].io
name = 'cube'
position = [0, 0, 0] # X, Y, Z
sizes = [0.07, 0.07, 0.07] # in meters
mass = 0.01 # in kg
io.add_cube(name, position, sizes, mass)

L'objectif est d'éloigner le cube le long de l'axe y. L'équipe qui déplace le cube le plus loin gagne !

Première methode, par tatonnement (essais - erreurs) :

La liste des moteurs :

In [4]:
mini_dof.motors
Out[4]:
[<DxlMotor name=m4 id=4 pos=0.0>,
 <DxlMotor name=m1 id=1 pos=-0.0>,
 <DxlMotor name=m3 id=3 pos=-0.0>,
 <DxlMotor name=m2 id=2 pos=0.0>]

La méthode goto_position qui permet de donner un angle entre 0 et 150 à un moteur :

nom_du_robot.nom_du_moteur.goto_position(angle,durée en seconde)
In [5]:
# Le code ci-dessous devrait être écrit par les élèves
# la correction est donnée à titre indicatif


mini_dof.m3.goto_position(90,2,wait='True')

mini_dof.m1.goto_position(90,3,wait='True')

mini_dof.m1.goto_position(-90,3,wait='True')

mini_dof.m3.goto_position(125,3,wait='True')

mini_dof.m2.goto_position(20,3,wait='True')

mini_dof.m4.goto_position(30,3,wait='True')

mini_dof.m4.goto_position(-30,3,wait='True')

mini_dof.m4.goto_position(-40,3,wait='True')

mini_dof.m4.goto_position(-60,3,wait='True')

mini_dof.m2.goto_position(30,3,wait='True')

mini_dof.m2.goto_position(40,3,wait='True')

mini_dof.m3.goto_position(110,3,wait='True')

mini_dof.m2.goto_position(50,3,wait='True')

mini_dof.m3.goto_position(90,3,wait='True')

mini_dof.m2.goto_position(60,3,wait='True')

mini_dof.m3.goto_position(70,3,wait='True')

Pour obtenir votre score, regardons les coordonnées du cube sur l'axe y :

In [6]:
d = io.get_object_position('cube')
dy = d[1]*100
print "La déplacement du cube sur l'axe y a été de %.2f cm" % dy
La déplacement du cube sur l'axe y a été de 4.52 cm

recommencer la simulation :

In [7]:
mini_dof.close()
In [8]:
mini_dof = Poppy4dofArmMini(simulator='vrep')

Seconde méthode, par le calcul :

Replacer le cube :

In [9]:
name = 'cube'
position = [0, 0, 0] # X, Y, Z
sizes = [0.07, 0.07, 0.07] # in meters
mass = 0.001 # in kg
io.add_cube(name, position, sizes, mass)

Analyser la figure suivante pour trouver directement les angles de départ des moteurs (notez bien que les bras du robot forment un triangle équilatéral) :

mini_dof

In [10]:
# Le code ci-dessous devrait être écrit par les élèves
# la correction est donnée à titre indicatif

mini_dof.m1.goto_position(-90,4)

mini_dof.m2.goto_position(30,3,)
mini_dof.m3.goto_position(120,3,)
mini_dof.m4.goto_position(-60,3,wait='True')

Calculer les angles finaux pour éloigner au maximum le cube :

In [11]:
# Le code ci-dessous devrait être écrit par les élèves
# la correction est donnée à titre indicatif

mini_dof.m2.goto_position(90,3,)
mini_dof.m3.goto_position(0,3,)
mini_dof.m4.goto_position(0,3,wait='True')

Pour obtenir votre score, regardons les coordonnées du cube sur l'axe y :

In [12]:
d = io.get_object_position('cube')
dy = (d[1])*100
print "La déplacement du cube sur l'axe y a été de %.2f cm" % dy
La déplacement du cube sur l'axe y a été de 8.16 cm
In [13]:
mini_dof.close()

Expérimentations appliquées sur le robot réel

Maintenant, vous pouvez mettre en oeuvre vos programmes sur un véritable mini_dof. Attention, il faut placer le cube à 10cm du bord du support.

In [20]:
mini_dof=Poppy4dofArmMini()

Positionner le robot dans la position de départ, tous les moteurs à zéro.

In [21]:
for m in mini_dof.motors :
    m.compliant=False
    m.goto_position(0,2)

Veillez à bien placer le robot par rapport au cube. C'est à dire dans le même sens que dans le simulateur, avec le cube à 10 cm du bord du support du robot. Il faut également veiller à ce que le support soit immobilisé pour ne pas basculer.

Vous pouvez ensuite recopier le code qui fonctionné dans le simulateur pour le tester avec le vrai robot.

Le code de la méthode par tatonnement :

In [24]:
# Le code ci-dessous devrait être écrit par les élèves
# la correction est donnée à titre indicatif


mini_dof.m3.goto_position(90,2,wait='True')

mini_dof.m1.goto_position(90,3,wait='True')

mini_dof.m1.goto_position(-90,3,wait='True')

mini_dof.m3.goto_position(125,3,wait='True')

mini_dof.m2.goto_position(20,3,wait='True')

mini_dof.m4.goto_position(30,3,wait='True')

mini_dof.m4.goto_position(-30,3,wait='True')

mini_dof.m4.goto_position(-40,3,wait='True')

mini_dof.m4.goto_position(-60,3,wait='True')

mini_dof.m2.goto_position(30,3,wait='True')

mini_dof.m2.goto_position(40,3,wait='True')

mini_dof.m3.goto_position(110,3,wait='True')

mini_dof.m2.goto_position(50,3,wait='True')

mini_dof.m3.goto_position(90,3,wait='True')

mini_dof.m2.goto_position(60,3,wait='True')

mini_dof.m3.goto_position(70,3,wait='True')

Mesurer le déplacement du cube et comparez-le avec l'éloignement obtenu lors de la simulation.

Remettez le robot en position de départ :

In [25]:
for m in mini_dof.motors :
    m.goto_position(0,2)

N'oubliez pas de replacer le cube !

Maintenant avec les angles calculés :

In [22]:
# Le code ci-dessous devrait être écrit par les élèves
# la correction est donnée à titre indicatif



mini_dof.m2.goto_position(30,3,)
mini_dof.m3.goto_position(120,3,)
mini_dof.m4.goto_position(-60,3)
mini_dof.m1.goto_position(-90,4,wait='True')

mini_dof.m2.goto_position(90,3,)
mini_dof.m3.goto_position(0,3,)
mini_dof.m4.goto_position(0,3,wait='True')
In [26]:
mini_dof.close()
In [ ]: