Utiliser REST APIs

Bonjour,

J’essaye de communiquer avec le robot par des GET POST

Pour les get je n’ai pas de problème
Une commande sur l’URL "http://eremurus.local:6969/motors/get/positions"
reponds
Response Code : 200
-17.16;88.42;67.3;60.56;36.51;-22.73

Et sur "http://eremurus.local:6969/motors/set/registers/m1:goal_position:20"
Response Code : 200
Done!

Impossible par contre de faire fonctionner les POST

Sur l’URL "http://eremurus.local:6969/motors/set/registers/m1:goal_position:20"
j’ai une erreur 405
ou sur "http://eremurus.local:6969/motors/set/registers/
J’ai une erreur 404

Quelle URL faut il ouvrir avec la méthode POST ?

Merci de votre aide

L’API de Snap (sur le port 6969) n’est pas très bien conçue, elle à été faite pour faciliter la cration des blocs en Snap, mais elle peut cependant être facilement utilisée avec des requêtes GET depuis n’importe quel language.
Une façon simple de l’appréhender est de regarder est d’inspecter directement le code.

##Liste des url à utiliser avec l’APIs:

Une liste complet est disponible à l’adresse:

http://<nom_du_robot>:6969/

En voici un petit résumé:

###Moteurs:

Récupérer un groupe de nom de moteur:

http://<nom_du_robot>:6969/motors/<alias>

nb: quand <alias>=motors, renvoie le nom de tout les moteurs.

Récupérer les noms de tout les groupes de moteur:

http://<nom_du_robot>:6969/motors/alias

###Registre:

Récupérer la valeur d’un registre pour un moteur:

 http://<nom_du_robot>:6969/motors/<nom_du_moteur>/get/<nom_du_registre>

Registre existant en lecture:

  • present_position
  • present_speed
  • present_load
  • present_temperature
  • present_voltage
  • led (seleument pour xl320)

Récupérer les positions de tout les moteurs:

http://<nom_du_robot>:6969/motors/get/positions

Modifier la valeur d’un registre:

http://<nom_du_robot>:6969/motors/set/registers/<nom_du_moteur>:<nom_du_registre>:<valeur>;<nom_du_moteur>:<nom_du_registre>:<valeur>; etc

Registre existant en écriture:

  • goal_position
  • goal_speed
  • torque_limit
  • compliant
  • led (seleument avec xl320)

Plus d’info sur: support.robotis/dynamixel: xl-320 (moteurs Ergo_Jr)

###Fonction pypot:
Fonction goto: (où la valeur est en degrés et la durée en seconde)

http://<nom_du_robot>:6969/motors/set/goto/<nom_du_moteur>:<valeur>:<durée>;<nom_du_moteur>:<valeur>:<durée>; etc

Fonction ikpy (cinématique inverse): (pour Ergo_Jr: <chain>=chain)

  • "Allez à" (où x,y,z sont en mètre et la durée en seconde)

      http://<nom_du_robot>:6969/ik/<chain>/goto/<x>/<y>/<z>/<durée>
    
  • "Où est" (Récupérer la position de l’extrémité d’un bras (ou jambe etc), renvoie x,y,z en mètre)

      http://<nom_du_robot>:6969/ik/<chain>/endeffector
    

Fonction QRcode: <marker>= tetris caribou lapin

http://<nom_du_robot>:6969/detetct/<marker>

###Programmation par démonstration:

Enregistrer un nouveau mouvement:

  • Start record:

      http://<nom_du_robot>:6969/primitive/MoveRecorder/<nom_mouvement>/start/<nom_moteurs>;<nom_moteurs>; etc
    
  • Stop record:

      http://<nom_du_robot>:6969/primitive/MoveRecorder/<nom_mouvement>/stop
    

Récupérer la liste de tout les enregistrements:*

http://<nom_du_robot>:6969/primitive/MovePlayer

Jouer un eregistrement:

  • Play move

      http://<nom_du_robot>:6969/primitive/MovePlayer/<nom_mouvement>/start/<speed>
    
  • Play move in inverse

      http://<nom_du_robot>:6969/primitive/MovePlayer/<nom_mouvement>/start/<speed>/backwards
    
  • Stop move

      http://<nom_du_robot>:6969/primitive/MovePlayer/<nom_mouvement>/stop
    

###Primitives

Récupérer la liste de tout les primitives

http://<nom_du_robot>:6969/primitives

