API REST de Pypot
L'API REST a été mise à jour dans la version 4.0.0. Cette page présente la documentation de l'API v4.0.0.
L'API Pypot est organisée autour de REST. Notre API dispose d'URLs prévisibles orientées ressources, renvoie des réponses codées en JSON et utilise des codes de réponse HTTP standard.
Les erreurs
Pypot utilise des codes de réponse HTTP conventionnels pour indiquer le succès ou l'échec d'une requête API. En général: les codes de la plage 2xx
indiquent le succès. Les codes de la plage 4xx
indiquent une erreur qui a échoué compte tenu des informations fournies (par exemple, un paramètre requis a été omis, une charge a échoué, etc.). Les codes de la gamme 5xx
indiquent une erreur avec les serveurs de Poppy (c'est rare).
Code | Signification |
---|---|
200 - OK | Tout a fonctionné comme prévu. |
202 - Accepted | La demande a été acceptée pour traitement, mais le traitement n'est pas terminé. |
204 - No Content | Le serveur a répondu à la demande mais il ne renvoie rien. |
404 - Not Found | La ressource demandée n'existe pas. |
500, 502, 503, 504 - Server Errors | Quelque chose s'est mal passé du côté de Poppy. (C'est rare) |
Points de terminaison
🔌 Divers
📕 Sommaire
GET /
GET /robot.json
GET /ip.json
Obtenir tous les points de terminaison
GET /
Description
Fournit tous les points de terminaison de l'API REST au format HTML.
Commande cURL
curl http://poppy.local:8080/
Valeur de retour
All url paths availables:
Get method url:
/robot.json
/ip.json
/motors/list.json
/motors/aliases/list.json
/motors/<alias>/list.json
/motors/<motor_name>/registers/list.json
/motors/<motor_name>/registers/<register_name>/value.json
/motors/registers/<register_name>/list.json
/sensors/list.json<br>/sensors/<sensor_name>/registers/list.json
/sensors/<sensor_name>/registers/<register_name>/value.json
/sensors/camera/frame.png
/sensors/code/<code_name>.json
/records/list.json
/records/<move_name>/value.json
/primitives/list.json
/primitives/running/list.json
/primitives/<primitive_name>/start.json
/primitives/<primitive_name>/stop.json
/primitives/<primitive_name>/pause.json
/primitives/<primitive_name>/resume.json
/primitives/<primitive_name>/properties/list.json
/primitives/<primitive_name>/properties/<prop>/value.json
/primitives/<primitive_name>/methods/list.json
/ik/<chain_name>/value.json
/ik/<chain_name>/rpy.json
Post method url:
/motors/<motor_name>/registers/<register_name>/value.json
/motors/<motor_name>/goto.json
/motors/goto.json
/sensors/<sensor_name>/registers/<register_name>/value.json
/records/<move_name>/record.json
/records/<move_name>/save.json
/records/<move_name>/play.json
/records/<move_name>/stop.json
/records/<move_name>/delete.json
/primitives/<primitive_name>/properties/<prop>/value.json
/primitives/<primitive_name>/methods/<method_name>/args.json
/ik/<chain_name>/goto.json
Obtenir toutes les valeurs du robot
GET /robot.json
Description
Obtenez toutes les valeurs du robot, telles que les valeurs d'attributs des moteurs ou les méthodes de comportement.
Commande cURL
curl http://poppy.local:8080/robot.json
Valeur de retour
Sur un Poppy Torso:
{
"motors":
[
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"pid"
],
"goal_speed": 0.0,
"compliant": true,
"angle_limit":
[
-79.96,
80.04
],
"id": 33,
"name": "abs_z",
"model": "MX-28",
"present_position": 49.27,
"goal_position": 52.18,
"present_speed": 0.0,
"moving_speed": 0.0,
"present_load": 0.0,
"torque_limit": 100.0,
"lower_limit": -79.96,
"upper_limit": 80.04,
"present_voltage": 11.3,
"present_temperature": 35.0,
"pid":
[
4.0,
0.0,
0.0
]
},
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"pid"
],
"goal_speed": -0.0,
"compliant": true,
"angle_limit":
[
46.02,
-22.99
],
"id": 34,
"name": "bust_y",
"model": "MX-28",
"present_position": 69.58,
"goal_position": 69.58,
"present_speed": -0.0,
"moving_speed": -0.0,
"present_load": -0.0,
"torque_limit": 100.0,
"lower_limit": 46.02,
"upper_limit": -22.99,
"present_voltage": 11.0,
"present_temperature": 33.0,
"pid":
[
4.0,
0.0,
0.0
]
},
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"pid"
],
"goal_speed": 0.0,
"compliant": true,
"angle_limit":
[
39.96,
-40.04
],
"id": 35,
"name": "bust_x",
"model": "MX-28",
"present_position": -5.23,
"goal_position": -5.23,
"present_speed": -0.0,
"moving_speed": -0.0,
"present_load": -0.0,
"torque_limit": 100.0,
"lower_limit": 39.96,
"upper_limit": -40.04,
"present_voltage": 11.200000000000001,
"present_temperature": 32.0,
"pid":
[
4.0,
0.0,
0.0
]
},
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"compliance_margin",
"compliance_slope"
],
"goal_speed": -0.0,
"compliant": true,
"angle_limit":
[
-99.85,
100.15
],
"id": 36,
"name": "head_z",
"model": "AX-12",
"present_position": -150.0,
"goal_position": -150.0,
"present_speed": 0.0,
"moving_speed": 0.0,
"present_load": 0.0,
"torque_limit": 100.0,
"lower_limit": -99.85,
"upper_limit": 100.15,
"present_voltage": 11.4,
"present_temperature": 32.0,
"compliance_margin":
[
1,
1
],
"compliance_slope":
[
32,
32
]
},
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"compliance_margin",
"compliance_slope"
],
"goal_speed": 0.0,
"compliant": true,
"angle_limit":
[
20.03,
-28.060000000000002
],
"id": 37,
"name": "head_y",
"model": "AX-12",
"present_position": -11.06,
"goal_position": -11.06,
"present_speed": -0.0,
"moving_speed": -0.0,
"present_load": -0.0,
"torque_limit": 100.0,
"lower_limit": 20.03,
"upper_limit": -28.060000000000002,
"present_voltage": 11.4,
"present_temperature": 32.0,
"compliance_margin":
[
1,
1
],
"compliance_slope":
[
32,
32
]
},
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"pid"
],
"goal_speed": -0.0,
"compliant": true,
"angle_limit":
[
-209.95999999999998,
65.03
],
"id": 41,
"name": "l_shoulder_y",
"model": "MX-28",
"present_position": -75.27,
"goal_position": -74.66,
"present_speed": 0.0,
"moving_speed": 0.0,
"present_load": 0.0,
"torque_limit": 100.0,
"lower_limit": -209.95999999999998,
"upper_limit": 65.03,
"present_voltage": 11.100000000000001,
"present_temperature": 30.0,
"pid":
[
4.0,
0.0,
0.0
]
},
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"pid"
],
"goal_speed": -0.0,
"compliant": true,
"angle_limit":
[
195.01,
-20.019999999999996
],
"id": 42,
"name": "l_shoulder_x",
"model": "MX-28",
"present_position": 4.510000000000005,
"goal_position": 4.150000000000006,
"present_speed": -0.0,
"moving_speed": -0.0,
"present_load": -0.0,
"torque_limit": 100.0,
"lower_limit": 195.01,
"upper_limit": -20.019999999999996,
"present_voltage": 11.3,
"present_temperature": 30.0,
"pid":
[
4.0,
0.0,
0.0
]
},
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"pid"
],
"goal_speed": 0.0,
"compliant": true,
"angle_limit":
[
89.98,
-89.98
],
"id": 43,
"name": "l_arm_z",
"model": "MX-28",
"present_position": -24.48,
"goal_position": -24.75,
"present_speed": -0.0,
"moving_speed": -0.0,
"present_load": -0.0,
"torque_limit": 100.0,
"lower_limit": 89.98,
"upper_limit": -89.98,
"present_voltage": 11.200000000000001,
"present_temperature": 31.0,
"pid":
[
4.0,
0.0,
0.0
]
},
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"pid"
],
"goal_speed": 0.0,
"compliant": true,
"angle_limit":
[
-50.0,
90.04
],
"id": 44,
"name": "l_elbow_y",
"model": "MX-28",
"present_position": 5.299999999999997,
"goal_position": 5.209999999999994,
"present_speed": 0.0,
"moving_speed": 0.0,
"present_load": 0.0,
"torque_limit": 100.0,
"lower_limit": -50.0,
"upper_limit": 90.04,
"present_voltage": 11.3,
"present_temperature": 30.0,
"pid":
[
4.0,
0.0,
0.0
]
},
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"pid"
],
"goal_speed": 0.0,
"compliant": true,
"angle_limit":
[
65.03,
-210.04000000000002
],
"id": 51,
"name": "r_shoulder_y",
"model": "MX-28",
"present_position": -64.9,
"goal_position": -72.46000000000001,
"present_speed": -0.0,
"moving_speed": -0.0,
"present_load": -0.0,
"torque_limit": 100.0,
"lower_limit": 65.03,
"upper_limit": -210.04000000000002,
"present_voltage": 11.600000000000001,
"present_temperature": 32.0,
"pid":
[
4.0,
0.0,
0.0
]
},
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"pid"
],
"goal_speed": -0.0,
"compliant": true,
"angle_limit":
[
20.019999999999996,
-195.01
],
"id": 52,
"name": "r_shoulder_x",
"model": "MX-28",
"present_position": 1.5600000000000023,
"goal_position": 2.530000000000001,
"present_speed": -0.0,
"moving_speed": -0.0,
"present_load": -0.0,
"torque_limit": 100.0,
"lower_limit": 20.019999999999996,
"upper_limit": -195.01,
"present_voltage": 11.200000000000001,
"present_temperature": 30.0,
"pid":
[
4.0,
0.0,
0.0
]
},
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"pid"
],
"goal_speed": 0.0,
"compliant": true,
"angle_limit":
[
89.98,
-89.98
],
"id": 53,
"name": "r_arm_z",
"model": "MX-28",
"present_position": -31.34,
"goal_position": -30.9,
"present_speed": -0.0,
"moving_speed": -0.0,
"present_load": -0.0,
"torque_limit": 100.0,
"lower_limit": 89.98,
"upper_limit": -89.98,
"present_voltage": 11.100000000000001,
"present_temperature": 30.0,
"pid":
[
4.0,
0.0,
0.0
]
},
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"pid"
],
"goal_speed": -0.0,
"compliant": true,
"angle_limit":
[
89.96,
-57.03
],
"id": 54,
"name": "r_elbow_y",
"model": "MX-28",
"present_position": 4.769999999999996,
"goal_position": 10.840000000000003,
"present_speed": -0.0,
"moving_speed": -0.0,
"present_load": -0.0,
"torque_limit": 100.0,
"lower_limit": 89.96,
"upper_limit": -57.03,
"present_voltage": 11.100000000000001,
"present_temperature": 31.0,
"pid":
[
4.0,
0.0,
0.0
]
}
],
"primitives":
[
{
"primitive": "limit_torque",
"running": false,
"properties":
[],
"methods":
[
"start",
"stop",
"pause",
"resume"
]
},
{
"primitive": "temperature_monitoring",
"running": true,
"properties":
[],
"methods":
[
"start",
"stop",
"pause",
"resume"
]
},
{
"primitive": "dance_beat_motion",
"running": false,
"properties":
[],
"methods":
[
"start",
"stop",
"pause",
"resume"
]
},
{
"primitive": "init_position",
"running": false,
"properties":
[],
"methods":
[
"start",
"stop",
"pause",
"resume"
]
},
{
"primitive": "upper_body_idle_motion",
"running": false,
"properties":
[],
"methods":
[
"start",
"stop",
"pause",
"resume"
]
},
{
"primitive": "head_idle_motion",
"running": false,
"properties":
[],
"methods":
[
"start",
"stop",
"pause",
"resume"
]
},
{
"primitive": "arms_turn_compliant",
"running": false,
"properties":
[],
"methods":
[
"start",
"stop",
"pause",
"resume"
]
},
{
"primitive": "arms_copy_motion",
"running": false,
"properties":
[],
"methods":
[
"start",
"stop",
"pause",
"resume"
]
}
]
}
Obtenir l'ip du robot
GET /ip.json
Description
Permet de récupérer l'adresse IP du robot.
Commande cURL
curl http://poppy.local:8080/ip.json
Valeur de retour
{
"ip": "10.2.11.54"
}
⚙ Moteurs
📕 Sommaire
GET /motors/list.json
GET /motors/aliases/list.json
GET /motors/<alias>/list.json
GET /motors/<motor_name>/registers/list.json
GET /motors/<motor_name>/registers/<register_name>/value.json
POST /motors/<motor_name>/registers/<register_name>/value.json + new_value
GET /motors/registers/<register_name>/list.json
Obtenir la liste des moteurs
GET /motors/list.json
Description
Donne la liste de tous les moteurs du robot Poppy.
Commande cURL
curl http://poppy.local:8080/motors/list.json
Valeur de retour
Sur un Poppy Torso :
{
"motors":
[
"abs_z",
"bust_y",
"bust_x",
"head_z",
"head_y",
"l_shoulder_y",
"l_shoulder_x",
"l_arm_z",
"l_elbow_y",
"r_shoulder_y",
"r_shoulder_x",
"r_arm_z",
"r_elbow_y"
]
}
Obtenir la liste des alias moteur
GET /motors/aliases/list.json
Description
Les alias définissent un groupe de moteurs. Cette requête vous donnera tous les noms d'alias définis.
Commande cURL
curl http://poppy.local:8080/motors/aliases/list.json
Valeur de retour
Sur un Poppy Torso :
{
"aliases":
[
"head",
"r_arm",
"torso",
"l_arm",
"arms"
]
}
Obtenir la liste des moteurs d'un alias
GET /motors/<alias>/list.json
Description
Donne tous les noms de moteurs faisant partie de l'alias donné dans l'url.
Exemple d'une commande cURL
curl http://poppy.local:8080/motors/head/list.json
Valeur de retour
Sur un Poppy Torso :
{
"head":
[
"head_z",
"head_y"
]
}
Obtenir la liste des registres d'un moteur
GET /motors/<motor_name>/registers/list.json
Description
Donne la liste de tous les registres d'un moteur.
Exemple d'une commande cURL
curl http://poppy.local:8080/motors/head_z/registers/list.json
Valeur de retour
Sur un Poppy Torso :
{
"registers":
[
"registers",
"goal_speed",
"compliant",
"safe_compliant",
"angle_limit",
"id",
"name",
"model",
"present_position",
"goal_position",
"present_speed",
"moving_speed",
"present_load",
"torque_limit",
"lower_limit",
"upper_limit",
"present_voltage",
"present_temperature",
"compliance_margin",
"compliance_slope"
]
}
Obtenir la valeur d'un registre d'un moteur
GET /motors/<motor_name>/registers/<register_name>/value.json
Description
Donne la valeur d'un registre d'un moteur. Le nom du moteur et le nom du registre sont indiqués dans l'url.
Exemple d'une commande cURL
curl http://poppy.local:8080/motors/head_z/registers/present_temperature/value.json
Valeur de retour
{
"present_temperature": 37.0
}
Définir la valeur d'un registre d'un moteur
POST /motors/<motor_name>/registers/<register_name>/value.json + new_value
Description
Modifie la valeur d'un registre d'un moteur. Le nom du moteur et le nom du registre sont indiqués dans l'url. La nouvelle valeur est donnée dans le corps de la requête.
Exemple d'une commande cURL
curl -X POST \
-H 'Content-Type: application/json' \
-d 'true' \
http://poppy.local:8080/motors/head_z/registers/compliant/value.json
Valeur de retour
{
"compliant": true
}
Obtenir les valeurs d'un registre pour tous les moteurs
GET /motors/registers/<register_name>/list.json
Description
Cette requête donne la valeur d'un registre pour tous les moteurs du robot.
Exemple d'une commande cURL
curl http://poppy.local:8080/motors/registers/angle_limit/list.json
Valeur de retour
Sur un Poppy Torso :
{
"angle_limit":
{
"abs_z":
[
-79.96,
80.04
],
"bust_y":
[
46.02,
-22.99
],
"bust_x":
[
39.96,
-40.04
],
"head_z":
[
-99.85,
100.15
],
"head_y":
[
20.03,
-28.060000000000002
],
"l_shoulder_y":
[
-209.95999999999998,
65.03
],
"l_shoulder_x":
[
195.01,
-20.019999999999996
],
"l_arm_z":
[
89.98,
-89.98
],
"l_elbow_y":
[
-50.0,
90.04
],
"r_shoulder_y":
[
65.03,
-210.04000000000002
],
"r_shoulder_x":
[
20.019999999999996,
-195.01
],
"r_arm_z":
[
89.98,
-89.98
],
"r_elbow_y":
[
89.96,
-57.03
]
}
}
Déplacer un moteur
POST /motors/<motor_name>/goto.json + position + duration + wait
Description
Définit la position des motors, en duration secondes et si wait vaut vrai
, il ne renverra sa réponse qu'une fois le déplacement terminé.
La position doit être donnée sous forme de valeur flottante (elle correspond à la valeur de l'angle à atteindre). La durée doit être donnée sous forme de flottant, en secondes. Et wait doit valoir true
, True
ou 1
si vous voulez attendre, n'importe quelle autre valeur si vous ne voulez pas attendre. wait est défini sur false
par défaut.
Exemple d'une commande cURL
curl -X POST \
-H 'Content-Type: application/json' \
-d '{"position":10,"duration":"3","wait":"true"}' \
http://localhost\:8080/motors/bust_y/goto.json
Valeur de retour
{
"motors":
{
"bust_y": 10.0
},
"duration": 3.0,
"waiting": true
}
Déplacer plusieurs moteurs
POST /motors/goto.json + motors + positions + duration + wait
Description
Définit la position des motors, en duration secondes et si wait vaut vrai
, il ne renverra sa réponse qu'une fois le déplacement terminé.
Les moteurs doivent être indiqués sous forme de liste de noms de moteurs. La position doit être donnée sous forme de liste de valeurs flottantes (elle correspond aux valeurs d'angle à atteindre pour chaque moteur). La durée doit être donnée sous forme de flottant, en secondes. Et wait devrait être soit true
, True
ou 1
si vous voulez attendre, n'importe quelle autre valeur si vous ne voulez pas attendre. wait est défini sur false
par défaut.
Exemple d'une commande cURL
curl -X POST \
-H 'Content-Type: application/json' \
-d '{"motors":["bust_y", "head_y"], "positions":[0,10],"duration":"3","wait":"true"}' \
http://localhost\:8080/motors/goto.json
Valeur de retour
{
"motors":
{
"bust_y": 0.0,
"head_y": 10.0
},
"duration": 3.0,
"waiting": true
}
📷 Capteurs
📕 Sommaire
GET /sensors/list.json
GET /sensors/<sensor_name>/registers/list.json
GET /sensors/<sensor_name>/registers/<register_name>/value.json
POST /sensors/<sensor_name>/registers/<register_name>/value.json + new_value
GET /sensors/camera/frame.png
GET /sensors/code/<code_name>.json
Obtenir la liste des capteurs
GET /sensors/list.json
Description
Donne la liste de tous les capteurs du robot Poppy.
Commande cURL
curl http://poppy.local:8080/sensors/list.json
Valeur de retour
{
"sensors":
[
"camera",
"marker_detector"
]
}
Obtenir la liste des registres d'un capteur
GET /sensors/<sensor_name>/registers/list.json
Description
Donne la liste des noms des registres d'un capteur.
Exemple d'une commande cURL
curl http://poppy.local:8080/sensors/camera/registers/list.json
Valeur de retour
{
"registers":
[
"frame",
"resolution",
"fps",
"index"
]
}
Obtenir la valeur d'un registre de capteur
GET /sensors/<sensor_name>/registers/<register_name>/value.json
Description
Donne la valeur d'un registre d'un capteur.
Exemple d'une commande cURL
curl http://poppy.local:8080/sensors/camera/registers/resolution/value.json
Valeur de retour
{
"resolution":
[
640,
480
]
}
Définir de la valeur d'un registre d'un capteur
POST /sensors/<sensor_name>/registers/<register_name>/value.json + new_value
Description
Modifie la valeur d'un registre d'un capteur. Le nom du capteur et le nom du registre sont indiqués dans l'url. La nouvelle valeur est donnée dans le corps de la requête.
⚠ Cette requête n'a pas pu être testée car nos robots Poppy n'ont que des capteurs dont les registres sont en lecture seule ⚠
Exemple d'une commande cURL
curl -X POST \
-H 'Content-Type: application/json' \
-d '30' \
http://poppy.local:8080/sensors/camera/registers/fps/value.json
Valeur de retour
Cette requête retourne l'erreur suivante:
{
"error": "Either sensor 'camera' or register 'fps' does not exist. Or you want to change a read-only register value",
"tip": "You can find the list of sensors with /sensors/list.json and their registers with /sensors/<sensor_name>/registers/list.json",
"details" : "can't set attribute"
}
Obtenir l'image de la caméra.
GET /sensors/camera/frame.png
Description
Récupère une image grâce à la caméra embarquée du robot
Exemple d'une commande cURL
curl http://poppy.local:8080/sensors/camera/frame.png -o camera.png
Valeur de retour
Une image camera.png
Obtenir les QR codes détectés par la caméra
GET /sensors/code/<code_name>.json
Description
Utilise la primitive marker_detector pour analyser l'image de la caméra et détecter les QR codes. Les noms des QR codes peuvent être tertis, caribou, lapin, rabbit. Vous pouvez également donner list dans le champ code_name pour obtenir la liste des QR codes détectés.
Exemple 1 d'une commande cURL
curl http://poppy.local:8080/sensors/code/tetris.json
Valeur de retour
{
"found": true
}
Exemple 2 d'une commande cURL
curl http://poppy.local:8080/sensors/code/list.json
Valeur de retour
{
"codes": ["caribou", "lapin", "rabbit"]
}
🦾 Enregistrements
📕 Sommaire
GET /records/list.json
POST /records/<move_name>/record.json
POST /records/<move_name>/save.json
POST /records/<move_name>/play.json
POST /records/<move_name>/stop.json
Obtenir les enregistrements disponibles
GET /records/list.json
Description
Donne la liste de tous les déplacements enregistrés par l'utilisateur.
Commande cURL
curl http://poppy.local:8080/records/list.json
Valeur de retour
{
"moves":
[
"wave_hand",
"raise_left_arm",
"my_dance"
]
}
Obtenir toutes les positions d'un enregistrement
GET records/<move_name>/value.json
Description
Donne toutes les positions d'un enregistrement avec le temps auquel elles ont été atteintes.
La réponse fournira toutes les positions pour chaque moteur enregistré, toutes les 0,2 seconde dans le champ "move_name". Il donne également le nombre de positions enregistrées dans le champ "longueur".
Exemple d'une commande cURL
curl http://poppy.local:8080/records/my_move/value.json
Valeur de retour
{
"my_move":
{
"3.4332275390625e-05":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.02030038833618164":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.04038596153259277":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.060483694076538086":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.08058643341064453":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.10069108009338379":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.12079858779907227":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.1409299373626709":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.16099071502685547":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.1810588836669922":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.20113611221313477":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.22122740745544434":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.24132609367370605":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.261415958404541":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.22,
-0.0
]
},
"0.2814903259277344":
{
"head_z":
[
-150.0,
0.0
],
"l_arm_z":
[
-0.31,
-0.0
]
}
},
"length": 15
}
Enregistrer un mouvement
POST /records/<move_name>/record.json + motors
Description
Si vos moteurs sont mous, vous pourrez déplacer les moteurs de votre robot et enregistrer certains mouvements. Cette requête démarre un enregistrement.
Les noms des moteurs dans le corps sont facultatifs. Si votre corps est vide, il enregistrera par défaut le mouvement avec tous les moteurs du robot. Les moteurs doivent être donnés de l'une des deux façons suivantes : {"motors": ["head_z", "l_arm_z"]}
ou {"motors": "head_z,l_arm_z"]}
.
⚠ Si un mouvement du même nom a déjà été défini, il sera écrasé !
Exemple d'une commande cURL
curl -X POST \
-H 'Content-Type: application/json' \
-d '{"motors":["head_z","l_arm_z"]}' \
http://localhost:8080/records/my_move/record.json
Valeur de retour
{
"my_move": "recording"
}
Enregistrer un mouvement
POST /records/<move_name>/save.json
Description
Arrête l'enregistrement en cours et le sauvegarde. Cette requête n'a pas besoin d'information supplémentaire dans son corps de requête.
Exemple d'une commande cURL
curl -X POST \
-H 'Content-Type: application/json' \
http://localhost:8080/records/my_move/save.json
Valeur de retour
{
"my_move": "saved"
}
Jouer un coup enregistré
POST /records/<move_name>/play.json + speed
Description
Rejoue un mouvement enregistré.
Le paramètre de vitesse est une valeur flottante. Il peut être négatif pour jouer le coup à l'envers. Il doit être donné de la façon suivante : {"speed":-1.0}
ou {"speed":0.5}
.
1.0
est la vitesse à donner pour rejouer le coup à la même vitesse qu'il a été enregistré.
Exemple d'une commande cURL
curl -X POST \
-H 'Content-Type: application/json' \
-d '{"speed": -1.0}' \
http://localhost:8080/records/my_move/play.json
Valeur de retour
{
"my_move": "started replay"
}
Arrêter la relecture d'un coup enregistré
POST /records/<move_name>/stop.json
Description
Arrête la relecture d'un coup enregistré.
Cette demande n'a pas besoin de données dans son corps.
Exemple d'une commande cURL
curl -X POST \
-H 'Content-Type: application/json' \
http://localhost:8080/records/my_move/stop.json
Valeur de retour
{
"my_move": "stopped"
}
🤖 Primitives
📕 Sommaire
GET /primitives/list.json
GET /primitives/running/list.json
GET /primitives/<primitive_name>/start.json
GET /primitives/<primitive_name>/stop.json
GET /primitives/<primitive_name>/pause.json
GET /primitives/<primitive_name>/resume.json
GET /primitives/<primitive_name>/properties/list.json
GET /primitives/<primitive_name>/properties/<prop>/value.json
POST /primitives/<primitive_name>/properties/<prop>/value.json + new_value
GET /primitives/<primitive_name>/methods/list.json
POST /primitives/<primitive_name>/methods/<method_name>/args.json
Obtenir la liste de toutes les primitives
GET /primitives/list.json
Description
Les primitives sont des comportements prédéfinis de nos robots Poppy. Vous pouvez ajouter votre propre primitive si vous l'écrivez dans les fichiers source. Un tutoriel (FR :fr:) est disponible pour l'Ergo-Jr ici. Vous pouvez ajouter votre comportement dans /home/poppy/dev/<creature_name>/software/<creature_name>/primitives
si vous êtes sur Raspberry.
Commande cURL
curl http://poppy.local:8080/primitives/list.json
Valeur de retour
{
"primitives":
[
"limit_torque",
"temperature_monitoring",
"dance_beat_motion",
"init_position",
"upper_body_idle_motion",
"head_idle_motion",
"arms_turn_compliant",
"arms_copy_motion",
"_mymove_recorder",
"_mymove_player"
]
}
Obtenir la liste de toutes les primitives en cours d'exécution
GET /primitives/running/list.json
Description
Même requête que ci-dessus mais elle ne donne que les primitives en cours d'exécution.
Commande cURL
curl http://poppy.local:8080/primitives/running/list.json
Valeur de retour
{
"primitives":
[
"temperature_monitoring"
]
}
Exécuter une primitive
GET /primitives/<primitive_name>/start.json
Description
Exécute une primitive existante.
Toutes les primitives existantes peuvent être obtenues avec GET /primitives/list.json
(décrite ci-dessus.
Exemple d'une commande cURL
curl http://poppy.local:8080/primitives/init_position/start.json
Valeur de retour
{
"init_position": "started"
}
Arrêter une primitive
GET /primitives/<primitive_name>/stop.json
Description
Arrête une primitive en cours d'exécution.
Exemple d'une commande cURL
curl http://poppy.local:8080/primitives/init_position/stop.json
Valeur de retour
{
"init_position": "stopped"
}
Mettre une primitive en pause
GET /primitives/<primitive_name>/pause.json
Description
Suspend une primitive en cours d'exécution.
Exemple d'une commande cURL
curl http://poppy.local:8080/primitives/init_position/pause.json
Valeur de retour
{
"init_position": "paused"
}
Reprendre la lecture d'une primitive
GET /primitives/<primitive_name>/resume.json
Description
Reprend la lecture d'une primitive précédemment mise en pause.
Exemple d'une commande cURL
curl http://poppy.local:8080/primitives/init_position/resume.json
Valeur de retour
{
"init_position": "resumed"
}
Obtenir la liste de toutes les propriétés d'une primitive
GET /primitives/<primitive_name>/properties/list.json
Description
Donne la liste des noms de propriétés d'une primitive.
Commande cURL
curl http://poppy.local:8080/init_position/properties/list.json
Valeur de retour
Malheureusement, mes primitives n'ont aucune propriété.
{
"property": []
}
Obtenir la valeur d'une propriété d'une primitive
GET /primitives/<primitive_name>/properties/<prop>/value.json
Description
Cette requête donnerait la valeur d'une propriété d'un primitive.
⚠ Cette requête get n'a pas pu être testée car nos primitives n'ont aucune propriété ⚠
Commande cURL
curl http://poppy.local:8080/primitives/init_position/properties/<prop>/value.json
Valeur de retour
Malheureusement, mes primitives n'ont aucune propriété.
Définir la valeur d'une propriété d'une primitive
POST /primitives/<primitive_name>/properties/<prop>/value.json + new_value
Description
Cette requête modifierait la valeur d'une propriété d'une primitive.
⚠ Cette requête post n'a pas pu être testée car nos primitives n'ont aucune propriété ⚠
Commande cURL
curl -X POST \
-H 'Content-Type: application/json' \
-d 'new_value' \
http://poppy.local:8080/primitives/init_position/properties/<prop>/value.json
Valeur de retour
Malheureusement, mes primitives n'ont aucune propriété.
Obtenir la liste de toutes les méthodes d'une primitive
GET /primitives/<primitive_name>/methods/list.json
Description
Donne la liste des noms des méthodes d'une primitive.
Commande cURL
curl http://poppy.local:8080/primitives/init_position/methods/list.json
Valeur de retour
{
"methods":
[
"start",
"stop",
"pause",
"resume"
]
}
Appeler une méthode d'une primitive avec des arguments
POST /primitives/<primitive_name>/methods/<method_name>/args.json
Description
Appelle une méthode d'une primitive avec des arguments optionnels. Malheureusement, nos primitives actuelles n'ont pas de méthodes acceptant des arguments optionnels.
Exemple d'une commande cURL (non testée)
En supposant que la méthode start
de la primitive init_position
puisse prendre des arguments optionnels, comme une vitesse (ce n'est actuellement pas le cas).
curl -X POST \
-H 'Content-Type: application/json' \
-d '1.0' \
http://poppy.local:8080/primitives/init_position/methods/speed/args.json
Valeur de retour
L'exemple précédent renverra une erreur, car la méthode start
ne peut pas prendre d'arguments optionnels.
Mais si c'était le cas, cela donnerait une réponse comme :
{"init_position:start": 1.0}
Avec 1.0 étant la valeur de retour de la méthode start
. Actuellement, la méthode start
ne renvoie rien.
🇽 🇾 🇿 Cinématique Inverse (IK)
📕 Summary
GET /ik/<chain_name>/value.json
POST /ik/<chain_name>/goto.json + xyz, duration, wait, [rotation]
GET /ik/<chain_name>/rpy.json + r, p, y
Obtenir les coordonnées cartésiennes des bras
GET /ik/<chain_name>/value.json
Description
Donne les coordonnées x, y et z de la chaîne de votre choix.
- Poppy Ergo Jr a 1 chaîne : chain,
- Poppy Torso a 2 chaines : l_arm_chain et r_arm_chain,
- Poppy Humanoid n'a pas encore de chaîne IK.
Les unités sont en mètres pour x, y, z.
La rotation (rot) est donnée pour le débogage car l'orientation IK n'est pas totalement opérationnelle. Donner des valeurs x,y,z à la requête IK-goto fonctionne bien, mais lorsqu'une orientation est donnée en complément, la position atteinte peut être très éloignée des coordonnées cartésiennes données.
Exemple d'une commande cURL (Ergo Jr)
curl http://poppy.local:8080/ik/chain>/value.json
Valeur de retour
{
"xyz": "-0.0067,-0.1744,0.1508",
"rot": "-0.0012,-0.0296,0.9996"
}
Déplacement de la chaîne IK vers une position cartésienne
POST /ik/<chain_name>/goto.json
Description
Déplace la chaîne cinématique inverse aux coordonnées x, y et z.
- Poppy Ergo Jr a 1 chaîne : chain,
- Poppy Torso a 2 chaines : l_arm_chain et r_arm_chain,
- Poppy Humanoid n'a pas encore de chaîne IK. Les unités sont en mètres pour x, y, z.
Vous pouvez donner une rotation ou un tuple roll/pitch/yaw (roulis/tangage/lacet) pour ajouter une orientation à la position cible. Attention, l'orientation IK n'est pas totalement opérationnelle. Donner des valeurs x,y,z à la requête IK-goto fonctionne bien, mais lorsqu'une orientation est donnée en complément, la position atteinte peut être très éloignée des coordonnées cartésiennes données.
Exemple d'une commande cURL (Ergo Jr)
curl -X POST \
-H 'Content-Type: application/json' \
-d '{"xyz": "-0.0091,-0.1744,0.1484","rot": "-0.0018,-0.0471,0.9989","duration":"3","wait":"true"}' \
http://poppy.local:8080/ik/chain/goto.json
Valeur de retour
La réponse est la position atteinte par le bras
{
"xyz": "-0.003,-0.1744,0.1475",
"rot": "-0.001,-0.0593,0.9982"
}
Obtenir la matrice de rotation à partir des valeurs RPY
GET /ik/<chain_name>/rpy.json
Description
Convertit un tuple rpy en une matrice de rotation.
Les chaînes IK disponibles sont :
- Poppy Ergo Jr a 1 chaîne : chain,
- Poppy Torso a 2 chaines : l_arm_chain et r_arm_chain,
- Poppy Humanoid n'a pas encore de chaîne IK.
Les arguments requis sont :
- "r" : roll/roulis (rad)
- "p" : pitch/tangage (rad)
- "y" : yaw/lacet (rad)
Vous pouvez utiliser ce site pour visualiser les valeurs de roulis, de tangage et de lacet : Euler Angles Gimbal Visualization. Ce site web vous permet de calculer la matrice de rotation à partir des valeurs rpy données en degrés.
les unités rpy sont en radians. Dans la plupart des exemples, vous trouverez ces valeurs en degrés. Une future mise à jour peut permettre l'utilisation de rpy avec des degrés.
Exemple d'une commande cURL (Ergo Jr)
curl -X GET \
-H 'Content-Type: application/json' \
-d '{"r":"90", "p":"0", "y":"0"}' \
http://localhost:8080/ik/chain/rpy.json
Valeur de retour
Donne la matrice de rotation à partir des valeurs rpy.
{
"rpy": [[ 1.0, 0.0, 0.0 ],
[ 0.0, 0.0, -1.0 ],
[ 0.0, 1.0, 0.0 ]]
}