Faire bouger poppy (bras) pendant qu'il parle :-)

Bonjour,
Je suis sur le poppy // wifi Version// je vudrais faire parler poppy et qu’il bouge les bras en même temps.

Dans le fichier demonstrator_server.py, je trouve le code:

@self.app.get('/play/<move>')
        def play_move(move):
            if move in custom_moves:
                if move == 'Sit':
                    self.rest_prim = self.poppy.sit
                elif move in ('Stand-Up', 'Walk'):
                    self.rest_prim = self.poppy.stand_up

                # elif move == 'HeadTracking':
                #     self.poppy.turn_compliant.start()
                #     self.running_prim.append(self.poppy.turn_compliant)

                prim = getattr(self.poppy, custom_moves[move])

            # elif move == 'HeadTracking':
            #     self.poppy.head_tracking.start()
            #     self.running_prim.append[self.poppy.head_tracking]

            else:
                filename = os.path.join('moves', '{}.json'.format(move))

                with open(filename, 'r') as f:
                    m = Move.load(f)

                prim = MovePlayer(self.poppy, m)

            prim.start()
            self.running_prim.append(prim)

Je comprends que les mouvementes pre-enregistré dans l’interface web , sont joué grace à ce code.
Je voudrais reutiliser ce code, pour faire juste jouer une sequence tjs predefini (le nom du fichier ne change pas) et ceci depuis une commande line ! pas d’interface web :smile:

Des idées?
Merci

une idée serait de faire un appel:

10.0.0.1:9999/play/macarena

ou macarena est un mouvement pre enregistre …
non ?

je mettrais avec un code de type:

import urllib
params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query", params)
print f.read()

alors si je fais depuis un web ui: http://10.0.0.1:9999/play/macarena
et bien cela fonctionne!
pas contre je dois initialiser la GUI depuis le web, etc… c’est malheureusement peu fiable du au perte de connexion wifi,
il faudrait que je fasse un programme python qui lance vraiment une sequence de mouvement…
a suivre :wink:

De quoi? Tu veux faire quoi exactement?
Oui play/move permet de jouer des mouvements pré-enregistrés genre ceux que tu crées par l’interface de démo.
Si tu veux faire ça en code, le plus court c’est d’utiliser la primitive MovePlayer(), comme dans le code mais sans les trucs autour:

tu ouvres ton fichier de mouvement .json
tu le transformes en objet Move
tu crées une primitive MovePlayer
tu start la primitive

with open(filename, 'r') as f:
    m = Move.load(f)
prim = MovePlayer(poppy, m)
prim.start()

Éventuellement prim.wait_to_stop() si tu veux que ce soit bloquant.