Récupérer la liste de tout les primitives active

http://<nom_du_robot>:6969/primitives/running

Jouer une primitive (<action>= start / stop / pause / resume)

http://<nom_du_robot>:6969/primitive/<nom_primitive>/<action>
1 Like

Merci pour la rapidité de la réponse.

donc mon adresse
http://eremurus.local:6969/motors/set/registers/m1:goal_position:20

est bien conforme à
http://<nom_du_robot>:6969/motors/set/registers/<nom_du_moteur>:<nom_du_registre>:;

Sauf le ; que je n’envoie pas puisque je n’ai qu’un registre pour l’instant.
Comme je suis bloqué sur les écritures dans les registres, j’en déduis que j’arrive à faire les GET et pas les POST !
Si j’ai bien compris pour faire de l’écriture c’est obligatoirement en POST.

En fait quand on fait un POST on doit d’abord ouvrir l’URL et ensuite passer les paramètres dans la connexion ouverte
//1 define url to join
//2 Open connection (type UrL connexion ou HttpUrLconnexion j’ai testé les deux.
//3 Specify POST method
//4 Send data

Est ce quelqu’un a déjà testé cela et aurait un exemple de commande POST dans un langage quelconque ?
Je travaille en Java et j’essayerai de traduire.

Non, c’est uniquement des GET (tu peux les faire depuis l’url de ton navigateur). Dans ce sens le SnapRemoteServer n’est pas RESTfull ; c’est probablement ce qui t’a induit en erreur.

Bonjour à tous,
quelqu’un peut-t-il me dire comment contrôler les LED par cette méthode ?
J’ai vainement tenté
http://robot.local:6969/motors/set/registers/m6:led:???
en remplaçant ??? par à peu près tout ce qui m’est passé par la tête… mais sans succès !
J’ai fouillé partout dans pypot sans trouver, je sèche.
Merci d’avance.

Merci
C’est beaucoup plus simple maintenant pour presque toutes les commandes c’est OK

Sauf que je bloque encore sur

http://<nom_du_robot>:6969/primitive/<nom_primitive>/
testé avec dance les actions pause et resume n’ont aucun effet !

Et pour
http://<nom_du_robot>:6969/motors/set/registers/<nom_du_moteur>:<nom_du_registre>:

goal_position
goal_speed
torque_limit
compliant
led (seleument avec xl320)

je n’arrive pas à les utiliser.
led 'n’allume aucune led …quelque soit le chiffre que je met

compliant : je n’arrive pas a trouver comment faire passer le robot de stiff à compliant

goal_position: position semble cohérent
Enfn je ne comprend le but de ces registres
goal_speed : vitesse fait aussi bouger le robot !
torque_limit : aucun effet apparent

C’est en effet très mal documenté.
Tu peux voir la liste des couleurs possibles ici.
Le registre led peut prendre comme valeurs

  • off
  • red
  • green
  • yellow
  • blue
  • pink
  • cyan
  • white

@tibo à relevé le problème il y a quelques jours, mais je n’ai pas encore investigué.

le registre compliant est un boolean, depuis l’api il prend la valeur de 1 ou 0.

goal_speed est pour faire du contrôle en vitesse ; le moteur va à la vitesse demandée jusqu’à ses limites d’angle.
torque_limit le couple max du moteur

Merci Théo
ça faisait partie des trucs que j’avais essayés (je suis allé jusqu’à mettre des valeurs en hexa, alors… :confused: ) et ça ne marchait pas.
Théoriquement,
http://robot.local:6969/motors/set/registers/m6:led:blue
allume la led du moteur m6 ?
J’avais un ‘Done’ et rien d’autre.
Je re-essaierai.

1 Like

Pour les couleurs la commande
http://robot.local:6969/motors/set/registers/m6:led:blue
Le serveur renvoie un code 500.
J’ai essayé toutes les couleurs et cela ne fonctionne pas
Est ce qu’ il n’ y aurait pas une autre commande pour activer les led avant de choisir la couleur ?

Merci pour les autres informations données

Même chose que Luc !
Internal Server Error

effectivement il faut mettre à jour le fichier serveur/snap.py pour y ajouter les url de controle des led

*Procédure: *
télécharger le fichier snap.py puis dans un terminal (dans l’ergo):

cd dev/pypot/pypot/server/
nano snap.py

puis copier/coller le contenu du fichier télécharger dans le fichier sur l’ergo, enregistrer puis quitter

