Decouverte – Niveau 1 - Python

TP3

Pour commencer votre programme python devra contenir les lignes de code ci-dessous et le logiciel V-REP devra être lancé.

  • Dans V-REP (en haut à gauche) utilise les deux icones flèche pour déplacer la vue et regarder poppy sous tous les angles.
  • Dans notebook, utilise le raccourci 'Ctrl+Enter' pour éxécuter les commandes.
In [ ]:
from poppy.creatures import PoppyTorso
poppy = PoppyTorso(simulator='vrep')

Boucle et memoire

Les dictionnaires

Les dictionnaires varient des listes dans l'accès aux éléments.

Comme nous l'avons vu l'accès aux éléments de la liste se fait grâce à leur numéro d'index.
Pour accéder aux éléments d'un dictionnaire, nous passons par une clé.

Essaies les commandes:

In [ ]:
print "\n------------\nDico :"
dico = {}
for m in poppy.motors: dico[m.name] = m.present_position
print dico

print '\n------------'
print 'Valeur à la clé head_z :', dico['head_z']
print 'Valeur à la clé head_y :', dico['head_y']
print 'Valeur à la clé l_arm_z :', dico['l_arm_z']

print '\n------------\nDico :'
for m in dico:
    print 'cle: ',m
    print 'valeur : ',dico[m]
    print '-'
print 'fin\n-------------'

Ainsi, il suffit de connaitre la clé pour récupérer l'information associée.
Cette information stockée peut-être: du texte, une variable, une liste, un dicitionnaire, etc

Pour récupérer l'ensemble des clés d'un dictionnaire essaies la commande:

In [ ]:
dico = { m.name : m.present_position for m in poppy.motors }
cle = dico.keys()
print cle

compteur = 0
for m in cle:
    compteur = compteur + 1
    print 'clé : ', m
    
print '\nNombre total de clé = ', compteur
print "Nombre d'élément dans la liste 'cle' = ", len(cle)

Boucle while & condition

Essaies les commandes:

In [ ]:
poppy.head_z.goal_position = 0
poppy.head_z.goal_position = 90
poppy.head_z.goal_position = 0
  • Se passe-t-il quelque chose ? oui / non
  • Y-a-t-il un bug ? oui / non
  • les commandes s'éxecutent-t-elles? oui / non
  • trop vite? oui / non

Essaies les commandes:

In [ ]:
import time
poppy.head_z.goal_position = 0
time.sleep(.1)
poppy.head_z.goal_position = 90
time.sleep(.1)
poppy.head_z.goal_position = 0

On comprend mieux ce qu'il se passe: les commandes s'éxecutent trop rapidement pour l'observer.

On voudrait trouver une méthode pour attendre qu'une condition soit remplie ; autrement dit:

Tant que (while) 'attendre' est vrai (True) : (faire), si (if) la position du moteur est égale (==) à la position voulue : (faire), 'attendre' devient faux (False).

Ceci se traduit par:

In [ ]:
attendre = True

poppy.head_z.goal_position = 90

while attendre == True:
    time.sleep(1)
    if poppy.head_z.present_position == 90:
        attendre = False
        
poppy.head_z.goal_position = 0

On peut même récupérer le temps (approximatif) qu'il a fallu pour effectuer le mouvement.

Comment ?

In [ ]:
#essaies ton code ici
In [ ]:
# correction
def time_position(m,goal,unite=0.001):
    start,attendre,tps=m.present_position,True,0
    poppy.head_z.goal_position = goal
    while attendre==True:
        time.sleep(unite)         
        if poppy.head_z.present_position == goal: attendre=False
        else: tps+=1
    poppy.head_z.goal_position = start
    return tps

print time_position(poppy.head_z,90), 'milliseconde'
time.sleep(1)
print time_position(poppy.head_z,90,1), 'seconde'
time.sleep(1)
print time_position(poppy.head_z,90,.1), 'dixième de seconde'
time.sleep(1)
print time_position(poppy.head_z,90,.01), 'centième de seconde'

for i in range(5): #problème précision
    time.sleep(0.5)
    print time_position(poppy.head_z,90)

Tu as raté? c'est pas grâve, recommmence, essaies ces lignes pour redémarrer :

In [ ]:
messager.reset_simulation()

Encore buger ? essaies celles-ci :

In [ ]:
import pypot
poppy.stop_simulation()
pypot.vrep.close_all_connections()

from poppy.creatures import PoppyTorso
poppy=PoppyTorso(simulator='vrep')

Tu as fini? coupes la simulation ici:

In [ ]:
import pypot
poppy.stop_simulation()
pypot.vrep.close_all_connections()