Problème lors de l'utilisation de l'API REST

Bonjour,

Je fias une communication entre un code en C++ et le code python, pour cela j’utilise l’API REST, un socket zmq et des request JSON. J’ai ajouté la fonction suivante au fchier rest.py pour envoyer dans une même réponse le registre de touts les moteurs:

def get_allmotors_register_value(self, register):
        return {m.name : self._get_register_value(m.name, register) for m in getattr(self.robot, 'motors')}

Cela marche bien, la réponse envoyée lorsque je demande les positions a cette forme:

{'l_elbow_y': -20.79, 'r_hip_y': -4.88, 'r_knee_y': -2.68, 'head_y': -6.359999999999999, 'head_z': 9.53, 'r_arm_z': 81.98, 'r_ankle_y': 70.29, 'r_shoulder_x': -58.31, 'r_shoulder_y': 11.099999999999994, 'r_hip_z': -2.15, 'r_hip_x': -1.36, 'r_elbow_y': -55.16, 'l_arm_z': -10.24, 'l_hip_x': 23.6, 'l_hip_y': -6.53, 'l_hip_z': 3.03, 'abs_x': -4.88, 'abs_y': -14.02, 'abs_z': 0.04, 'l_ankle_y': 70.29, 'bust_y': 9.27, 'bust_x': 26.15, 'l_knee_y': -2.51, 'l_shoulder_x': 11.450000000000003, 'l_shoulder_y': 15.89}

Et j’arrive à le lire depuis mon code en c++. Pourtant, lorsque je bouge le robot pour changer la position et je demande encore une fois les positions, python envoie les même positions qu’avant pour tous les moteurs, c’est comme s’il ne mettait pas à jour les valeurs. Quelqu’un a eu ce même problème?

L’autre problème c’est quand je veux mettre un position de consigne, selon le protocol, la réponse envoyé après le set_register_value est {}, et c’est bien cela ce que j’obtiens, mais le robot ne bouge pas. Quelqu’un a une idée de comment corriger cela?

Merci,

Bonjour,

Quel est ton robot ? Tu as une créature standard (Poppy Humanoid, ergo_jr) ou tu utilises un fichier de config à toi ? Dans ce cas, est ce que tu as bien démarré la synchronisation ?

Est ce que tu as un peu d’attente entre l’écriture et la lecture ? Il faut laisser au moins 20ms pour que les valeurs des registres soient mises à jour.

Tes moteurs sont bien alimentés ? Une connexion au PC permet de lire les registres mais il faut une alim externe (SMPS2Dynamixel) pour les faire bouger. Est ce que tu peux faire bouger le robot depuis Python ?

J’utilise un PoppyHumanoid. Voici le code que j’utilise:

from contextlib import closing
import json
import time

##Connect to real robot
from poppy.creatures import PoppyHumanoid

with closing(PoppyHumanoid()) as poppy:

    for m in poppy.motors:
        m.compliant = True;

    ##Create the ZMQServer
    HOST = '127.0.0.17'
    PORT = 1140

    from pypot.server.zmqserver import ZMQRobotServer
    server = ZMQRobotServer(poppy,HOST,PORT)
    print("Binding... "+HOST+","+str(PORT))

    ##Create a thread to run the REQ/RESP loop
    from threading import Thread
    Thread(target=lambda: server.run()).start()

    pass

Le robot est bien branché et je peux le faire bouger depuis Python. Avec le même code, je peux toujours accéder aux registres, mais j’ai le même problème, les valeurs ne sont pas mis à jour. Voici un eimage de l’execution et des lignes que j’écris après:

La première partie en bleu c’est la réponse envoyée après avoir demandé depuis le code c++ la position de tous les moteurs. Ensuite, depuis la même console je demande la position des moteurs l_elbow_y et r_elbow_y. J’ai bougé le moteur r_elbow_y mais la valeur montré sur python est la même à chaque fois. Ensuite j’ai essayé d’envoyer une goal_position à ce même moteur, mais cela n’a pas marché, et finalement j’ai débranché le robot, et j’ai demandé encore la position du moteur r_elbow_y et il montre la même position.

Salut @JuanMiguel,

Il me semble que ton programme python va terminer immédiatement, non ? Cela pourrait expliquer le problème !

Tu peux remplacer la ligne

    Thread(target=lambda: server.run()).start()

par


    server.run()

et voir si cela fonctionne ?