Procédure: mise à jour global
dans un terminal (dans l’ergo) avec une connexion internet

cd dev/poppy-ergo-jr
git pull
cd ..
cd poppy-creature
git pull
cd ..
cd pypot
git pull
python setup.py develop
exit

attention certain fichier/fonctionnalité peuvent être perdu par rapport à votre version actuel

Désolé mais le nulix que je suis (nul en linux) a un peu de mal à suivre la procédure.

Je suis sous windows, j’enregistre snap.py sur mon bureau OK
Je démarre chrome je vais sur http://robot.local OK
Je choisi open Open ipithon notebook OK
Je choisis new terminal OK
Je tappe
cd pypot/pypot/server/

Reponse No such file or directory

Peux tu détailler un peu plus ce qu’il faut faire !

le probleme vient de mon copier/coller … désolé j’ai corrigé l’erreur:

cd dev/pypot/pypot/server

Bon c’est pas gagné pour moi désolé !
Quand je démarre le terminal
j’ai
bash: .poppy_profile: No such file or directory
poppy@eremurus:/ $

la commande
poppy@eremurus:/ $ cd dev/pypot/pypot/server
bash: cd: dev/pypot/pypot/server: No such file or directory
poppy@eremurus:/ $

Ne fonctionne pas !

Par contre

poppy@eremurus:/ $ cd
poppy@eremurus:~ $ cd dev
poppy@eremurus:~/dev $ cd pypot
poppy@eremurus:~dev/pypot $ cd pypot
poppy@eremurus:~/dev/pypot/pypot $ cd server
poppy@eremurus:~/dev/pypot/pypot/server $

Fonctionne !
poppy@eremurus:~/dev/pypot/pypot/server $nano snap.py

Fonctionne !
Le fichier s’ouvre …
Mais pas moyen de faire du copier coller ! On fait comment ?

Salut Luc,
on s’amuse travaille encore en simultané ce soir. Je vais tenter la même chose que toi.
Quelques pistes déjà :

ça c’est parce que t’es pas encore rentré dans home/poppy/ (répertoire perso de l’utilisateur générique poppy, valable pour toutes les cartes)
Et c’est ce que tu fais quand tu fais
cd
tu peux alors vérifier
poppy@lily:~ $ ls
dev miniconda poppy-logo
que tu es bien au bon endroit, donc tu peux ensuite naviguer vers
~/dev/pypot/pypot/server

Pour la suite de la manip, j’y retourne.

1 Like

Ensuite, le mieux est quand même, avant toute chose, de faire un
mv snap.py snap.py.bak
(qui renomme en fait le snap.py original, au cas où on ait envie de le retrouver)
Ensuite (je suppose toujours que tu es dans le répertoire ~/dev/pypot/pypot/server),
le plus simple est je crois de faire
wget https://raw.githubusercontent.com/poppy-project/pypot/master/pypot/server/snap.py

qui va télécharger le nouveau snap.py.

Bon maintenant je teste pour savoir si les LED s’allument…

1 Like

bon bon bon… ça ne marche toujours pas. Pas de Led
Même erreur que précédemment (j’ai redémarré au cas où…)
Je n’ai pas envie de faire la mise à jour globale, je ne sais pas s’il y a encore beaucoup de work in progress dedans… donc j’arrête là et je remets le vieux snap.py !

Hello,

J’ai repris la procédure et j’ai réussi la première partie sauf que !
Comme j’ai suivi les conseils de Gilles, j’ai renommé snap.py en snap.bak
je pense que cela génère maintenant une erreur …dans la deuxième manip

cd dev/poppy-ergo-jr
git pull
Première opération OK :slight_smile:

cd …
cd poppy-creature
git pull
Deuxième opération OK :slight_smile:

cd …
cd pypot
git pull
Troisieme opération :frowning:

SOS :slight_smile:

La procédure n’est pas documentée, car elle est vraiment faite pour les dev… @Pierre travaille sur la procédure d’installation et d’update depuis l’interface web mais ce n’est pas possible de faire ça mieux aujourd’hui…

Dans ton cas fait

git checkout -- pypot/server/snap.py
git pull origin master
python setup.py install

et ça devrait fonctionner.

Une façon plus simple que celle que décrit @tibo si tu souhaites simplement la dernière version stable (vs version en développement)

pip uninstall pypot poppy-creature poppy-ergo-jr
pip install poppy-ergo-jr
1 Like