{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "\n", "#Premiers pas avec une créature\n", "##### 10 choses à savoir sur poppy\n", "\n", "1. Ouvrir l'interface\n", "2. Instancier Poppy (démarrer la simulation)\n", "3. Redémarrer la simulation\n", "4. Eteindre la simulation\n", "5. Moteurs & capteurs de poppy\n", "6. Bouger - fonction goal_position\n", "7. Bouger - fonction goto_position\n", "8. Instancier d'autres créatures\n", "9. Démarrer avec une créature réelle\n", "10. Particularités des modèles réelle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##1 - Ouvrir l'interface\n", "\n", "####Ouvrir V-REP ou connecter le robot.\n", "####Ouvrir Jupyter - ipython [vidéo démonstrative](https://www.youtube.com/watch?v=roWqTz9fQSE)\n", "\n", "- via un terminal avec la commande : ipython notebook\n", "- via l'exécutable: rechercher dans 'tout les programmes' anaconda\\IPython (Py 2.7) Notebook\n", "- via l'exécutable 'Launcher' : rechercher dans 'tout les programmes' anaconda\\Launcher\n", "\n", "\n", "- Pour Poppy réel : via http://poppy.local (ou si vous avez modifié le nom de votre Poppy: http://new-name.local)\n", "\n", "\n", "##2 - Instancier Poppy\n", "Pour démarrer la simulation ; éxécuter les commandes suivantes:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from poppy.creatures import PoppyHumanoid\n", "creature = PoppyHumanoid(simulator='vrep')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##3 - Redémarrer la simulatiuon " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "creature.reset_simulation()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##4 - Eteindre la simulation" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pypot\n", "creature.stop_simulation()\n", "pypot.vrep.close_all_connections()" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "from poppy.creatures import PoppyHumanoid\n", "poppy = PoppyHumanoid(simulator='vrep')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##5 - Moteurs & capteurs\n", "\n", "#####Poppy, comment tu fonctionnes?" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Réponse:\n", "j'ai 25 moteurs\n", "il sont tous indexés dans une qui s'appelle poppy.motors \n", "\n", " la voici: \n", "-------------\n", "nom du moteur: l_elbow_y\n", "position actuel du moteur: 0.0 degrès\n", "-------------\n", "nom du moteur: r_elbow_y\n", "position actuel du moteur: 0.0 degrès\n", "-------------\n", "nom du moteur: r_knee_y\n", "position actuel du moteur: 0.0 degrès\n", "-------------\n", "nom du moteur: head_y\n", "position actuel du moteur: -2.3 degrès\n", "-------------\n", "nom du moteur: head_z\n", "position actuel du moteur: 0.0 degrès\n", "-------------\n", "nom du moteur: r_arm_z\n", "position actuel du moteur: 0.0 degrès\n", "-------------\n", "nom du moteur: r_ankle_y\n", "position actuel du moteur: 0.1 degrès\n", "-------------\n", "nom du moteur: r_shoulder_x\n", "position actuel du moteur: -1.0 degrès\n", "-------------\n", "nom du moteur: r_shoulder_y\n", "position actuel du moteur: 0.0 degrès\n", "-------------\n", "nom du moteur: r_hip_z\n", "position actuel du moteur: 0.0 degrès\n", "-------------\n", "nom du moteur: r_hip_x\n", "position actuel du moteur: 0.2 degrès\n", "-------------\n", "nom du moteur: r_hip_y\n", "position actuel du moteur: 0.0 degrès\n", "-------------\n", "nom du moteur: l_arm_z\n", "position actuel du moteur: 0.0 degrès\n", "-------------\n", "nom du moteur: l_hip_x\n", "position actuel du moteur: -0.3 degrès\n", "-------------\n", "nom du moteur: l_hip_y\n", "position actuel du moteur: -2.0 degrès\n", "-------------\n", "nom du moteur: l_hip_z\n", "position actuel du moteur: 0.1 degrès\n", "-------------\n", "nom du moteur: abs_x\n", "position actuel du moteur: 0.0 degrès\n", "-------------\n", "nom du moteur: abs_y\n", "position actuel du moteur: 0.1 degrès\n", "-------------\n", "nom du moteur: abs_z\n", "position actuel du moteur: 0.0 degrès\n", "-------------\n", "nom du moteur: l_ankle_y\n", "position actuel du moteur: 0.1 degrès\n", "-------------\n", "nom du moteur: bust_y\n", "position actuel du moteur: 0.1 degrès\n", "-------------\n", "nom du moteur: bust_x\n", "position actuel du moteur: 0.0 degrès\n", "-------------\n", "nom du moteur: l_knee_y\n", "position actuel du moteur: 0.0 degrès\n", "-------------\n", "nom du moteur: l_shoulder_x\n", "position actuel du moteur: 0.3 degrès\n", "-------------\n", "nom du moteur: l_shoulder_y\n", "position actuel du moteur: -0.3 degrès\n" ] } ], "source": [ "print\"Réponse:\"\n", "print \"j'ai\", len( poppy.motors ), \"moteurs\"\n", "print \"ils sont tous indexés dans une \", type( poppy.motors ), \"qui s'appelle poppy.motors \\n\\n la voici: \"\n", "for m in poppy.motors:\n", " print \"-------------\"\n", " print \"nom du moteur: \", m.name\n", " print \"position actuelle du moteur: \", m.present_position, \"degrès\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#####Explication:\n", "\n", "Ici on utilise une liste pour stocker le nom des moteurs: poppy.motors\n", "\n", "chaque moteur possède:\n", "\n", "- un nom ; exemple: poppy.head_z.name\n", "- une id ; exemple: poppy.head_z.id\n", "- une position courante ; exemple: poppy.head_z.present_position" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#####Aperçu de l'ensemble des moteurs:\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##6 - Bouger - fonction 'goal_position'\n", "\n", "#####Poppy, tu es prêt ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# éteindre la simulation précédente...\n", "import pypot\n", "creature.stop_simulation()\n", "pypot.vrep.close_all_connections()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# ...avant d'en démarrer une nouvelle.\n", "from poppy.creatures import PoppyHumanoid\n", "poppy = PoppyHumanoid(simulator='vrep')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Poppy dit oui\n", "for i in range(2):\n", " poppy.head_y.goal_position = -20\n", " poppy.head_y.goal_position = +20\n", "poppy.head_y.goal_position = 0\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#####Il ne se passe rien... si !\n", "#####mais Poppy va trop vite, essayons ça :" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Poppy dit oui\n", "import time\n", "for i in range(2):\n", " poppy.head_y.goal_position = -20\n", " time.sleep(1)\n", " poppy.head_y.goal_position = +20\n", " time.sleep(1)\n", "poppy.head_y.goal_position = 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#####Explication:\n", "\n", "Ici on utilise la fonction 'goal_position', précédée du nom du moteur, précédé du nom de la créature.\n", "\n", "Elle accepte des valeurs de positions allant de -180° à +180°
\n", "\n", "Les lignes de code s'exécutent de façon quasi instantannées ; même si la position (demandée en ligne précédente) n'a pas été atteinte.\n", "\n", "Le module 'Time' nous permet d'attendre (grâce à la fonction 'time.sleep') que le moteur ai atteint la position voulue avant d'exécuter la commande suivante." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##7 - Bouger - fonction 'goto_position'\n", "\n", "#####Bonjour Poppy" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "poppy.l_shoulder_x.goto_position(90,2)\n", "poppy.l_arm_z.goto_position(90,2)\n", "poppy.abs_z.goto_position(10,2)\n", "poppy.l_elbow_y.goto_position(-120,2,wait=True)\n", "\n", "for i in range(3):\n", " poppy.l_elbow_y.goto_position(-90,0.5,wait=True)\n", " poppy.l_elbow_y.goto_position(-120,0.5,wait=True)\n", " \n", "poppy.l_shoulder_x.goto_position(0,2)\n", "poppy.l_arm_z.goto_position(0,2)\n", "poppy.abs_z.goto_position(0,2)\n", "poppy.l_elbow_y.goto_position(0,2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#####Explication:\n", "\n", "Ici on utilise la fonction 'goto_position', précédée du nom du moteur, précédé du nom de la créature.\n", "\n", "Elle accepte entre 2 et 3 paramètres:\n", " - la position en dégrès\n", " - le temps en secondes pour atteindre cette position\n", " - paramètre facultatif 'wait=True'\n", " \n", "L'option 'wait=True' permet d'attendre que la position soit atteinte avant de passer à la ligne suivante.
\n", "Par défaut 'wait=False' ne bloque pas le défilement, on peut donc lancer plusieurs moteurs au même moment." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##8 - Démarrer avec d'autres créatures\n", "\n", "#####Poppy, y a t-il d'autres créatures comme toi ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for i in range(3):\n", " poppy.head_y.goto_position(-20,1)\n", " poppy.head_y.goto_position(+20,1)\n", "poppy.head_y.goto_position(0,0.5)\n", "\n", "print \"Torso, Ergo, et toute la family\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plus d'informations sur les prochaines créatures Poppy sur ce topic : [Poppy mini family](https://forum.poppy-project.org/t/cfc-extending-the-poppy-mini-family-we-need-your-help/1346)\n", "\n", "####Instancier Poppy-Torso\n", "Pour démarrer la simulation ; éxécuter les commandes suivantes:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#si une simulation est active, n'oubliez pas de la quitter\n", "from poppy.creatures import PoppyTorso\n", "torso = PoppyTorso(simulator='vrep')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Instancier Ergo\n", "Pour démarrer la simulation ; éxécuter les commandes suivantes:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#si une simulation est active, n'oubliez pas de la quitter\n", "from poppy.creatures import PoppyErgo\n", "ergo = PoppyErgo(simulator='vrep')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "etc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##9 - Démarrer avec une créature réelle\n", "\n", "Pour passer d'un programme destiné à une version simulée vers une version réelle, cela nécéssite une unique modification lorsque la créture est instanciée:\n", "\n", "Dans votre programme, la ligne...\n", "\n", "- creatures = PoppyHumanoid(simulator='vrep') \n", "\n", "...devient : \n", "\n", "- creatures = PoppyHumanoid()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "####Particularités des modèles réels\n", "\n", "- Les moteurs peuvent être dans deux états: compliant / non compliant\n", "\n", " 1. l'état compliant permet de déplacer manuellement les moteurs sans résistance.\n", " 2. l'état non compliant bloque les moteurs.\n", " \n", " Exemple:
\n", " poppy.head_z.compliant = True
\n", " poppy.head_z.compliant = False
\n", "\n", "\n", "- La vitesse des moteurs peut être modifiée via la fonction 'moving_speed'\n", "\n", " Exemple:
\n", " poppy.head_z.moving_speed = 150 #vitesse en milliseconde\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##10 - Achat, construction, créer sa créature :\n", "\n", "Acheter :
\n", "Rendez vous sur : [Génération robots](http://www.generationrobots.com/en/279-poppy-opensource-robotics-platform) plusieurs modèles vous y sont proposés.\n", "\n", "\n", "Construire :
\n", "Rendez vous sur : [Assembling Poppy Humanoid](https://github.com/poppy-project/poppy-humanoid/blob/master/hardware/doc/Poppy_Humanoid_assembly_instructions.md) une notice et des vidéos vous aident à construire votre poppy\n", "\n", "\n", "Création :
\n", "Retrouvez toute la documentation pour imprimer et acheter individuellement les éléments nécessaires à la construction d'un « pypot robot » sur le site [poppy-project.org](http://www.poppy-project.org).\n", "\n", "Pour plus d'informations rendez-vous sur le [Forum](http://www.forum.poppy-project.org)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##Aller plus loin\n", "\n", "- La possibilité d'ajouter des objets interactifs (balle, cube, etc) plus de details [ici](https://forum.poppy-project.org/t/torso-interacting-with-objects-in-v-rep/1321)\n", "\n", "- Installation détaillée [ici](https://github.com/HumaRobotics/poppy-examples/blob/master/doc/softwareGuide/softwareGuide.pdf)\n", "\n", "- d'autres notebooks pour\n", "[V-REP](http://nbviewer.ipython.org/github/poppy-project/pypot/blob/master/samples/notebooks/Controlling%20a%20Poppy%20humanoid%20in%20V-REP%20using%20pypot.ipynb) ;\n", "[Torso](http://nbviewer.ipython.org/github/poppy-project/poppy-torso/blob/master/software/doc/tutorial/Poppy%20Torso%20interacting%20with%20objects%20in%20V-REP%20using%20Pypot.ipynb) ;\n", "[Snap!](http://nbviewer.ipython.org/github/poppy-project/pypot/blob/master/samples/notebooks/Controlling%20a%20Poppy%20Creature%20using%20SNAP.ipynb) ;\n", "et l'ensemble des notebooks via le site [poppy-project.org](http://poppy-project.org)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# essaies ton propre code ;)\n", "\n", "\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.9" } }, "nbformat": 4, "nbformat_minor": 0 }