├── .gitattributes ├── .gitignore ├── .gitmodules ├── README.md ├── doc ├── README.md └── img │ └── poppy-humanoid-github.jpg ├── hardware ├── LICENSE.md ├── Poppy_Humanoid.SLDASM ├── STL │ └── extract_3D_printable_STL_parts.py ├── URDF │ ├── launch │ │ ├── display.launch │ │ └── gazebo.launch │ ├── manifest.xml │ ├── meshes │ │ ├── abdomen_respondable.STL │ │ ├── abdomen_visual.STL │ │ ├── abs_motors_respondable.stl │ │ ├── abs_motors_visual.STL │ │ ├── bust_motors_respondable.stl │ │ ├── bust_motors_visual.STL │ │ ├── chest_respondable.STL │ │ ├── chest_visual.STL │ │ ├── head_respondable.stl │ │ ├── head_visual.STL │ │ ├── l_foot_respondable.stl │ │ ├── l_foot_visual.STL │ │ ├── l_forearm_respondable.stl │ │ ├── l_forearm_visual.STL │ │ ├── l_hip_motor_respondable.stl │ │ ├── l_hip_motor_visual.STL │ │ ├── l_hip_respondable.stl │ │ ├── l_hip_visual.STL │ │ ├── l_shin_respondable.stl │ │ ├── l_shin_visual.STL │ │ ├── l_shoulder_motor_respondable.stl │ │ ├── l_shoulder_motor_visual.STL │ │ ├── l_shoulder_respondable.stl │ │ ├── l_shoulder_visual.STL │ │ ├── l_thigh_respondable.STL │ │ ├── l_thigh_visual.STL │ │ ├── l_upper_arm_respondable.STL │ │ ├── l_upper_arm_visual.STL │ │ ├── neck_respondable.STL │ │ ├── neck_visual.STL │ │ ├── pelvis_respondable.STL │ │ ├── pelvis_visual.STL │ │ ├── r_foot_respondable.STL │ │ ├── r_foot_visual.STL │ │ ├── r_forearm_respondable.STL │ │ ├── r_forearm_visual.STL │ │ ├── r_hip_motor_respondable.STL │ │ ├── r_hip_motor_visual.STL │ │ ├── r_hip_respondable.STL │ │ ├── r_hip_visual.STL │ │ ├── r_shin_respondable.STL │ │ ├── r_shin_visual.STL │ │ ├── r_shoulder_motor_respondable.STL │ │ ├── r_shoulder_motor_visual.STL │ │ ├── r_shoulder_respondable.STL │ │ ├── r_shoulder_visual.STL │ │ ├── r_thigh_respondable.STL │ │ ├── r_thigh_visual.STL │ │ ├── r_upper_arm_respondable.STL │ │ ├── r_upper_arm_visual.STL │ │ ├── spine_respondable.STL │ │ └── spine_visual.STL │ ├── robots │ │ └── Poppy_Humanoid.URDF │ └── update_URDF.py ├── doc │ └── README.md └── utils │ ├── 3D_printing.sldmat │ ├── black_polyamide.p2m │ └── white_polyamide.p2m └── software ├── LICENSE ├── MANIFEST.in ├── README ├── doc ├── img │ ├── GR-logo.png │ ├── poppy-logo.png │ ├── snap-header.png │ ├── snap-import.png │ ├── snap_blocks.png │ ├── snap_full.png │ ├── snap_full_selected.png │ ├── snap_motors.png │ ├── snap_move.png │ ├── snap_record.png │ └── vrep-poppy.png ├── softwareGuide.pdf ├── softwareGuide.tex └── start_Poppy_Humanoid.md ├── poppy_humanoid ├── __init__.py ├── _version.py ├── configuration │ └── poppy_humanoid.json ├── media │ └── sounds │ │ └── error.wav ├── poppy_humanoid.py ├── primitives │ ├── __init__.py │ ├── dance.py │ ├── idle.py │ ├── interaction.py │ ├── posture.py │ └── safe.py ├── utils │ └── __init__.py └── vrep-scene │ ├── poppy_humanoid.ttt │ ├── random_force.lua │ └── timer.lua ├── samples └── notebooks │ ├── Controlling a Poppy humanoid in V-REP using pypot.ipynb │ ├── Demo Interface.ipynb │ ├── Discover your Poppy Humanoid.ipynb │ ├── Record, Save and Play Moves on Poppy Humanoid.ipynb │ ├── TTFX.ipynb │ └── image │ ├── poppy_humanoid.jpg │ ├── poppy_humanoid_motors.png │ ├── vrep-finding-names.png │ ├── vrep-header.png │ ├── vrep-poppy.png │ └── vrep-screenshot.png └── setup.py /.gitattributes: -------------------------------------------------------------------------------- 1 | *.SLDPRT binary 2 | *.SLDASM binary 3 | *.STL binary 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # HARDWARE 2 | 3 | # Output binary file for 3D printing (too heavy to be kept in the history) 4 | *.STL 5 | 6 | !hardware/URDF/meshes/*.stl 7 | 8 | 9 | 10 | # SOFTWARE 11 | # Byte-compiled / optimized / DLL files 12 | __pycache__/ 13 | *.py[cod] 14 | 15 | # C extensions 16 | *.so 17 | 18 | # Distribution / packaging 19 | .Python 20 | env/ 21 | build/ 22 | develop-eggs/ 23 | dist/ 24 | downloads/ 25 | eggs/ 26 | lib/ 27 | lib64/ 28 | parts/ 29 | sdist/ 30 | var/ 31 | *.egg-info/ 32 | .installed.cfg 33 | *.egg 34 | 35 | # PyInstaller 36 | # Usually these files are written by a python script from a template 37 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 38 | *.manifest 39 | *.spec 40 | 41 | # Installer logs 42 | pip-log.txt 43 | pip-delete-this-directory.txt 44 | 45 | # Unit test / coverage reports 46 | htmlcov/ 47 | .tox/ 48 | .coverage 49 | .cache 50 | nosetests.xml 51 | coverage.xml 52 | 53 | # Translations 54 | *.mo 55 | *.pot 56 | 57 | # Django stuff: 58 | *.log 59 | 60 | # Sphinx documentation 61 | docs/_build/ 62 | 63 | # PyBuilder 64 | target/ 65 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "hardware/lower_limbs"] 2 | path = hardware/lower_limbs 3 | url = https://github.com/poppy-project/Poppy-lightweight-biped-legs.git 4 | branch = master 5 | [submodule "hardware/robotis_library"] 6 | path = hardware/robotis_library 7 | url=https://github.com/poppy-project/Robotis-library.git 8 | branch = master 9 | [submodule "hardware/torso"] 10 | path = hardware/torso 11 | url = https://github.com/poppy-project/Poppy-multiarticulated-torso.git 12 | branch = master 13 | [submodule "hardware/head"] 14 | path = hardware/head 15 | url = https://github.com/poppy-project/Poppy-minimal-head-design.git 16 | branch = master 17 | [submodule "hardware/upper_limbs"] 18 | path = hardware/upper_limbs 19 | url = https://github.com/poppy-project/Poppy-basic-arms.git 20 | branch = master 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Poppy Humanoid 2 | =================== 3 | [![PyPI](https://img.shields.io/pypi/v/poppy-humanoid.svg)](https://pypi.python.org/pypi/poppy-humanoid/) 4 | 5 | Poppy Humanoid is an open-source and 3D printed humanoid robot. Optimized for research and education purposes, its modularity allows for a wide range of applications and experimentations. 6 | 7 | 8 | ![Trunk Assembled](doc/img/poppy-humanoid-github.jpg) 9 | 10 | ### Open Source 11 | 12 | All the technological development work made in the Poppy project is freely available under open source licenses. Only the name usage *"Poppy"* is restricted and protected as an international trademark, please contact us if you want to use it or have more information. 13 | 14 | 15 | | License | Hardware | Software | 16 | | ------------- | :-------------: | :-------------: | 17 | | Title | [Creatives Commons BY-SA](http://creativecommons.org/licenses/by-sa/4.0/) |[GPL v3](http://www.gnu.org/licenses/gpl.html) | 18 | | Logo | [![Creative Commons BY-SA](https://i.creativecommons.org/l/by-sa/4.0/88x31.png) ](http://creativecommons.org/licenses/by-sa/4.0/) |[![GPL V3](https://www.gnu.org/graphics/gplv3-88x31.png)](http://www.gnu.org/licenses/gpl.html) | 19 | 20 | 21 | **Please keep references to the [Poppy project (www.poppy-project.org)](https://www.poppy-project.org/) and [authors](doc/authors.md) when you use or fork this work.** 22 | 23 | ### Looking for the Solidworks files ? 24 | 25 | We are using a GitHub feature called GIT LFS. It is great for versionning solidworks files but it stills lack basic features. If you download directly solidworks files from this web page, you will get an empty file... 26 | 27 | You have two option: 28 | 29 | 1. Download the last official Solidworks version in the [release](https://github.com/poppy-project/poppy-humanoid/releases). You will also find STL, STEP and parasolid files. 30 | - Clone locally this repository following [this guide](doc/en/cloning.md). This solution is only for people desiring to contribute or develop news hardware features for Poppy. 31 | 32 | ## Build your own Poppy Humanoid 33 | 34 | Building a complete Poppy Humanoid costs $8000-9000 with about 60% for buying the 25 Robotis Dynamixel actuators required. The full BOM is available here >> [Bill Of Material](https://docs.poppy-project.org/en/assembly-guides/poppy-humanoid/bom.html). 35 | 36 | **The STL files are available in [the releases](https://github.com/poppy-project/poppy-humanoid/releases) of this repository.** 37 | 38 | Then the process to assemble a complete Poppy Humanoid takes about 7hrs for handyman people. 39 | 40 | **For more informations, refer to the [assembly instructions](https://docs.poppy-project.org/en/assembly-guides/poppy-humanoid/)**. 41 | 42 | ### Install poppy-humanoid 43 | #### Install a Poppy board 44 | Poppy Humanoid is made to work with a Raspberry Pi 3 or 4. We provide our own [system image](https://github.com/poppy-project/poppy-humanoid/releases) that can be directly copied to the SD-card or MMC. You can refer to the [documentation](http://docs.poppy-project.org/en/installation/burn-an-image-file.html) for more details. Note that if you buy it as a kit from one of the reseller you will also get a pre-installed SD-card. 45 | 46 | ### Install the software tools locally 47 | 48 | You way also connect Poppy Huanoid's motors directly on your own computer with a USB2Dynamixel or USB2AX adapter instead of using the embedded Raspberry Pi 3/4 board. Just install software with pip: `pip install poppy-humanoid`. 49 | 50 | **For more informations, refer to the [poppy documentation](http://docs.poppy-project.org/en/installation/index.html)**. 51 | 52 | ## Support 53 | You need support ? 54 | The [Poppy forum](https://forum.poppy-project.org) is the best (and single) place to ask for help. 55 | 56 | You can in particular check for the [Poppy Humanoid category](https://forum.poppy-project.org/c/poppy-creatures/humanoid). 57 | 58 | ## Contribution 59 | 60 | If you are interrested by contribuing to the Poppy project, you can **take a look at [open issues](https://github.com/poppy-project/poppy-humanoid/issues) and [call for contributions](https://forum.poppy-project.org/tags/call-for-contributions)**. 61 | 62 | Morevover, the Poppy project involves a very large scope of disciplines: 63 | - Engineering fields such as computer science, mechanics, electronics, machine learning... 64 | - Humanities such as cognitive science, psychology... 65 | - Life science such as biology, biomechanics,... 66 | - Community management, scientific mediation, communication... 67 | - Design such as web design, object design, UX,... 68 | - Art with the need of animator to create [the illusion of life](http://en.wikipedia.org/wiki/Disney_Animation:_The_Illusion_of_Life) and emotions. 69 | 70 | So there are many ways to contribute to this project and you are very welcome to do it. 71 | 72 | Maybe the first step is to become a member of the community on the [poppy forum](https://forum.poppy-project.org). The forum is the very central place to exchange with users and contributors. You can freely come and talk about your project or ideas with your prefered language. 73 | 74 | For github ninja, you can of course fork this repository and open pull requests to propose your changes, or create issues to notify a problem. 75 | 76 | ## License 77 | 78 | All the technological development work made in the Poppy project is freely available under open source licenses. Only the name usage *"Poppy"* is restricted and protected as an international trademark, please contact us if you want to use it or have more information. 79 | 80 | 81 | | License | Hardware | Software | 82 | | ------------- | :-------------: | :-------------: | 83 | | Title | [Creatives Commons BY-SA](http://creativecommons.org/licenses/by-sa/4.0/) |[GPL v3](http://www.gnu.org/licenses/gpl.html) | 84 | | Logo | [![Creative Commons BY-SA](https://i.creativecommons.org/l/by-sa/4.0/88x31.png) ](http://creativecommons.org/licenses/by-sa/4.0/) |[![GPL V3](https://www.gnu.org/graphics/gplv3-88x31.png)](http://www.gnu.org/licenses/gpl.html) | 85 | 86 | 87 | **Please keep references to the [Poppy project (www.poppy-project.org)](https://www.poppy-project.org/) and [authors](doc/authors.md) when you use or fork this work.** 88 | 89 | 90 | ## The Poppy project history 91 | 92 | The Poppy project is born in 2012 in the [Flowers laboratory](https://flowers.inria.fr/) at [Inria Bordeaux Sud-Ouest](http://www.inria.fr/en/centre/bordeaux). 93 | It was initiated during [Matthieu Lapeyre](https://github.com/matthieu-lapeyre)'s PhD Thesis surpervised by [Pierre Yves Oudeyer](http://www.pyoudeyer.com/). At the beginning, the development team was composed by [Matthieu Lapeyre](https://github.com/matthieu-lapeyre) (mechanics & design), [Pierre Rouanet](https://github.com/pierre-rouanet) (software) and [Jonathan Grizou](http://jgrizou.com/) (electronics). 94 | 95 | This project is initially a fundamental research project financed by [ERC Grant Explorer](http://erc.europa.eu/) to explore the role of embodiement and morphology properties on cognition and especially on the learning of sensori-motor tasks. It is now hosted by the [Poppy Station non-profit](https://www.poppy-station.org/en). 96 | 97 | 98 | ### More on the project 99 | 100 | - [Website](https://www.poppy-project.org) 101 | - [Forum](https://forum.poppy-project.org) 102 | - [Twitter](https://twitter.com/poppy_project) 103 | - [Facebook](https://www.facebook.com/poppycommunity/) 104 | - [Flickr](https://www.flickr.com/photos/poppy-project) 105 | - [YouTube](https://www.youtube.com/channel/UC3iVGSr-vMgnFlIfPBH2p7Q) 106 | - [Vimeo](https://vimeo.com/poppyproject/videos) 107 | - [Thingiverse](http://www.thingiverse.com/poppy_project/) 108 | -------------------------------------------------------------------------------- /doc/README.md: -------------------------------------------------------------------------------- 1 | # Poppy Humanoid 2 | 3 | The documentation has moved, please consult the new [assembly guide for Poppy Humanoid](https://docs.poppy-project.org/en/assembly-guides/poppy-humanoid/). 4 | 5 | You can still consult the old version: [read the obsolete documentation](https://github.com/poppy-project/poppy-humanoid/tree/6a1ea175f86e1b5a3063007e0c84b435cf22d111#open-source). 6 | -------------------------------------------------------------------------------- /doc/img/poppy-humanoid-github.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/doc/img/poppy-humanoid-github.jpg -------------------------------------------------------------------------------- /hardware/LICENSE.md: -------------------------------------------------------------------------------- 1 | ### Disclaimer 2 | Document forked from https://github.com/idleberg/Creative-Commons-4.0-Markdown 3 | 4 | # Creative Commons 5 | 6 | ## Attribution-ShareAlike 4.0 International 7 | 8 | Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. 9 | 10 | ### Using Creative Commons Public Licenses 11 | 12 | Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. 13 | 14 | * __Considerations for licensors:__ Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. [More considerations for licensors](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensors). 15 | 16 | * __Considerations for the public:__ By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. [More considerations for the public](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensees). 17 | 18 | ## Creative Commons Attribution-ShareAlike 4.0 International Public License 19 | 20 | By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. 21 | 22 | ### Section 1 – Definitions. 23 | 24 | a. __Adapted Material__ means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. 25 | 26 | b. __Adapter's License__ means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. 27 | 28 | c. __BY-SA Compatible License__ means a license listed at [creativecommons.org/compatiblelicenses](http://creativecommons.org/compatiblelicenses), approved by Creative Commons as essentially the equivalent of this Public License. 29 | 30 | d. __Copyright and Similar Rights__ means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. 31 | 32 | e. __Effective Technological Measures__ means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. 33 | 34 | f. __Exceptions and Limitations__ means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. 35 | 36 | g. __License Elements__ means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike. 37 | 38 | h. __Licensed Material__ means the artistic or literary work, database, or other material to which the Licensor applied this Public License. 39 | 40 | i. __Licensed Rights__ means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. 41 | 42 | j. __Licensor__ means the individual(s) or entity(ies) granting rights under this Public License. 43 | 44 | k. __Share__ means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. 45 | 46 | l. __Sui Generis Database Rights__ means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. 47 | 48 | m. __You__ means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. 49 | 50 | ### Section 2 – Scope. 51 | 52 | a. ___License grant.___ 53 | 54 | 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: 55 | 56 | A. reproduce and Share the Licensed Material, in whole or in part; and 57 | 58 | B. produce, reproduce, and Share Adapted Material. 59 | 60 | 2. __Exceptions and Limitations.__ For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 61 | 62 | 3. __Term.__ The term of this Public License is specified in Section 6(a). 63 | 64 | 4. __Media and formats; technical modifications allowed.__ The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. 65 | 66 | 5. __Downstream recipients.__ 67 | 68 | A. __Offer from the Licensor – Licensed Material.__ Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. 69 | 70 | B. __Additional offer from the Licensor – Adapted Material.__ Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. 71 | 72 | C. __No downstream restrictions.__ You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 73 | 74 | 6. __No endorsement.__ Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). 75 | 76 | b. ___Other rights.___ 77 | 78 | 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 79 | 80 | 2. Patent and trademark rights are not licensed under this Public License. 81 | 82 | 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. 83 | 84 | ### Section 3 – License Conditions. 85 | 86 | Your exercise of the Licensed Rights is expressly made subject to the following conditions. 87 | 88 | a. ___Attribution.___ 89 | 90 | 1. If You Share the Licensed Material (including in modified form), You must: 91 | 92 | A. retain the following if it is supplied by the Licensor with the Licensed Material: 93 | 94 | i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); 95 | 96 | ii. a copyright notice; 97 | 98 | iii. a notice that refers to this Public License; 99 | 100 | iv. a notice that refers to the disclaimer of warranties; 101 | 102 | v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; 103 | 104 | B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and 105 | 106 | C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. 107 | 108 | 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 109 | 110 | 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. 111 | 112 | b. ___ShareAlike.___ 113 | 114 | In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. 115 | 116 | 1. The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License. 117 | 118 | 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. 119 | 120 | 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. 121 | 122 | ### Section 4 – Sui Generis Database Rights. 123 | 124 | Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: 125 | 126 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; 127 | 128 | b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and 129 | 130 | c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. 131 | 132 | For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. 133 | 134 | ### Section 5 – Disclaimer of Warranties and Limitation of Liability. 135 | 136 | a. __Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.__ 137 | 138 | b. __To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.__ 139 | 140 | c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. 141 | 142 | ### Section 6 – Term and Termination. 143 | 144 | a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. 145 | 146 | b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 147 | 148 | 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 149 | 150 | 2. upon express reinstatement by the Licensor. 151 | 152 | For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. 153 | 154 | c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. 155 | 156 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. 157 | 158 | ### Section 7 – Other Terms and Conditions. 159 | 160 | a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. 161 | 162 | b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.t stated herein are separate from and independent of the terms and conditions of this Public License. 163 | 164 | ### Section 8 – Interpretation. 165 | 166 | a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. 167 | 168 | b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. 169 | 170 | c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. 171 | 172 | d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. 173 | 174 | ``` 175 | Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. 176 | 177 | Creative Commons may be contacted at [creativecommons.org](http://creativecommons.org/). 178 | ``` 179 | -------------------------------------------------------------------------------- /hardware/Poppy_Humanoid.SLDASM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/Poppy_Humanoid.SLDASM -------------------------------------------------------------------------------- /hardware/STL/extract_3D_printable_STL_parts.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | # Remove parts that should not be 3D printed: 4 | JUNK = ['dynamixel_AX', 'dynamixel_x28', 'dynamixel_x64', 5 | 'BIOLOID', 'SMPS2Dyn', 6 | 'AX12_horn', 'trust_washer', 'HN07-N1', 'HN07-i1', 'HN05-N1', 'HN05-i1', 'HN05-T1', 7 | 'BHS_M2', 'MF1', 'CAP', 'WB', '1226T', 8 | 'Videw', 'Visaton', 'Odroid'] 9 | 10 | # sort and rename parts to be 3D printed 11 | TRUNK_PARTS_FOLDER = 'trunk' 12 | TRUNK_NAME_MAPPING = { 13 | 'double_rotation-1 double_rotation_link-1': 'MX64_double_rotation_link', 14 | 'double_rotation-1 i101-Set_to_MX_link': 'i101_to_MX64_link', 15 | 'abdomen-1':'abdomen', 16 | 'spine-1': 'spine', 17 | 'double_rotation-2 double_rotation_link-1': 'MX28_double_rotation_link', 18 | 'double_rotation-2 i101-Set_to_MX_link': 'i101_to_MX28_link', 19 | 'chest-1': 'chest', 20 | } 21 | 22 | ARMS_PARTS_FOLDER = 'arms' 23 | ARMS_NAME_MAPPING = { 24 | 'forearm-1 hand-1': 'hand_left', 25 | 'forearm-1 forearm-1': 'forearm_left', 26 | 'shoulder-1' : 'shoulder_left', 27 | 'forearm-2 hand-1': 'hand_right', 28 | 'forearm-2 forearm-1': 'forearm_right', 29 | 'shoulder-2' : 'shoulder_right', 30 | 'shoulder_x-1 arm_connector-1': 'arm_connector', 31 | 'upper_arm-1 upper_arm-1': 'upper_arm', 32 | } 33 | 34 | LEGS_PARTS_FOLDER = 'legs' 35 | LEGS_NAME_MAPPING = { 36 | 'hip_main_motor-1 hip_z_to_hip_y': 'hip_z_to_hip_y-connector', 37 | 'hip-1 hip-1': 'hip_left', 38 | 'thigh-1 thigh-1': 'thigh_left', 39 | 'simple_foot-1': 'simple_foot_left', 40 | 'hip-2 hip-1': 'hip_right', 41 | 'thigh-2 thigh-1': 'thigh_right', 42 | 'simple_foot-2': 'simple_foot_right', 43 | 'shin-1 shin-1': 'shin', 44 | 'pelvis-1 pelvis-1' : 'pelvis' 45 | } 46 | 47 | HEAD_PARTS_FOLDER = 'head' 48 | HEAD_NAME_MAPPING = { 49 | 'neck-1': 'neck', 50 | 'camera_support': 'camera_support', 51 | 'screen_support': 'screen_support', 52 | 'head-1 screen-1' : 'screen', 53 | 'speaker_left': 'speaker_left', 54 | 'speaker_right': 'speaker_right', 55 | 'head_back': 'head_back', 56 | 'head_face': 'head_face', 57 | 'fake_manga_screen': 'fake_manga_screen', 58 | } 59 | 60 | 61 | def delete_stl_files(stl_folder_path, pattern_to_delete): 62 | exported_stl_files = os.listdir(stl_folder_path) 63 | 64 | for filename in exported_stl_files: 65 | for name in pattern_to_delete: 66 | if name in filename: 67 | # try: 68 | os.remove(os.path.join(stl_path, filename)) 69 | print '{} removed'.format(filename) 70 | # except OSError: 71 | # raise 'A problem occured during the removing of {}'.format(filename) 72 | 73 | 74 | def rename_stl_files(stl_folder_path, name_mapping, dest_path=None, specific_folder=None): 75 | if dest_path is None: 76 | dest_path = '.' 77 | 78 | if specific_folder is None: 79 | specific_folder = '.' 80 | 81 | exported_stl_files = os.listdir(stl_folder_path) 82 | destination_path = os.path.join(stl_folder_path, dest_path, specific_folder) 83 | 84 | if not os.path.exists(destination_path): 85 | os.makedirs(destination_path) 86 | 87 | for filename in exported_stl_files: 88 | for name, new_name in name_mapping.iteritems(): 89 | if name in filename: 90 | # try: 91 | print '{} moved'.format(new_name) 92 | os.rename(os.path.join(stl_folder_path, filename), os.path.join(destination_path, new_name + '.STL')) 93 | # except OSError as err: 94 | # print("OS error: {0}".format(err)) 95 | 96 | if __name__ == '__main__': 97 | RAW_STL_FOLDER = '.' 98 | OUTPUT_STL_FOLDER = 'STL_3D_printed_parts' 99 | 100 | stl_path = os.path.join('.', RAW_STL_FOLDER) 101 | 102 | delete_stl_files(stl_path, JUNK) 103 | 104 | rename_stl_files(stl_path, TRUNK_NAME_MAPPING, OUTPUT_STL_FOLDER, TRUNK_PARTS_FOLDER) 105 | rename_stl_files(stl_path, ARMS_NAME_MAPPING, OUTPUT_STL_FOLDER, ARMS_PARTS_FOLDER) 106 | rename_stl_files(stl_path, LEGS_NAME_MAPPING, OUTPUT_STL_FOLDER, LEGS_PARTS_FOLDER) 107 | rename_stl_files(stl_path, HEAD_NAME_MAPPING, OUTPUT_STL_FOLDER, HEAD_PARTS_FOLDER) 108 | 109 | delete_stl_files(stl_path, ['.STL', ]) 110 | -------------------------------------------------------------------------------- /hardware/URDF/launch/display.launch: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 10 | 13 | 17 | 21 | 26 | 27 | -------------------------------------------------------------------------------- /hardware/URDF/launch/gazebo.launch: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 15 | 17 | 22 | 23 | -------------------------------------------------------------------------------- /hardware/URDF/manifest.xml: -------------------------------------------------------------------------------- 1 | 2 | Poppy_Humanoid 3 | 4 | Matthieu Lapeyre, Poppy Project 5 | www.poppy-project.org 6 | CC-BY-SA 7 | 8 | -------------------------------------------------------------------------------- /hardware/URDF/meshes/abdomen_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/abdomen_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/abdomen_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/abdomen_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/abs_motors_respondable.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/abs_motors_respondable.stl -------------------------------------------------------------------------------- /hardware/URDF/meshes/abs_motors_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/abs_motors_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/bust_motors_respondable.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/bust_motors_respondable.stl -------------------------------------------------------------------------------- /hardware/URDF/meshes/bust_motors_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/bust_motors_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/chest_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/chest_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/chest_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/chest_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/head_respondable.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/head_respondable.stl -------------------------------------------------------------------------------- /hardware/URDF/meshes/head_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/head_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_foot_respondable.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_foot_respondable.stl -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_foot_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_foot_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_forearm_respondable.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_forearm_respondable.stl -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_forearm_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_forearm_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_hip_motor_respondable.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_hip_motor_respondable.stl -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_hip_motor_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_hip_motor_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_hip_respondable.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_hip_respondable.stl -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_hip_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_hip_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_shin_respondable.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_shin_respondable.stl -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_shin_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_shin_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_shoulder_motor_respondable.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_shoulder_motor_respondable.stl -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_shoulder_motor_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_shoulder_motor_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_shoulder_respondable.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_shoulder_respondable.stl -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_shoulder_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_shoulder_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_thigh_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_thigh_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_thigh_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_thigh_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_upper_arm_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_upper_arm_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/l_upper_arm_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/l_upper_arm_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/neck_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/neck_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/neck_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/neck_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/pelvis_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/pelvis_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/pelvis_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/pelvis_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_foot_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_foot_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_foot_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_foot_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_forearm_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_forearm_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_forearm_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_forearm_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_hip_motor_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_hip_motor_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_hip_motor_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_hip_motor_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_hip_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_hip_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_hip_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_hip_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_shin_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_shin_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_shin_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_shin_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_shoulder_motor_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_shoulder_motor_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_shoulder_motor_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_shoulder_motor_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_shoulder_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_shoulder_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_shoulder_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_shoulder_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_thigh_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_thigh_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_thigh_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_thigh_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_upper_arm_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_upper_arm_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/r_upper_arm_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/r_upper_arm_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/spine_respondable.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/spine_respondable.STL -------------------------------------------------------------------------------- /hardware/URDF/meshes/spine_visual.STL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/URDF/meshes/spine_visual.STL -------------------------------------------------------------------------------- /hardware/URDF/robots/Poppy_Humanoid.URDF: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 0.18508 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 0.08433 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 0.13848 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 0.12066 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 0.11169 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 0.04674 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 0.08434 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 0.13848 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 0.12152 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 0.11169 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 0.04678 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 0.27838 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 0.03839 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 0.09264 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 0.15889 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 0.27528 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 0.00588 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 0.2126 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 0.00838 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 0.08288 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 0.16814 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 0.04863 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 0.00838 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 0.08288 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 0.16814 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 0.04863 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | -------------------------------------------------------------------------------- /hardware/URDF/update_URDF.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | try: 4 | import xmltodict 5 | except ImportError: 6 | raise ImportError('A module required is not installed on your system, please run this command in your terminal: pip install xmltodict') 7 | 8 | from numpy import deg2rad 9 | 10 | 11 | # Dynamixel torque limit (N.m) 12 | DXL2EFFORT = { 13 | 'MX-28': 3.1, 14 | 'MX-64': 7.3, 15 | 'AX-12': 1.8 16 | } 17 | 18 | # Dynamixel velocity (rad/s) 19 | DXL2VEL = { 20 | 'MX-28': 7., 21 | 'MX-64': 8.2, 22 | 'AX-12': 10. 23 | } 24 | 25 | # Robot color 26 | COLOR = '0.9 0.9 0.9 1.0' # RGB Alpha 27 | 28 | 29 | # Masses (kg) 30 | MASS = { 31 | 'pelvis': 0.18508, 32 | 'r_hip': 0.08433, 33 | 'r_hip_motor': 0.13848, 34 | 'r_thigh': 0.12066, 35 | 'r_shin': 0.11169, 36 | 'r_foot': 0.04674, 37 | 'l_hip': 0.08434, 38 | 'l_hip_motor': 0.13848, 39 | 'l_thigh': 0.12152, 40 | 'l_shin': 0.11169, 41 | 'l_foot': 0.04678, 42 | 'abs_motors': 0.27838, 43 | 'abdomen': 0.03839, 44 | 'spine': 0.09264, 45 | 'bust_motors': 0.15889, 46 | 'chest': 0.27528, 47 | 'neck': 0.00588, 48 | 'head': 0.21260, 49 | 'l_shoulder': 0.00838, 50 | 'l_shoulder_motor': 0.08288, 51 | 'l_upper_arm': 0.16814, 52 | 'l_forearm': 0.04863, 53 | 'r_shoulder': 0.00838, 54 | 'r_shoulder_motor': 0.08288, 55 | 'r_upper_arm': 0.16814, 56 | 'r_forearm': 0.04863 57 | } 58 | 59 | 60 | def update_URDF_from_config(urdf_path, config_path): 61 | with open(urdf_path) as f: 62 | urdf = xmltodict.parse(f.read()) 63 | 64 | with open(config_path) as f: 65 | conf = json.load(f) 66 | 67 | confmotors = conf['motors'] 68 | joints = urdf['robot']['joint'] 69 | links = urdf['robot']['link'] 70 | 71 | # Update joint properties 72 | for j in joints: 73 | name = j['@name'] 74 | dxl = confmotors[name]['type'] 75 | ll, ul = confmotors[name]['angle_limit'] 76 | 77 | j['limit']['@lower'] = str(deg2rad(ll)) 78 | j['limit']['@upper'] = str(deg2rad(ul)) 79 | j['limit']['@effort'] = str(DXL2EFFORT[dxl]) 80 | j['limit']['@velocity'] = str(DXL2VEL[dxl]) 81 | 82 | # Update link properties 83 | for l in links: 84 | name = l['@name'] 85 | l['visual']['material']['color']['@rgba'] = COLOR 86 | l['mass'] = MASS[name] 87 | 88 | new_urdf = xmltodict.unparse(urdf, pretty=True) 89 | 90 | with open(urdf_path, 'w') as f: 91 | f.write(new_urdf) 92 | 93 | 94 | if __name__ == '__main__': 95 | 96 | urdf_path = './robots/Poppy_Humanoid.URDF' 97 | config_path = '../../software/poppy_humanoid/configuration/poppy_humanoid.json' 98 | 99 | update_URDF_from_config(urdf_path, config_path) 100 | -------------------------------------------------------------------------------- /hardware/doc/README.md: -------------------------------------------------------------------------------- 1 | # Poppy Humanoid BOM 2 | 3 | The latest version of the BOM has moved here: [Poppy Humanoid BOM from the assembly guide](https://docs.poppy-project.org/en/assembly-guides/poppy-humanoid/bom.html). 4 | 5 | You can still access an archieved version of the [Former Popppy Humanoid BOM](https://github.com/poppy-project/poppy-humanoid/blob/2b6cd60404a45520d8332b1d7d3db10b0ff6218e/hardware/doc/BOM.md#poppy-humanoid-10-pre-release). 6 | -------------------------------------------------------------------------------- /hardware/utils/3D_printing.sldmat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/utils/3D_printing.sldmat -------------------------------------------------------------------------------- /hardware/utils/black_polyamide.p2m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/utils/black_polyamide.p2m -------------------------------------------------------------------------------- /hardware/utils/white_polyamide.p2m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/hardware/utils/white_polyamide.p2m -------------------------------------------------------------------------------- /software/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include poppy_humanoid/media/sounds/error.wav 2 | include poppy_humanoid/configuration/*.json 3 | include poppy_humanoid/vrep-scene/*.ttt 4 | -------------------------------------------------------------------------------- /software/README: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/README -------------------------------------------------------------------------------- /software/doc/img/GR-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/doc/img/GR-logo.png -------------------------------------------------------------------------------- /software/doc/img/poppy-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/doc/img/poppy-logo.png -------------------------------------------------------------------------------- /software/doc/img/snap-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/doc/img/snap-header.png -------------------------------------------------------------------------------- /software/doc/img/snap-import.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/doc/img/snap-import.png -------------------------------------------------------------------------------- /software/doc/img/snap_blocks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/doc/img/snap_blocks.png -------------------------------------------------------------------------------- /software/doc/img/snap_full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/doc/img/snap_full.png -------------------------------------------------------------------------------- /software/doc/img/snap_full_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/doc/img/snap_full_selected.png -------------------------------------------------------------------------------- /software/doc/img/snap_motors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/doc/img/snap_motors.png -------------------------------------------------------------------------------- /software/doc/img/snap_move.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/doc/img/snap_move.png -------------------------------------------------------------------------------- /software/doc/img/snap_record.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/doc/img/snap_record.png -------------------------------------------------------------------------------- /software/doc/img/vrep-poppy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/doc/img/vrep-poppy.png -------------------------------------------------------------------------------- /software/doc/softwareGuide.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/doc/softwareGuide.pdf -------------------------------------------------------------------------------- /software/doc/softwareGuide.tex: -------------------------------------------------------------------------------- 1 | \documentclass{article} 2 | \usepackage{graphicx} 3 | \usepackage{hyperref} 4 | \usepackage{color} 5 | \usepackage[utf8]{inputenc} 6 | 7 | \begin{document} 8 | 9 | \title{Poppy software quickstart guide} 10 | \author{Manon Cortial, Generation Robots} 11 | 12 | \maketitle 13 | 14 | \includegraphics[height=0.22\textwidth]{img/poppy-logo} \hfill \includegraphics[height=0.22\textwidth]{img/GR-logo} 15 | 16 | \tableofcontents 17 | 18 | \section{Introduction} 19 | 20 | \subsection{The Poppy Project} 21 | 22 | Poppy is an open hardware and open-source project, containing in particular the Poppy Humanoid robot. The Pypot library was created by the Liris to control the Poppy robots. It is in constant evolution, thanks to the engineers of Liris and to the community, so keep posted. 23 | 24 | %The programmation in made essentially in Python, but it is also possible to control the robot with visual programming using Snap!. 25 | 26 | %All links to the forum and online documentations are grouped in the section \ref{documentation-links}. 27 | 28 | \subsection{How to use this guide?} 29 | 30 | This guide gives you an introduction to Poppy programming and helps you to set up your system and find the relevant documentations and tutorials in the Poppy environment. 31 | 32 | If you are a \textbf{Poppy user} (beginner, teacher, artist...), you will mostly use the webserver (section \ref{poppy-webservices}) and Snap! (section \ref{programming-with-snap}). 33 | 34 | If you are a \textbf{Poppy developer} (student, researcher, application developer...), you want to know about the webserver (section \ref{poppy-webservices}) and the pypot library (section \ref{pypot}) 35 | 36 | If you \textbf{don't have a Poppy robot}, see section \ref{installing-pypot} to setup your computer, section \ref{v-rep} for the V-REP simulator, then have a look at Snap! (section \ref{programming-with-snap}) or Pypot (section \ref{pypot}). 37 | 38 | If you are a \textbf{Poppy contributor}, you want to know about it all! ;-) 39 | 40 | \subsection{\textcolor{red}{Safety warning}} 41 | 42 | \textbf{The Poppy humanoid robot is built using mainly MX-28 Dynamixel servomotors, which are pretty powerful and may be harmful to your fingers or materials.} 43 | 44 | \textbf{So be very careful and put the robot in a free space while testing your programs.} 45 | 46 | \subsection{Useful tools} 47 | 48 | \subsubsection{Bonjour} 49 | 50 | Bonjour is a software made by the Apple company to communicate with a device using its name instead of its IP address. 51 | 52 | It is installed by default on Mac and most Linux. Windows users can find an installer here: \url{https://support.apple.com/kb/DL999?locale=fr_FR&viewlocale=fr_FR} 53 | 54 | If you don't want to use Bonjour, replace all occurrences of 'poppy.local' by the IP address of the robot in this tutorial. 55 | 56 | \subsubsection{SSH} 57 | 58 | SSH means Secure SHell. It's a protocol allowing to open a terminal from another device (say, your robot) on your computer. 59 | 60 | We will use SSH to have a look at the documents in the robot, change the settings and install new programs. If you are only using the webservices and/or Snap!, you don't need SSH. 61 | 62 | SSH is installed by default on Mac and most Linux. The most popular SSH software for Windows is \href{http://www.putty.org/}{Putty}. 63 | 64 | \subsubsection{Git and Github} 65 | 66 | Git is a versioning software, very useful to secure older versions of your code while working on a new one. It also allows to merge different modifications from different developers on the same project. 67 | 68 | Github is a website offering free remote hosting for Git project (if they are public). All sources for Poppy are on \href{https://github.com/poppy-project}{Github}. 69 | 70 | Git is not installed by default. For Debian and Fedora based computer, the packet is called git. For Mac, have a look at \url{http://sourceforge.net/projects/git-osx-installer/}. For Windows, find the installer here: \url{http://msysgit.github.io/}. 71 | 72 | If you are mainly a user, you will use \textit{git clone} to get new packages and \textit{git pull} to update them. 73 | 74 | If you are a developer, quickly create your own account on \url{https://github.com/} and follow the instructions. 75 | 76 | %\subsubsection{ipython} 77 | 78 | %bla 79 | 80 | \section{Poppy Humanoid webservices} 81 | \label{poppy-webservices} 82 | 83 | Let assume you have a brand new Poppy Humanoid robot with and embedded Odroid (or Raspberry Pi) board already prepared using the \href{https://github.com/poppy-project/poppy_install}{poppy-install} script. 84 | 85 | Connect your Poppy Humanoid robot on your network with an Ethernet cable. Be sure your computer is connected to the same network. Open your web browser and enter: 86 | 87 | \begin{verbatim} 88 | http://poppy.local 89 | \end{verbatim} 90 | 91 | It opens the Poppy Humanoid web interface, which allows you to: 92 | 93 | \begin{itemize} 94 | \item Connect to a local wifi 95 | \item [soon] Put the robot in standing, sitting or compliant position 96 | \item [soon] Record and play moves 97 | \item [soon] Open a ipython console to 98 | \end{itemize} 99 | 100 | 101 | \section{Setting up your computer} 102 | \label{installing-pypot} 103 | You may wish to install the Poppy development tool on your computer for several reasons: 104 | 105 | \begin{itemize} 106 | \item you have want to use a simulator 107 | \item you want to control a Poppy creature directly plugged on your computer 108 | \item You do lots of development and want an environment friendlier than a webservice or SSH. 109 | \end{itemize} 110 | 111 | 112 | There are two ways of installing pypot and Poppy-Humanoid on your computer : using pip is easier, but you will get less frequent (but hopefully more stable) software updates. Installing from the sources will get you the latest version of pypot and the possibility to contribute to its development. 113 | 114 | \subsection{From pip} 115 | If you're using Ubuntu, Python and pip should be already installed. Otherwise: 116 | \begin{verbatim} 117 | sudo apt-get install python2.7 118 | sudo apt-get install python-pip 119 | \end{verbatim} 120 | 121 | Then you simply need to install the Poppy-humanoid package. As pypot is a dependency of Poppy-humanoid, it will be installed too, as well a a few other libraries including numpy and poppy-creature. 122 | 123 | \begin{verbatim} 124 | sudo pip install poppy_humanoid 125 | \end{verbatim} 126 | 127 | \subsection{From the sources} 128 | 129 | The sources of Pyppot are hosted in the \href{https://github.com/poppy-project/pypot}{Poppy project Github}. 130 | 131 | To download them, you need to have git installed on your computer. Then, in the folder where you want to put Pypot, you do: 132 | 133 | \begin{verbatim} 134 | git clone --recursive https://github.com/poppy-project/pypot.git 135 | \end{verbatim} 136 | 137 | Then, you have to install it (so Python can find it): 138 | 139 | \begin{verbatim} 140 | cd pypot 141 | python setup.py build 142 | python setup.py install 143 | \end{verbatim} 144 | 145 | For the poppy-humanoid sources, follow the same procedure: 146 | 147 | \begin{verbatim} 148 | git clone --recursive https://github.com/poppy-project/poppy-humanoid.git 149 | cd ppoppy-humanoid/software 150 | python setup.py build 151 | python setup.py install 152 | \end{verbatim} 153 | 154 | \subsection{Test your installation} 155 | 156 | In a Python console: 157 | 158 | \begin{verbatim} 159 | import pypot, poppy, poppy_humanoid 160 | \end{verbatim} 161 | 162 | If one of the imports fails, try to reinstall, to check your PYTHONPATH or check the \href{https://github.com/poppy-project/pypot/issues}{Pypot issues}. 163 | 164 | 165 | 166 | \section{The v-rep Simulator} 167 | \label{v-rep} 168 | 169 | v-rep is a 3D robots simulator allowing virtual robots to act in a world with gravity, friction and collisions. The 3D model for Poppy is included in the poppy\_humanoid package. 170 | 171 | Be aware that V-rep asks for a fair amount of computation power, so use a decently recent computer. 172 | 173 | \subsection{Getting started with v-rep} 174 | 175 | First, install the v-rep software corresponding to your computer (\href{http://www.coppeliarobotics.com/downloads.html}{v-rep download page}). This software is free for people of the academical world and there is a free but limited version for other users. 176 | 177 | Launch v-rep. On linux: 178 | 179 | \begin{verbatim} 180 | cd 181 | ./vrep.sh 182 | \end{verbatim} 183 | 184 | You should get an empty world with a floor and a tree structure of the elements of the world on the right. 185 | 186 | You can explore the world by drag-and-dropping the simulated world and you can start/pause/stop the simulation with the up-right corresponding buttons. As v-rep uses a lots a computing power, it is advised to pause the simulation while your robot don't move. 187 | 188 | \subsection{Adding a Poppy} 189 | 190 | Open a Python console and type in: 191 | 192 | \begin{verbatim} 193 | from poppy_humanoid import PoppyHumanoid 194 | poppy = PoppyHumanoid(simulator='vrep') 195 | \end{verbatim} 196 | 197 | The first line imports the PoppyHumanoid object from the poppy\_humanoid library. This object is a Poppy creature with the characteristics of a Poppy robot (see sections \ref{pypot} and \ref{creating-poppy-creature}). 198 | 199 | The second line instantiates a PoppyHumanoid creature. It has the \textit{simulator='vrep'} argument to know it should connect to the v-rep server and create a simulated v-rep robot. 200 | 201 | In your v-rep world, you should now have a Poppy Humanoid robot. 202 | 203 | \begin{center} 204 | \includegraphics[width=0.8\textwidth]{img/vrep-poppy} 205 | \end{center} 206 | 207 | Now you can control the simulated Poppy robot as a real robot, as presented in section \ref{pypot}. 208 | 209 | 210 | 211 | \section{Visual programming with snap!} 212 | \label{programming-with-snap} 213 | 214 | \subsection{What is snap?} 215 | 216 | \href{http://snap.berkeley.edu/}{Snap!} is a "very powerful visual, drag-and-drop programming language. It is an extended reimplementation of Scratch (a project of the Lifelong Kindergarten Group at the MIT Media Lab) that allows you to Build Your Own Blocks". It is an extremely efficient tool to learn how to program for kids or even college students and also a powerful prototyping method for artists. 217 | 218 | \begin{center} 219 | \includegraphics[width=0.9\textwidth]{img/snap-header} 220 | \end{center} 221 | 222 | Snap! is open-source and it is entirely written in javascript, you only need a browser connected to the Poppy Creature webserver. No installation is required on your computer! 223 | 224 | WARNING! As there is no browser installed by default in Poppy Humanoid's head, you can't use Snap! directly on the robot. You will have to connect the USB2AX to your computer or to use a simulated robot (see V-rep, section \ref{v-rep}). 225 | 226 | \subsection{Creating the server} 227 | 228 | The first step is to have a server running in the robot or in your computer. The Snap! page will then connect to this server to send orders to the robot. 229 | 230 | \subsubsection{On a real Poppy Humanoid robot} 231 | 232 | SSH inside the robot and enter the following command: 233 | 234 | \begin{verbatim} 235 | poppy-snap poppy-humanoid --no-browser 236 | \end{verbatim} 237 | 238 | This will create a PoppyHumanoid object and launch a snap server. It will also return a url (typically \url{http://snap.berkeley.edu/snapsource/snap.html#open:http://:6969/snap-blocks.xml}). 239 | 240 | Enter this address in your web browser. 241 | 242 | \subsubsection{On a simulated Poppy Humanoid robot} 243 | 244 | For the v-rep simulator, open a Python console and enter: 245 | 246 | \begin{verbatim} 247 | from poppy_humanoid import PoppyHumanoid 248 | poppy = PoppyHumanoid(simulator='vrep', use_snap=True) 249 | poppy.snap.run() 250 | \end{verbatim} 251 | 252 | Then, open the following url in your web browser: \url{http://snap.berkeley.edu/snapsource/snap.html#open:http://127.0.0.1:6969/snap-blocks.xml} 253 | 254 | \subsubsection{Running Snap! locally} 255 | 256 | The previous paragraphs make you connect to the Berkeley server and use Snap! online. If you want to avoid this, you can \href{https://github.com/jmoenig/Snap--Build-Your-Own-Blocks}{install} Snap! locally. 257 | 258 | Then, in your web browser, open the snap.html file. Import the Poppy specific blocks: 259 | 260 | \begin{center} 261 | \includegraphics[width=0.6\textwidth]{img/snap-import} 262 | \end{center} 263 | 264 | If you have Pypot installed from source, the file pypot-snap-blocks.xml is in the pypot/server folder. Otherwise, you can download only the file: 265 | \begin{verbatim} 266 | wget https://raw.githubusercontent.com/poppy-project/pypot/master/ 267 | pypot/server/pypot-snap-blocks.xml 268 | \end{verbatim} 269 | 270 | \subsection{Snap! quick start} 271 | 272 | The webpage you opened should like like this: 273 | 274 | \begin{center} 275 | \includegraphics[width=0.8\textwidth]{img/snap_full} 276 | \end{center} 277 | 278 | \subsubsection{Synchronization} 279 | 280 | The first thing to do is to launch the synchronization loop. Replace the hostname by poppy.local if you use a real Poppy Humanoid robot. Then click on the loop, it should stay highlighted. 281 | 282 | \begin{center} 283 | \includegraphics[width=0.8\textwidth]{img/snap_full_selected} 284 | \end{center} 285 | 286 | This piece of code first set some variables: host, port, motors and goal-position, the later being created by reading the goal position ('poppy get motor') of each motor present in the 'motors' array. You can check it by looking at the motors block top right: 287 | 288 | \begin{center} 289 | \includegraphics[width=0.3\textwidth]{img/snap_motors} 290 | \end{center} 291 | 292 | 293 | Then we start a 'forever' loop that read the motors positions ('poppy poll all motors present positions') and store them in a present-positions array. Then it sends to the motors the content of the goal-position array. 294 | 295 | This loop is the link between our Snap! code (we will read the present-positions array and modify the goal-positions array) and the real or simulated Poppy robot. You can stop the synchronization loop by clicking on it. 296 | 297 | \subsubsection{Poppy blocks} 298 | 299 | The default program shows you how to record a movement (called cercle by default): 300 | 301 | \begin{center} 302 | \includegraphics[width=0.8\textwidth]{img/snap_record} 303 | \end{center} 304 | 305 | The first line initializes an array containing all motors names. You need to run it only once. 306 | 307 | The next block turns all the motors to compliant, so you can move the robot by hand, and starts recording. 308 | 309 | To stop recording, click on the next block: 310 | 311 | 312 | \begin{center} 313 | \includegraphics[width=0.8\textwidth]{img/snap_move} 314 | \end{center} 315 | 316 | This block stops the recording, then removes the compliance so that the robot can move by itself. Then, it starts playing the move you just recorded. 317 | 318 | \textbf{Warning}, if you record a move with a name that has already been used, the new movement will be added after the previous one! This may lead to unexpected movements from the robot. Moves are recorded as .record files in the home folder of the Poppy robot. 319 | 320 | Other Poppy specific blocks allow you to command each motor separately: 321 | 322 | \begin{center} 323 | \includegraphics[width=0.6\textwidth]{img/snap_blocks} 324 | \end{center} 325 | 326 | For other blocks, see the \href{http://snap.berkeley.edu/SnapManual.pdf}{Snap! reference manual}. 327 | 328 | 329 | \section{The Pypot library for Poppy} 330 | \label{pypot} 331 | 332 | Pypot is a framework developed in the Inria FLOWERS team to make it easy and fast to control custom robots based on Dynamixel motors. This framework provides different level of abstraction corresponding to different types of use, i.e. direct control Robotis motors through a USB2AX, or high-level command of a robot defined by its particular structure. 333 | 334 | Pypot has been entirely written in Python to allow for fast development, easy deployment and quick scripting by non-necessary expert developers. The serial communication is handled through the standard library and thus allows for rather high performance (10ms sensorimotor loop). It is crossed-platform and has been tested on Linux, Windows and Mac OS. It is distributed under the GPL V3 open source license. 335 | 336 | Pypot is also compatible with the V-REP simulator. This allows you to seamlessly switch from a real robot to its simulated equivalent without having to modify your code. 337 | 338 | Documentation can be found \href{http://poppy-project.github.io/pypot/index.html}{here}. %We do only a quick introduction here, find more in the advanced part, section \ref{•}. 339 | 340 | \subsection{PoppyHumanoid} 341 | 342 | %Use the ipython webservice (when ready) or 343 | Open a Python console inside the head of your PoppyHumanoid: 344 | 345 | \begin{verbatim} 346 | python 347 | \end{verbatim} 348 | 349 | The first step to control a Poppy robot with Pypot is to create a Python object corresponding to your robot. We call this object poppy and define it as a PoppyHumanoid: 350 | 351 | \begin{verbatim} 352 | from poppy_humanoid import PoppyHumanoid 353 | poppy = PoppyHumanoid() 354 | \end{verbatim} 355 | 356 | This PoppyHumanoid object contains a list of motor objects that you can list with: 357 | 358 | \begin{verbatim} 359 | print poppy.motors 360 | \end{verbatim} 361 | 362 | You get something like: 363 | 364 | \begin{verbatim} 365 | [, 366 | , 367 | , 368 | , 369 | , 370 | ... 371 | \end{verbatim} 372 | 373 | Each motor contain several fields, some static, like name and other directly linked to the corresponding Dynamixel register: 374 | 375 | \begin{verbatim} 376 | for m in poppy.motors: 377 | print "motor ",m.name 378 | print " compliance: ",m.compliant,", position: ",m.present_position 379 | \end{verbatim} 380 | 381 | You end up with: 382 | 383 | \begin{verbatim} 384 | motor abs_y 385 | compliance: True , position: 45.14 386 | motor abs_x 387 | compliance: True , position: -21.41 388 | motor abs_z 389 | compliance: True , position: 24.22 390 | ... 391 | \end{verbatim} 392 | 393 | Remember that the angular values are in degrees. When all motors are set to 0, the robot is standing with arms along the body. 394 | 395 | You can also control each motor directly: 396 | 397 | \begin{verbatim} 398 | print "right ankle angle: ",poppy.r_ankle_y.present_position 399 | \end{verbatim} 400 | 401 | \subsection{Simple motor control} 402 | 403 | To control a motor, you first need to allow it to use its torque, i.e. to stop being compliant. Let test on the left-right head motor (head\_z). 404 | 405 | \begin{verbatim} 406 | poppy.head_z.compliant = False 407 | \end{verbatim} 408 | 409 | To prevent the robot from being dangerous, we will limit its maximum torque. You will be able to slightly push the motor with your hand, but it will go back to its goal position. Max torque is an integer value between 0 and 100, a proportion of the physical motor max torque (depends on the motor model). 410 | 411 | \begin{verbatim} 412 | poppy.head_z.max_torque=20 413 | \end{verbatim} 414 | 415 | Then you have to set the goal position of the register. This operation is instantaneous and the servomotor will try to reach this position using a PID controller. But this is so quick that you will likely not see any delay. 416 | 417 | \begin{verbatim} 418 | poppy.head_z.goal_position=20 419 | \end{verbatim} 420 | 421 | The communication with the Dynamixels itself takes some time and is done in parallel. So if you're using Python script, you need to add a bit of delay before the end, as the end of the script destroys you Poppy creature. 422 | 423 | \begin{verbatim} 424 | import time 425 | time.sleep(0.1) 426 | \end{verbatim} 427 | 428 | \subsection{Timed movements} 429 | 430 | If you want a slower movement for your Dynamixel servomotor, you can use the goto\_position function and setting a time for the movement. 431 | 432 | \begin{verbatim} 433 | poppy.head_z.goto_position(-20, 3) 434 | \end{verbatim} 435 | 436 | The head should go to angle -20 in 3 seconds. 437 | 438 | The wait optional argument allows you to decide if you want the script to return immediately or to wait for the movement completion: 439 | 440 | \begin{verbatim} 441 | print "before moving" 442 | poppy.head_z.goto_position(40, 3, wait=True) 443 | print "after first movement completion" 444 | poppy.head_z.goto_position(-40, 3, wait=False) 445 | print "during second movement" 446 | \end{verbatim} 447 | 448 | 449 | 450 | 451 | % 452 | %\section{Advanced guide} 453 | % 454 | % 455 | %\subsection{Creating your own Poppy creature} 456 | %\label{creating-poppy-creature} 457 | % 458 | %\subsection{Creating a primitive} 459 | % 460 | %\subsection{Quick look on Dynamixel registers} 461 | %\label{dynamixel-registers} 462 | 463 | %use code from others 464 | 465 | %anaconda ? 466 | 467 | %ipython notebooks ? 468 | 469 | \section{Useful links} 470 | \label{documentation-links} 471 | 472 | \subsection{Forum and documentations} 473 | 474 | \begin{tabular}{lr} 475 | 476 | Poppy project website: & \url{https://www.poppy-project.org/} \\ 477 | 478 | Poppy project forum: & \url{https://forum.poppy-project.org/} \\ 479 | 480 | Pypot documentation: & \url{http://poppy-project.github.io/pypot/} \\ 481 | 482 | Github: & \url{https://github.com/poppy-project} \\ 483 | 484 | v-rep resources: & \url{http://www.coppeliarobotics.com/resources.html} \\ 485 | \end{tabular} 486 | 487 | \subsection{Other tutorials} 488 | 489 | Poppy in V-REP: 490 | 491 | \begin{flushright} 492 | \href{https://forum.poppy-project.org/t/howto-connect-pypot-to-your-simulated-version-of-a-poppy-humanoid-in-v-rep/332}{https://forum.poppy-project.org/t/howto-connect-pypot-\\to-your-simulated-version-of-a-poppy-humanoid-in-v-rep/332} 493 | \end{flushright} 494 | 495 | Poppy and Snap!: 496 | 497 | \begin{flushright} 498 | \href{http://nbviewer.ipython.org/github/poppy-project/pypot/blob/master/samples/notebooks/Controlling%20a%20Poppy%20Creature%20using%20SNAP.ipynb}{http://nbviewer.ipython.org/github/poppy-project/pypot/blob/master/samples/notebooks/Controlling\%20\\a\%20Poppy\%20Creature\%20using\%20SNAP.ipynb} 499 | 500 | \end{flushright} 501 | 502 | Introduction to Pypot: 503 | \begin{flushright} 504 | \href{http://nbviewer.ipython.org/github/poppy-project/pypot/blob/master/samples/notebooks/QuickStart%20playing%20with%20a%20PoppyErgo.ipynb}{http://nbviewer.ipython.org/github/poppy-project/pypot/blob/master/samples/notebooks/\\QuickStart\%20playing\%20with\%20a\%20PoppyErgo.ipynb} 505 | \end{flushright} 506 | 507 | Record and save moves: 508 | \begin{flushright} 509 | \href{http://nbviewer.ipython.org/github/poppy-project/pypot/blob/master/samples/notebooks/Record%2C%20Save%2C%20and%20Play%20Moves%20on%20a%20Poppy%20Creature.ipynb}{http://nbviewer.ipython.org/github/poppy-project/pypot/blob/master/samples/notebooks/\\Record\%2C\%20Save\%2C\%20and\%20Play\%20Moves\%20\\on\%20a\%20Poppy\%20Creature.ipynb} 510 | \end{flushright} 511 | 512 | \subsection{How to improve this guide?} 513 | 514 | You found an imprecision or an error in this guide? We need to correct it! 515 | 516 | If you master LaTeX and Github, get the tex file at \href{https://github.com/HumaRobotics/poppy-examples/tree/master/doc}{https://github.com/HumaRobotics/poppy-examples/tree/master/doc} and do a pull request. 517 | 518 | Otherwise, go to the forum and point the problem in this topic: \href{https://forum.poppy-project.org/t/quickstart-assembly-and-programming-plus-some-code-examples/1228}{https://forum.poppy-project.org/t/quickstart-assembly-and-programming-plus-some-code-examples/1228} 519 | 520 | Thanks in advance! 521 | 522 | \end{document} 523 | -------------------------------------------------------------------------------- /software/doc/start_Poppy_Humanoid.md: -------------------------------------------------------------------------------- 1 | ## Note 2 | 3 | Le robot n'est pas prêt pour les démonstrations, il n'y a pas vraiment de sécurité qui va l'empecher de s'auto-detruire en cas de mauvaise manipulation... 4 | 5 | 6 | ## Démarrage 7 | 8 | - Brancher le routeur WIFI 9 | - Brancher le robot (12V). 10 | 11 | ## Connexion 12 | 13 | - Se connecter au wifi du routeur 14 | - Normalement, si tout va bien, on doit pouvoir ping le robot: 15 | `ping robot-name.local` 16 | - Si ça ping: 17 | - se connecter en SSH: 18 | - `ssh poppy@robot-name.local` 19 | - `password: odroid` 20 | 21 | - Si ça ping pas ... 22 | - brancher un cable ethernet de la tête au routeur 23 | - retenter le ping et se connecter en SSH 24 | - checker ifconfig pour voir si wlan a une IP 25 | - si non: `sudo reboot` 26 | - si oui: debrancher l'ethernet et retenter sa chance. 27 | 28 | 29 | ## Play 30 | 31 | Une fois connecté en SSH: 32 | 33 | - lancer le racourci pour démarrer un ipython notebook: `bash notebook-launcher` 34 | - se connecter à la page `poppy-humanoid.local:8888` 35 | - et paf tu as un notebook pour coder Poppy et il y a meme quelques trucs déjà prêts. 36 | 37 | 38 | ## Eteindre: 39 | 40 | - se connecter en SSH 41 | - `sudo halt` 42 | - attendre un peu et débrancher le robot 43 | -------------------------------------------------------------------------------- /software/poppy_humanoid/__init__.py: -------------------------------------------------------------------------------- 1 | from .poppy_humanoid import PoppyHumanoid 2 | from ._version import __version__ 3 | -------------------------------------------------------------------------------- /software/poppy_humanoid/_version.py: -------------------------------------------------------------------------------- 1 | __version__ = '3.0.0' 2 | -------------------------------------------------------------------------------- /software/poppy_humanoid/configuration/poppy_humanoid.json: -------------------------------------------------------------------------------- 1 | { 2 | "controllers": { 3 | "upper_body_controller": { 4 | "sync_read": true, 5 | "attached_motors": [ 6 | "torso", 7 | "head", 8 | "arms" 9 | ], 10 | "port": "auto" 11 | }, 12 | "lower_body_controller": { 13 | "sync_read": true, 14 | "attached_motors": [ 15 | "legs" 16 | ], 17 | "port": "auto" 18 | } 19 | }, 20 | "motorgroups": { 21 | "r_leg": [ 22 | "r_hip_x", 23 | "r_hip_z", 24 | "r_leg_sagitall" 25 | ], 26 | "l_leg_sagitall": [ 27 | "l_hip_y", 28 | "l_knee_y", 29 | "l_ankle_y" 30 | ], 31 | "l_leg": [ 32 | "l_hip_x", 33 | "l_hip_z", 34 | "l_leg_sagitall" 35 | ], 36 | "head": [ 37 | "head_z", 38 | "head_y" 39 | ], 40 | "r_arm": [ 41 | "r_shoulder_y", 42 | "r_shoulder_x", 43 | "r_arm_z", 44 | "r_elbow_y" 45 | ], 46 | "legs": [ 47 | "l_leg", 48 | "r_leg" 49 | ], 50 | "torso": [ 51 | "abs_y", 52 | "abs_x", 53 | "abs_z", 54 | "bust_y", 55 | "bust_x" 56 | ], 57 | "r_leg_sagitall": [ 58 | "r_hip_y", 59 | "r_knee_y", 60 | "r_ankle_y" 61 | ], 62 | "l_arm": [ 63 | "l_shoulder_y", 64 | "l_shoulder_x", 65 | "l_arm_z", 66 | "l_elbow_y" 67 | ], 68 | "arms": [ 69 | "l_arm", 70 | "r_arm" 71 | ] 72 | }, 73 | "motors": { 74 | "l_elbow_y": { 75 | "offset": 0.0, 76 | "type": "MX-28", 77 | "id": 44, 78 | "angle_limit": [ 79 | -148, 80 | 1 81 | ], 82 | "orientation": "direct" 83 | }, 84 | "r_hip_y": { 85 | "offset": 0.0, 86 | "type": "MX-64", 87 | "id": 23, 88 | "angle_limit": [ 89 | -85, 90 | 105 91 | ], 92 | "orientation": "indirect" 93 | }, 94 | "r_knee_y": { 95 | "offset": 0.0, 96 | "type": "MX-28", 97 | "id": 24, 98 | "angle_limit": [ 99 | -134, 100 | 3.5 101 | ], 102 | "orientation": "indirect" 103 | }, 104 | "head_y": { 105 | "offset": 20.0, 106 | "type": "AX-12", 107 | "id": 37, 108 | "angle_limit": [ 109 | -45, 110 | 6 111 | ], 112 | "orientation": "indirect" 113 | }, 114 | "r_ankle_y": { 115 | "offset": 0.0, 116 | "type": "MX-28", 117 | "id": 25, 118 | "angle_limit": [ 119 | -45, 120 | 45 121 | ], 122 | "orientation": "indirect" 123 | }, 124 | "r_arm_z": { 125 | "offset": 0.0, 126 | "type": "MX-28", 127 | "id": 53, 128 | "angle_limit": [ 129 | -105, 130 | 105 131 | ], 132 | "orientation": "indirect" 133 | }, 134 | "head_z": { 135 | "offset": 0.0, 136 | "type": "AX-12", 137 | "id": 36, 138 | "angle_limit": [ 139 | -90, 140 | 90 141 | ], 142 | "orientation": "direct" 143 | }, 144 | "r_shoulder_x": { 145 | "offset": 90.0, 146 | "type": "MX-28", 147 | "id": 52, 148 | "angle_limit": [ 149 | -110, 150 | 105 151 | ], 152 | "orientation": "indirect" 153 | }, 154 | "r_shoulder_y": { 155 | "offset": 90, 156 | "type": "MX-28", 157 | "id": 51, 158 | "angle_limit": [ 159 | -155, 160 | 120 161 | ], 162 | "orientation": "indirect" 163 | }, 164 | "r_hip_z": { 165 | "offset": 0, 166 | "type": "MX-28", 167 | "id": 22, 168 | "angle_limit": [ 169 | -90, 170 | 25 171 | ], 172 | "orientation": "indirect" 173 | }, 174 | "r_hip_x": { 175 | "offset": 0.0, 176 | "type": "MX-28", 177 | "id": 21, 178 | "angle_limit": [ 179 | -28.5, 180 | 30 181 | ], 182 | "orientation": "direct" 183 | }, 184 | "r_elbow_y": { 185 | "offset": 0.0, 186 | "type": "MX-28", 187 | "id": 54, 188 | "angle_limit": [ 189 | -1, 190 | 148 191 | ], 192 | "orientation": "indirect" 193 | }, 194 | "l_arm_z": { 195 | "offset": 0.0, 196 | "type": "MX-28", 197 | "id": 43, 198 | "angle_limit": [ 199 | -105, 200 | 105 201 | ], 202 | "orientation": "indirect" 203 | }, 204 | "l_hip_x": { 205 | "offset": 0.0, 206 | "type": "MX-28", 207 | "id": 11, 208 | "angle_limit": [ 209 | -30, 210 | 28.5 211 | ], 212 | "orientation": "direct" 213 | }, 214 | "l_hip_y": { 215 | "offset": 2.0, 216 | "type": "MX-64", 217 | "id": 13, 218 | "angle_limit": [ 219 | -104, 220 | 84 221 | ], 222 | "orientation": "direct" 223 | }, 224 | "l_hip_z": { 225 | "offset": 0, 226 | "type": "MX-28", 227 | "id": 12, 228 | "angle_limit": [ 229 | -25, 230 | 90 231 | ], 232 | "orientation": "indirect" 233 | }, 234 | "abs_x": { 235 | "offset": 0.0, 236 | "type": "MX-64", 237 | "id": 32, 238 | "angle_limit": [ 239 | -45, 240 | 45 241 | ], 242 | "orientation": "indirect" 243 | }, 244 | "abs_y": { 245 | "offset": 0.0, 246 | "type": "MX-64", 247 | "id": 31, 248 | "angle_limit": [ 249 | -50, 250 | 12 251 | ], 252 | "orientation": "indirect" 253 | }, 254 | "abs_z": { 255 | "offset": 0.0, 256 | "type": "MX-28", 257 | "id": 33, 258 | "angle_limit": [ 259 | -90, 260 | 90 261 | ], 262 | "orientation": "direct" 263 | }, 264 | "l_ankle_y": { 265 | "offset": 0.0, 266 | "type": "MX-28", 267 | "id": 15, 268 | "angle_limit": [ 269 | -45, 270 | 45 271 | ], 272 | "orientation": "direct" 273 | }, 274 | "bust_y": { 275 | "offset": 0.0, 276 | "type": "MX-28", 277 | "id": 34, 278 | "angle_limit": [ 279 | -67, 280 | 27 281 | ], 282 | "orientation": "indirect" 283 | }, 284 | "bust_x": { 285 | "offset": 0.0, 286 | "type": "MX-28", 287 | "id": 35, 288 | "angle_limit": [ 289 | -40, 290 | 40 291 | ], 292 | "orientation": "indirect" 293 | }, 294 | "l_knee_y": { 295 | "offset": 0.0, 296 | "type": "MX-28", 297 | "id": 14, 298 | "angle_limit": [ 299 | -3.5, 300 | 134 301 | ], 302 | "orientation": "direct" 303 | }, 304 | "l_shoulder_x": { 305 | "offset": -90.0, 306 | "type": "MX-28", 307 | "id": 42, 308 | "angle_limit": [ 309 | -105, 310 | 110 311 | ], 312 | "orientation": "indirect" 313 | }, 314 | "l_shoulder_y": { 315 | "offset": 90, 316 | "type": "MX-28", 317 | "id": 41, 318 | "angle_limit": [ 319 | -120, 320 | 155 321 | ], 322 | "orientation": "direct" 323 | } 324 | }, 325 | "sensors": { 326 | "camera": { 327 | "type": "OpenCVCamera", 328 | "index": -1, 329 | "fps": 20.0, 330 | "resolution": [640, 480] 331 | } 332 | } 333 | } 334 | -------------------------------------------------------------------------------- /software/poppy_humanoid/media/sounds/error.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/poppy_humanoid/media/sounds/error.wav -------------------------------------------------------------------------------- /software/poppy_humanoid/poppy_humanoid.py: -------------------------------------------------------------------------------- 1 | import os 2 | import numpy 3 | import ctypes 4 | 5 | from functools import partial 6 | 7 | from pypot.creatures import AbstractPoppyCreature 8 | 9 | from .primitives.safe import LimitTorque, TemperatureMonitor 10 | from .primitives.dance import SimpleBodyBeatMotion 11 | from .primitives.posture import StandPosition, SitPosition 12 | from .primitives.idle import UpperBodyIdleMotion, HeadIdleMotion 13 | from .primitives.interaction import ArmsTurnCompliant, PuppetMaster 14 | 15 | 16 | class PoppyHumanoid(AbstractPoppyCreature): 17 | 18 | @classmethod 19 | def setup(cls, robot): 20 | robot._primitive_manager._filter = partial(numpy.sum, axis=0) 21 | 22 | if robot.simulated: 23 | cls.vrep_hack(robot) 24 | cls.add_vrep_methods(robot) 25 | 26 | for m in robot.motors: 27 | m.goto_behavior = 'dummy' 28 | 29 | for m in robot.torso: 30 | m.compliant_behavior = 'safe' 31 | 32 | # Attach default primitives: 33 | if not robot.simulated: 34 | sound_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 35 | 'media', 'sounds', 'error.wav') 36 | robot.attach_primitive(TemperatureMonitor(robot, sound=sound_file), 'temperature_monitoring') 37 | robot.temperature_monitoring.start() 38 | 39 | # basic primitives: 40 | robot.attach_primitive(StandPosition(robot), 'stand_position') 41 | robot.attach_primitive(SitPosition(robot), 'sit_position') 42 | 43 | # Safe primitives: 44 | robot.attach_primitive(LimitTorque(robot), 'limit_torque') 45 | # robot.limit_torque.start() 46 | 47 | # Dance primitive: 48 | robot.attach_primitive(SimpleBodyBeatMotion(robot, 50), 'dance_beat_motion') 49 | 50 | # Idle primitives 51 | robot.attach_primitive(UpperBodyIdleMotion(robot, 50), 'upper_body_idle_motion') 52 | robot.attach_primitive(HeadIdleMotion(robot, 50), 'head_idle_motion') 53 | 54 | # Interaction primitives 55 | robot.attach_primitive(ArmsTurnCompliant(robot, 50), 'arms_turn_compliant') 56 | robot.attach_primitive(PuppetMaster(robot, 50), 'arms_copy_motion') 57 | 58 | @classmethod 59 | def vrep_hack(cls, robot): 60 | # fix vrep orientation bug 61 | wrong_motor = [robot.r_knee_y, robot.abs_x, robot.bust_x] 62 | 63 | for m in wrong_motor: 64 | m.direct = not m.direct 65 | m.offset = -m.offset 66 | 67 | @classmethod 68 | def add_vrep_methods(cls, robot): 69 | from pypot.vrep.controller import VrepController 70 | from pypot.vrep.io import remote_api 71 | 72 | def set_vrep_force(robot, vector_force, shape_name): 73 | """ Set a force to apply on Poppy Humanoid. """ 74 | vrep_io = next(c for c in robot._controllers 75 | if isinstance(c, VrepController)).io 76 | 77 | raw_bytes = (ctypes.c_ubyte * len(shape_name)).from_buffer_copy(shape_name) 78 | vrep_io.call_remote_api('simxSetStringSignal', 'shape', 79 | raw_bytes, sending=True) 80 | 81 | packedData = remote_api.simxPackFloats(vector_force) 82 | raw_bytes = (ctypes.c_ubyte * len(packedData)).from_buffer_copy(packedData) 83 | vrep_io.call_remote_api('simxSetStringSignal', 'force', 84 | raw_bytes, sending=True) 85 | 86 | robot.set_vrep_force = partial(set_vrep_force, robot) 87 | -------------------------------------------------------------------------------- /software/poppy_humanoid/primitives/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/poppy_humanoid/primitives/__init__.py -------------------------------------------------------------------------------- /software/poppy_humanoid/primitives/dance.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import numpy 4 | 5 | import pypot.primitive 6 | 7 | 8 | def sinus(ampl, t, freq=0.5, phase=0, offset=0): 9 | pi = numpy.pi 10 | return ampl * numpy.sin(freq * 2.0 * pi * t + phase * pi / 180.0) + offset 11 | 12 | 13 | class SimpleBodyBeatMotion(pypot.primitive.LoopPrimitive): 14 | ''' 15 | Simple primitive to make Poppy shake its booty following a given beat rate in bpm. 16 | 17 | ''' 18 | def __init__(self, robot, bpm, motion_amplitude=10): 19 | pypot.primitive.LoopPrimitive.__init__(self, robot, 50) 20 | 21 | self._bpm = bpm 22 | self.amplitude = motion_amplitude 23 | self.frequency = bpm / 60.0 24 | self.pi = numpy.pi 25 | 26 | def setup(self): 27 | for m in self.robot.motors: 28 | m.moving_speed = 50.0 29 | 30 | def update(self): 31 | t = self.elapsed_time 32 | amp = self._amplitude 33 | freq = self.frequency 34 | 35 | self.robot.head_y.goal_position = sinus(amp / 2.0, t, freq) 36 | self.robot.head_z.goal_position = sinus(amp / 2.0, t, freq / 2.0) 37 | 38 | self.robot.bust_x.goal_position = sinus(amp / 6.0, t, freq / 2.0) + sinus(amp / 6.0, t, freq / 4.0) 39 | self.robot.abs_x.goal_position = - sinus(amp / 8.0, t, freq / 4.0) + sinus(amp / 6.0, t, freq / 4.0) 40 | 41 | self.robot.l_shoulder_y.goal_position = sinus(amp / 3.0, t, freq / 2.0) 42 | self.robot.r_shoulder_y.goal_position = - sinus(amp / 3.0, t, freq / 2.0) 43 | 44 | self.robot.r_elbow_y.goal_position = sinus(amp / 2.0, t, freq, offset=-20) 45 | self.robot.l_elbow_y.goal_position = sinus(amp / 2.0, t, freq / 2.0, offset=-20) 46 | 47 | def teardown(self): 48 | self.robot.power_up() 49 | 50 | @property 51 | def bpm(self): 52 | return self._bpm 53 | 54 | @bpm.setter 55 | def bpm(self, new_bpm): 56 | ''' 57 | Permits to change the beat rate while the motion is performing 58 | ''' 59 | self._bpm = new_bpm 60 | self.frequency = self._bpm / 60.0 61 | 62 | @property 63 | def amplitude(self): 64 | return self._amplitude 65 | 66 | @amplitude.setter 67 | def amplitude(self, new_amp): 68 | self._amplitude = new_amp 69 | -------------------------------------------------------------------------------- /software/poppy_humanoid/primitives/idle.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import pypot.primitive 4 | from pypot.primitive.utils import Sinus 5 | 6 | 7 | class UpperBodyIdleMotion(pypot.primitive.LoopPrimitive): 8 | def __init__(self, robot, freq): 9 | pypot.primitive.LoopPrimitive.__init__(self, robot, freq) 10 | 11 | sinus_args = [{'motor_list': [self.robot.abs_z, ], 'amp': 3, 'freq': 0.2}, 12 | {'motor_list': [self.robot.abs_z, ], 'amp': 0.8, 'freq': 0.5}, 13 | {'motor_list': [self.robot.l_shoulder_x, ], 'amp': 2, 'freq': 0.2, 'offset': 5}, 14 | {'motor_list': [self.robot.l_shoulder_x, ], 'amp': 0.8, 'freq': 0.5, 'offset': 0}, 15 | {'motor_list': [self.robot.r_shoulder_x, ], 'amp': 2, 'freq': 0.2, 'offset': -5, 'phase': 66}, 16 | {'motor_list': [self.robot.r_shoulder_x, ], 'amp': 0.8, 'freq': 0.5, 'offset': 0, 'phase': 66}, 17 | {'motor_list': [self.robot.l_shoulder_y, ], 'amp': 3, 'freq': 0.2, 'offset': 15}, 18 | {'motor_list': [self.robot.l_shoulder_y, ], 'amp': 0.8, 'freq': 0.5, 'offset': 0}, 19 | {'motor_list': [self.robot.l_elbow_y, ], 'amp': 2, 'freq': 0.5, 'offset': -25}, 20 | {'motor_list': [self.robot.l_elbow_y, ], 'amp': 0.3, 'freq': 0.2}, 21 | {'motor_list': [self.robot.r_elbow_y, ], 'amp': 2, 'freq': 0.5, 'offset': -25, 'phase': 75}, 22 | {'motor_list': [self.robot.r_elbow_y, ], 'amp': 0.3, 'freq': 0.2, 'phase': 75}, 23 | {'motor_list': [self.robot.l_arm_z, ], 'amp': 3, 'freq': 0.2}, 24 | {'motor_list': [self.robot.r_arm_z, ], 'amp': 3, 'freq': 0.2, 'phase':78}] 25 | 26 | self.all_sinus = [Sinus(self.robot, 50, **s) for s in sinus_args] 27 | 28 | def setup(self): 29 | for m in self.robot.torso + self.robot.arms: 30 | m.compliant = False 31 | 32 | [all_sinus.start() for all_sinus in self.all_sinus] 33 | 34 | def teardown(self): 35 | [all_sinus.stop() for all_sinus in self.all_sinus] 36 | 37 | def update(self): 38 | pass 39 | 40 | 41 | class HeadIdleMotion(pypot.primitive.LoopPrimitive): 42 | def __init__(self, robot, freq): 43 | pypot.primitive.LoopPrimitive.__init__(self, robot, freq) 44 | 45 | sinus_args = [{'motor_list': [self.robot.head_z, ], 'amp': 20, 'freq': 0.05}, 46 | {'motor_list': [self.robot.head_z, ], 'amp': 15, 'freq': 0.1}, 47 | {'motor_list': [self.robot.head_y, ], 'amp': 20, 'freq': 0.04}, 48 | {'motor_list': [self.robot.head_y, ], 'amp': 5, 'freq': 0.09}] 49 | 50 | self.head_sinus = [Sinus(self.robot, 50, **s) for s in sinus_args] 51 | 52 | def start(self): 53 | pypot.primitive.LoopPrimitive.start(self) 54 | 55 | for m in self.robot.head: 56 | m.compliant = False 57 | 58 | [hs.start() for hs in self.head_sinus] 59 | 60 | def pause(self): 61 | [hs.pause() for hs in self.head_sinus] 62 | 63 | def resume(self): 64 | [hs.resume() for hs in self.head_sinus] 65 | 66 | def stop(self): 67 | [hs.stop() for hs in self.head_sinus] 68 | pypot.primitive.LoopPrimitive.stop(self) 69 | 70 | def update(self): 71 | pass 72 | -------------------------------------------------------------------------------- /software/poppy_humanoid/primitives/interaction.py: -------------------------------------------------------------------------------- 1 | from numpy import mean 2 | from collections import deque 3 | 4 | from pypot.primitive import LoopPrimitive 5 | 6 | 7 | class ArmsTurnCompliant(LoopPrimitive): 8 | """ Automatically turns the arms compliant when a force is applied. """ 9 | def setup(self): 10 | for m in self.robot.arms: 11 | m.compliant = False 12 | m.torque_limit = 20 13 | 14 | freq = 1. / self.period 15 | self.l_arm_torque = deque([0], int(0.2 * freq)) 16 | self.r_arm_torque = deque([0], int(0.2 * freq)) 17 | 18 | def update(self): 19 | for side in ('l', 'r'): 20 | recent_arm_torques = getattr(self, '{}_arm_torque'.format(side)) 21 | motors = getattr(self.robot, '{}_arm'.format(side)) 22 | 23 | recent_arm_torques.append(max([abs(m.present_load) for m in motors])) 24 | 25 | mt = mean(recent_arm_torques) 26 | 27 | if mt > 20: 28 | for m in motors: 29 | m.compliant = True 30 | elif mt < 7: 31 | for m in motors: 32 | m.compliant = False 33 | 34 | 35 | class PuppetMaster(LoopPrimitive): 36 | """ Apply the motion made on the left arm to the right arm. """ 37 | def setup(self): 38 | for m in self.robot.arms: 39 | m.moving_speed = 0. 40 | m.torque_limit = 50. 41 | 42 | for m in self.robot.l_arm: 43 | m.compliant = True 44 | 45 | for m in self.robot.r_arm: 46 | m.compliant = False 47 | 48 | def update(self): 49 | for lm, rm in zip(self.robot.l_arm, self.robot.r_arm): 50 | rm.goal_position = lm.present_position * (1 if lm.direct else -1) 51 | 52 | def teardown(self): 53 | for m in self.robot.arms: 54 | m.compliant = False 55 | 56 | self.robot.goto_position({m.name: 0. for m in self.robot.arms}, 57 | 2., wait=True) 58 | 59 | for m in self.robot.arms: 60 | m.moving_speed = 0. 61 | -------------------------------------------------------------------------------- /software/poppy_humanoid/primitives/posture.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import time 4 | import itertools 5 | 6 | import pypot.primitive 7 | 8 | 9 | class InitRobot(pypot.primitive.Primitive): 10 | 11 | def setup(self): 12 | self.robot.compliant = False 13 | self.robot.power_up() 14 | 15 | # Change PID of Dynamixel MX motors 16 | for m in [m for m in self.robot.motors if hasattr(m, 'pid')]: 17 | m.pid = (4, 2, 0) 18 | for m in self.robot.torso: 19 | m.pid = (6, 2, 0) 20 | 21 | # Reduce max torque to keep motor temperature low 22 | for m in self.robot.motors: 23 | m.torque_limit = 70 24 | 25 | time.sleep(0.5) 26 | 27 | def run(self): 28 | pass 29 | 30 | 31 | class StandPosition(InitRobot): 32 | def run(self): 33 | # Goto to position 0 on all motors 34 | self.robot.goto_position(dict(zip((m.name for m in self.robot.motors), itertools.repeat(0))), 2, wait=True) 35 | 36 | # Specified some motor positions to keep the robot balanced 37 | self.robot.goto_position({'r_hip_z': -2, 38 | 'l_hip_z': 2, 39 | 'r_hip_x': -2, 40 | 'l_hip_x': 2, 41 | 'l_shoulder_x': 20, 42 | 'r_shoulder_x': -20, 43 | 'l_shoulder_y': 10, 44 | 'r_shoulder_y': 10, 45 | 'l_elbow_y': -20, 46 | 'r_elbow_y': -20, 47 | 'l_ankle_y': -3, 48 | 'r_ankle_y': -2, 49 | 'abs_y': -2, 50 | 'head_y': 1, 51 | 'head_z': 0}, 52 | 3, 53 | wait=True) 54 | 55 | # Restore the motor speed 56 | self.robot.power_up() 57 | 58 | # Reduce max torque to keep motor temperature low 59 | for m in self.robot.motors: 60 | m.torque_limit = 70 61 | 62 | time.sleep(1) 63 | 64 | 65 | class SitPosition(pypot.primitive.Primitive): 66 | def run(self): 67 | self.robot.goto_position({'l_hip_y': -39, 68 | 'r_hip_y': -39, 69 | 'l_knee_y': 134, 70 | 'r_knee_y': 134, 71 | 'abs_x': 0, 72 | 'abs_y': 3, 73 | 'abs_z': 0, 74 | 'bust_x': 0, 75 | 'bust_y': 0, 76 | }, 77 | 2, 78 | wait=True) 79 | 80 | motor_list = [self.robot.l_knee_y, self.robot.l_ankle_y, self.robot.r_knee_y, self.robot.r_ankle_y] 81 | 82 | for m in motor_list: 83 | m.compliant = True 84 | 85 | for m in self.robot.legs: 86 | m.torque_limit = 20 87 | 88 | time.sleep(2) 89 | -------------------------------------------------------------------------------- /software/poppy_humanoid/primitives/safe.py: -------------------------------------------------------------------------------- 1 | 2 | import platform 3 | import logging 4 | import subprocess 5 | 6 | import pypot.primitive 7 | 8 | logger = logging.getLogger(__name__) 9 | 10 | class LimitTorque(pypot.primitive.LoopPrimitive): 11 | def __init__(self, robot, freq=20, max_error=10., torque_min=20., torque_max=95.): 12 | pypot.primitive.LoopPrimitive.__init__(self, robot, freq) 13 | 14 | self._max_error = max_error 15 | self.torque_min = torque_min 16 | self.torque_max = torque_max 17 | 18 | def setup(self): 19 | self.initial_torque_limit = [] 20 | 21 | # Using a dictionnary may be a better solution so we can easily retrieve the initial torque value. 22 | for m in self.robot.motors: 23 | self.initial_torque_limit.append(m.torque_limit) 24 | 25 | self.active_motors = self.robot.motors 26 | 27 | def update(self): 28 | for m in self.active_motors: 29 | self.adjust_torque(m) 30 | 31 | def adjust_torque(self, motor): 32 | target = motor.goal_position 33 | pos = motor.present_position 34 | dist = abs(target - pos) 35 | 36 | if dist > self._max_error: 37 | motor.torque_limit = self.torque_max 38 | else: 39 | motor.torque_limit = self.torque_min + dist / self._max_error * (self.torque_max - self.torque_min) 40 | 41 | def teardown(self): 42 | for m, i in enumerate(self.robot.motors): 43 | m.torque_limit = self.initial_torque_limit[i] 44 | 45 | @property 46 | def change_watched_motors(self): 47 | return self.active_motors 48 | 49 | @change_watched_motors.setter 50 | def change_watched_motors(self, watched_motors): 51 | self.active_motors = list(map(self.get_mockup_motor, watched_motors)) 52 | 53 | @property 54 | def max_error(self): 55 | return self._max_error 56 | 57 | @max_error.setter 58 | def max_error(self, new_error): 59 | if new_error <= 0: 60 | raise ValueError('The max_error parameter must be strictly positive!') 61 | self._max_error = float(new_error) 62 | 63 | # TODO 64 | @property 65 | def add_watched_motors(self): 66 | raise NotImplementedError('TODO :)') 67 | 68 | @add_watched_motors.setter 69 | def add_watched_motors(self, added_motors): 70 | raise NotImplementedError('TODO :)') 71 | 72 | @property 73 | def remove_watched_motors(self): 74 | raise NotImplementedError('TODO :)') 75 | 76 | @remove_watched_motors.setter 77 | def remove_watched_motors(self, suppressed_motors): 78 | raise NotImplementedError('TODO :)') 79 | 80 | 81 | class TemperatureMonitor(pypot.primitive.LoopPrimitive): 82 | ''' 83 | This primitive raises an alert by playing a sound when the temperature 84 | of one motor reaches the "temp_limit". 85 | 86 | On GNU/Linux you can use "aplay" for player 87 | On MacOS "Darwin" you can use "afplay" for player 88 | On windows vista+, you can maybe use "start wmplayer" 89 | ''' 90 | def __init__(self, robot, freq=0.5, temp_limit=55, player=None, sound=None): 91 | pypot.primitive.LoopPrimitive.__init__(self, robot, freq) 92 | 93 | self.temp_limit = temp_limit 94 | self.sound = sound 95 | self.watched_motors = self.robot.legs + self.robot.torso + self.robot.arms 96 | 97 | if player is not None: 98 | self.player = player 99 | elif 'Windows' in platform.system(): 100 | self.player = 'wmplayer' 101 | elif 'Darwin' in platform.system(): 102 | self.player = 'afplay' 103 | else: 104 | self.player = 'aplay' 105 | 106 | def setup(self): 107 | pass 108 | 109 | def update(self): 110 | self.check_temperature() 111 | 112 | def teardown(self): 113 | pass 114 | 115 | def check_temperature(self): 116 | motor_list = [] 117 | 118 | for m in self.watched_motors: 119 | if m.present_temperature > self.temp_limit: 120 | motor_list.append(m) 121 | 122 | if len(motor_list) > 0: 123 | self.raise_problem(motor_list) 124 | 125 | def raise_problem(self, motor_list): 126 | try: 127 | subprocess.call([self.player, self.sound]) 128 | except OSError: 129 | logger.warning('Sound player {} cannot be started'.format(self.player)) 130 | 131 | for m in motor_list: 132 | print('{} overheating: {}'.format(m.name, m.present_temperature)) 133 | -------------------------------------------------------------------------------- /software/poppy_humanoid/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/poppy_humanoid/utils/__init__.py -------------------------------------------------------------------------------- /software/poppy_humanoid/vrep-scene/poppy_humanoid.ttt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/poppy_humanoid/vrep-scene/poppy_humanoid.ttt -------------------------------------------------------------------------------- /software/poppy_humanoid/vrep-scene/random_force.lua: -------------------------------------------------------------------------------- 1 | -- Put this lua script as child threated script and poppy will be push every 2 seconds with a random force in a random direction 2 | 3 | if (sim_call_type==sim_childscriptcall_initialization) then 4 | 5 | 6 | handle=simGetObjectHandle('chest_respondable') 7 | t0 = simGetSimulationTime() 8 | 9 | 10 | 11 | end 12 | 13 | 14 | if (sim_call_type==sim_childscriptcall_actuation) then 15 | 16 | 17 | if simGetSimulationTime()-t0>2 then 18 | t0 = simGetSimulationTime() 19 | fx = math.random(3,8) 20 | fy = math.random(3,8) 21 | fz = math.random(3,8) 22 | simAddForce(handle,{0,0,0},{fx,fy,fz}) 23 | 24 | end 25 | 26 | 27 | 28 | end 29 | 30 | 31 | if (sim_call_type==sim_childscriptcall_sensing) then 32 | 33 | -- Put your main SENSING code here 34 | 35 | end 36 | 37 | 38 | if (sim_call_type==sim_childscriptcall_cleanup) then 39 | 40 | -- Put some restoration code here 41 | 42 | end -------------------------------------------------------------------------------- /software/poppy_humanoid/vrep-scene/timer.lua: -------------------------------------------------------------------------------- 1 | -- DO NOT WRITE CODE OUTSIDE OF THE if-then-end SECTIONS BELOW!! 2 | 3 | if (sim_call_type==sim_childscriptcall_initialization) then 4 | simSetScriptAttribute(sim_handle_self,sim_childscriptattribute_automaticcascadingcalls,false) 5 | end 6 | 7 | 8 | if (sim_call_type==sim_childscriptcall_actuation) then 9 | if not firstTimeHere93846738 then 10 | firstTimeHere93846738=0 11 | end 12 | simSetScriptAttribute(sim_handle_self,sim_scriptattribute_executioncount,firstTimeHere93846738) 13 | firstTimeHere93846738=firstTimeHere93846738+1 14 | 15 | ------------------------------------------------------------------------------ 16 | 17 | 18 | -- Check the end of the script for some explanations! 19 | if (simGetScriptExecutionCount()==0) then 20 | 21 | end 22 | 23 | simHandleChildScripts(sim_call_type) 24 | 25 | local currentTime=simGetSimulationTime() 26 | 27 | simSetFloatSignal('CurrentTime',currentTime) 28 | 29 | end 30 | 31 | 32 | if (sim_call_type==sim_childscriptcall_sensing) then 33 | simHandleChildScripts(sim_call_type) 34 | end 35 | 36 | 37 | if (sim_call_type==sim_childscriptcall_cleanup) then 38 | 39 | -- Put some restoration code here 40 | 41 | end 42 | -------------------------------------------------------------------------------- /software/samples/notebooks/Demo Interface.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Initialisation" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": { 14 | "collapsed": false 15 | }, 16 | "outputs": [], 17 | "source": [ 18 | "from pypot.creatures import PoppyHumanoid\n", 19 | "from pypot.primitive.move import MoveRecorder, MovePlayer\n", 20 | "\n", 21 | "poppy = PoppyHumanoid()" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "# Change the robot's position" 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "## Stand up" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 2, 41 | "metadata": { 42 | "collapsed": false 43 | }, 44 | "outputs": [], 45 | "source": [ 46 | "poppy.stand_position.start()" 47 | ] 48 | }, 49 | { 50 | "cell_type": "markdown", 51 | "metadata": {}, 52 | "source": [ 53 | "## Sit down" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 3, 59 | "metadata": { 60 | "collapsed": true 61 | }, 62 | "outputs": [], 63 | "source": [ 64 | "poppy.sit_position.start()" 65 | ] 66 | }, 67 | { 68 | "cell_type": "markdown", 69 | "metadata": {}, 70 | "source": [ 71 | "# Limit torque" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": 4, 77 | "metadata": { 78 | "collapsed": true 79 | }, 80 | "outputs": [], 81 | "source": [ 82 | "poppy.limit_torque.start()" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 8, 88 | "metadata": { 89 | "collapsed": true 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "poppy.limit_torque.stop()" 94 | ] 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "metadata": {}, 99 | "source": [ 100 | "# Idle" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 4, 106 | "metadata": { 107 | "collapsed": false 108 | }, 109 | "outputs": [], 110 | "source": [ 111 | "poppy.upper_body_idle_motion.start()" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": 5, 117 | "metadata": { 118 | "collapsed": false 119 | }, 120 | "outputs": [], 121 | "source": [ 122 | "poppy.head_idle_motion.start()" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": 6, 128 | "metadata": { 129 | "collapsed": true 130 | }, 131 | "outputs": [], 132 | "source": [ 133 | "poppy.upper_body_idle_motion.stop()\n", 134 | "poppy.head_idle_motion.stop()" 135 | ] 136 | }, 137 | { 138 | "cell_type": "markdown", 139 | "metadata": { 140 | "collapsed": false 141 | }, 142 | "source": [ 143 | "# Interaction" 144 | ] 145 | }, 146 | { 147 | "cell_type": "markdown", 148 | "metadata": {}, 149 | "source": [ 150 | "## arms turning compliant" 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": 7, 156 | "metadata": { 157 | "collapsed": true 158 | }, 159 | "outputs": [], 160 | "source": [ 161 | "poppy.arms_turn_compliant.start()" 162 | ] 163 | }, 164 | { 165 | "cell_type": "markdown", 166 | "metadata": {}, 167 | "source": [ 168 | "## arms copy" 169 | ] 170 | }, 171 | { 172 | "cell_type": "code", 173 | "execution_count": 9, 174 | "metadata": { 175 | "collapsed": false 176 | }, 177 | "outputs": [], 178 | "source": [ 179 | "poppy.arms_copy_motion.start()" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 10, 185 | "metadata": { 186 | "collapsed": true 187 | }, 188 | "outputs": [], 189 | "source": [ 190 | "poppy.arms_turn_compliant.stop()\n", 191 | "poppy.arms_copy_motion.stop()" 192 | ] 193 | }, 194 | { 195 | "cell_type": "markdown", 196 | "metadata": {}, 197 | "source": [ 198 | "# Record and replay a move" 199 | ] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": 11, 204 | "metadata": { 205 | "collapsed": true 206 | }, 207 | "outputs": [], 208 | "source": [ 209 | "rec = MoveRecorder(poppy, 50, poppy.arms)" 210 | ] 211 | }, 212 | { 213 | "cell_type": "code", 214 | "execution_count": 12, 215 | "metadata": { 216 | "collapsed": false 217 | }, 218 | "outputs": [ 219 | { 220 | "name": "stderr", 221 | "output_type": "stream", 222 | "text": [ 223 | ] 224 | } 225 | ], 226 | "source": [ 227 | "for m in poppy.arms:\n", 228 | " m.compliant = True\n", 229 | " \n", 230 | "rec.start()" 231 | ] 232 | }, 233 | { 234 | "cell_type": "code", 235 | "execution_count": 13, 236 | "metadata": { 237 | "collapsed": true 238 | }, 239 | "outputs": [], 240 | "source": [ 241 | "rec.stop()\n", 242 | "\n", 243 | "move = MovePlayer(poppy, rec.move)" 244 | ] 245 | }, 246 | { 247 | "cell_type": "code", 248 | "execution_count": 14, 249 | "metadata": { 250 | "collapsed": true 251 | }, 252 | "outputs": [], 253 | "source": [ 254 | "for m in poppy.arms:\n", 255 | " m.compliant = False" 256 | ] 257 | }, 258 | { 259 | "cell_type": "code", 260 | "execution_count": 17, 261 | "metadata": { 262 | "collapsed": false 263 | }, 264 | "outputs": [], 265 | "source": [ 266 | "move.start()" 267 | ] 268 | }, 269 | { 270 | "cell_type": "code", 271 | "execution_count": 18, 272 | "metadata": { 273 | "collapsed": false 274 | }, 275 | "outputs": [], 276 | "source": [ 277 | "move.stop()" 278 | ] 279 | }, 280 | { 281 | "cell_type": "markdown", 282 | "metadata": {}, 283 | "source": [ 284 | "# Snap" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": null, 290 | "metadata": { 291 | "collapsed": false 292 | }, 293 | "outputs": [], 294 | "source": [ 295 | "from pypot.server.snap import SnapRobotServer\n", 296 | "\n", 297 | "snap_server = SnapRobotServer(poppy, '0.0.0.0', 8080)\n", 298 | "snap_server.run()" 299 | ] 300 | }, 301 | { 302 | "cell_type": "markdown", 303 | "metadata": {}, 304 | "source": [ 305 | "# Killall primitives" 306 | ] 307 | }, 308 | { 309 | "cell_type": "code", 310 | "execution_count": 10, 311 | "metadata": { 312 | "collapsed": false 313 | }, 314 | "outputs": [], 315 | "source": [ 316 | "import time\n", 317 | "\n", 318 | "while poppy.active_primitives:\n", 319 | " for p in poppy.active_primitives:\n", 320 | " p.stop()\n", 321 | " \n", 322 | " time.sleep(0.1)" 323 | ] 324 | }, 325 | { 326 | "cell_type": "code", 327 | "execution_count": null, 328 | "metadata": { 329 | "collapsed": true 330 | }, 331 | "outputs": [], 332 | "source": [] 333 | } 334 | ], 335 | "metadata": { 336 | "language_info": { 337 | "codemirror_mode": { 338 | "name": "ipython", 339 | "version": 2 340 | }, 341 | "file_extension": ".py", 342 | "mimetype": "text/x-python", 343 | "name": "python", 344 | "nbconvert_exporter": "python", 345 | "pygments_lexer": "ipython2", 346 | "version": "2.7.6" 347 | } 348 | }, 349 | "nbformat": 4, 350 | "nbformat_minor": 0 351 | } 352 | -------------------------------------------------------------------------------- /software/samples/notebooks/Discover your Poppy Humanoid.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Discover your Poppy Humanoid" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "This notebook will guide you in your very first steps with Poppy Humanoid in Python. \n", 15 | "\n", 16 | "What you will see in this notebook:\n", 17 | "\n", 18 | "1. Instantiate your robot\n", 19 | "2. Access motors, send motor commands\n", 20 | "3. Start high level behaviors" 21 | ] 22 | }, 23 | { 24 | "cell_type": "markdown", 25 | "metadata": {}, 26 | "source": [ 27 | "*We assume here that you are connected to a physical Poppy Humanoid. It also need to be assembled and configured (you can referer to the [documentation](http://docs.poppy-project.org/en) if you haven't done in yet).*\n", 28 | "" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": null, 34 | "metadata": { 35 | "collapsed": false 36 | }, 37 | "outputs": [], 38 | "source": [ 39 | "# Import some matplolib shortcuts for Jupyter notebook\n", 40 | "%matplotlib inline\n", 41 | "\n", 42 | "import numpy as np\n", 43 | "import matplotlib.pyplot as plt\n" 44 | ] 45 | }, 46 | { 47 | "cell_type": "markdown", 48 | "metadata": {}, 49 | "source": [ 50 | "## Instantiate your robot" 51 | ] 52 | }, 53 | { 54 | "cell_type": "markdown", 55 | "metadata": {}, 56 | "source": [ 57 | "To start using your robot in Python, you first need to instantiate it. You can do that by running the following code:" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": null, 63 | "metadata": { 64 | "collapsed": false 65 | }, 66 | "outputs": [], 67 | "source": [ 68 | "from pypot.creatures import PoppyHumanoid\n", 69 | "\n", 70 | "# if your Humanoid has no camera you should create the robot with:\n", 71 | "# poppy = PoppyHumanoid(camera='dummy')\n", 72 | "\n", 73 | "# else if your Humanoid has a camera you can create the robot with:\n", 74 | "poppy = PoppyHumanoid()" 75 | ] 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": {}, 80 | "source": [ 81 | "**If you are using V-REP simulator**, you have to run this code instead. If you have troubles, look at the [documentation to install and run V-REP](http://docs.poppy-project.org/en/installation/install-vrep.html#test-your-installation)." 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 1, 87 | "metadata": { 88 | "collapsed": false 89 | }, 90 | "outputs": [], 91 | "source": [ 92 | "from pypot.creatures import PoppyHumanoid\n", 93 | "\n", 94 | "poppy = PoppyHumanoid(simulator='vrep')" 95 | ] 96 | }, 97 | { 98 | "cell_type": "markdown", 99 | "metadata": {}, 100 | "source": [ 101 | "This creates a [Robot](http://poppy-project.github.io/pypot/pypot.robot.html#pypot.robot.robot.Robot) object that can be used to access the motors and sensors. It handles all the low-level communication for you, so you do not need to know anything about the serial protocol used to make a motor turn. The *motors* and *sensors* fields of the Robot are automatically synced to match the state of their hardware equivalent." 102 | ] 103 | }, 104 | { 105 | "cell_type": "markdown", 106 | "metadata": {}, 107 | "source": [ 108 | "Before doing anything else, we will initalize everything by asking the robot to go to its init position (the code below will be described in more detailed later):" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 2, 114 | "metadata": { 115 | "collapsed": false 116 | }, 117 | "outputs": [], 118 | "source": [ 119 | "poppy.stand_position.start()\n" 120 | ] 121 | }, 122 | { 123 | "cell_type": "markdown", 124 | "metadata": {}, 125 | "source": [ 126 | "## Access motors" 127 | ] 128 | }, 129 | { 130 | "cell_type": "markdown", 131 | "metadata": {}, 132 | "source": [ 133 | "In a Poppy Humanoid, motors are defined as illustrated below:\n", 134 | "\n", 135 | "" 136 | ] 137 | }, 138 | { 139 | "cell_type": "markdown", 140 | "metadata": {}, 141 | "source": [ 142 | "From the [Robot](http://poppy-project.github.io/pypot/pypot.robot.html#pypot.robot.robot.Robot) object, you can directly retrieve the list of motors connected:" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": 6, 148 | "metadata": { 149 | "collapsed": false 150 | }, 151 | "outputs": [ 152 | { 153 | "data": { 154 | "text/plain": [ 155 | "[,\n", 156 | " ,\n", 157 | " ,\n", 158 | " ,\n", 159 | " ,\n", 160 | " ,\n", 161 | " ,\n", 162 | " ,\n", 163 | " ,\n", 164 | " ,\n", 165 | " ,\n", 166 | " ,\n", 167 | " ,\n", 168 | " ,\n", 169 | " ,\n", 170 | " ,\n", 171 | " ,\n", 172 | " ,\n", 173 | " ,\n", 174 | " ,\n", 175 | " ,\n", 176 | " ,\n", 177 | " ,\n", 178 | " ,\n", 179 | " ]" 180 | ] 181 | }, 182 | "execution_count": 6, 183 | "metadata": {}, 184 | "output_type": "execute_result" 185 | } 186 | ], 187 | "source": [ 188 | "poppy.motors" 189 | ] 190 | }, 191 | { 192 | "cell_type": "markdown", 193 | "metadata": {}, 194 | "source": [ 195 | "As you can see *poppy.motors* holds a list of all motors." 196 | ] 197 | }, 198 | { 199 | "cell_type": "markdown", 200 | "metadata": {}, 201 | "source": [ 202 | "You can retrieve all motors names:" 203 | ] 204 | }, 205 | { 206 | "cell_type": "code", 207 | "execution_count": null, 208 | "metadata": { 209 | "collapsed": false 210 | }, 211 | "outputs": [], 212 | "source": [ 213 | "for m in poppy.motors:\n", 214 | " print(m.name)" 215 | ] 216 | }, 217 | { 218 | "cell_type": "markdown", 219 | "metadata": {}, 220 | "source": [ 221 | " Each of them can be access directly from its name. For instance:\n", 222 | " \n", 223 | " " 224 | ] 225 | }, 226 | { 227 | "cell_type": "code", 228 | "execution_count": null, 229 | "metadata": { 230 | "collapsed": false 231 | }, 232 | "outputs": [], 233 | "source": [ 234 | "poppy.l_elbow_y" 235 | ] 236 | }, 237 | { 238 | "cell_type": "markdown", 239 | "metadata": {}, 240 | "source": [ 241 | "### Read values from the motors" 242 | ] 243 | }, 244 | { 245 | "cell_type": "markdown", 246 | "metadata": {}, 247 | "source": [ 248 | "From the motor object you can access its registers. The main ones are:\n", 249 | "\n", 250 | "* **present_position**: the current position of the motor in degrees\n", 251 | "* **present_speed**: the current speed of the motor in degrees per second \n", 252 | "* **present_load**: the current workload of the motor (in percentage of max load)\n", 253 | "* **present_temperature**: the temperature of the motor in celsius\n", 254 | "* **angle_limit**: the reachable limits of the motor (in degrees)\n", 255 | "\n", 256 | "They can be accessed directly:" 257 | ] 258 | }, 259 | { 260 | "cell_type": "code", 261 | "execution_count": null, 262 | "metadata": { 263 | "collapsed": false 264 | }, 265 | "outputs": [], 266 | "source": [ 267 | "poppy.l_elbow_y.present_temperature" 268 | ] 269 | }, 270 | { 271 | "cell_type": "markdown", 272 | "metadata": {}, 273 | "source": [ 274 | "Or, to get the present position for all motors:" 275 | ] 276 | }, 277 | { 278 | "cell_type": "code", 279 | "execution_count": 6, 280 | "metadata": { 281 | "collapsed": false 282 | }, 283 | "outputs": [ 284 | { 285 | "data": { 286 | "text/plain": [ 287 | "[-20.0,\n", 288 | " 0.0,\n", 289 | " 0.0,\n", 290 | " 1.0,\n", 291 | " -2.0,\n", 292 | " 0.0,\n", 293 | " 0.0,\n", 294 | " -20.0,\n", 295 | " 10.0,\n", 296 | " -2.0,\n", 297 | " -2.0,\n", 298 | " -20.0,\n", 299 | " -105.0,\n", 300 | " 2.0,\n", 301 | " 0.0,\n", 302 | " 2.0,\n", 303 | " 0.0,\n", 304 | " -2.0,\n", 305 | " 0.0,\n", 306 | " -3.0,\n", 307 | " -0.0,\n", 308 | " 0.0,\n", 309 | " 0.0,\n", 310 | " 20.0,\n", 311 | " 9.700000000000003]" 312 | ] 313 | }, 314 | "execution_count": 6, 315 | "metadata": {}, 316 | "output_type": "execute_result" 317 | } 318 | ], 319 | "source": [ 320 | "[m.present_position for m in poppy.motors]" 321 | ] 322 | }, 323 | { 324 | "cell_type": "markdown", 325 | "metadata": {}, 326 | "source": [ 327 | "It's important to understand the *poppy.m1.present_position* is automatically updated with the real motor position (at 50Hz). Similarly for other registers, the update frequency may vary depending on its importance. For instance, the temperature is only refreshed at 1Hz as it is not fluctuating that quickly." 328 | ] 329 | }, 330 | { 331 | "cell_type": "markdown", 332 | "metadata": {}, 333 | "source": [ 334 | "### Send motor commands" 335 | ] 336 | }, 337 | { 338 | "cell_type": "markdown", 339 | "metadata": {}, 340 | "source": [ 341 | "On top of the registers presented above, they are additional ones used to send commands. For instance, the position of the motor is split in two different registers: \n", 342 | "\n", 343 | "* the read-only **present_position** of the motor\n", 344 | "* the read-write **goal_position** which sends to the motor a target position that it will try to reach.\n", 345 | "\n", 346 | "If you want to set a new position for a motor, you write:" 347 | ] 348 | }, 349 | { 350 | "cell_type": "code", 351 | "execution_count": 6, 352 | "metadata": { 353 | "collapsed": false 354 | }, 355 | "outputs": [], 356 | "source": [ 357 | "poppy.l_arm_z.goal_position = 50" 358 | ] 359 | }, 360 | { 361 | "cell_type": "markdown", 362 | "metadata": {}, 363 | "source": [ 364 | "You should see the robot turn of 20 degrees. Sending motor command is as simple as that. To make it turn to the other side:" 365 | ] 366 | }, 367 | { 368 | "cell_type": "code", 369 | "execution_count": 7, 370 | "metadata": { 371 | "collapsed": true 372 | }, 373 | "outputs": [], 374 | "source": [ 375 | "poppy.l_arm_z.goal_position = -50" 376 | ] 377 | }, 378 | { 379 | "cell_type": "markdown", 380 | "metadata": {}, 381 | "source": [ 382 | "In the examples above, the motor turned as fast as possible (its default mode). You can change its *moving_speed* (i.e. its maximum possible speed):" 383 | ] 384 | }, 385 | { 386 | "cell_type": "code", 387 | "execution_count": null, 388 | "metadata": { 389 | "collapsed": true 390 | }, 391 | "outputs": [], 392 | "source": [ 393 | "poppy.l_arm_z.moving_speed = 50" 394 | ] 395 | }, 396 | { 397 | "cell_type": "markdown", 398 | "metadata": {}, 399 | "source": [ 400 | "Now the motor *l_arm_z* can not move faster than 50 degrees per second. If we ask to move again, you should see the difference:" 401 | ] 402 | }, 403 | { 404 | "cell_type": "code", 405 | "execution_count": null, 406 | "metadata": { 407 | "collapsed": true 408 | }, 409 | "outputs": [], 410 | "source": [ 411 | "poppy.l_arm_z.goal_position = 90" 412 | ] 413 | }, 414 | { 415 | "cell_type": "markdown", 416 | "metadata": {}, 417 | "source": [ 418 | "The main write registers are:\n", 419 | "\n", 420 | "* **goal_position**: target position in degrees\n", 421 | "* **moving_speed**: maximum reachable speed in degrees per second\n", 422 | "* **compliant** (explained below) " 423 | ] 424 | }, 425 | { 426 | "cell_type": "markdown", 427 | "metadata": {}, 428 | "source": [ 429 | "The dynamixel servo motors have two modes:\n", 430 | "\n", 431 | "* **stiff**: the normal mode for motors where they can be controlled\n", 432 | "* **compliant**: a mode where the motors can be freely moved by hand. This is particularly useful for phyisical human-robot interaction\n", 433 | "\n", 434 | "You can make them switch from one mode to the other using the *compliant* register. For instance, you can turn the motor *m6* compliant via:" 435 | ] 436 | }, 437 | { 438 | "cell_type": "code", 439 | "execution_count": null, 440 | "metadata": { 441 | "collapsed": true 442 | }, 443 | "outputs": [], 444 | "source": [ 445 | "poppy.l_arm_z.compliant = True" 446 | ] 447 | }, 448 | { 449 | "cell_type": "markdown", 450 | "metadata": {}, 451 | "source": [ 452 | "You should now be able to move this motors by hand. This is particularly useful for programming your robot by demonstration (see the dedicated notebook)." 453 | ] 454 | }, 455 | { 456 | "cell_type": "markdown", 457 | "metadata": {}, 458 | "source": [ 459 | " And to turn it stiff again:" 460 | ] 461 | }, 462 | { 463 | "cell_type": "code", 464 | "execution_count": null, 465 | "metadata": { 466 | "collapsed": true 467 | }, 468 | "outputs": [], 469 | "source": [ 470 | "poppy.l_arm_z.compliant = False" 471 | ] 472 | }, 473 | { 474 | "cell_type": "markdown", 475 | "metadata": {}, 476 | "source": [ 477 | "## High level behaviors" 478 | ] 479 | }, 480 | { 481 | "cell_type": "markdown", 482 | "metadata": {}, 483 | "source": [ 484 | "The Poppy Humanoid robot comes with a set of pre-defined behaviors. They can be specific postures - such as the init_position used at the beginning - or a *breathing* motion, ... " 485 | ] 486 | }, 487 | { 488 | "cell_type": "markdown", 489 | "metadata": {}, 490 | "source": [ 491 | "You can find the exhaustive list using the *primitives* accessor:" 492 | ] 493 | }, 494 | { 495 | "cell_type": "code", 496 | "execution_count": null, 497 | "metadata": { 498 | "collapsed": false 499 | }, 500 | "outputs": [], 501 | "source": [ 502 | "[p.name for p in poppy.primitives]" 503 | ] 504 | }, 505 | { 506 | "cell_type": "markdown", 507 | "metadata": {}, 508 | "source": [ 509 | "Those behaviors (or primitives in \"poppy terms\") can be started, stopped, paused, etc..." 510 | ] 511 | }, 512 | { 513 | "cell_type": "code", 514 | "execution_count": null, 515 | "metadata": { 516 | "collapsed": true 517 | }, 518 | "outputs": [], 519 | "source": [ 520 | "poppy.upper_body_idle_motion.start()" 521 | ] 522 | }, 523 | { 524 | "cell_type": "markdown", 525 | "metadata": {}, 526 | "source": [ 527 | "You can make the Poppy Humanoid *breathe* for 10 seconds:" 528 | ] 529 | }, 530 | { 531 | "cell_type": "code", 532 | "execution_count": null, 533 | "metadata": { 534 | "collapsed": true 535 | }, 536 | "outputs": [], 537 | "source": [ 538 | "import time\n", 539 | "\n", 540 | "poppy.upper_body_idle_motion.start()\n", 541 | "time.sleep(10)\n", 542 | "poppy.upper_body_idle_motion.stop()" 543 | ] 544 | }, 545 | { 546 | "cell_type": "markdown", 547 | "metadata": {}, 548 | "source": [ 549 | "## Going further\n", 550 | "\n", 551 | "Now that you have learnt the basis of what you can do with a Poppy Humanoid, there is much more to discover:\n", 552 | "* how to record/replay move by demonstration\n", 553 | "* how to define your own high-level behavior (e.g. a visual servoing of the tip of the robot using blob detection)\n", 554 | "* used your Poppy Humanoid as a connected device and make it communaticate with the rest of the world using HTTP requests\n", 555 | "* ...\n", 556 | "\n", 557 | "You can find other examples in the [docs](http://docs.poppy-project.org) or in the notebook folder next to this one." 558 | ] 559 | }, 560 | { 561 | "cell_type": "code", 562 | "execution_count": null, 563 | "metadata": { 564 | "collapsed": true 565 | }, 566 | "outputs": [], 567 | "source": [] 568 | } 569 | ], 570 | "metadata": { 571 | "anaconda-cloud": {}, 572 | "kernelspec": { 573 | "display_name": "Python [default]", 574 | "language": "python", 575 | "name": "python2" 576 | }, 577 | "language_info": { 578 | "codemirror_mode": { 579 | "name": "ipython", 580 | "version": 2 581 | }, 582 | "file_extension": ".py", 583 | "mimetype": "text/x-python", 584 | "name": "python", 585 | "nbconvert_exporter": "python", 586 | "pygments_lexer": "ipython2", 587 | "version": "2.7.12" 588 | } 589 | }, 590 | "nbformat": 4, 591 | "nbformat_minor": 0 592 | } 593 | -------------------------------------------------------------------------------- /software/samples/notebooks/TTFX.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Controler une créature Poppy" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "Différentes créatures:\n", 15 | "* humanoid\n", 16 | "* torso\n", 17 | "* ergo\n", 18 | "* ..." 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 1, 24 | "metadata": { 25 | "collapsed": false 26 | }, 27 | "outputs": [ 28 | { 29 | "name": "stderr", 30 | "output_type": "stream", 31 | "text": [ 32 | "WARNING:pypot.robot.config:Limits of 'head_y' changed to [-40, 8]\n" 33 | ] 34 | } 35 | ], 36 | "source": [ 37 | "from pypot.creatures import PoppyHumanoid\n", 38 | "\n", 39 | "poppy = PoppyHumanoid()" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "On peut donner des positions de base:\n", 47 | "* debout\n", 48 | "* assis" 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 2, 54 | "metadata": { 55 | "collapsed": false 56 | }, 57 | "outputs": [], 58 | "source": [ 59 | "poppy.stand_position.start()" 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "metadata": {}, 65 | "source": [ 66 | "Les valeurs des moteurs hardware sont automatiquement synchronisées (à 50Hz) avec les valeurs de l'objet (R/W)." 67 | ] 68 | }, 69 | { 70 | "cell_type": "markdown", 71 | "metadata": {}, 72 | "source": [ 73 | "On peut récupérer la liste des moteurs, lire les différents registres des servo-moteurs:" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": 3, 79 | "metadata": { 80 | "collapsed": false 81 | }, 82 | "outputs": [ 83 | { 84 | "data": { 85 | "text/plain": [ 86 | "[,\n", 87 | " ,\n", 88 | " ,\n", 89 | " ,\n", 90 | " ,\n", 91 | " ,\n", 92 | " ,\n", 93 | " ,\n", 94 | " ,\n", 95 | " ,\n", 96 | " ,\n", 97 | " ,\n", 98 | " ,\n", 99 | " ,\n", 100 | " ,\n", 101 | " ,\n", 102 | " ,\n", 103 | " ,\n", 104 | " ,\n", 105 | " ,\n", 106 | " ,\n", 107 | " ,\n", 108 | " ,\n", 109 | " ,\n", 110 | " ]" 111 | ] 112 | }, 113 | "execution_count": 3, 114 | "metadata": {}, 115 | "output_type": "execute_result" 116 | } 117 | ], 118 | "source": [ 119 | "poppy.motors" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": 4, 125 | "metadata": { 126 | "collapsed": false 127 | }, 128 | "outputs": [ 129 | { 130 | "data": { 131 | "text/plain": [ 132 | "-0.44" 133 | ] 134 | }, 135 | "execution_count": 4, 136 | "metadata": {}, 137 | "output_type": "execute_result" 138 | } 139 | ], 140 | "source": [ 141 | "poppy.head_z.present_position" 142 | ] 143 | }, 144 | { 145 | "cell_type": "code", 146 | "execution_count": 5, 147 | "metadata": { 148 | "collapsed": false 149 | }, 150 | "outputs": [ 151 | { 152 | "data": { 153 | "text/plain": [ 154 | "0.0" 155 | ] 156 | }, 157 | "execution_count": 5, 158 | "metadata": {}, 159 | "output_type": "execute_result" 160 | } 161 | ], 162 | "source": [ 163 | "poppy.head_z.present_load" 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 6, 169 | "metadata": { 170 | "collapsed": false 171 | }, 172 | "outputs": [ 173 | { 174 | "data": { 175 | "text/plain": [ 176 | "{u'abs_x': 0.13,\n", 177 | " u'abs_y': -1.98,\n", 178 | " u'abs_z': 0.04,\n", 179 | " u'bust_x': -0.04,\n", 180 | " u'bust_y': -0.57,\n", 181 | " u'head_y': 0.6700000000000017,\n", 182 | " u'head_z': 0.15,\n", 183 | " u'l_ankle_y': -6.99,\n", 184 | " u'l_arm_z': 0.04,\n", 185 | " u'l_elbow_y': -20.18,\n", 186 | " u'l_hip_x': 2.33,\n", 187 | " u'l_hip_y': -0.1100000000000001,\n", 188 | " u'l_hip_z': 2.42,\n", 189 | " u'l_knee_y': 0.66,\n", 190 | " u'l_shoulder_x': 19.89,\n", 191 | " u'l_shoulder_y': 9.739999999999995,\n", 192 | " u'r_ankle_y': -7.69,\n", 193 | " u'r_arm_z': 0.13,\n", 194 | " u'r_elbow_y': -20.0,\n", 195 | " u'r_hip_x': 1.71,\n", 196 | " u'r_hip_y': 0.57,\n", 197 | " u'r_hip_z': -1.8,\n", 198 | " u'r_knee_y': 0.84,\n", 199 | " u'r_shoulder_x': -20.33,\n", 200 | " u'r_shoulder_y': 10.090000000000003}" 201 | ] 202 | }, 203 | "execution_count": 6, 204 | "metadata": {}, 205 | "output_type": "execute_result" 206 | } 207 | ], 208 | "source": [ 209 | "{m.name: m.present_position for m in poppy.motors}" 210 | ] 211 | }, 212 | { 213 | "cell_type": "markdown", 214 | "metadata": {}, 215 | "source": [ 216 | "De la même manière on peut écrire dans ces registres:" 217 | ] 218 | }, 219 | { 220 | "cell_type": "code", 221 | "execution_count": 7, 222 | "metadata": { 223 | "collapsed": false 224 | }, 225 | "outputs": [], 226 | "source": [ 227 | "poppy.head_z.goal_position = 30" 228 | ] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "execution_count": 8, 233 | "metadata": { 234 | "collapsed": false 235 | }, 236 | "outputs": [], 237 | "source": [ 238 | "poppy.head_z.goal_position = -30" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": 9, 244 | "metadata": { 245 | "collapsed": false 246 | }, 247 | "outputs": [], 248 | "source": [ 249 | "import time\n", 250 | "\n", 251 | "from numpy import sin\n", 252 | "\n", 253 | "amp = 30\n", 254 | "freq = 0.5\n", 255 | "\n", 256 | "t0 = time.time()\n", 257 | "\n", 258 | "while time.time() - t0 < 10:\n", 259 | " t = time.time()\n", 260 | " pos = amp * sin(2 * 3.14 * freq * t)\n", 261 | " \n", 262 | " poppy.head_z.goal_position = pos\n", 263 | " \n", 264 | " time.sleep(0.02)" 265 | ] 266 | }, 267 | { 268 | "cell_type": "markdown", 269 | "metadata": {}, 270 | "source": [ 271 | "## Primitives" 272 | ] 273 | }, 274 | { 275 | "cell_type": "code", 276 | "execution_count": 10, 277 | "metadata": { 278 | "collapsed": false 279 | }, 280 | "outputs": [], 281 | "source": [ 282 | "from pypot.primitive.utils import Sinus\n", 283 | "\n", 284 | "s1 = Sinus(poppy, 50., [poppy.head_z, poppy.head_y], amp=20, freq=0.5)" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": 11, 290 | "metadata": { 291 | "collapsed": false 292 | }, 293 | "outputs": [], 294 | "source": [ 295 | "s1.start()" 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": 12, 301 | "metadata": { 302 | "collapsed": false 303 | }, 304 | "outputs": [], 305 | "source": [ 306 | "s2 = Sinus(poppy, 50., [poppy.head_z, ], amp=5, freq=0.75)" 307 | ] 308 | }, 309 | { 310 | "cell_type": "code", 311 | "execution_count": 13, 312 | "metadata": { 313 | "collapsed": false 314 | }, 315 | "outputs": [], 316 | "source": [ 317 | "s2.start()" 318 | ] 319 | }, 320 | { 321 | "cell_type": "code", 322 | "execution_count": 14, 323 | "metadata": { 324 | "collapsed": false 325 | }, 326 | "outputs": [], 327 | "source": [ 328 | "pos = []\n", 329 | "\n", 330 | "t0 = time.time()\n", 331 | "while time.time() - t0 < 10:\n", 332 | " pos.append(poppy.head_z.present_position)\n", 333 | " time.sleep(0.1)\n", 334 | " \n", 335 | "s1.stop()\n", 336 | "s2.stop()" 337 | ] 338 | }, 339 | { 340 | "cell_type": "code", 341 | "execution_count": 16, 342 | "metadata": { 343 | "collapsed": false 344 | }, 345 | "outputs": [ 346 | { 347 | "name": "stdout", 348 | "output_type": "stream", 349 | "text": [ 350 | "Populating the interactive namespace from numpy and matplotlib\n" 351 | ] 352 | }, 353 | { 354 | "data": { 355 | "text/plain": [ 356 | "[]" 357 | ] 358 | }, 359 | "execution_count": 16, 360 | "metadata": {}, 361 | "output_type": "execute_result" 362 | }, 363 | { 364 | "data": { 365 | "image/png": [ 366 | "iVBORw0KGgoAAAANSUhEUgAAAX0AAAEACAYAAABfxaZOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", 367 | "AAALEgAACxIB0t1+/AAAIABJREFUeJztnXncXVV577+PhDkQRpOQgUBCIAMhhMggUkJkiK1Fvb2K\n", 368 | "3paL4u2nLW0FO9wi1krVWvR2slfR1hZLbZ2q1IYqQwpEQSAGTDAjGSCQEBKGQJA54NM/1jrJyZt3\n", 369 | "OOfstfZae+/n+/nwIe8Z1n7e8+79O8/+rWc9S1QVwzAMoxm8IXUAhmEYRnmY6BuGYTQIE33DMIwG\n", 370 | "YaJvGIbRIEz0DcMwGoSJvmEYRoMoJPoisp+ILBKRpSKyUkT+3D9+mIgsEJE1InKriBwSJlzDMAyj\n", 371 | "CFK0Tl9EDlDVF0VkGHAX8AfAhcBTqvpZEfkj4FBVvbJ4uIZhGEYRCts7qvqi/+c+wF7AMzjRv94/\n", 372 | "fj3wzqLHMQzDMIpTWPRF5A0ishTYCtyhqiuAkaq61b9kKzCy6HEMwzCM4gwrOoCq/hyYKSIjgFtE\n", 373 | "5Jw+z6uIWK8HwzCMDCgs+i1UdbuIfA84BdgqIqNUdYuIjAae6Pt6+yIwDMPoDVWVXt9bSPRF5Ajg\n", 374 | "NVV9VkT2B84D/hSYD1wCfMb//7v9vb9I4HVCRK5W1atTx5ED9lnswj6LXdhnsYuiCXPRTH80cL2I\n", 375 | "vAE3P/BVVb1NRJYA3xKRDwIbgPcUPI5hGIYRgEKir6rLgFn9PL4NOLfI2IZhGEZ4bEVuHixMHUBG\n", 376 | "LEwdQEYsTB1ARixMHUBdKLw4q+cDi6h5+oZhGN1RVDst0zcMw2gQJvqGYRgNwkTfMAyjQZjoG4Zh\n", 377 | "NAgTfcMwjAZhom8YhtEgTPQNwzAahIm+YRhGgzDRNwzDaBAm+oZhGA3CRN8wDKNBmOgbhmE0CBN9\n", 378 | "wzCCIsKRIpwz9CuNFJjoGz0jwv4inJ06DiM7vgDcIMKBqQMx9sRE3yjCFcBCES5PHYiRByJcgNsn\n", 379 | "+x7cVqlGZlg/faMnRBgBrAN+Ffgi8EVV/iJtVEZKRNgfWAb8LvAC8GVgiio/TxpYzSiqnUX3yDWa\n", 380 | "yxXATarc6i2e20XYR5VPpw7MSMaVwFJVbhJBgOeBecD304ZltGOZvtE1IhwGrAFOV2Wdf+wo4D7g\n", 381 | "fFWWp4zPKB8RJgN3AzNV2eQfuxj436qclzS4mmE7Zxkp+H3guy3BB1BlM3AbcFqyqIyUfAz4i5bg\n", 382 | "e74JTBNheqKYjH4w0Te6QoQjgd8EPtnP04uB2eVGZKTGWznnAd9of1yVV4FrwSb6c8JE3+iW3wb+\n", 383 | "TZVH+nnuPuBNJcdjpGcK8JIqG/p57u+Ad4twcLkhGQNhom90yxzghgGeWwpMFWHf8sIxMuAc4Pb+\n", 384 | "nlDlSdx5cUapERkDYqJvdIwIw3A12D/u73lVXgTWAjPKjMtIzlzgjkGevxN4S0mxGENgom90w3Rg\n", 385 | "oyrPDvKa+zBfvzGI8AbgbAYX/buAs8qJyBgKE32jG84A7h3iNSb6zeJE4GlVHhvkNfcAs0XYp6SY\n", 386 | "jEEw0Te64XSGFv3F2GRuk5jLAH5+C1Wew63rmFVKRMagFBJ9ERknIneIyAoRWS4iH/KPHyYiC0Rk\n", 387 | "jYjcKiKHhAnXSEwnor8MmCTCASXEY6TnHAa3dlqYxZMJRTP9HcCHVXUaThB+W0Sm4JZjL1DVybgF\n", 388 | "O1cWPI6RGBEOB0YDKwZ7nSqvACuBmWXEZaTDT+z/ArCwg5ffhU3mZkEh0VfVLaq61P/7eWAVMAa4\n", 389 | "ELjev+x64J1FjmNkwanAYlVe7+C1ZvE0g5NxE/tPdPDau4Az/cSvkZBgfwARmYA7CRYBI1V1q39q\n", 390 | "KzAy1HGMZHRi7bSwydxmMKSf38K36dgOnBA1ImNIgoi+iAwHvgNcrqo/a39OXUe3NF3djJB0I/rW\n", 391 | "jqEZdOrntzCLJwMKt1YWkb1xgv9VVf2uf3iriIxS1S0iMhr6v/0TkavbflyoqguLxmOEx9+SnwZc\n", 392 | "3OFbVgLjRTjYV24YNcOfE2cC/6uLt92JmwP4+yhB1RQRmYNbCR9mvCKtlUVEcJ7906r64bbHP+sf\n", 393 | "+4yIXAkcoqpX9nmvtVauCCJMAf5TlYldvOdu4CrVjib5jIohwjjgXlXGdPGeE3B7MBwTL7L6k7q1\n", 394 | "8pnArwHniMgS/9884BrgPBFZg/P9ril4HCMt3Vg7LczXrzeTgPVdvudB4CARxkaIx+iQQvaOqt7F\n", 395 | "wF8c5xYZ28iKXkR/FVa2WWcmwq79FDpBFRVxVTy4XvtGAqx8yuiE03FL6bvhIeDYCLEYeTCJLkXf\n", 396 | "8wAwLXAsRheY6BuD4ifsJuMmZ7vhIeh8DsCoHL2K/jr/XiMRJvrGUBwJPO/bJnfDI8AYEfaOEJOR\n", 397 | "nl48fTDRT46JvjEU44FHu32T3ypvCzAueERGUvz2iBPpTfTXY3eASTHRN4ZiPPS7NWInmK9fT94I\n", 398 | "vDzEvgoD8SSwtwiHBY7J6BATfWMoesr0PSb69aRXawdVFGfxWLafCBN9YyiOxkTf2J1eJ3FbmMWT\n", 399 | "EBN9YyiKZPrrMdGvI13X6PfBJnMTYqJvDIV5+kZfimb6JvoJMdE3hsI8faMvPXv6HhP9hJjoGwPi\n", 400 | "tzw8GFdx0QtPA8NEODRcVEYGmKdfYUz0jcEYh9sZ6ee9vNlXali2XyN8qeVewFMFhtkMjBBheJio\n", 401 | "jG4w0TcGo4i108JEv15MBNb5L/Se8EmEtelIhIm+MRhFJnFbmOjXi6J+fgur1U9E4Z2zjFpTpEa/\n", 402 | "xUPASQFiMfKgqJ/fYj0NmMwV4XDgXUBr05NXgdtU2ZQqJhP9LhFhGHAesO8AL7lXlS0lhhST8cAP\n", 403 | "C46xHnfS1xoR9sftIbHXAC+5Q5XtJYYUi4kUPyfAfXGcHGCcbPFa8W3gZdgp8gcBfyXCWuAG4Etl\n", 404 | "bylqot89nwIuBNb089whwBtEOLuI55kR5ul3gAgHAjcCBwKP9/OSMcAvAx8sM65ITAK+EmCcdcC7\n", 405 | "A4yTM5/EZfZvV+X11oO+8+wc4PeBUcDvlRmUiX4XiHAhbiPoWap7Vi/4b/YVuIxvQcnhxSCEp/8I\n", 406 | "MFaEYaq8FiCmrBDhIOB7uDua/9N+cbe9ZjSwUoTLVXm+7BgDE9Leqa2n36YVp/Q9J1TZASwQ4UFg\n", 407 | "qQhXl5nt20Ruh4hwDPAPwEX9CT6AF7WrgU/69rOVxW+eMhaKeY91brEswgjgFmA18MH+BB9AlceB\n", 408 | "u4D/WWJ4wfFfcAfT/91MtzwKjBJhvwBjZYUIxwJfZhCtAFDlUeC/gPeXFBpgot8RIuwLfAv4tOqQ\n", 409 | "2wZ+ExgO/GL0wOIyEtiuyksBxqqdxeO/1P8Ft/3fb3awluE64NLogcXlWGB9r+s22vEJ0iPAMYWj\n", 410 | "yo+/A65R7Whf6b8BPiQy4FxQcEz0O+OjwEbgc0O90F8QHwc+UfFsP4Sf36KONdnvxP1Ol3cogt8D\n", 411 | "jhdhctywojIJ97cMRe3KNkU4EZgKfKHDt9wDbAN+KVpQfTDRHwLfiuC3gD/sYnL233Gf7TujBRaf\n", 412 | "0KJfm0zfryT9HHCZt6+GxL/uXyj5Vj4w44ENAcerY9nm5cC1XZwXisv2L48aVRsm+kNzMfAj1c4X\n", 413 | "pPjM70+Aj0WLKj4hJnFb1Er0cX/bhaos7PJ91wGX+An/KnI04c4JqFnjNRGOBH4F+Psu3/pt4AQR\n", 414 | "ZoSPak9M9AfBT2Zegfsm7pbvAeNEGB82qtIIsTCrRW3sHRGm47L1P+j2vaqswNmE5wcOqyxC3v1B\n", 415 | "zUQf+A3gO6rdNSj0dwVfAD4UJao+mOgPzvnAK8APun2jz/YXABeEDqokQl7gG/x4deALwJ+o8kSP\n", 416 | "76/yhG5o0X+EmpwXIuwDXEYH834D8C/AhT7RjIqJ/uBcAfx1gYVWN2OiD64183C/iKmyiDAVdpbj\n", 417 | "9coNwHl+gU7VCC36m3BlwXXg3cBKVZb18mZfvvk0MCtoVP1goj8A/gKfCXyjwDC3AnMr6uEG8/T9\n", 418 | "Xc9Gql+rfxHwrYHq8TvB121vAE4JFVQZtO2t0OsdTn9sx61gPzjgmKXjq/R6tYHbKSVJNNEfmMuB\n", 419 | "L6rySq8D+B48jwKnBouqBHxGfgDFeqb35VEqfCvvL+yLcOswinI7cE6Accqk0N4K/eHvoOuQ7c8C\n", 420 | "jgC+X3CcW4B5xcMZHBP9fvCZx0XAlwIMdzMl/CEDMx53gYfsH1Rp0cd1Ct0HWBxgrDuAuQHGKZPQ\n", 421 | "1k6LOoj+B4HrAnwh/gCY6Vd6R6Ow6IvIdSKyVUSWtT12mIgsEJE1InKriBxS9Dgl8x7gdlW2Bhjr\n", 422 | "Fqrn64/H2TEheRRXEVRVWtZOiC/CHwKn+5XeVcFEvx98d9WLgH8qOpZf/f4j4K1FxxqMEJn+V9gz\n", 423 | "k70SWKCqk4Hb/M9V4lJclUUIfoSrwT080HhlELJGv0VlKzXarJ0i8zs7UeVZXL+e00KMVxIm+v3z\n", 424 | "P4DFqsGSpOgWT2HRV9U7gWf6PHwhcL3/9/VUaGWqCFOACThbpjC+BvcHuB78VSGG6FfZ3nkTsAPX\n", 425 | "ZycUVfP1Q67baKfqon8p8I8Bx7sZuCBmC5dYnv5IVW1ZI1txzbuqwgeAfw7cBrhqFk+MC7zKon8R\n", 426 | "8M3AcxxV8/VjJALgbMRKir7vpjkDmB9w2NW4XbZOCDjmbkQvJVRVFZF+LxYRubrtx4WqujB2PIPh\n", 427 | "a6cvxm1wEJJbgI+KIBXZXCXGrfxGXF/9N4SsAImNXyzzHsLfct8FnCLCAaq8GHjsGJi9syfvB75W\n", 428 | "pMKvL6qoyM7SzVUAIjKHgJoUS/S3isgoVd0iIqMZoLZXVa+OdPxeeRuwTpUHQw6qyjoRXgSmQ2+L\n", 429 | "N0om+AWuyssiPIPbKWhzyLEjcxquxfSKkIOq8rwIDwBvxvVUz5a2vRVCT+5DRUXft0L+APD2CMPf\n", 430 | "Avw6vu7fJ8MLdx1bPl5k8Fj2znzgEv/vS4DvRjpOaEJO4Pblh8CZkcYOhj+Zx1Bw85QBqKLFMxd3\n", 431 | "EcagKr7+SOC5QHsr9GUbsH8FV2vPBbaqBp3naXEbcGasDWZClGx+HbgbOF5ENorIB4BrgPNEZA3u\n", 432 | "w7mm6HFiI8JI4Gzg3yId4l7g9Ehjh2QksE2VlyOMXUXRPwu4M9LYd1AN0Y9l7bQv0BoTY/yInAf8\n", 433 | "R4yBfXXXQxCn62Zhe0dV3zfAU+cWHbtk3oqrzY+1h+m9lLwBco9Eu8CpWK2+v+s5AzfPE4N7gBki\n", 434 | "HKTKzyIdIwSxJnFbtCyeNRGPEZqzgKsijv8T4GTgx6EHthW5u4iZ0YHbMP0oEQ6LeIwQxCrNg+rV\n", 435 | "6p8IbO62VW6neLtkKa4kNGdiJgJQMV/f9yGaASyKeJglONEPjon+Lt6Cq6iIgm/SdR/59+GJnelX\n", 436 | "SfTPIuI54VkMzI58jKLETASgYqKPu4aXRa66MtGPic++j8ZlXTGpgq9vor+LtxD37g9cIpC76Fum\n", 437 | "vzuxXQFwCwGnx+jQa6LvOBNYFHhBVn/cg/OIcyamf1sZT9+viCwj07+Patg7ZXj6VSGqKwCgynO4\n", 438 | "0ubjQ49tou+I/kf0LAJOK2N3nALEzOqeAvYT4aBI44fkGECBhyMfZy1wmAhHRD5OEcrI9Cux14LP\n", 439 | "vM/A9dSKTRSLJ2fxKZMybtfwW+w9TYRv74BE8299ed6jVOMCPwu4M/YKar86+X4y3VTF188fCHEm\n", 440 | "sz1VyvRnAJv8ZjixMdGPgW+NehJxZ+LbydbX9xn4frgvplhUxeIp6+4P8rZ4Yuyt0JcngYNjLUYK\n", 441 | "TCkJomcJEbZPbLzo42bil6vyQknHy1b0cRn4o5Ev8KpM5pZ5cedcwRPb2mnd7WymGgu0ykwGluA2\n", 442 | "VQnacdNEv9w/IuQt+rEn7KACoi/CkbgeQctLOmTOFTxlnBNQAYunbXK/lGTAb+L0Iq7VezBM9MvN\n", 443 | "6MCVYk3MdDIzelZHNRZonQncXWQD9C7ZgJvgHl3S8bqhjHMCqtFieSLwGuV8CbYI7us3WvTbltmX\n", 444 | "MRMP7NxUJddVmLEX4UA1PP0ySjV34u20XLP9GFtn9kf2mT4lTe73wUQ/MDOIuMx+EO4lz3r9MrK6\n", 445 | "7O0d3N/m7pKPmavoj8NEv0XZVjCY6AcnxR8R3AUeZYl1QcoQ/U24HkR7RT5OT/jNyk/CTa6WSa4V\n", 446 | "PGOAx0o4ThVE/82UnwyY6AfmzZRo7bTxUyK1TS1I9Ek7v8vQU5Clfw1O8NeUWM3VYjEwO+beqN3i\n", 447 | "YzHRB0Q4FBdf2ZsgbQAOEOGNoQZsuuifgWuNUDZrcFsHZrNxhM+8j6KcC3wj+fr6p+Pst7LZDLxO\n", 448 | "XgvXDvb/f66EY2Ut+rjS7vtLaNWyG37+YCkBs/3Gir6vlDgYtwy+VPyJswq3fWIujAaeDrnf5yBs\n", 449 | "JN+a7CSi3zaZm5PFMwZ4rKSJy63A4SLsU8KxeiFVMgBwM4RLEBsr+ri9Txcl3KQ7N4unrNI8yDur\n", 450 | "O4N0F/f9RFiBWYBY22bugS+P3YK728yR00njCqDKZ1S5IdR4TRb9ZH9Ej4l+ZogwChhBgrs/z2ry\n", 451 | "6ss0lnLsvhYbycveAnZuDH8a5bVqiUrTRT9VRgd5in5Zi06yFH3S3/3lJvplTeK2yFL0geOA7aps\n", 452 | "SR1ICBop+r496ilE2H+yC36K2x81l2qNshbhQL6inzoRWAtMyqic1UTfkfq8CEojRR+39+lGv+t8\n", 453 | "EvyCsJfI5yQfS0n+LSb6/eLLRJ8kn8omE32HiX4NyOWPmJPFU+YFvhkYlVFG27r7m03auz/Iy+Ix\n", 454 | "0XfkohdBMNFPSyNF3/cf2gaMLON4HTINtznGM4njeBA4IXEMLRov+n4tzWTi759dGk0W/ZSVOy2y\n", 455 | "EH0R9gaOgFInqnKzeHJJBB4kg0zfnxOH4+rnyyI70cfd/f20pPUrpdA40RfhcNxCpJWpYyET0cf1\n", 456 | "jn+y5NWGJvr9k4u9Mxp4ouRz4kngIL+bXS7kcl4Eo3GijyvLW1xir/TBWA1MyOAkL/s2Hkz0ByIX\n", 457 | "e6f0c8KXyj5GXtl+LudFMJoo+tn8Eb23vRaYmjiUFKKfzaYZIhyMK1ldkToW3N/hIB9TSlKcE5CR\n", 458 | "xePLqbPRi1CY6KcnB4snVaafxcUNzASWld1Mqz98truG9BZPKtF/lHzOi7GAUN5K9VKIJvoiMk9E\n", 459 | "VovIWhH5o1jH6Qb/zZ1DWV47TRb9LDJ9XAfDn6QOoo0cLJ7GZ/r486LknbKiE0X0RWQv4PPAPJx1\n", 460 | "8T4RmRLjWF0yEvi533A4F0z00zMLt1lFLuRQwVNas7U+5CT6uZ0XQYiV6Z8KrFPVDaq6A/gG8I5I\n", 461 | "x+qGqbiWxjnRVNF/DLeDVg4W48nkdXHnUMFjmX5+50UQYl1wY9i9j8sm8uifPoU8SjXb2QIME+HI\n", 462 | "hDGkqNR4Gbc5R8rfGxH2wzXUWp4yjj7kYO+U3WGzhYl+ZIZFGrcjD0xErm77caGqLowSzS6mkFmm\n", 463 | "r4qKsBIXW9kbtJe9JV5fWhZPSrttOrDWfwnlwhp847UUpcWJz4ksRN+v5xkBPJw+FpkDzAk1XizR\n", 464 | "71trO45+/EFVvTrS8QdiKnBjycfshFW42H6Y4NgjgNdU+VmCY7dE//4Ex26RXTanygsiPIkrI00h\n", 465 | "OocCr6ryfIJjPwvsJcLBqqVs0zgQJwNLE7bZ3olPhhe2fhaRjxcZL5a9cx9wnIhMEJF9gIuA+ZGO\n", 466 | "1Q052jvAzkw/Balu4yGPydzsRN+T0uJJleW3to3MIdvP9bwoTBTRV9XXgN8BbsEJ2jdVNamtIsIh\n", 467 | "wHDSVCQMRSvTT0GyCxwT/cFIWcGT8pwAE/2oxLJ3UNWbgJtijd8DU4DVmdbcriJdpp9a9M9NdGx8\n", 468 | "a+cTybOD4mpc588U5CD64xMeH1y55jWJY4hCDuVyZZFjuWaLR4FDEi29T3mBp27FcDywRZXtCWMY\n", 469 | "iEbaO56kmb4Iw3FfOrnqRSGaJPq5+vmtpfcPkibbT53ppxT9nG/hV9Nc0U/dimEGsEKVHQljiEbT\n", 470 | "RD/nb+5UFk/KC/wxYGzCfYJzFv1NwHARDk1w7NSin9rTz/m8KIyJfj6sJM1kbspKjRdw+wQfluL4\n", 471 | "ZHxx+7mnJiYCYKIflUaIvggH4DaFeCh1LIPQ1As8icXj7y5yv7ibek5sxO4Ao9EI0cdN2K3LoXXu\n", 472 | "IJReqy/CPriFOE+Uedw+pPL1xwOvqJa6RWS3lC76IuwLHELCc8LfAb6M266xVPw2kVNwPbFqSVNE\n", 473 | "P3drB2A9MKbkXbSOwlWvpNxFLFVf/Znkn82lsPzGAI9nsLNcKotnKrBBlRcTHLsUmiT6WVbutPB3\n", 474 | "IQ8Bk0s8bOrbeEgn+pNxFTI5k8LeGc/uzRJTkUr0TyH/ZKAQTRH9nGv02yk7s8tB9DcAExIcdyLu\n", 475 | "7ipnHgZGiXBgicccRx47RaVaoPULwF0JjlsaTRH9Ktg7UH5ml4PorweOTXDcScC6BMftGH/3t5Zy\n", 476 | "2zGMI49M/xFKFn0/cXwOcHuZxy2b2ou+n5g5BteuNneaKPoPYaI/GGWfEzmJ/tElH/NYYG+qoRU9\n", 477 | "U3vRx93Gb8qsX/pANNHe2QIc5Je+l4KvUBmNE5bcKbsZXy6iv4Hybb9zgNsz7c8VjCaI/nQyn8Rt\n", 478 | "Yw1wrL87KYPkou8vsIdxd2NlMQHYmHkJb4uyS3lzEf0Umf5c4I6Sj1k6TRD9GcADqYPoBFVewonw\n", 479 | "xJIOmVz0PWVbPFWxdqC59s4WXBPCUkqYm+LnQ3NEv0oLLUpptOU3JD8KE/3cWQMc4xfSRcVbbPsD\n", 480 | "T8U+1lD4JoRlVvAcj1usl3x7xNg0QfRPoiKZvmcNbqPu2BwJPJ/JIpSyRb8K5ZoAqPIKroRyUgmH\n", 481 | "G4ezvXLxtB+hPF+/EdYO1Fz0RRiBE7ece+70ZS3lLNAaTz4TmQ9RnqUF1cr0oTyLJxdrp8UGyvP1\n", 482 | "G2HtQM1FHzeJuyKDJeXdUFamP548FuGA2TtDUVYFT26iX0qm763Oc7BMvxacRLX8fHCZfhmifzT5\n", 483 | "iP7DwAR/8UVFhGG4L7wqebdlVfDkJvobKCfTnw5sU81y/+zg1F30K1O508Ym4NAS6tazyfT9vMI2\n", 484 | "3MRybMYBT1Rk3UaLpto7ZZVtNsbPh2aIfqUyfV+1sJ74E3c5efpQnsVTNWsHXEXX8X4j95jkJvob\n", 485 | "KGcidw4m+tXHWwUnAstSx9IDZVg82WT6HhP9AVDlZ7gyygmRD5VLs7UWm4EjSyhXPRn4ceRjZENt\n", 486 | "RR+3wnObKs+kDqQHyqjgycnTh/JEfyIVE33PCiJO5vrFSVll+n7F9GYitlgW4WDcZi0bYh0jN+os\n", 487 | "+pWzdtqIWsHjt488CHgy1jF6oMxMvxI1+n1YgZtwjMWhwOuqPBfxGL0Q29efBqzytmojMNHPk9j2\n", 488 | "TmsRTk4nutk7g7McJ1CxyCrLb2MDcW2tabjPtjEkFf3IXl0VyzVbrCGuvZPbJC6UIPp+nudYqpnp\n", 489 | "Lydupp+r6MfO9Kfj7qIaQ+pMP+Yfs4rlmi22AvuJcGik8XObxAXXYOvgyKWqo4Htqjwf8RixWIWr\n", 490 | "4BkWafycRX9CxPGnY5l+qUTJ7LxwjKaat/GtdsMxLZ7cJnFbpaqxWyxX1c9HlRdwk5qx2lXkKvob\n", 491 | "iO/pm+h3goi8W0RWiMjrIjKrz3MfEZG1IrJaRM4fZJhYt/Mn4iZnqtAvfSBiTubmmOlDfIunqpU7\n", 492 | "LWJaPLmVa7aIZu+IcASuq2gOnWZLo0imvwx4F/DD9gdFZCpwEa68bB5wrYgMdJxYF3iVrZ0WMTP9\n", 493 | "pop+VSdxW8Ss4Mk1098IHBXJ1pqG682VS1fRUuhZ9FV1tar2t5fkO4Cvq+oOVd2Au8hOHWCYWBd4\n", 494 | "lSdxW8SczM1xIhfii/4JVFv0Y1bwjCdD0VflVVxpcYwWHdNo2CQuxPH0j4LdGhdtwu3Q1B+x/MlT\n", 495 | "qf4KuyiZvq9gGQtZNpeKJvq+hcHZwF0xxi+JKPaOPyfGkOc5AfHKNhs3iQsMfsskIguAUf08dZWq\n", 496 | "3tjFcQa4ffrjKSJ/drX/YaGqLuxizH7xC4+mAEuKjpWYtcBxIkjg28+RuAqWlwKOGYqYffVnA49X\n", 497 | "vJPig7g9lPf1m6uE4o3Ac5meExDP158OfDvCuEERkTm4/kBBGFT0VfW8HsZ8jN2XTY9lwImST70I\n", 498 | "n/q8atDt2U4Bllesi+IeqPK0CK/jNoF5IuDQufr54CprjhZhb1V2BB77AuDmwGOWiiqviPAwzvYL\n", 499 | "2VMqVz+/xQYCZ/q+7UQl7B2fDC9s/SwiHy8yXih7R9r+PR94r4jsIyLH4CyKgayW9YS/nT8duDfw\n", 500 | "mKmIYfFkK/r+i3oTcbL9ecAtEcYtmxgWT+6iHyPTHwX8nLAJVSUoUrL5LhHZiBPZ74nITQCquhL4\n", 501 | "Fm7jh5uAy1R1IHsihodbN9EPPZmb6yRui+C7RPlFbicCd4YcNxErCD+Zeyx5byoTY4HWdJwj0KjK\n", 502 | "HShWvfPvqjpOVfdX1VGq+ra25z6tqpNU9QRVHSy7Cir6/pbtDOoj+jFq9bPN9D0xNgx5K3Bn1S0/\n", 503 | "T4xM/zjcuZYr6wh/HVTC2olB6hW5oTP9scBe1KdN6irCX+DZrcbtQ4ytAeti7UA80V8beMyQPAwc\n", 504 | "4dsgh6KRlTuQh+iH9G9PB+6t0S3bfbiJ6ZBUIdMPZu/4u78LqI/orwPG+Cq1UEwm40zft+gIbftZ\n", 505 | "pp+I0Jl+nfx8cF7mviJBF6bk7um3tgYMdW5OAV7HlTtWHt9aZA2B7oZEOBC3iUjOE7kQcGFalSp3\n", 506 | "YpBa9DcCowK2WK6V6Ps7lsW4GvPC+Av8AAhaIhsUv4nHNtyXUwjmAbfU6O4Pwlo8k4CHMttboT9C\n", 507 | "tqA4GviZKtsCjVcpkoq+r8XeRIByLP/FMRNnidSJ+4A3BRqrtXlK7gIY8la+TtZOi+W4aqQQ5D6J\n", 508 | "2yLkF93JwNJAY1WO1Jk+hLN4TgLW+U2k68R9BMr0cWVvOfv5LYJU8IiwL/Bm4LbCEeXFA7gEJwS5\n", 509 | "T+K2CFmqejLVX7HfM3US/VpZO20sBmZ7H7Iox1MNb3slYTL9GcB6VbYHGCsnlgAnBzonsp7EbWMj\n", 510 | "MFyEwwOMZaKfmFAVPLUUfVU2AzsIsyJxKi6Lzp1Qtfpvon52H6o8jjsnxg312g6oRKbvLclQk7kn\n", 511 | "Az8JME4NAZ4rAAAOAUlEQVQlyUX0LdMfnFCTuVOokOgHyGRnU0PR9yzBiVdRJlMB0fcUtnhEOBI4\n", 512 | "kPqs5emaWoi+CG/ElZ1VwbrohVCTuVNw1knWqPIk8Br9d3jthjfhvjDrSGHRF2EErprr8SARxSfE\n", 513 | "ZO7JwNIKFDNEIxvRL5jVnQYsqkDZWa8Unsz1Gc4w3KbrVaCQxePLUydS31WXITL944C1FRLAEGWb\n", 514 | "s2iwnw8ZiL4qz+AWzxSZoKmztQN+ZW7BBUtTcPsGV+UCL+rrz8RthRey73xOhBD9qkzitlgOTCuY\n", 515 | "IDZ6EhcyEH1P0RbLdWqytgfe7ngWt5CmVyph7bRRtIKnztYOuDvkEQWrWSoxidtG6y51ZIExTPRT\n", 516 | "B+BZS49Znd8GbzawKGhE+VHU4qlK5U6Lopl+nSdxW/1oHqBYtl+lSdxWBU/PFo8IB+G2hVwdMq6q\n", 517 | "kYvo30/vjcWmAZsbsKR6McUmc6tSudOi6Krcumf6UNziqcpq3HaKlG2ehOuh/1rAeCpHLqJfRNDq\n", 518 | "7ue3CJHpV8ne2QQc4DdA6QpflTKGan3J9ULPou998arZO1BsMrfx1g7kI/pLgBki7N3De5si+vfj\n", 519 | "VmHu1e0bfR/yQ6lGCwZg5638SnrrMTMLeKABGd0Sem/HcASgwNPhwimFImWbJvpkIvq+s+Kj9HY7\n", 520 | "X+tJ3BaqPAtspjef+wTgwQqWtN4FnN3D+5pg7YD7UpzQY2/9qpVrtlhB7xU8jS/XhExE39O1xeNv\n", 521 | "/cdS31rsvvRq8VTN2mlxO3BOD++r9SRuC9+ldhWux1C3VK1cEwBVngaep8u2JL753vHAshhxVYmc\n", 522 | "RL8XQTsVuK8Bt/Etem3HULVJ3BZ3Am8SYb8u39cI0ff06utX0c9vcQ/wli7fMw3XhfelCPFUiqqL\n", 523 | "flP8/Ba9tmOopOj7NtnLcRZeR4hwBG6hX+Wy2B5poujfAczt8j3m53tyEv2lwFR/G9YpTRP9JcD0\n", 524 | "HnYaq6q9A+4C78biOQX4SQXnL3qlV9GfSXWtjl5svznAj8KHUj2yEX1VXsRlHh35k74lwWnUf1HW\n", 525 | "TlR5HniYLuqURdgfN++xPlZckek2qzsXZws1hSXACb5MtSNEOAQYTQXv/jyrgP1FOKaTF3utqOMO\n", 526 | "aj2Rjeh7urF4JgPbVdkSMZ4c6dbimYzbA3VHpHhi8yNgpm+gNii+ouMdwH9EjyoTvEd9N919Mc7C\n", 527 | "dZp8PU5UcfEVR90kAzOBbarNbafcTm6i300Fzy/hbvOaRrdzH1XrubMb/g7wJ3Q2cXc8rlVw0zbI\n", 528 | "uBmXyXZKHTaX6cbisSy/jdxEvyNB8xndpcA/xQ4oQ7qt4KnkJG4fOr3A3wHMr2DteVFuAeZ1Ubs+\n", 529 | "m+qvY7gdmNvh7zwPE/2d5Cb6y4BJHSw2ORXYB7d4p2n8FOfhdlrGOJPqr2PodDK3UdZOG6tw1/Lx\n", 530 | "Hb6+DiWtD+E22hn0d/ar0WcBPygjqCqQlej73ucrGLoa4VLgugZmdC0P90Fc86hB8S0bzgJ+GDuu\n", 531 | "yNyLq+wacLJShJG4KqWFZQWVC/46uIUOLB6/mc6hwLrYccXE/86d3AGeA9yrygvxo6oGPYu+iPw/\n", 532 | "EVklIg+IyA0iMqLtuY+IyFoRWS0i53c59KAWj78LeDfwz71FXgs6tXhmAlv8RtqVxScDi3BfYAPx\n", 533 | "duDWGm+aMhQ342yMoTgFuL8mJa2dTOaatdOHIpn+rcA0VT0JtxDmIwAiMhW4CJd1zQOuFZFujrMI\n", 534 | "+JVB6vV/BbhHlcd6jrz6dFrBcw7uwqgDt+Mm7weiqdZOi9uAt/gS3cGog7XT4g5gzkA7ynm//wLc\n", 535 | "F6Lh6Vn0VXWBqrayhUW4WnBwF9/XVXWHqm7A3Uae2sXQXwOeAm4YwLe+FLiut6hrQ6eZ/lzqU+F0\n", 536 | "HfAeEcb0fcLf/c0Bvl92ULngG/I9wOB3Q1CjZnSqPIrbUW6grpuTcHN/K0oLqgKE8vQvZdcFdxSu\n", 537 | "F3qLTbDnhToQqryKu1N4HpjfPqkrwkTcwqQbiwZccVYAx4gwfKAX+DbVZ1KTCSy/HuM64Kp+nj4P\n", 538 | "WOz3W24ynVg8dcr0wWX7bxvguXk4y69xc3+DMajoi8gCEVnWz3+/3PaajwKvqurXBhmqqw/dLyT6\n", 539 | "VeAJ4HYRPifC54AvA//qvxgai//9lzP4bmOzgYdVeaqcqErhs8B7RXZ1WPS38O8D5ieLKh8GncwV\n", 540 | "4ShgX+CR0iKKzxeA3/cT1H15O+bn78GwwZ5U1fMGe15E3g/8IvDWtocfA8a1/TzWP9bf+69u+3Gh\n", 541 | "qi7cdWxeE+ES4GLYWbWxHmf/GPBt4HcYOJOvk58PuA3iRfgS8MfAr3vB/yTu9v6ypMHlwf3AG0U4\n", 542 | "WrVfYZ+NuyOqTearygMi/CvwGZzjAIDXjqOB/0wVWyhEZA7Ovgwznmpvf38RmQf8JXC2qj7V9vhU\n", 543 | "nDCfirN1/guYpH0OJCKqqr1shGAAvi3BOuBtqizt5/kFwN+q1ssKE+EwXOHAacBvAOcD56nyZNLA\n", 544 | "MsF/KT6uyp/289wnAFHlY+VHFg9fi78SeK8qd4kwAzexPUe1fn5+Ue0s4un/f2A4sEBElojItQCq\n", 545 | "uhL4Fu6PcBNwWV/BN4rj644/A/1e3PviOpBWvT5/D1TZBnwe97vNBeaa4O/G3wK/NUARRB1W4u6B\n", 546 | "33nv94AvinA48B3gijoKfgh6zvQLH9gy/cL4C3sd8C7VXRezCL8A/IVqV1VTlcEv0voU8DFftWK0\n", 547 | "IcLNwDdUd7Up8VbYE8BJqmxOFVss/O93M65U/EbV+tp9KTN9IzGqvAx8GvhEn6fmUjM/vx1Vtqvy\n", 548 | "uyb4A/LXwBV9+tL8GrC1joIPO1foXoazdT6cOJysMdGvPv+Ia1Fwlgh7+1LNOtXnG91zK64+fQ6A\n", 549 | "CCcCfwW8N2FM0VFlvSrvb/Cq7I4YtHrHyB9VXhHhKtyEeetLfDu2S1BjUUV9ifMVItyP87h/T7Xy\n", 550 | "jfeMAJinbxg1xC9qfAS3nuNBVX4zcUhGIMzTNwxjD/zmM1/CVdhdkTgcIyMs0zeMmuJbaw8zj7te\n", 551 | "FNVO8/QNo6b4PXAruQ+uEQ+zdwzDMBqEib5hGEaDMNE3DMNoECb6hmEYDcJE3zAMo0GY6BuGYTQI\n", 552 | "E33DMIwGYaJvGIbRIEz0DcMwGoSJvmEYRoMw0TcMw2gQJvqGYRgNwkTfMAyjQZjoG4ZhNAgTfcMw\n", 553 | "jAZhom8YhtEgTPQNwzAahIm+YRhGgzDRNwzDaBAm+oZhGA3CRN8wDKNB9Cz6IvJJEXlARJaKyG0i\n", 554 | "Mq7tuY+IyFoRWS0i54cJ1TAMwyhKkUz/s6p6kqrOBL4LfBxARKYCFwFTgXnAtSJidxSDICJzUseQ\n", 555 | "C/ZZ7MI+i13YZxGOnsVYVX/W9uNw4Cn/73cAX1fVHaq6AVgHnNpzhM1gTuoAMmJO6gAyYk7qADJi\n", 556 | "TuoA6sKwIm8WkT8DLgZeYpewHwXc2/ayTcCYIscxDMMwwjBopi8iC0RkWT///TKAqn5UVccDXwH+\n", 557 | "ZpChNGDMhmEYRo+IanE9FpHxwPdVdbqIXAmgqtf4524GPq6qi/q8x74IDMMwekBVpdf39mzviMhx\n", 558 | "qrrW//gOYIn/93zgayLyVzhb5zjgx33fXyRowzAMozeKePp/LiLHA68D64HfAlDVlSLyLWAl8Bpw\n", 559 | "mYa4nTAMwzAKE8TeMQzDMKpBkvp5EZnnF26tFZE/ShFDKkRknIjcISIrRGS5iHzIP36YnzhfIyK3\n", 560 | "isghqWMtCxHZS0SWiMiN/udGfhYicoiIfFtEVonIShE5rcGfxUf8NbJMRL4mIvs25bMQketEZKuI\n", 561 | "LGt7bMDfvdvFsKWLvojsBXwet3BrKvA+EZlSdhwJ2QF8WFWnAacDv+1//yuBBao6GbjN/9wULsfZ\n", 562 | "ga3bzqZ+Fp/DFURMAWYAq2ngZyEiE4BfB2ap6onAXsB7ac5n8RWcPrbT7+/ey2LYFJn+qcA6Vd2g\n", 563 | "qjuAb+AmghuBqm5R1aX+388Dq3AT3hcC1/uXXQ+8M02E5SIiY4FfBP4BaE3uN+6zEJERwFmqeh2A\n", 564 | "qr6mqttp4GcBPIdLjg4QkWHAAcBmGvJZqOqdwDN9Hh7od+96MWwK0R8DbGz7ubGLt3xGczKwCBip\n", 565 | "qlv9U1uBkYnCKpu/Bv4Q+HnbY038LI4BnhSRr4jIT0TkyyJyIA38LFR1G/CXwKM4sX9WVRfQwM+i\n", 566 | "jYF+96NwGtpiSD1NIfo2cwyIyHDgO8DlfVpa4Kudav85icjbgSdUdQm7svzdaMpngaukmwVcq6qz\n", 567 | "gBfoY1805bMQkYnAFcAEnKgNF5Ffa39NUz6L/ujgdx/0c0kh+o8B49p+Hsfu31S1R0T2xgn+V1X1\n", 568 | "u/7hrSIyyj8/GngiVXwl8mbgQhF5GPg6MFdEvkozP4tNwCZVXex//jbuS2BLAz+L2cDdqvq0qr4G\n", 569 | "3ACcQTM/ixYDXRN99XSsf2xAUoj+fcBxIjJBRPbBTULMTxBHEkREgH8EVqpqe+uK+cAl/t+X4DqX\n", 570 | "1hpVvUpVx6nqMbiJuttV9WKa+VlsATaKyGT/0LnACuBGGvZZ4CawTxeR/f31ci5uor+Jn0WLga6J\n", 571 | "+cB7RWQfETmGARbD7oaqlv4f8DbgQdykw0dSxJDqP+AtOP96KW4V8xLcrPthwH8Ba4BbgUNSx1ry\n", 572 | "53I2MN//u5GfBXASsBh4AJfdjmjwZ/F/cV96y3ATl3s35bPA3fVuBl7FzX9+YLDfHbjKa+lq4IKh\n", 573 | "xrfFWYZhGA3CNjcxDMNoECb6hmEYDcJE3zAMo0GY6BuGYTQIE33DMIwGYaJvGIbRIEz0DcMwGoSJ\n", 574 | "vmEYRoP4b0LdibOTbe+wAAAAAElFTkSuQmCC\n" 575 | ], 576 | "text/plain": [ 577 | "" 578 | ] 579 | }, 580 | "metadata": {}, 581 | "output_type": "display_data" 582 | } 583 | ], 584 | "source": [ 585 | "%pylab inline\n", 586 | "\n", 587 | "plot(pos)" 588 | ] 589 | }, 590 | { 591 | "cell_type": "markdown", 592 | "metadata": {}, 593 | "source": [ 594 | "## Pareil en V-REP" 595 | ] 596 | }, 597 | { 598 | "cell_type": "markdown", 599 | "metadata": {}, 600 | "source": [ 601 | "http://localhost:8888/notebooks/Desktop/TTFX-VREP.ipynb" 602 | ] 603 | }, 604 | { 605 | "cell_type": "markdown", 606 | "metadata": {}, 607 | "source": [ 608 | "## Utilisation de SNAP" 609 | ] 610 | }, 611 | { 612 | "cell_type": "markdown", 613 | "metadata": {}, 614 | "source": [ 615 | "Via un serveur web et accès à travers une REST API." 616 | ] 617 | }, 618 | { 619 | "cell_type": "code", 620 | "execution_count": 1, 621 | "metadata": { 622 | "collapsed": false 623 | }, 624 | "outputs": [], 625 | "source": [ 626 | "from pypot.creatures import PoppyHumanoid\n", 627 | "\n", 628 | "poppy = PoppyHumanoid(simulator='vrep')" 629 | ] 630 | }, 631 | { 632 | "cell_type": "code", 633 | "execution_count": null, 634 | "metadata": { 635 | "collapsed": false 636 | }, 637 | "outputs": [], 638 | "source": [ 639 | "from pypot.server.snap import SnapRobotServer\n", 640 | "\n", 641 | "snap_server = SnapRobotServer(poppy, '0.0.0.0', 8080)\n", 642 | "snap_server.run()" 643 | ] 644 | }, 645 | { 646 | "cell_type": "markdown", 647 | "metadata": {}, 648 | "source": [ 649 | "http://snap.berkeley.edu/snapsource/snap.html#open:http://poppy-humanoid.local:8080/snap-blocks.xml" 650 | ] 651 | }, 652 | { 653 | "cell_type": "markdown", 654 | "metadata": {}, 655 | "source": [ 656 | "## Apprentissage autonome: [Explauto](https://github.com/flowersteam/explauto)" 657 | ] 658 | }, 659 | { 660 | "cell_type": "code", 661 | "execution_count": 1, 662 | "metadata": { 663 | "collapsed": false 664 | }, 665 | "outputs": [ 666 | { 667 | "data": { 668 | "text/html": [ 669 | "\n", 670 | " \n", 677 | " " 678 | ], 679 | "text/plain": [ 680 | "" 681 | ] 682 | }, 683 | "execution_count": 1, 684 | "metadata": {}, 685 | "output_type": "execute_result" 686 | } 687 | ], 688 | "source": [ 689 | "from IPython.display import VimeoVideo\n", 690 | "\n", 691 | "VimeoVideo(95405850)" 692 | ] 693 | }, 694 | { 695 | "cell_type": "code", 696 | "execution_count": null, 697 | "metadata": { 698 | "collapsed": false 699 | }, 700 | "outputs": [], 701 | "source": [] 702 | } 703 | ], 704 | "metadata": { 705 | "kernelspec": { 706 | "display_name": "Python 2", 707 | "language": "python", 708 | "name": "python2" 709 | }, 710 | "language_info": { 711 | "codemirror_mode": { 712 | "name": "ipython", 713 | "version": 2 714 | }, 715 | "file_extension": ".py", 716 | "mimetype": "text/x-python", 717 | "name": "python", 718 | "nbconvert_exporter": "python", 719 | "pygments_lexer": "ipython2", 720 | "version": "2.7.9" 721 | } 722 | }, 723 | "nbformat": 4, 724 | "nbformat_minor": 0 725 | } 726 | -------------------------------------------------------------------------------- /software/samples/notebooks/image/poppy_humanoid.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/samples/notebooks/image/poppy_humanoid.jpg -------------------------------------------------------------------------------- /software/samples/notebooks/image/poppy_humanoid_motors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/samples/notebooks/image/poppy_humanoid_motors.png -------------------------------------------------------------------------------- /software/samples/notebooks/image/vrep-finding-names.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/samples/notebooks/image/vrep-finding-names.png -------------------------------------------------------------------------------- /software/samples/notebooks/image/vrep-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/samples/notebooks/image/vrep-header.png -------------------------------------------------------------------------------- /software/samples/notebooks/image/vrep-poppy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/samples/notebooks/image/vrep-poppy.png -------------------------------------------------------------------------------- /software/samples/notebooks/image/vrep-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poppy-project/poppy-humanoid/d66c8fbd6aa3ebbf9e38399cc56aae3c155ee991/software/samples/notebooks/image/vrep-screenshot.png -------------------------------------------------------------------------------- /software/setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import re 4 | import sys 5 | 6 | from setuptools import setup, find_packages 7 | 8 | 9 | def version(): 10 | with open('poppy_humanoid/_version.py') as f: 11 | return re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", f.read()).group(1) 12 | 13 | 14 | setup(name='poppy-humanoid', 15 | version=version(), 16 | packages=find_packages(), 17 | 18 | install_requires=['pypot >= 4.0.0'], 19 | 20 | include_package_data=True, 21 | exclude_package_data={'': ['README', '.gitignore']}, 22 | 23 | zip_safe=False, 24 | 25 | author='Poppy Station', 26 | author_email='dev@poppy-station.org', 27 | description='Poppy Humanoid Software Library', 28 | url='https://poppy-project.org', 29 | license='GNU GENERAL PUBLIC LICENSE Version 3', 30 | 31 | ) 32 | --------------------------------------------------------------------------------