Genial ! je vais tester (mais plus tard).
j’imagine que mon prgramme python doit faire appel au début aux fonctions d’init du robot . non ?
je vais prendre les codes mis sur le forum (ex. le code pour faire tomber poppy dans le simulateur vrep-. Si tu as un bout de code déjà tout fait, je prends !
A++

(Ps: merci merci merci merci pour le temps que tu passes en ce dimanche!).

import os
import time
import poppytools

from pypot.robot import from_json

config_path = os.path.join(os.path.dirname(poppytools.__file__), 'configuration', 'poppy_config.json')

poppy = from_json(config_path)
poppy.start_sync()

devrait faire l’affaire ?
A+

Oui ça devrait le faire !

Ensuite tu dois pouvoir importer les class Move et MovePlayer directement avec un:

from pypot.primitive.move import Move, MovePlayer

Je vais tenter le bout de code suivant :

import os
import time
import poppytools

from pypot.robot import from_json

config_path = os.path.join(os.path.dirname(poppytools.__file__), 'configuration', 'poppy_config.json')

poppy = from_json(config_path)
poppy.start_sync()

move_filename = "/home/odroid/dev/poppy-software/demo/webdemo/moves/macarena.json"

from pypot.primitive.move import Move, MovePlayer

with open(move_filename, 'r') as f:
    m = Move.load(f)
prim = MovePlayer(poppy, m)
prim.start()

le system m’insulte !

python readmovement.py
Exception in thread Thread-get_pos_speed_load (most likely raised during interpreter shutdown):Exception in thread Thread-get_pos_speed_load (most likely raised during interpreter shutdown):Exception in thread Thread-set_compliance_margin (most likely raised during interpreter shutdown):Exception in thread Thread-set_compliance_slope (most likely raised during interpreter shutdown):Exception in thread Thread-set_pos_speed_load (most likely raised during interpreter shutdown):Exception in thread Primitive Manager (most likely raised during interpreter shutdown):Exception in thread Thread-1 (most likely raised during

interpreter shutdown):odroid@odroid:~/dev/poppy-software/demo/webdemo$ python readmovement.py
Exception in thread Thread-get_pos_speed_load (most likely raised during interpreter shutdown):Exception in thread Thread-set_pid_gain (most likely raised during interpreter shutdown):Exception in thread Thread-set_compliance_margin (most likely raised during interpreter shutdown):Exception in thread Thread-set_compliance_slope (most likely raised during interpreter shutdown):
Exception in thread Thread-get_pos_speed_load (most likely raised during interpreter shutdown):Exception in thread Thread-1 (most likely raised during interpreter shutdown):

Traceback (most recent call last):Exception in thread Thread-set_pos_speed_load (most likely raised during interpreter shutdown):Exception in thread Primitive Manager (most likely raised during interpreter shutdown):

Celui là c’est un peu tricky… en fait le programme te dit simplement qu’il a planté APRES avoir exécuté ton programme (les threads ne sont pas clean dans le bon ordre, problème python 2.* connu).

Du coup, ton problème est simplement que ton programme se termine avant que tu ai eu le temps de faire quoi que ce soit. Avec un :

prim.wait_to_stop()

à la fin de ton programme ça devrait le faire !

pour le moment, j’ai rajouter le wait_to_stop mais a present , le robot ne fait rien, pas de mouvement.
je vais l’arreter et redemarrer.
A+

mon prog pour lire les mouvements :

import os
import time
import poppytools

from pypot.robot import from_json

config_path = os.path.join(os.path.dirname(poppytools.__file__), 'configuration', 'poppy_config.json')

poppy = from_json(config_path)
poppy.start_sync()

move_filename = "/home/odroid/dev/poppy-software/demo/webdemo/moves/macarena.json"

from pypot.primitive.move import Move, MovePlayer

with open(move_filename, 'r') as f:
    m = Move.load(f)

print move_filename

prim = MovePlayer(poppy, m)
prim.start()
time.sleep(5)
prim.wait_to_stop()

Le robot ne fait, il bloque sur le wait_to_stop :frowning:

par contre, le programme de clement et pierre (making music) fonctionne, lepied bouge bien … grrrr!

help sur mon code !

Pas facile de débugger sans robot à proximité !

Tu t’es bien assuré que les moteurs ne sont pas compilants ?

yeap, sans robot c’est dur ! mais j’apprends et je vois mieux ce que je dois apprendre, je vais revenir vous voir!

pour le “moteur compilants” tu veux dire compliant= true … ?

blabla.compliant = True
blabla.compliant = False

D’après mon code, je dois mettre la variable:
prim.compliant = false ?
ou
poppy.compliant = False?

a priori je dirais poppy.compliant…

merci!

Je suis pas sûr que cet alias existe. Par contre tu peux faire:

for m in poppy.motors:
    m.compliant = False

en fait, j’ai rahouté cette instruction mais bizarrement, j’ai un autre souci qui apparait:

Traceback (most recent call last):
  File "readmovement.py", line 13, in <module>
    poppy = from_json(config_path)
  File "/home/odroid/dev/pypot/pypot/robot/config.py", line 191, in from_json
    return from_config(config)
  File "/home/odroid/dev/pypot/pypot/robot/config.py", line 112, in from_config
    port = find_port(ids, strict)
  File "/home/odroid/dev/pypot/pypot/dynamixel/__init__.py", line 56, in find_port
    raise IndexError('No suitable port found for ids {}!'.format(ids))
IndexError: No suitable port found for ids [31, 32, 33, 34, 35, 36, 37, 41, 42, 43, 44, 51, 52, 53, 54]!

en gros, je ne vois pas les moteurs :wink:
A++

Les deux choses doivent être indépendantes.

Là comme tu le dis c’est qu’il y a un (ou plus) moteur qu’il ne trouve pas. Il faut peut être redémarrer le robot, si ça ne marche toujours pas, vérifie les fils. Il y’en a probablement un qui est détaché ou abimé.

This topic was automatically closed after 24 hours. New replies are no longer allowed.