{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# How-To: Control a Poppy Humanoid in a Simulator using a Python lib: [pypot](https://github.com/poppy-project/pypot)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"V-REP" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this notebook, we will present how a simulated [Poppy Humanoid](https://github.com/poppy-project/poppy-humanoid) - an open-source and 3D printed humanoid robot - can be controlled in real time. The robot will be simulated in [V-REP](http://www.coppeliarobotics.com) a well known and powerful robot simulator. In this tutorial we will show how to **install**, **use**, and **program** the simulated robot in [Python](https://www.python.org). To do that, we will use the [pypot](https://github.com/poppy-project/pypot) library developed to easily control and program Poppy Creatures." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In more details, we will:\n", "* see how we can **create a poppy humanoid in the V-REP simulator**\n", "* learn how we can **read/send values to the motors**\n", "* **track** one or several Poppy's parts 3D **position and orientation** (e.g. its head)\n", "* write a **simple primitive** to design higher level behaviors (e.g. a dance motion)\n", "* see how we can **reset** and tune the simulation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"Poppy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Note: Most of the tutorial is redundant with the ones on how to control a \"real\" poppy creature. In particular, switching from a real robot to a simulated one (and vice versa) can be done just by changing a single line of code (see the [appendix]() at the end of this notebook). Furthermore, most of the notebook can be applied to any [Poppy Creature](https://www.poppy-project.org/technologies/) (and even any \"[pypot robot](http://poppy-project.github.io/pypot/pypot.robot.html#pypot.robot.robot.Robot)\"), only the instantiation method will change.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Comments, issues, improvements and updates can be sent directly on the dedicated section of the [github issue tracker](https://github.com/poppy-project/pypot/labels/Notebooks).**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### What's needed?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**First, if you do not know how to run an IPython Notebook please refer to [our readme](https://github.com/poppy-project/pypot/blob/master/samples/notebooks/readme.md#notebooks-everywhere).**\n", "\n", "To follow this tutorial you will need:\n", "* a [Python](https://www.python.org) interpreter > 3.4.\n", "* the [V-REP](http://www.coppeliarobotics.com) simulator (please directly see [v-rep download section](http://www.coppeliarobotics.com/downloads.html) for installation details)\n", "* the python [pypot](https://github.com/poppy-project/pypot) library version >= 3.1.0\n", "* the [poppy_humanoid](https://github.com/poppy-project/Poppy-Humanoid) software library >= 2.0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Both V-REP and the pypot/poppy libraries are open source and cross platform." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The pypot and poppy_humanoid library can be installed via [pip](https://python-packaging-user-guide.readthedocs.org/en/latest/projects.html#pip) - a tool for installing Python Package **(if you have no idea what pip is or how to run the following command, please refer to [our readme](https://github.com/poppy-project/pypot#installation) first :-))**:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```bash\n", "pip install pypot poppy_humanoid\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also install them from the [source](https://github.com/poppy-project/poppy-humanoid/tree/master/software) and then use the classical:\n", "\n", "```bash\n", "python setup.py install\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Note: installing poppy_humanoid will also install pypot as it is one of the depencies.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Checking your installation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To check if everything is installed correctly, you can run the following code. If it runs without raising an error, everything is probably installed correctly:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**You can run IPython Notebook code cells by selecting them and clicking the play button or by pressing shift+enter.**" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from pypot.vrep import from_vrep\n", "from pypot.creatures import PoppyHumanoid" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you have any installation issue, please check [our forum](https://forum.poppy-project.org) or the [github issue tracker](https://github.com/poppy-project/pypot/labels/Notebooks)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Instantiating a [Poppy Humanoid](https://www.poppy-project.org/creatures/poppy-humanoid/)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this section, we will see how a Poppy Humanoid can be created into V-REP and how we can connect it to a [pypot Robot](http://poppy-project.github.io/pypot/pypot.robot.html): i.e. the object used in pypot to represent and communicate with a robot." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, you will need to launch V-REP (please refer to [V-REP documentation](http://www.coppeliarobotics.com/helpFiles/index.html) if you don't know how to do it). Once it's done you should see something like:\n", "\n", "\"V-REP" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Instead of loading a specific scene with a Poppy humanoid through the V-REP GUI and then connect to it using pypot, we will directly instantiate the [PoppyHumanoid](https://github.com/poppy-project/Poppy-Humanoid) class which will do most of the work for us." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In particular, it will:\n", "* load a V-REP scene with a Poppy Humanoid\n", "* instantiate a [pypot Robot](http://poppy-project.github.io/pypot/pypot.robot.html) and connect it to the simulated Poppy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To do that, we will use the following code:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from pypot.creatures import PoppyHumanoid\n", "\n", "poppy = PoppyHumanoid(simulator='vrep')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### **Note: Be careful that VREP is often displaying pop-up that freezes the communication with pypot. You will have to close them otherwise a timeout will occur!**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You should now see a Poppy in your V-REP window:\n", "\n", "\"V-REP" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Controlling motors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As soon as you have instantiated a [Robot](http://poppy-project.github.io/pypot/pypot.robot.html#pypot.robot.robot.Robot) - in our case through the [PoppyHumanoid](https://github.com/poppy-project/Poppy-Humanoid) class - it is synced with the simulation (or the real robot). This means that values from the V-REP simulation (e.g. limbs position) are retrieved from the simu and affected to their equivalent variables by a synchronization loop. Similarly target variables (e.g. motors goal position) are sent to V-REP. This synchronization loop runs at 50Hz by default." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To be more clear, when reading a variable from the *poppy* object you will obtain the last synced value from V-REP and when setting a new value to a *poppy* variable it will be automatically sent to V-REP a short time after. You never need to manually sync your instance with the current state of the simulation, it is automatically done by a thread running in background." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Accessing motors registers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dynamixel motors comes with a [lot of registers](http://support.robotis.com/en/product/dynamixel/mx_series/mx-28.htm) which are used to store the current state of the robot (its current position, temperature, pid gains...) but also where you can write new target values, for instance a new goal position." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " In this section we will see how pypot give you an high-level access to the most frequently used registers ([pypot low-level IO](http://poppy-project.github.io/pypot/dynamixel.html) gives you an access to all registers but this is beyond the scope of this tutorial)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So, first we will retrieve the list of all available motors. The [motors](http://poppy-project.github.io/pypot/pypot.robot.html#pypot.robot.robot.Robot.motors) variable contains the list of all motors attached to the current robot. \n", "\n", "\"Poppy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By default, each motor prints its name, its id, and its current position:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "poppy.motors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can access a specific motor directly using its name:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "poppy.l_shoulder_y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we want to get the current position (in degrees) of a specific motor (e.g. *head_y*) we can use:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-2.1999999999999993" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "poppy.head_y.present_position" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also use the list/dict comprehension to retrieve a specific value for all motors." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A list of all current motor positions:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[-0.0,\n", " 0.0,\n", " 0.0,\n", " -2.1999999999999993,\n", " 0.1,\n", " 0.0,\n", " 0.0,\n", " -1.0,\n", " 0.0,\n", " 0.0,\n", " 0.3,\n", " 0.0,\n", " 0.0,\n", " -0.3,\n", " -2.0,\n", " 0.1,\n", " 0.0,\n", " 0.1,\n", " -0.0,\n", " 0.1,\n", " 0.1,\n", " 0.0,\n", " -0.0,\n", " 0.29999999999999716,\n", " -0.29999999999999716]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[m.present_position for m in poppy.motors]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A dictionary of pairs {motor_name: motor_position}:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{u'abs_x': 0.0,\n", " u'abs_y': 0.1,\n", " u'abs_z': 0.0,\n", " u'bust_x': 0.0,\n", " u'bust_y': 0.1,\n", " u'head_y': -2.3000000000000007,\n", " u'head_z': 0.0,\n", " u'l_ankle_y': 0.1,\n", " u'l_arm_z': 0.0,\n", " u'l_elbow_y': 0.0,\n", " u'l_hip_x': -0.3,\n", " u'l_hip_y': -2.0,\n", " u'l_hip_z': 0.1,\n", " u'l_knee_y': 0.0,\n", " u'l_shoulder_x': 0.29999999999999716,\n", " u'l_shoulder_y': -0.29999999999999716,\n", " u'r_ankle_y': 0.1,\n", " u'r_arm_z': 0.0,\n", " u'r_elbow_y': 0.0,\n", " u'r_hip_x': 0.3,\n", " u'r_hip_y': 0.0,\n", " u'r_hip_z': -0.0,\n", " u'r_knee_y': 0.0,\n", " u'r_shoulder_x': -1.0,\n", " u'r_shoulder_y': 0.0}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "{m.name: m.present_position for m in poppy.motors}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Motor alias or group of motors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In pypot we use the concept of motor alias which is simply a list of motors grouped together under a specific name. For instance, you can directly access all the motors from the torso using the *torso* alias. Poppy Humanoid also defines a *leg* alias, a *left arm* alias..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note, that *motors* used above is just one of the predefined motors alias - one with all attached motors. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can retrieve the list of motors alias available using:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[u'r_leg',\n", " u'l_leg_sagitall',\n", " u'l_leg',\n", " u'head',\n", " u'r_arm',\n", " u'legs',\n", " u'torso',\n", " u'r_leg_sagitall',\n", " u'l_arm',\n", " u'arms']" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "poppy.alias" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each alias contains a list of motors. Thus, you can similarly retrieve all positions for only the motors of the right leg:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{u'r_ankle_y': 0.1,\n", " u'r_hip_x': 0.3,\n", " u'r_hip_y': 0.0,\n", " u'r_hip_z': -0.0,\n", " u'r_knee_y': 0.0}" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "{m.name: m.present_position for m in poppy.r_leg}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Setting registers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In a similar way that you retrieve values from V-REP, you can set a new target position to a motor." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By sending the following command, you should see the robot turns its head of 90°:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "poppy.head_z.goal_position = 90." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or you can affect new target positions for a group of motors:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "for m in poppy.l_arm:\n", " m.goal_position = 30." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's important to note the difference between the current and goal position. In particular, when setting a new goal position, it will take time before the motor actually reaches the desired position (see section below for an example)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Thus, in the code below only the second instruction will likely have an effect on the robot:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "poppy.r_shoulder_x.goal_position = 30\n", "poppy.r_shoulder_x.goal_position = -30" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Note: While the full list of motor registers is available, not all of them are having an effect in the V-REP simulation. For instance, modifying the pid of a motor won't affect the simulation.*\n", "\n", "*Currently in the V-REP simulator you can use:*\n", "\n", "* **present_position** *(R): the actual position of the motor (usually from -180° to 180°)*\n", "* **goal_position** *(RW): the target position of the motor, that is to say the position it will try to reach (same range and units than the present position)*\n", "* **present_load** *(R): the current load applied on the motor (expressed in % of the max supported load)*\n", "* **torque_limit** *(RW): the maximum torque that a motor can applied (also expressed in % of the max supported load)*\n", "* **compliant** *(RW): whether the motor is compliant: if it resits or not when manually turned*\n", "* **angle_limit** *(R): the position limits (lower and upper) of the motor. Some motors are restrained to a smaller position range to avoid breaking other parts.*\n", "\n", "*Support for additional features may be added in future version.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Goto position" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also use the [goto_position](http://poppy-project.github.io/pypot/pypot.dynamixel.html#pypot.dynamixel.motor.DxlMotor.goto_position) method (both at the robot or motor level) to get more control over the trajectory of a motor. In the examples above, when affecting the [goal_position](http://poppy-project.github.io/pypot/pypot.dynamixel.html#pypot.dynamixel.io.DxlIO.get_goal_position) the motor will try to reach it as fast as the [moving_speed](http://poppy-project.github.io/pypot/pypot.dynamixel.html#pypot.dynamixel.io.DxlIO.get_moving_speed) permits it. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At the moment, [goto_position](http://poppy-project.github.io/pypot/pypot.dynamixel.html#pypot.dynamixel.motor.DxlMotor.goto_position) comes with two behaviors:\n", "* *dummy:* just adjust the moving_speed so the goal_position is reached at the predefined timestamp (not always very accurate)\n", "* *minjerk:* using the [minimum jerk](http://nbviewer.ipython.org/github/demotu/BMC/blob/master/notebooks/MinimumJerkHypothesis.ipynb) to compute a smoother trajectory." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, let's restart the simulation:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "poppy.reset_simulation()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we make the head move towards -45° in 2 seconds:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "poppy.head_z.goto_position(-45, 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Goto position also comes with a wait arguments, so you can easily link motions (*wait=True* will wait for the movement to finish before executing the next line, while *wait=False* will send the new target position order and directly jump to the next instruction):" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "poppy.head_z.goto_position(45, 2, wait=False)\n", "poppy.head_y.goto_position(-30, 2, wait=True)\n", "\n", "poppy.head_z.goto_position(0, 2, wait=True)\n", "\n", "poppy.head_y.goto_position(20, 1, wait=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can get and set a new *goto_behavior* through the property:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'minjerk'" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "poppy.head_y.goto_behavior" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "poppy.head_y.goto_behavior = 'dummy'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Read and Write" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's prepare another example where we will illustrate the difference between present and goal position by applying a sinusoid on a specific motor." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To make sure the robot is in a stable position, we will reset the simulation. This will re-positioned the robot in its initial position:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "poppy.reset_simulation()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's make the robot's head moves:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "import time\n", "\n", "import math\n", "\n", "amp = 30 # in degrees\n", "freq = 0.5 # in Hz\n", "\n", "t0 = time.time()\n", "\n", "while True:\n", " t = time.time()\n", " \n", " # run for 10s\n", " if t - t0 > 10:\n", " break\n", "\n", " poppy.head_z.goal_position = amp * math.sin(2 * 3.14 * freq * t)\n", " \n", " time.sleep(0.04)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we will use the same code but we will record both the current and goal position:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "current, goal = [], []\n", "\n", "t0 = time.time()\n", "\n", "while True:\n", " t = time.time()\n", " \n", " # run for 5s\n", " if t - t0 > 5:\n", " break\n", "\n", " poppy.head_z.goal_position = amp * math.sin(2 * 3.14 * freq * t)\n", "\n", " \n", " current.append(poppy.head_z.present_position)\n", " goal.append(poppy.head_z.goal_position)\n", " \n", " time.sleep(0.04)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we plot the two trajectories, we can clearly see a time shift representing the time needed by the motor to reach the desired position: " ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%pylab inline\n", "\n", "t = linspace(0, 5, len(current))\n", "plot(t, goal)\n", "plot(t, current)\n", "\n", "legend(('goal', 'current'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Similarly, we can observe a goto position using the *minimum jerk* mode which shows the smooth acceleration and deceleration:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "poppy.l_shoulder_x.goto_behavior = 'minjerk'\n", "\n", "poppy.l_shoulder_x.goto_position(120, 5)\n", "\n", "pos = []\n", "t0 = time.time()\n", "\n", "while time.time() - t0 < 5:\n", " pos.append(poppy.l_shoulder_x.present_position)\n", " \n", " time.sleep(0.01)\n", " \n", "t = linspace(0, 5, len(pos))\n", "plot(t, pos)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "poppy.reset_simulation()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tracking objects" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using a V-REP simulated robot, you can easily retrieve an object position and orientation. You just need to know its name in the vrep scene." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Note: at the moment to know the name of object in the vrep scene, you have to look for them in the v-rep window. Hopefully in future version of pypot, you will be able to directly retrieve them.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"Finding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For instance, to get the 3D position of the left hand, you just have to do:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0.1095716655254364, -0.00011663895566016436, 0.41662484407424927]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "poppy.get_object_position('l_forearm_visual')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By default, the position is in the V-REP scene referential (the zero is somewhere between Poppy Humanoid's feet). You can use any object as referential and thus get the *left forearm* position related to the *head* for instance:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[-0.12343111634254456, -0.30701112747192383, -0.12243124842643738]" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "poppy.get_object_position('l_forearm_visual', 'head_visual')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This can be used for discovering a reachable space for instance:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "reached_pt = []\n", "\n", "for m in poppy.l_arm:\n", " m.goto_behavior = 'minjerk'\n", "\n", "# We generate 25 random arm configuration\n", "# and stores the reached position of the forearm\n", "for _ in range(25):\n", " poppy.reset_simulation()\n", " \n", " # Generate a position by setting random position (within the angle limit) to each joint\n", " # This can be hacked to define other exploration\n", " pos = {m.name: randint(min(m.angle_limit), max(m.angle_limit)) for m in poppy.l_arm} \n", " poppy.goto_position(pos, 2., wait=True)\n", " \n", " reached_pt.append(poppy.get_object_position('l_forearm_visual'))" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nNUEQbA0m5MZdLBZx1VVX4e2338by5cvRr18/284lBz1NDoccckjF/9+6daujY7ITHYp077nnHrzx\nxhs499xz8e2332LixIk46aSTMHjwYIwdOxaHHHKIVLkkHSL7olKLr9KLyi6b7V6SW13uy4n92Xwp\nSddI4VEsFk2lJeTG7WQxiz0266olR0xG9MNyeUonc6BWjs1OshQ50yqIVnJy16vku6A2bj5y/uij\nj3DBBRfgxBNPxDXXXNMmHVx6mxwId999N6ZOner4uOxChyJdQRCQTCZx2mmn4eyzz5a8Oz/99FO8\n+eabuPPOO/HRRx8hGAxizJgxGDt2LA4++GB06tRJ9sFl84hOeQ7wy327hPGkuSQ/Wn5XXy21hJ5x\nO6mm0Oook7tevfph1iLRCfUAVfidjJxjsVirY/PRP6uY0Frd8ZrecrmMW265BS+99BLuueceDB06\n1LbrsBOvvPIK7r33Xrz++uu7eyi60aFIFwCmTJmCKVOmSP/t9Xqx7777Yt9998UZZ5wBURSRTCax\nYcMGvPnmm3jooYewbds27L333jjooIMwbtw4jBgxAoIgSMU3io4CgYAjTQher9fRF5QlFirAEczs\n12a260sP2NWE1VZYPg1DjTLlcllqkkmlUgDUr1cPyInOiYhfLr8qBzXfBbV2X0q9UXT7+eefY86c\nOZgyZQpefPFFW82H9EBvk8N7772H2bNnY8WKFejcuXNbDtESOlQhzSzK5TK2bNmCN998E2vXrsWm\nTZsQj8eRSqXQt29fLF26FN27d694gK2oB5x01FJbkuuBViGHfmf3fm1OF7N49yu2SUFv4UppPGr2\ni1bBTsx2WH/yaZhCoQAAeP3117F8+XLU1NRg06ZNuOuuuzBu3Dg7LsEwSqUShg4dipUrV6K+vh4H\nH3wwli1bhuHDh0t/88033+AXv/gFHnjggYr8bjvCnqFesAsLFizAfffdh1mzZqGurg7r16/Hli1b\n0K1bN4wdOxbjxo3D6NGjpeU6dVvJ5dNYOE0sTulLy+WydGyWrPg0jFlCcFLyZEYGplc/DOyqDdg9\neeqNbs0em+2G8/v9ePfdd/HnP/8ZO3bsQCaTwUcffYSzzz4bf/7zn207rxGsWLEC559/viQZu+SS\nSyqaHGbNmoV///vf2GeffSCKLd7Xannf3QCXdI3gnXfewcCBA6WteoCWB3Xbtm1Yu3Yt1q5diw0b\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from mpl_toolkits.mplot3d import Axes3D\n", "\n", "ax = axes(projection='3d')\n", "ax.scatter(*array(reached_pt).T)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This example could be extended to show a simple method to build an inverse model (you build a table with many goals in the search space associated with the motor command which generated it, and for the inverse model you reproduce the motor command of the stored goal closest to the point you want to reach).\n", "\n", "This could be a very good exercise where in a specific notebook you describe a simple approach to build and use approximated inverse models. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you are interested in this kind of experiments and want to go further, you can see the [explauto](https://github.com/flowersteam/explauto) library. It provides a unified framework for autonomous exploration experiment notably using a Poppy Creature. You will find there learning algorithms that can be used to learn forward (e.g. where the end position of an arm is depending on each joints position) and inverse model (finding the joint angles to locate the end effector at a desired position)." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "poppy.reset_simulation()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using primitives" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pypot also comes with the [Primitive](http://poppy-project.github.io/pypot/primitive.html) abstraction. The idea is to write simple behaviors that can be automatically combined to create more complex behaviors. As the primitive is likely to change in the future, and go toward something better defined, we will only show the very basic stuff you can do using primitives." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In more technical details, a primitive is only a thread which have access to all robot sensors and effectors. A [primitive manager](http://poppy-project.github.io/pypot/pypot.primitive.html#module-pypot.primitive.manager) is used to gather all primitives orders and combined them using a filter (a simple sum by default)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As an example of how to use primitives, we will use one of the predefined primitives, the [Sinus](http://poppy-project.github.io/pypot/pypot.primitive.html#pypot.primitive.utils.Sinus):" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "from pypot.primitive.utils import Sinus" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Primitives are usually instantiated with a robot as the first argument. As Sinus is a [LoopPrimitive](http://poppy-project.github.io/pypot/pypot.primitive.html#pypot.primitive.primitive.LoopPrimitive) (i.e. a specific primitive which call an update method at a predefined frequency), you also need to pass the call frequency as the second argument)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The other arguments, here the motors list, the amplitude and the frequency are specific to the [Sinus](http://poppy-project.github.io/pypot/pypot.primitive.html#pypot.primitive.utils.Sinus) primitive." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "sin_1 = Sinus(poppy, 25., [poppy.head_z, poppy.head_y], amp=15, freq=.15)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A primitive can be:\n", "* started (re-started)\n", "* stopped\n", "* paused\n", "* resumed" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By running the following code, you should see both motors of the head performs a sinusoid." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "sin_1.start()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Multiples primitives can be runned at the same time:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "sin_2 = Sinus(poppy, 25., [poppy.head_z, ], amp=8, freq=.5)\n", "sin_2.start()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will now write a simple motor position logger using a loop primitive:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "from pypot.primitive import LoopPrimitive\n", "\n", "class MotorPositionLogger(LoopPrimitive):\n", " def __init__(self, robot, refresh_freq, motor):\n", " LoopPrimitive.__init__(self, robot, refresh_freq)\n", " \n", " self.motor = getattr(self.robot, motor.name)\n", "\n", " # This code will be called each time the primitive is started\n", " def setup(self):\n", " self.positions = []\n", " \n", " # This method will be called at the predefined frequency\n", " def update(self):\n", " self.positions.append(self.motor.present_position)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "logger = MotorPositionLogger(poppy, 50, poppy.head_z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will illustrate the combination of primitives by pausing one of them in the middle of the recording:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "logger.start()\n", "\n", "time.sleep(10)\n", "sin_2.pause()\n", "\n", "time.sleep(15)\n", "sin_2.resume()\n", "\n", "time.sleep(5)\n", "logger.stop()\n", "\n", "pos = logger.positions\n", "\n", "plot(linspace(0, 30, len(pos)), pos)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can see on the plot above, that the two sinusoids are combined from 0 to 10 and from 25 to 30. From 10 to 25 only one of the sinusoid is applied." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we stop all running primitives:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "for p in poppy.active_primitives:\n", " p.stop()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Appendix: switching from a simulated poppy to a real one" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As mentionned in the introduction, most of the code above can be run on a \"real\" robot. All you need to change is the way the robot is instantiated. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You have to replace:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "poppy = PoppyHumanoid(simulator='vrep')\n", "```\n", "\n", "by \n", "\n", "```python\n", "poppy = PoppyHumanoid()\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Of course, some of the directly V-REP related code - such as *reset_simulation* or *get_object_position* does not have any direct equivalent on the real robot. But all the rest should work and give about the same results on the real or the simulated robot." ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.5" } }, "nbformat": 4, "nbformat_minor": 1 }