diff --git a/README.md b/README.md deleted file mode 100644 index 9fd2ca7..0000000 --- a/README.md +++ /dev/null @@ -1,147 +0,0 @@ -# PyRoboLearn - -This repository contains the code for the *PyRoboLearn* (PRL) framework: a Python framework for Robot Learning. -This framework revolves mainly around 7 axes: simulators, worlds, robots, interfaces, learning tasks (= environment and policy), learning models, and learning algorithms. - -**Warning**: The development of this framework is ongoing, and thus some substantial changes might occur. Sorry for the inconvenience. - - -## Requirements - -The framework has been tested with Python 2.7 and Ubuntu 16.04 and 18.04. We also tested parts of it with Python 3.5 on Ubuntu 16.04 and so far so good, but there might be some errors that escaped my attention. - - -## Installation - -### Docker -At the moment the docker is a self contained Ubuntu image with all the libraries installed. When launched we have access to a Python3.6 interpreter and we can import pyrobolearn directly. -In the future, ROS may be splitted in another container and linked to this one. - -1. Install Docker and nvidia-docker -```bash -$ sudo apt-get update -$ sudo apt install apt-transport-https ca-certificates curl software-properties-common -$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - -$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable # you should replace bionic by your version -$ sudo apt update -$ sudo apt install docker-ce -$ sudo systemctl status docker # check that docker is active -``` -2. Build the image -```bash -$ docker build -t pyrobolearn . -``` -3. Launch - - -You can now start the python interpreter with every library already installed - -```bash -$ docker run -p 11311:11311 -v $PWD/dev:/pyrobolearn/dev/:rw -ti pyrobolearn python3 -``` - -To open an interactive terminal in the docker image use: - -```bash -$ docker run -p 11311:11311 -v $PWD/dev:/pyrobolearn/dev/:rw -ti pyrobolearn /bin/bash -``` - -4. nvidia-docker -if the GPU is not recognized in the interpreter, you can install nvidia-docker - -```bash -$ curl -sL https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - -$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) -$ curl -sL https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list -$ sudo apt-get update -$ sudo apt-get install nvidia-docker2 -sudo pkill -SIGHUP dockerd -``` - -And use: -```bash -$ nvidia-docker run -p 11311:11311 -v $PWD/dev:/pyrobolearn/dev/:rw -ti pyrobolearn -``` - -### Ubuntu - -1. First download the `pip` Python package manager and create a virtual environment for Python as described in the following link: https://packaging.python.org/guides/installing-using-pip-and-virtualenv/ -On Ubuntu, you can install `pip` and `virtualenv` by typing in the terminal: - -- In Python 2.7: -```bash -sudo apt install python-pip -sudo pip install virtualenv -``` - -- In Python 3.5: -```bash -sudo apt install python3-pip -sudo pip install virtualenv -``` - -You can then create the virtual environment by typing: -```bash -virtualenv -p /usr/bin/python -# activate the virtual environment -source /bin/activate -``` -where `` is the python version you want to use (select between `2.7` or `3.5`), and `` is a name of your choice for the virtual environment. For instance, it can be `py2.7` or `py3.5`. - -To deactivate the virtual environment, just type: -```bash -deactivate -``` - -2. clone this repository and install the requirements by executing the setup.py - -In Python 2.7: -```bash -git clone https://github.com/robotlearn/pyrobolearn -cd pyrobolearn -pip install numpy cython -pip install http://github.com/cornellius-gp/gpytorch/archive/alpha.zip # this is for Python 2.7 -pip install -e . # this will install pyrobolearn as well as the required packages (so no need for: pip install -r requirements.txt) -``` - -In Python 3.5: -```bash -git clone https://github.com/robotlearn/pyrobolearn -cd pyrobolearn -pip install numpy cython -pip install gpytorch # this is for Python 3.5 -pip install -e . # this will install pyrobolearn as well as the required packages (so no need for: pip install -r requirements.txt) -``` - -Depending on your computer configuration and the python version you use, you might need to install also the following packages through `apt-get`: -```bash -sudo apt install python-tk # if python 2.7 -sudo apt install python3-tk # if python 3.5 -``` - -## How to use it? - -Check the `README.md` file in the `examples` folder. - -## Citation - -``` -@misc{delhaisse2019pyrobolearn, - author = {Delhaisse, Brian and Xin, Songyan and Rozo, Leonel, and Caldwell, Darwin}, - title = {PyRoboLearn: A Python Framework for Robot Learning Practitioners}, - howpublished = {\url{https://github.com/robotlearn/pyrobolearn}}, - year=2019, -} -``` - -If you use a specific learning model, algorithm, robot, controller, and so on, please cite the corresponding paper. The reference(s) can usually be found in the class documentation (at the end), and sometimes in the README file in the corresponding folder. - - -## Acknowledgements - -Currently, we mainly use the PyBullet simulator. -- *PyBullet, a Python module for physics simulation for games, robotics and machine learning*, -Erwin Coumans and Yunfei Bai, 2016-2019 -- references for each robot, model, and others can be found in the corresponding class documentation -- Locomotion controllers were provided by Songyan Xin (see `pyrobolearn/controllers/locomotion`). - diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..d97a1a6 --- /dev/null +++ b/README.rst @@ -0,0 +1,174 @@ +PyRoboLearn +=========== + +This repository contains the code for the *PyRoboLearn* (PRL) framework: a Python framework for Robot Learning. +This framework revolves mainly around 7 axes: simulators, worlds, robots, interfaces, learning tasks (= environment and policy), learning models, and learning algorithms. + +**Warning**: The development of this framework is ongoing, and thus some substantial changes might occur. Sorry for the inconvenience. + + +Requirements +------------ + +The framework has been tested with Python 2.7 and Ubuntu 16.04 and 18.04. We also tested parts of it with Python 3.5 on Ubuntu 16.04 and so far so good, but there might be some errors that escaped my attention. + + +Installation +------------ + +Docker +~~~~~~ + +At the moment the docker is a self contained Ubuntu image with all the libraries installed. When launched we have access to a Python3.6 interpreter and we can import pyrobolearn directly. +In the future, ROS may be splitted in another container and linked to this one. + +1. Install Docker and nvidia-docker + +.. code-block:: bash + + sudo apt-get update + sudo apt install apt-transport-https ca-certificates curl software-properties-common + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable # you should replace bionic by your version + sudo apt update + sudo apt install docker-ce + sudo systemctl status docker # check that docker is active + +2. Build the image + +.. code-block:: bash + + docker build -t pyrobolearn . + + +3. Launch + + +You can now start the python interpreter with every library already installed + +.. code-block:: bash + + docker run -p 11311:11311 -v $PWD/dev:/pyrobolearn/dev/:rw -ti pyrobolearn python3 + + +To open an interactive terminal in the docker image use: + +.. code-block:: bash + + docker run -p 11311:11311 -v $PWD/dev:/pyrobolearn/dev/:rw -ti pyrobolearn /bin/bash + + +4. nvidia-docker +if the GPU is not recognized in the interpreter, you can install nvidia-docker + +.. code-block:: bash + + curl -sL https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - + distribution=$(. /etc/os-release;echo $ID$VERSION_ID) + curl -sL https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list + sudo apt-get update + sudo apt-get install nvidia-docker2 + sudo pkill -SIGHUP dockerd + +And use: + +.. code-block:: bash + + nvidia-docker run -p 11311:11311 -v $PWD/dev:/pyrobolearn/dev/:rw -ti pyrobolearn + + +Ubuntu +~~~~~~ + +1. First download the ``pip`` Python package manager and create a virtual environment for Python as described in the following link: https://packaging.python.org/guides/installing-using-pip-and-virtualenv/ +On Ubuntu, you can install ``pip`` and ``virtualenv`` by typing in the terminal: + +- In Python 2.7: + +.. code-block:: bash + + sudo apt install python-pip + sudo pip install virtualenv + +- In Python 3.5: + +.. code-block:: bash + + sudo apt install python3-pip + sudo pip install virtualenv + +You can then create the virtual environment by typing: + +.. code-block:: bash + + virtualenv -p /usr/bin/python + # activate the virtual environment + source /bin/activate + +where ```` is the python version you want to use (select between ``2.7`` or ``3.5``), and ```` is a name of your choice for the virtual environment. For instance, it can be ``py2.7`` or ``py3.5``. + +To deactivate the virtual environment, just type: + +.. code-block:: bash + + deactivate + +2. clone this repository and install the requirements by executing the ``setup.py`` + +In Python 2.7: + +.. code-block:: bash + + git clone https://github.com/robotlearn/pyrobolearn + cd pyrobolearn + pip install numpy cython + pip install http://github.com/cornellius-gp/gpytorch/archive/alpha.zip # this is for Python 2.7 + pip install -e . # this will install pyrobolearn as well as the required packages (so no need for: pip install -r requirements.txt) + +In Python 3.5: + +.. code-block:: bash + + git clone https://github.com/robotlearn/pyrobolearn + cd pyrobolearn + pip install numpy cython + pip install gpytorch # this is for Python 3.5 + pip install -e . # this will install pyrobolearn as well as the required packages (so no need for: pip install -r requirements.txt) + +Depending on your computer configuration and the python version you use, you might need to install also the following packages through ``apt-get``: + +.. code-block:: bash + + sudo apt install python-tk # if python 2.7 + sudo apt install python3-tk # if python 3.5 + + +How to use it? +-------------- + +Check the ``README.rst`` file in the ``examples`` folder. + +Citation +-------- + +.. code-block:: latex + + @misc{delhaisse2019pyrobolearn, + author = {Delhaisse, Brian and Xin, Songyan and Rozo, Leonel, and Caldwell, Darwin}, + title = {PyRoboLearn: A Python Framework for Robot Learning Practitioners}, + howpublished = {\url{https://github.com/robotlearn/pyrobolearn}}, + year=2019, + } + + +If you use a specific learning model, algorithm, robot, controller, and so on, please cite the corresponding paper. The reference(s) can usually be found in the class documentation (at the end), and sometimes in the README file in the corresponding folder. + + +Acknowledgements +---------------- + +Currently, we mainly use the PyBullet simulator. + +- *PyBullet, a Python module for physics simulation for games, robotics and machine learning*, Erwin Coumans and Yunfei Bai, 2016-2019 +- references for each robot, model, and others can be found in the corresponding class documentation +- Locomotion controllers were provided by Songyan Xin (see ``pyrobolearn/controllers/locomotion``) diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..69fe55e --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,19 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/UML/environment.png b/docs/UML/environment.png new file mode 100644 index 0000000..98502f4 Binary files /dev/null and b/docs/UML/environment.png differ diff --git a/docs/UML/pyrobolearn-uml.dia b/docs/UML/pyrobolearn-uml.dia index b516d1b..52ded9a 100644 Binary files a/docs/UML/pyrobolearn-uml.dia and b/docs/UML/pyrobolearn-uml.dia differ diff --git a/docs/UML/pyrobolearn_uml.png b/docs/UML/pyrobolearn_uml.png new file mode 100644 index 0000000..272c3d2 Binary files /dev/null and b/docs/UML/pyrobolearn_uml.png differ diff --git a/docs/UML/robots.png b/docs/UML/robots.png new file mode 100644 index 0000000..ff4cbf6 Binary files /dev/null and b/docs/UML/robots.png differ diff --git a/docs/UML/simulator.png b/docs/UML/simulator.png new file mode 100644 index 0000000..65c5322 Binary files /dev/null and b/docs/UML/simulator.png differ diff --git a/docs/UML/world.png b/docs/UML/world.png new file mode 100644 index 0000000..1b4576c Binary files /dev/null and b/docs/UML/world.png differ diff --git a/docs/figures/baxter.png b/docs/figures/baxter.png new file mode 100644 index 0000000..e23a65d Binary files /dev/null and b/docs/figures/baxter.png differ diff --git a/docs/figures/bb8.png b/docs/figures/bb8.png new file mode 100644 index 0000000..e1abdc7 Binary files /dev/null and b/docs/figures/bb8.png differ diff --git a/docs/figures/cassie.png b/docs/figures/cassie.png new file mode 100644 index 0000000..e6a04fd Binary files /dev/null and b/docs/figures/cassie.png differ diff --git a/docs/figures/centauro.png b/docs/figures/centauro.png new file mode 100644 index 0000000..3f22058 Binary files /dev/null and b/docs/figures/centauro.png differ diff --git a/docs/figures/cogimon.png b/docs/figures/cogimon.png new file mode 100644 index 0000000..f31e785 Binary files /dev/null and b/docs/figures/cogimon.png differ diff --git a/docs/figures/coman.png b/docs/figures/coman.png new file mode 100644 index 0000000..2bebe28 Binary files /dev/null and b/docs/figures/coman.png differ diff --git a/docs/figures/crab.png b/docs/figures/crab.png new file mode 100644 index 0000000..7e98d4d Binary files /dev/null and b/docs/figures/crab.png differ diff --git a/docs/figures/cubli.png b/docs/figures/cubli.png new file mode 100644 index 0000000..56659d4 Binary files /dev/null and b/docs/figures/cubli.png differ diff --git a/docs/figures/environment.png b/docs/figures/environment.png new file mode 100644 index 0000000..fc13fb3 Binary files /dev/null and b/docs/figures/environment.png differ diff --git a/docs/figures/fetch.png b/docs/figures/fetch.png new file mode 100644 index 0000000..d189311 Binary files /dev/null and b/docs/figures/fetch.png differ diff --git a/docs/figures/hyq2max.png b/docs/figures/hyq2max.png new file mode 100644 index 0000000..ea59be3 Binary files /dev/null and b/docs/figures/hyq2max.png differ diff --git a/docs/figures/phantomx.png b/docs/figures/phantomx.png new file mode 100644 index 0000000..83d4664 Binary files /dev/null and b/docs/figures/phantomx.png differ diff --git a/docs/figures/pleurobot.png b/docs/figures/pleurobot.png new file mode 100644 index 0000000..7868f27 Binary files /dev/null and b/docs/figures/pleurobot.png differ diff --git a/docs/figures/pyrobolearn.png b/docs/figures/pyrobolearn.png new file mode 100755 index 0000000..ab7ff34 Binary files /dev/null and b/docs/figures/pyrobolearn.png differ diff --git a/docs/figures/softhand.png b/docs/figures/softhand.png new file mode 100644 index 0000000..6109e04 Binary files /dev/null and b/docs/figures/softhand.png differ diff --git a/docs/figures/walkman.png b/docs/figures/walkman.png new file mode 100644 index 0000000..b24c46c Binary files /dev/null and b/docs/figures/walkman.png differ diff --git a/docs/figures/wam.png b/docs/figures/wam.png new file mode 100644 index 0000000..f6eddf3 Binary files /dev/null and b/docs/figures/wam.png differ diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..543c6b1 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd diff --git a/docs/make_docs.sh b/docs/make_docs.sh new file mode 100755 index 0000000..2b63980 --- /dev/null +++ b/docs/make_docs.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +# . venv/bin/activate + +rm -Rf build +rm -Rf source/docstring + +sphinx-apidoc -f -o source/docstring/ ../pyrobolearn +make html + diff --git a/docs/source/actions.rst b/docs/source/actions.rst new file mode 100644 index 0000000..7f802b9 --- /dev/null +++ b/docs/source/actions.rst @@ -0,0 +1,28 @@ +Actions +======= + +In PRL, every concept is modelized as a class. This is also true for actions which are used by the policies. + +.. figure:: ../figures/environment.png + :alt: environment + :align: center + + The agent-environment interaction + + +Design +------ + + +How to use a particular action? +------------------------------ + +example of actions with robot + + +How to create your own action? +------------------------------ + + +FAQs +---- diff --git a/docs/source/algorithms.rst b/docs/source/algorithms.rst new file mode 100644 index 0000000..629ef83 --- /dev/null +++ b/docs/source/algorithms.rst @@ -0,0 +1,2 @@ +Algorithms +========== diff --git a/docs/source/approximators.rst b/docs/source/approximators.rst new file mode 100644 index 0000000..2747289 --- /dev/null +++ b/docs/source/approximators.rst @@ -0,0 +1,14 @@ +Approximators +============= + +An ``Approximator`` accepts as inputs the ``State``, ``Action``, and learning ``Model``, and connects them. +Approximators are used by other classes in the PRL framework. + + +How to use an approximator? +--------------------------- + + +How to create your own approximator? +------------------------------------ + diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..56d12d6 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,187 @@ +# -*- coding: utf-8 -*- +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +sys.path.insert(0, os.path.abspath('../..')) + + +# -- Project information ----------------------------------------------------- + +project = u'PyRoboLearn' +copyright = u'2019, Brian Delhaisse' +author = u'Brian Delhaisse' + +# The short X.Y version +version = u'' +# The full version, including alpha/beta/rc tags +release = u'0.0.1' + + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.intersphinx', + 'sphinx.ext.coverage', + 'sphinx.ext.mathjax', + 'sphinx.ext.viewcode', + 'sphinx.ext.githubpages', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = None + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' # 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'PyRoboLearndoc' + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'PyRoboLearn.tex', u'PyRoboLearn Documentation', + u'Brian Delhaisse', 'manual'), +] + + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'pyrobolearn', u'PyRoboLearn Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'PyRoboLearn', u'PyRoboLearn Documentation', + author, 'PyRoboLearn', 'One line description of project.', + 'Miscellaneous'), +] + + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + + +# -- Extension configuration ------------------------------------------------- + +# -- Options for intersphinx extension --------------------------------------- + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = {'https://docs.python.org/': None} diff --git a/pyrobolearn/robots/ros/coman/__init__.py b/docs/source/controllers.rst similarity index 100% rename from pyrobolearn/robots/ros/coman/__init__.py rename to docs/source/controllers.rst diff --git a/docs/source/environments.rst b/docs/source/environments.rst new file mode 100644 index 0000000..5459d5c --- /dev/null +++ b/docs/source/environments.rst @@ -0,0 +1,157 @@ +Environments +============ + +The environment is one of the main concept in imitation and reinforcement learning as defined in the following figures (inspired by [1]_): + +.. figure:: ../figures/environment.png + :alt: environment + :align: center + + The agent-environment interaction + + +The environment is notably responsible to perform a step in the world, compute the next state, compute the rewards, and others. + + +Design +------ + +In PRL, the environment is an abstraction layer class that regroups: + +- the world; an instance of ``World`` which will be used to perform a step in the world (simulator). This is called at each step performed by the environment. +- the states: an instance of ``State`` (or a list of them). The states are updated at each time step by the environment. +- the rewards (optional): an instance of ``Reward`` (or a list of them). It is optional because some environments like in imitation learning does not require a reward function. The reward functions are computed at each time step. +- the terminal conditions (optional): an instance of ``TerminalCondition`` (or a list of them) that checks at each time step if the goal of the environment has been achieved. A ``TerminalCondition`` also details if the environment ended with a success or failure. +- the initial state generators (optional): an instance of ``StateGenerator`` (or a list of them) which are called to generate the initial states each time the environment is reset. +- the physics randomizers (optional): an instance of ``PhysicsRandomizer`` (or a list of them) to randomize the physical properties of bodies in the simulator, or the simulator itself, each time the environment is reset. +- the actions (optional): an instance of ``Action`` (or a list of them). The actions are not used nor updated by the environment. This is left to the ``Policy`` or ``Controller``. + + +By favoring `composition over inheritance `_ for the environment class, we improve the flexibility of the framework and the reuse of different modules. This leads ultimately to less code duplication, and ease the process of creating environments. + + +.. figure:: ../UML/environment.png + :alt: UML diagram for Environment + :align: center + + UML diagram for environment + + +How to use an environment? +-------------------------- + +Let's assume that you have an environment where you have a manipulator, and the goal is to reach an object (such as a cube) on a table. + +Here is a short snippet showing the basic usage of an environment: + +.. code-block:: python + :linenos: + + import pyrobolearn as prl + + # define the simulator and world (and load what you want in it) + sim = ... + world = ... + robot = ... + + # define state, action, and reward (and possibly action) + state = ... + action = ... + reward = ... + + # you can give the reward function to your RL environment + # which will use it when calling `env.step()`. + env = prl.envs.Env(world, state, reward) + + # like in OpenAI gym environments, you can reset and step in the environment + obs = env.reset() + for t in count(): + obs, rew, done, info = env.step() + + +Few notes regarding the code above: + +- the ``action`` can also be given to the environment but it won't be called by the environment. This is carried out by the policy(ies)/agent(s). The main reason why you can give an action to an environment is when later you will create your own environment class (that inherits from ``prl.envs.Env``), you will be able to get the states and actions for your policies in the following way: + +.. code-block:: python + :linenos: + + import pyrobolearn as prl + + # define your environment + class MyEnv(prl.envs.Env): + ... + + # create the environment and provide possible arguments + env = MyEnv(args) + + # get states and actions from your environment + states, actions = env.states, env.actions + + # create policy + policy = Policy(states, actions) + +- the observation ``obs`` is a list of arrays that are returned by the environment. This is a bit different from what it is usually returned by gym environments (which is an array). The reason is that the states returned by the environment might have different dimensions (e.g. joint positions = 1D array, camera = 2D/3D array, etc) so you can not return one array. +- You can easily update the state, reward function, world, and other modules that are given to environment. This results in less code duplication and greater flexibility. + +Few more examples can be found in `pyrobolearn/examples/environments `_. + +If you would like other people to use your environment, implement your environment class like described in the section below. + + +How to create my own environment? +--------------------------------- + +Using the same example as the section above REF. + +.. code-block:: python + :linenos: + + class MyEnv(Env): # inherit from the PRL Env class + """Description""" + + # specify what the user is allowed to change in your environment by providing optional inputs + # in this case, let's say he is allowed to change the manipulator: use Franka Panda instead of Kuka + def __init__(self, manipulator=None, ...): + # initialize the world as you would like by loading different objects in it + world = ... + ... + + # make sure the given manipulator is valid + if manipulator is None: + manipulator = world.load_robot('kuka_iiwa', ...) + if not isinstance(manipulator, prl.robots.Manipulator): + raise TypeError("Expecting a manipulator, instead got: {}".format(type(manipulator))) + + # create the states + states = state1(manipulator) + ... + + # create the reward + reward = ... + + # other stuffs + ... + + # call the parent's constructor + super(MyEnv, self).__init__(world, states, rewards, ...) + + +You normally don't have to implement anything else (like the ``step``, ``reset``, and other functions are automatically implemented based on what you provided to the parent's constructor). + + +What are the differences with the OpenAI gym's environments? +------------------------------------------------------------ + +To better depict the differences, let's consider an environment which contains a quadruped robot and the goal is that it learns to walk. Usually, as it can be seen on multiple repositories, people would inherit from the gym ``Env`` class and call it something similar to ``QuadrupedFlatTerrainWalkEnv(Env)``. Inside of ``step`` function, they would compute the next states and rewards. Now suppose, you would like to change ... + +In our framework, the ``world``, ``states``, and ``rewards`` are given to the PRL ``Env`` class. This means that if you would like to change the world, reward function, or states you can do it outside the function. + +- Actions + +Having said that, we tried to make PRL compatible with OpenAI gym at the exception that the returned state is not a array but a list of arrays. + + +References +---------- + +.. [1] "Reinforcement Learning: An Introduction", Sutton and Barto, 1998 diff --git a/docs/source/examples.rst b/docs/source/examples.rst new file mode 100644 index 0000000..0e1d223 --- /dev/null +++ b/docs/source/examples.rst @@ -0,0 +1,2 @@ +.. include:: ../../examples/README.rst + diff --git a/docs/source/faqs.rst b/docs/source/faqs.rst new file mode 100644 index 0000000..644f9f4 --- /dev/null +++ b/docs/source/faqs.rst @@ -0,0 +1,6 @@ +FAQs +==== + +* How to add a completely new component, for instance, a state estimator or navigation (SLAM) module? There are multiple steps: 1. you have to divide your code into submodules that are minimal, do not depend on various pieces of code. 2. Compositonality 3. Flexibility: if I want to change something how easy is it? + + diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..c61d17a --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,55 @@ +.. PyRoboLearn documentation master file, created by + sphinx-quickstart on Thu Jun 20 20:28:11 2019. + You can adapt this file completely to your liking, but it should at least + contain the root toctree directive. + +Welcome to PyRoboLearn's documentation! +======================================= + +.. toctree:: + :maxdepth: 2 + :caption: Introduction + + readme + +.. toctree:: + :maxdepth: 3 + :caption: Installation + + installation + +.. toctree:: + :maxdepth: 4 + :caption: PyRoboLearn + + pyrobolearn + simulators + worlds + robots + interfaces + states + actions + rewards + environments + models + approximators + algorithms + +.. toctree:: + :maxdepth: 2 + :caption: Examples + + examples + +.. toctree:: + :maxdepth: 3 + :caption: Package Reference + + docstring/modules + +.. toctree:: + :maxdepth: 2 + :caption: Index + + indices + diff --git a/docs/source/indices.rst b/docs/source/indices.rst new file mode 100644 index 0000000..0dcc748 --- /dev/null +++ b/docs/source/indices.rst @@ -0,0 +1,6 @@ +Indices and tables +================== +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/docs/source/installation.rst b/docs/source/installation.rst new file mode 100644 index 0000000..99bd765 --- /dev/null +++ b/docs/source/installation.rst @@ -0,0 +1,145 @@ +Installation +============ + +There are 2 ways to install the PyRoboLearn framework. + +1. via :ref:`Docker` +2. using a :ref:`Virtual Environment` + + +.. _Docker: + +Docker +------- + +At the moment the docker is a self contained Ubuntu image with all the libraries installed. When launched we have access to a Python3.6 interpreter and we can import pyrobolearn directly. +In the future, ROS may be splitted in another container and linked to this one. + +1. Install Docker and nvidia-docker + +.. code-block:: bash + + sudo apt-get update + sudo apt install apt-transport-https ca-certificates curl software-properties-common + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable # you should replace bionic by your version + sudo apt update + sudo apt install docker-ce + sudo systemctl status docker # check that docker is active + +2. Build the image + +.. code-block:: bash + + docker build -t pyrobolearn . + +3. You can now start the python interpreter with every library already installed + +.. code-block:: bash + + docker run -p 11311:11311 -v catkin_ws:/pyrobolearn/catkin_ws/ -ti pyrobolearn python3 + + +To open an interactive terminal in the docker image use: + +.. code-block:: bash + + docker run -p 11311:11311 -v catkin_ws:/pyrobolearn/catkin_ws/ -ti pyrobolearn /bin/bash + + +4. If the GPU is not recognized in the interpreter, you can install ``nvidia-docker`` + +.. code-block:: bash + + curl -sL https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - + distribution=$(. /etc/os-release;echo $ID$VERSION_ID) + curl -sL https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list + sudo apt-get update + sudo apt-get install nvidia-docker2 + sudo pkill -SIGHUP dockerd + +And use: + +.. code-block:: bash + + nvidia-docker run -p 11311:11311 -v catkin_ws:/pyrobolearn/catkin_ws/ -ti pyrobolearn + + +.. _Virtual Environment: + +Virtual Environment +------------------- + +0. Prerequisites: install the following packages on your Ubuntu system + +.. code-block:: bash + + sudo apt-get install cmake gfortran + + +1. First download the ``pip`` Python package manager and create a virtual environment for Python as described in the following link: https://packaging.python.org/guides/installing-using-pip-and-virtualenv/ + +On Ubuntu, you can install ``pip`` and ``virtualenv`` by typing in the terminal: + +- In Python 2.7: + +.. code-block:: bash + + sudo apt install python-pip + sudo pip install virtualenv + +- In Python 3.5: + +.. code-block:: bash + + sudo apt install python3-pip + sudo pip install virtualenv + + +You can then create the virtual environment by typing: + +.. code-block:: bash + + virtualenv -p /usr/bin/python + # activate the virtual environment + source /bin/activate + +where ```` is the python version you want to use (select between ``2.7`` or ``3.5``), and ```` is a name of your choice for the virtual environment. For instance, it can be ``py2.7`` or ``py3.5``. + +To deactivate the virtual environment, just type: + +.. code-block:: bash + + deactivate + + +2. clone this repository and install the requirements by executing the ``setup.py`` + +In Python 2.7: + +.. code-block:: bash + + git clone https://github.com/robotlearn/pyrobolearn + cd pyrobolearn + pip install numpy cython + pip install http://github.com/cornellius-gp/gpytorch/archive/alpha.zip # this is for Python 2.7 + pip install -e . # this will install pyrobolearn as well as the required packages (so no need for: pip install -r requirements.txt) + +In Python 3.5: + +.. code-block:: bash + + git clone https://github.com/robotlearn/pyrobolearn + cd pyrobolearn + pip install numpy cython + pip install gpytorch # this is for Python 3.5 + pip install -e . # this will install pyrobolearn as well as the required packages (so no need for: pip install -r requirements.txt) + + +Depending on your computer configuration and the python version you use, you might need to install also the following packages through ``apt-get``: + +.. code-block:: bash + + sudo apt install python-tk # if python 2.7 + sudo apt install python3-tk # if python 3.5 + diff --git a/docs/source/interfaces.rst b/docs/source/interfaces.rst new file mode 100644 index 0000000..6d4d714 --- /dev/null +++ b/docs/source/interfaces.rst @@ -0,0 +1,85 @@ +Interfaces and Bridges +====================== + +**I/O interfaces** allows you to receive/send data from/to different devices. Interfaces are divided into 3 categories, ``InputInterface`` which can only receive data from a particular device and save it in memory, ``OutputInterface`` which can only send data given by PRL to the interface, and ``InputOutputInterface`` which allows you to receive and send data. Interfaces include for instance webcam, speaker, mouse, keyboard, game controller, and so on. + +To avoid a direct coupling with the interface and an element in PRL such as a robot, **bridges** are introduced. Bridges makes the connection between an interface and an element in PRL (like a robot, an object in the world, the world itself, the world camera, etc). For instance, you could have a game controller and when moving one of its joystick forward, you would like for a quadcopter to take off while for a wheeled robot to move forward instead. For both examples, the values returned by the joystick is the same but you would like to have different behaviors depending on the type of robots. It might be even the case that someone would like to map the game controller events in a different way that you did. This is exactly the raison d'ĂȘtre of such bridges; to map an interface with an element in PRL. Different bridges can be implemented for the same interface as the user sees fit. + +Available interfaces in PRL include: + +- camera: webcam, asus_xtion, kinect, openpose +- controllers: mouse+keyboard, spacemouse, playstation, xbox +- speech: recognizer, translator, and synthesizer +- VR: Oculus (through Windows) + +They are available in `pyrobolearn/tools/interfaces/ `_ folder while bridges are available in the `pyrobolearn/tools/bridges/ `_ folder. + + +How to use an interface/bridge in PRL? +-------------------------------------- + +The following snippet show how to use the space mouse interface. + + + + +You can check for more examples in the `examples/interfaces `_ folder. + + + +How to create your own interface/bridge? +---------------------------------------- + +Let's say that you have a new interface, for instance, an EMG sensor that measures the electrical activity of muscles, and you would like based on the sensed values makes a robot behave in a certain way. For instance, you would like the robot to be more stiff (see teleimpedance for more info). + +- In order to create your interface, you will have to inherit one of the following interfaces: ``InputInterface``, ``OutputInterface``, ``InputOutputInterface`` based on the type of device you have. In our case, we have an EMG sensor which provides the sensed values as *inputs* to PRL, thus we will inherit from ``InputInterface``. + +.. code-block:: python + :linenos: + + # please add the word `Interface` at the end of your class so we can based on its name alone + # knows it is an interface. + class EMGInterface(InputInterface): + """ + Description + """ + + def __init__(self, use_thread=False, sleep_dt=0, verbose=False, *args, **kwargs): + # initialize your variables/attributes + ... + + # call at the end the parent constructor + super(EMGInterface, self).__init__(self, use_thread, sleep_dt, verbose) + + def run(self): + """main method to implement. This method is automatically called when using threads, and you + have to call it when you are not using threads.""" + # get the last sensed data and save it in one of the attributes of this class + ... + +- Now, let's create a bridge that connects the above interface with a manipulator robot. + +.. code-block:: python + :linenos: + + # please add the word `Interface` at the end of your class so we can based on its name alone + # knows it is an interface. + class EMGBridge(InputInterface): + + +FAQs and Troubleshootings +------------------------- + +- I have an ``ImportError`` with one of the interface, why? Some libraries have to be installed and configured manually. To ease the installation process, there is a docker file as well as bash scripts in the `pyrobolearn/scripts/ `_ folder. + + +Future works +------------ + +* add an interface to get the values sensed by an android/Iphone smartphone (which might have an accelerometer, gyroscope, microphone, etc.) +* add HTC Vive interface +* add a Facial Expression Recognition (FER) module +* add Google assistant / Alexa +* implement interfaces for haptic devices +* improve the VR interface; right now, I have something for Oculus but it requires to use a Windows system in parallel (see VIDEO) +* implement the Xsens suit interface; I also have a code for this but pretty old and it also requires a Windows system. diff --git a/docs/source/models.rst b/docs/source/models.rst new file mode 100644 index 0000000..6ed93c9 --- /dev/null +++ b/docs/source/models.rst @@ -0,0 +1,89 @@ +Models +====== + +Learning models versus algorithms. + +As shown on the following figures: + + +Learning models can be divided into 2 categories: + +- General function approximators (aka step-based learning models) + - Linear models + - Polynomial models + - Deep Neural Networks (DNNs) + - Gaussian processes (GPs) +- Trajectory based learning models: + - Dynamic Movement Primitives (DMPs) + - Central Pattern Generators (CPGs) + - Gaussian Mixture Models and Gaussian Mixture Regression (GMMs/GMRs) + - Probabilistic Movement Primitives (ProMPs) + - Kernel Movement Primitives (KMPs) + +For few of these models, we provide a wrapper around popular libraries such as ``pytorch`` or ``gpytorch``. The other models have been reimplemented to be the most general possible. + + +Design +------ + +Models are independent of the other elements in PRL, but are used by other elements in PRL. + +UML + +The models is notably used by approximators and policies, and their (hyper-)parameters are optimized by algorithms. + + +How to use a learning model? +---------------------------- + +.. code-block:: python + :linenos: + + import torch + import pyrobolearn as prl + + + x = torch.rand(4) + model = prl.models.LinearModel(num_inputs=4, num_outputs=2) + + print(model.predict(y)) + + +How to create your own model? +----------------------------- + +.. code-block:: python + :linenos: + + import pyrobolearn as prl + + + class MyModel(prl.models.Model): + """Description""" + + def __init__(self, ...): + pass + + # implement the various abstract methods + def ... + + +Comparisons between the various models? +--------------------------------------- + +A question that you might have, especially if you are new to the field, what are the differences between the different models that have been proposed in the literature? In this section, I will try to provide the differences (strengths and weaknesses) of each model, and when you should favor one over another one. + +The below table summarizes: + +- General function approximator (aka step-based learning models) vs trajectory based learning models: trajectory based models accepts as inputs the time and outputs a trajectory (a sequence). +- Parametric vs Non-parametric: In a nutshell, parametric models have parameters that are tuned by the learning algorithm based on the given dataset. Depending on the number of parameters, they might require a lot of data or to have been pretrained on similar datasets. Once trained, parametric models do not need the dataset anymore. On the other hand, non-parametric models don't have parameters but few hyper-parameters. They remember each data point in the dataset, and when given a new input they compare that new input with previous ones, and outputs an estimate based on it. Non-parametric models are very good when you don't have a lot of data points and don't have a pretrained model. +- Linear vs Non-linear: Linear models are the most simple models that makes the least assumption about the data, but can be quite limited in their expressiveness. +- Deterministic vs Probabilistic: Deterministic models predicts a point estimate as output without any quantity that captures the uncertainty associated with that output. Meanwhile, probabilistic models provide a probability distribution for each output. +- Discriminative vs Generative: discriminative models model learn the mapping ``p(y|x)`` where x is the input and y is the output, while generative models use to learn the data distribution ``p(x,y)``. Generative models are more powerful as given the prior ``p(x)`` or ``p(y)``, you can get back ``p(y|x)`` or ``p(x|y)``. Generative models might require more data. + + +Future works +------------ + +* add methods to combine different models together +* provide few other functionalities for the various models diff --git a/pyrobolearn/robots/ros/walkman/__init__.py b/docs/source/papers.rst similarity index 100% rename from pyrobolearn/robots/ros/walkman/__init__.py rename to docs/source/papers.rst diff --git a/docs/source/priorities.rst b/docs/source/priorities.rst new file mode 100644 index 0000000..54d6d64 --- /dev/null +++ b/docs/source/priorities.rst @@ -0,0 +1,3 @@ +Priority Tasks +============== + diff --git a/docs/source/pyrobolearn.rst b/docs/source/pyrobolearn.rst new file mode 100644 index 0000000..e3a145b --- /dev/null +++ b/docs/source/pyrobolearn.rst @@ -0,0 +1,52 @@ +PyRoboLearn +=========== + +PyRoboLearn is a Python framework in robot learning for education and research. PyRoboLearn is meant to be a free and open-source tool. + +Goal + + +Problem formulation +------------------- + +General idea. + +- lack of benchmarks +- lack of flexibility and modularity +- lack of generalization +- high coupling + +For instance: + +Full example. + + +Main idea of PyRoboLearn and solution to above problem. + + +Hardware/Software requirements +------------------------------ + +The PyRoboLearn framework has been tested on Ubuntu 16.04 and 18.04, with Python 2.7, 3.5 and 3.6. + + +Design Decisions +---------------- + +While designing PRL, we focused on the five following features: + +- modularity: design a module (i.e. class) for each different concept +- abstraction: add a layer of abstraction for combination of low-level modules +- reusability: easy to reuse the different modules and to combine them +- low coupling between the different modules +- flexibility: this is mainly achieved by favoring composition over inheritance. + + +The Python language has been selected. + + +.. figure:: ../UML/pyrobolearn_uml.png + :alt: UML diagram of PyRoboLearn + :align: center + + UML diagram of PyRoboLearn \ No newline at end of file diff --git a/docs/source/readme.rst b/docs/source/readme.rst new file mode 100644 index 0000000..4128c55 --- /dev/null +++ b/docs/source/readme.rst @@ -0,0 +1,15 @@ + +.. include:: ../../README.rst + +Citation +======== + +.. code-block:: latex + + @misc{delhaisse2019pyrobolearn, + author = {Delhaisse, Brian and Xin, Songyan and Rozo, Leonel, and Caldwell, Darwin}, + title = {PyRoboLearn: A Python Framework for Robot Learning Practitioners}, + howpublished = {\url{https://github.com/robotlearn/pyrobolearn}}, + year=2019, + } + diff --git a/docs/source/rewards.rst b/docs/source/rewards.rst new file mode 100644 index 0000000..4370799 --- /dev/null +++ b/docs/source/rewards.rst @@ -0,0 +1,121 @@ +Rewards +======= + +In PRL, every concept is modelized as a class. This is also true for rewards which are returned by the environment as shown in the figure below (inspired by [1]_): + +.. figure:: ../figures/environment.png + :alt: environment + :align: center + + The agent-environment interaction + + +The reward function might be defined as [1]_: + +- :math:`r: \mathcal{S} \rightarrow \mathbb{R}`: given the state :math:`s \in \mathcal{S}`, it returns the reward value :math:`r(s)`. +- :math:`r: \mathcal{S} \times \mathcal{A} \rightarrow \mathbb{R}`: given the state :math:`s \in \mathcal{S}` and action :math:`a \in \mathcal{A}`, it returns the reward value :math:`r(s,a)`. +- :math:`r: \mathcal{S} \times \mathcal{A} \times \mathcal{S} \rightarrow \mathbb{R}`: given the state :math:`s \in \mathcal{S}`, action :math:`a \in \mathcal{A}`, and next state :math:`s' \in \mathcal{S}`, it returns the reward value :math:`r(s,a,s')`. + +Note that the cost function is just minus the reward function, i.e. it is given by :math:`c(s,a,s') = -r(s,a,s')`. + + +Design +------ + +In PRL, all reward functions inherit from the abstract ``Reward`` class defined in `pyrobolearn/rewards/reward.py `_, and several methods and operations are provided. + +You can for instance: + +* provide the ``State`` and/or ``Action`` instances to some reward functions that will compute the reward value based on their value. +* access to the range of the reward function. +* add, multiply, divide, subtract, and apply basic functions such as :math:`\exp`, :math:`\cos`, :math:`\sin`, and others on reward functions. The resulting range is automatically scaled based on the operations. +* define your own rewards/costs and reuse them in your code. + + +How to use a particular reward? +------------------------------- + +Here is a short snippet showing the basic usage of reward functions: + +.. code-block:: python + :linenos: + + import pyrobolearn as prl + from pyrobolearn.rewards import FixedReward, YourReward + + # define the simulator and world (and load what you want in it) + sim = ... + world = ... + ... + + # define your state / action for your reward function + state = ... + action = ... + + # define the reward function + reward = 2 * FixedReward(3) + 0.5 * YourReward(state, action) + + # print the range of the reward function + print(reward.range) + + # compute the reward value + value = reward() + print(value) + + # update the state for instance + state() # this will modify the internal state data + + # recompute the reward value + value = reward() + print(value) # you will normally get a different value + + # you can give the reward function to your RL environment + # which will use it when calling `env.step()`. + env = prl.envs.Env(world, state, reward) + + +More examples on how to use the rewards can be found in `pyrobolearn/examples/rewards `_. + + +How to create your own reward? +------------------------------ + +In order to create your own reward, you have to inherit from ``Reward`` defined in `pyrobolearn/rewards/reward.py `_. + +.. code-block:: python + :linenos: + + import pyrobolearn as prl + + class MyReward(prl.rewards.Reward): + """Description""" + + def __init__(self, args): + # initialize your reward function based on the args + ... + + # gives initial value to your reward + # this attribute will be used to cache the computed value + self.value = 0 + + def _compute(self): + # compute the reward function + ... + # save the computed value and return it + self.value = ... + return self.value + + +Once done, you will be able to use your reward function and perform operations on it (such as addition, substraction, etc). + + +FAQs +---- + +* If you have any questions, please submit an issue on the `Github page `_. + + +References: +----------- + +.. [1] "Reinforcement Learning: An Introduction", Sutton and Barto, 1998 diff --git a/docs/source/robots.rst b/docs/source/robots.rst new file mode 100644 index 0000000..9e3ddf3 --- /dev/null +++ b/docs/source/robots.rst @@ -0,0 +1,337 @@ +Robots +====== + +Robots constitute one of the main elements in the *PyRoboLearn* (PRL) framework. PRL provides a high-level abstraction and common interface to many robots, offering better consistency and generalization between them. This allows for instance to check if one particular controller or algorithm works with other robots as well. + +More than 60+ robots are currently available in PRL covering a large range of robotic platforms. Among them, manipulators, biped robots, quadrupeds, hexapods, wheeled robots, quadcopters, and many others as shown below: + + +GIF + + +.. image:: ../figures/coman.png + :width: 9% + :alt: coman +.. image:: ../figures/wam.png + :width: 9% + :alt: wam +.. image:: ../figures/fetch.png + :width: 9% + :alt: fetch +.. image:: ../figures/cassie.png + :width: 9% + :alt: cassie +.. image:: ../figures/hyq2max.png + :width: 9% + :alt: hyq2max +.. image:: ../figures/phantomx.png + :width: 9% + :alt: phantomx +.. image:: ../figures/pleurobot.png + :width: 9% + :alt: pleurobot +.. image:: ../figures/softhand.png + :width: 9% + :alt: softhand +.. image:: ../figures/centauro.png + :width: 9% + :alt: baxter +.. image:: ../figures/walkman.png + :width: 9% + :alt: walkman + +Note that for few of them such as the ones that require the simulation of fluids (e.g. quadcopters). If the simulator does not simulate fluids, the corresponding robot class implements a simple dynamics simulation. For such classes, as I did not spend too much time one it, some improvements might be needed for better realism. + + +Design +------ + +The most abstract class is the ``Body`` class which is described in `pyrobolearn/robots/base.py `_. From it, you can already access to multiple functionalities/attributes, such as its position and orientation. It only depends on the simulator. + + +.. figure:: ../UML/robots.png + :alt: UML diagram for Robot + :align: center + + UML diagram for Robot + + +Inheriting from one of its child classes is the most interesting (for our purpose) ``Robot`` class, described in `robot.py `_. It is the parent class of several classes such as: + +- ``Manipulator`` defined in `manipulator.py `_ +- ``LeggedRobot`` defined in `legged_robot.py `_ +- ``WheeledRobot`` defined in `wheeled_robot.py `_ +- ``Hand`` defined in `hand.py `_ +- etc. + +Note that ``Robot`` only depends on the simulator interface (aggregation relationship), and is independent of other modules in PRL (at the exception of some util methods that are useful to perform some transformations). + + +How to use a robot in PRL? +-------------------------- + +.. code-block:: python + :linenos: + + from itertools import count + import pyrobolearn as prl + + + # create simulator + simulator = prl.simulators.Bullet() + + # create basic world (with floor and gravity) + world = prl.worlds.BasicWorld(simulator) + + # load robot in the world at the specified (x, y) position (you can also give a (x,y,z) position) + # For other possible parameters, check the method documentation. + robot = world.load_robot('robot_name', position=[0., 0.], ...) + + # print some info about the robot + robot.print_info() + print(dir(robot)) # print available methods + + # main loop + for _ in count(): + + # perform something with the robot for instance some kinematic / dynamic control + ... + + # perform a step in the world and sleep for `sim.dt` + world.step(sim.dt) + + +You can check for more examples in the `examples/robots `_ folder. You can also check for `examples/kinematics `_ and `examples/dynamics `_. + +- Kinematics +- Dynamics + + +How to create your own robot? +----------------------------- + +To illustrate how to create your own robot, let's assume you want to create a humanoid robot (biped and bi-manipulator) called ``Asimov``. + +1. First, you have to get (or create) its URDF file and the associated meshes. Let's put them in a directory called ``asimov``, and move it in the ``pyrobolearn/robots/urdfs/`` folder where all the other URDFs are. + +2. If you want to use it directly and to not create a specific class, you can just call: + +.. code-block:: python + :linenos: + + import pyrobolearn as prl + + # create simulator and basic world + simulator = prl.simulators.Bullet() + + # create world + world = prl.worlds.BasicWorld(simulator) + + # create robot + urdf = "path/to/urdf" + position = None # position [x,y,[z]]. If None, by default, it will be set to (0,0,0) + orientation = None # quaternion [x,y,z,w]. If None, by default, it will be set to (0,0,0,1) + robot = Robot(simulator, urdf, position, orientation, fixed_base=False) + + # main loop + while True: + # do something with robot + ... + + # perform a step in the world and pause for `sim.dt` + world.step(sim.dt) + +3. Instead of the second point, let's create a proper class ``Asimov`` that inherits from the ``BipedRobot`` and ``BiManipulator`` (and thus inherits their functionalities) in a Python file ``asimov.py``: + +.. code-block:: python + :linenos: + + #!/usr/bin/env python + """Short description about your robot + + Long description about the robot + """ + + # import libraries you need + import ... + + # import the classes to inherit from + from pyrobolearn.robots.legged_robot import BipedRobot + from pyrobolearn.robots.manipulator import BiManipulator + + + class Asimov(BipedRobot, BiManipulator): + r"""Asimov Robot + + Add description about the robot here, such as the number of degrees of freedom, the various sensors/actuators that are available. + + References: + - [1] reference 1; e.g. link to the robot webpage + - [2] reference 2: e.g. link to original URDF + """ + + # define static variables here, e.g. + BASE_HEIGHT = 1 + + def __init__(self, simulator, position=(0, 0, 0), orinetation=(0, 0, 0, 1), fixed_base=False, scale=1., + urdf=os.path.dirname(os.path.abspath(__file__)) + '/relative/path/to/your/urdf/wrt/this/python/file.urdf') + + # check parameters and set default parameters if necessary + if position is None: # it receives None notably when the world load the robot if a position is not specified + position = (0, 0, 0) + if len(position) == 2: # assume (x,y) are given + position = tuple(position) + (self.BASE_HEIGHT,) + if orientation is None: # it receives None notably when the world load the robot if an orientation is not specified + orientation = (0, 0, 0, 1) # quaternion [x,y,z,w] + if fixed_base is None: # it receives None notably when the world load the robot if fixed_base is not specified + fixed_base = False + + # call parent constructor + super(Asimov, self).__init__(simulator, urdf, position, orientation, fixed_base, scale) + + # define common attributes to all bimanipulator/biped robot (see their respective classes) + + # for bimanipulator + self.arms = [] # list of arms where each arm is a list of link ids + self.hands = [] # list of end-effector/hand link ids + + # default values set in BiManipulator class that you can modify if necessary + # self.left_arm_id, self.left_hand_id = 0, 0 # used e.g. for self.arms[self.left_arm_id] + # self.right_arm_id, self.right_hand_id = 1, 1 # used e.g. for self.arms[self.right_arm_id] + + # for biped (similar than for bimanipulator): check corresponding `BipedRobot` class + self.legs = [] # list of legs where a leg is a list of links + self.feet = [] # list of feet ids + ... + + # define your own sensors and actuators + ... + + +3. If you want to be able to load your robot from the world using its name (by calling ``world.load_robot('asimov')``), add the Python file ``asimov.py`` in the `pyrobolearn/robots/ `_ folder. The ``__init__.py`` inside that folder will automatically go through all the files and add the robots inside the ``implemented_robots`` list which is accessed by ``World``. Note that you can also access this list by calling ``pyrobolearn.robots.implemented_robots``. If you also want to be able to call your robot using ``from pyrobolearn.robots import Asimov``, you will have to add the line ``from .asimov import Asimov`` in the `pyrobolearn/robots/__init__.py `_. + +4. Now, you can call your robot in the framework. + +.. code-block:: python + :linenos: + + from itertools import count + import pyrobolearn as prl + + simulator = prl.simulators.Bullet() + + # create world and load robot inside (recommended) + world = prl.worlds.BasicWorld(simulator) + robot = world.load_robot('asimov') + # or directly created the robot in the simulator (not recommended unless you are doing experiments on the real robot + # and thus the world is not useful) + # robot = prl.robots.Asimov(simulator) + robot.print_info() + + # main loop + for _ in count(): + world.step(sleep_dt=sim.dt) + + +Sensors and Actuators +--------------------- + +* Sensors +* Actuators + + +FAQs and Troubleshootings +------------------------- + +- The mass/inertia matrix of some links are not correct in the simulator, what should I do? + - If you use the Bullet simulator (which uses ``pybullet``), you have to specify the mass and inertia matrix for each link. If a link doesn't have these attributes defined, pybullet automatically attribute a mass of 1kg and an identity inertia matrix (which is ridiculous huge). Normally, links without a mass and inertia matrices defined in a URDF file are dummy links that are used to represent a reference frame. To set a reasonable inertia matrix, please refer to `"Adding Physical and Collision Properties to a URDF Model" `_ and `"Inertial parameters of triangle meshes" `_. + - It is possible that some masses / inertia matrices have not been correctly set in the original URDF. I cleaned most of the URDF files but some links might have escaped my attention. Please open an issue on `Github `_, or check the 2 `links `_ `above `_ on how to set reasonable inertia values. + +- How to convert a xacro file to a URDF file? Type ``rosrun xacro xacro --inorder path/to/.urdf.xacro > .urdf`` or ``rosrun xacro xacro.py --inorder path/to/.urdf.xacro > .urdf`` + +- When I set the ``fixed_base`` to ``False``, the robot has still a fixed base, what is happening? The first link (often called base_link or world_link in most URDF files) shouldn't have a mass/inertia of zero, this causes the robot to have a fixed base. Remove the corresponding tag from the urdf. + +- What are the differences when a robot has a floating-based and a fixed base? When the robot has a floating base, the total number of degrees of freedom becomes 6 + the number of actuated joints. This appears when computing the Jacobian and Inertia matrices. + +- I noticed that some functionalities are missing in one of the robot class? I probably forgot to implement it. Please open an issue on `Github `_ or create a pull request. + +- There is an error in one of the functionalities? Or, I have another question or want to suggest an improvement? Please open an issue on `Github `_ or a create a pull request. + + +Future works +------------ + +- add more robots. Here are few other robots that might interest the users: + - `hexapods `_ + - `ROS robots `_ + - `Universal robots `_ +- improve the flexibility/modularity by allowing to remove/add/replace links to/from the main robot. For instance: + - add a gripper to a manipulator robot, or replace a gripper with another + - remove a leg from a legged robot (which is interesting to simulate damage recovery scenarios) +- might need to define different URDFs for different simulators + + +References +---------- + +All the robots were found in the following github repositories (and several were cleaned by me): + +- `Aibo `_ +- `Allegrohand `_ +- `Ant `_ +- Atlas: `1 `_, `2 `_ +- `Ballbot `_ +- `Baxter `_ +- BB8: `1 `_, `2 `_ +- `Blackbird `_ +- `Cartpole `_ but modified to be able to have multiple links specified at runtime +- Cassie: `1 `_, `2 `_, `3 `_ +- `Centauro `_ +- `Cogimon `_ +- `Coman `_ +- `Crab `_ +- `Cubli `_ +- `Darwin `_ +- `e.Do `_ +- `E-puck `_ +- `F10 racecar `_ +- `Fetch `_ +- `Franka Emika `_ +- `Half Cheetah `_ +- `Hopper `_ +- `Hubo `_ +- `Humanoid `_ +- `Husky `_ +- `HyQ `_ +- `HyQ2Max `_ +- ICub: `1 `_, `2 `_. There are currently few problems with this robot. +- `Jaco `_ +- KR5: `1 `_, `2 `_ +- Kuka IIWA: `1 `_, `2 `_ +- Kuka LWR: `1 `_, `2 `_ +- `Laikago `_ +- `Little Dog `_ +- `Manipulator2D `_ +- `Minitaur `_ +- `Lincoln MKZ car `_ +- `Morphex `_ +- Nao: `1 `_, and `2 `_ +- OpenDog: `1 `_, and `2 `_ +- `Pepper `_ +- `Phantom X `_ +- `Pleurobot `_ +- `PR2 `_ +- `Quadcopter `_ +- `Rhex `_ +- `RRbot `_ +- Sawyer: `1 `_, `2 `_ +- `SEA hexapod `_ +- `SEA snake `_ +- `Shadow hand `_ +- `Soft hand `_ +- `Swimmer `_ +- `Valkyrie `_ +- `Walker 2D `_ +- `Walk-man `_ +- `Wam `_ +- `Youbot `_: this includes the youbot base without any arms, one kuka arm, 2 kuka arms, and the kuka arm without the wheeled base. diff --git a/docs/source/simulators.rst b/docs/source/simulators.rst new file mode 100644 index 0000000..01066d2 --- /dev/null +++ b/docs/source/simulators.rst @@ -0,0 +1,97 @@ +Simulators +========== + +The simulator is the starting point in the **PyRoboLearn** (PRL) framework. To avoid a tight coupling with a particular simulator, a ``Simulator`` interface class (from which all the other simulators inherit from) has been implemented. Other . + +We provide the ``Bullet`` interface, which uses the ``pybullet`` library. + +The general idea is that you would be able to change the simulator if you wish without having to modify any other lines of code. See example below. + + +Design +------ + +The important goal when designing the simulators was that it should be a stand alone interface. + + +.. figure:: ../UML/simulator.png + :alt: UML diagram for Simulators + :align: center + + UML diagram for simulators + + +Currently, the only fully functional simulator is ``Bullet``. While other simulators have been considered such as Gazebo (with ROS), Mujoco, Dart, and others, few of them required a particular license or do not have strong Python bindings. + +Note that each simulator implements static methods which provide information about the simulator itself; if it can for instance simulate fluids or not, etc. + + +How to use a particular simulator in PRL? +----------------------------------------- + +For the moment, the only fully operational interface is ``Bullet``. Some few other interfaces have been partially implemented (see Future works). Here is a snippet on how to use the ``Bullet`` simulator in PRL: + +.. code-block:: python + + from itertools import count + import pyrobolearn as prl + + + # create simulator + simulator = prl.simulators.Bullet() + # later: you would be able to change the simulator by `BulletROS` or `RBDL_ROS` to command a real robot using ROS + + # create world, robots, etc + ... + + # main loop + for _ in count(): + + # do something + ... + + # perform a step in the world and sleep for `sim.dt` + sim.step(sim.dt) + + +You can check for more examples in the `examples/simulators `_ folder. + + +How to create an interface to a simulator? +------------------------------------------ + +To create your own Simulator, you have to inherit from the ``Simulator`` class defined in `pyrobolearn/simulators/simulator.py `_. + + +.. code-block:: python + + import pyrobolearn as prl + + + class MySimulator(prl.simulators.Simulator): + """Description""" + # implement all the abstract methods in Simulator + + +FAQs and Troubleshootings +------------------------- + +* What are the differences between `BulletClient `_ and the ``Bullet`` defined in PRL? There are few differences but the design of the abstract ``Simulator`` class as well as the `Bullet` class was heavily inspired by the methods provided in PyBullet. The subtil differences include: + * a full documentation embedded in the code of ``Bullet``. The documentation for each function provided in the original pybullet is described on a Google doc available `here `_. This is not optimal when coding where a user often wants to access the documentation through the code using ``function?`` or ``help(function)`` in a Python console. + * follow the PEP8 style guideline. For instance, the names of the method are given by ``create_collision_shape`` instead of ``createCollisionShape``. + * automatic conversion to numpy arrays from lists that are returned by ``pybullet``, and vice-versa. Some methods (not all of them) in the original pybullet raises an error when given a numpy array. I identified these methods and convert these numpy arrays to lists. Also, some matrices returned by some methods in the original pybullet are returned as a list of int/float instead of numpy arrays. The conversion to numpy array and the reshaping to the correct shapes is thus also performed in the ``Bullet`` class. + * enforce consistency; for instance, some angles that were returned from or provided to some methods in the original pybullet, were for some in degrees while for others in radians. This can lead to some bugs that could be hard to detect if the user is not aware of that. In ``Bullet``, all the returned/provided angles are in radians. + + +Future works +------------ + +My main objectives for future works are the implementation of: + +- the Mujoco interface; I originally did not start with it as it is closed-source and requires a License. However, it is used a lot in research and thus it could be interesting to have it as well. +- the Gazebo-ROS interface; a part has already been implemented but it is far from over. +- the Isaac interface if Nvidia provided a nice Python API. + +Possible other future works might include the implementation of: +- the DART interface; there is a minimal implementation of it when I was playing around with it +- the opensim interface; this interface is for musculoskeletal models but this can be interesting when testing algorithms/models. diff --git a/docs/source/states.rst b/docs/source/states.rst new file mode 100644 index 0000000..f9ea74e --- /dev/null +++ b/docs/source/states.rst @@ -0,0 +1,108 @@ +States +====== + +In PRL, every concept is modelized as a class. This is also true for states which are returned by the environment. + +.. figure:: ../figures/environment.png + :alt: environment + :align: center + + The agent-environment interaction + + +States are given to the policy and the environment. The environment is responsible to update them while policies read their ``data`` and feed it to the underlying learning model. In the case we use a physics simulator like PyBullet, the environment performs one step in the simulation and calls the ``states()`` which updates the ``data`` they contained. Instead, if you have a dynamical model function, the environment can call this one to update the ``data`` of the various ``states`` without having to call the ``states()`` itself to update their values. + +States can also be given to dynamical models (which predicts the next state given the current state and last action), value function approximators (which predicts a scalar value given a state and possibly an action), reward functions, etc. + + +Design +------ + +UML + + +How to use a particular state? +------------------------------ + +Let's assume you have a quadruped robot, and you would like to get its joint positions, velocities, and base position. + +.. code-block:: python + :linenos: + + from itertools import count + import pyrobolearn as prl + from pyrobolearn.states import BasePositionState, JointPositionState, JointVelocityState + + + # create simulator + sim = prl.simulators.Bullet() + + # load robot + robot = prl.robots.HyQ2Max(sim) + + # create the states + base_pos_state = BasePositionState(robot) + joint_pos_state = JointPositionState(robot, joint_ids=robot.legs) # you can specify which joints you would like to get the position + joint_vel_state = JointVelocityState(robot, joint_ids=robot.legs) # you can specify which joints you would like to get the velocity + + state = base_pos_state + joint_pos_state + joint_vel_state + + # run simulation + for t in count(): + # call and print the state + print(state()) + + # perform a step in the world + world.step(sim.dt) + + +All the states accept also as inputs: + +- ``window_size``: size (by default, it is set to one) +- ``ticks``: the number of simulation ticks to sleep before getting the next state. + +In the example above, for joint states, you could also specify the joints that you would like to get the states from by setting ``joint_ids``. Note that in order to be able to generalize to other robots, avoid to give manually the joint ids but instead gives an attribute of the robot, like, ``robot.legs`` (wich is a list containing the joint ids associated with each leg). + +Now, let's assume that you forgot to include the robot's base orientation and its linear/angular velocity in the state. In other frameworks, it is very likely that you would have to change manually the state and everything that depends on it (the policy / value function approximator which accepts as input the state, the step function in the environment which compute the next state, possibly the reward function which is often based on the current state, etc). In PRL, everything is automatized, and thus setting: + +.. code-block:: python + + state = state + BaseOrientationState(robot) + BaseLinearVelocity(robot) + +will automatically results the other components to update their input size or because this new state is provided to them. + + +How to create your own state? +----------------------------- + +Let's assume that you want to create a state that accepts as inputs the game controller . + +.. code-block:: python + :linenos: + + import pyrobolearn as prl + + + class MyState(prl.states.State): # inherit from the abstract State class + """Description""" + + def __init__(self, ...): + + super(MyState, self).__init__(...) + + +FAQs +---- + + +Other functionalities +--------------------- + +- `State generator `_: generate a state (used as initial state generator) +- `State processor `_: process the given state (before giving it to another model such as a policy) + + +Future works +------------ + +* add a ``rate`` attribute to the states which is used when we set the real-time on the simulator. Or better, using the ``ticks`` and ``sim.dt`` infer the rate. diff --git a/docs/source/worlds.rst b/docs/source/worlds.rst new file mode 100644 index 0000000..1bf32b8 --- /dev/null +++ b/docs/source/worlds.rst @@ -0,0 +1,82 @@ +Worlds +====== + +The world is the second important item in PRL; it is, with the ``Body`` class (see next section), the only class that can access the simulator. As it name implies, it allows you to create a world in the simulator, load various objects in it, and change the world's and objects' physical properties. From it, you can also access to the main camera (if the GUI is enabled in the simulator), and move it as you wish. The world can be seen as a wrapper around the simulator which provides you extra functionalities where each function calls different methods of the simulator. Finally, the world also allows you to load and generate terrains. + + +Design +------ + +As it can be seen on the UML diagram below the ``World`` depends on the ``Simulator`` and the various ``Body`` (see next section) loaded in it (as well as few util functions). + + +.. figure:: ../UML/world.png + :alt: UML diagram for World + :align: center + + UML diagram for world + + +Later, we will see that world is notably given to the environment along with the states and rewards. + + +How to use the world in PRL? +---------------------------- + +Here is a snippet showing how to create a simple world in PRL: + +.. code-block:: python + :linenos: + + from itertools import count + import pyrobolearn as prl + + + # create simulator + simulator = prl.simulators.Bullet() + + # create basic world (with floor and gravity) + world = prl.worlds.BasicWorld(simulator) + + # load a sphere in the world + sphere = world.load_sphere(position=[0, 0, 5]) + + # run the simulator + for t in count(): + # follow the sphere falling with the main camera + world.camera.follow(sphere, distance=2) + + # perform a step in the simulator and sleep for `sim.dt` + world.step() + + +Note that you can get access to the world camera, and change its position and orientation. You can also follow an object moving with the camera as done in the code above. + +For more examples, you can check the `examples/worlds `_ folder. + + +How to create your own world? +----------------------------- + +Creating your own world basically boils down to inheriting from the ``World`` or ``BasicWorld`` (if you want a floor and enable gravity by default) class, and write in the constructor what you want your world to load when instantiated. + + + +FAQs and Troubleshootings +------------------------- + +- Why do the ``Body`` class (and all the classes that inherit from it such as ``Robot``) can access the simulator as well? + - This is because, creating a world when the ``Simulator`` consists to be the real world doesn't make much sense. The ``Robot`` is completely independent of the ``World``, while the converse is not true. +- I got an error while loading a 3D object / mesh? + - The most common error is because the given format is not supported by the simulator. Try to convert it in ``.obj`` using for instance `meshlab `_ (which is an open-source free tool to process and edit 3D meshes) + + +Where can I find 3d models to load in the world? +------------------------------------------------ + +- If it a combination of simple shapes linked together, you can build it in the simulator. +- `Pybullet data `_ +- `Gazebo database `_ +- `Turbosquid `_ +- `free3d `_ +- `sketchfab `_ diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index edada3d..0000000 --- a/examples/README.md +++ /dev/null @@ -1,9 +0,0 @@ -## Examples - -In this folder, you will find different examples on how to use the framework. - -You can check the following folders: -- `gym/cartpole`: policies are trained with different algorithms on the gym Cartpole environment. -- `robots`: check how to load a specific robot into the world. -- `states`: how to query the states / observations. - diff --git a/examples/README.rst b/examples/README.rst new file mode 100644 index 0000000..b2236e0 --- /dev/null +++ b/examples/README.rst @@ -0,0 +1,21 @@ +Examples +======== + +In this folder, you will find different examples on how to use the framework. + +Warning: this folder is currently being updated; few files might still have some bugs or not +implemented completely. Some other folders will be added in the upcoming days. + +You can check the following folders on: + +- ``simulators``: how to use a particular simulator. Currently, the Bullet simulator is the one fully operational. +- ``worlds``: how to create a world in the simulator, load various objects inside and interact with them, use the camera, and load or generate terrains. +- ``robots``: how to load a specific robot (biped, quadruped, wheeled, etc) into the world. +- ``interfaces``: the various interfaces (game controllers, webcam, etc) and bridges that you can use. +- ``kinematics``: how to use forward and inverse kinematics as well as position and velocity control. +- ``dynamics``: how to use forward and inverse dynamics as well as force control. +- ``manipulability``: how to use the velocity and dynamic manipulability ellipsoids. +- ``states``: how to query the states / observations. +- ``models``: the different learning models that you can use. +- ``imitation``: how to use imitation learning with the framework. +- ``gym/cartpole``: policies that are trained with different algorithms on the gym Cartpole environment. diff --git a/examples/dynamics/README.md b/examples/dynamics/README.md new file mode 100644 index 0000000..7889092 --- /dev/null +++ b/examples/dynamics/README.md @@ -0,0 +1,9 @@ +## Robot dynamics + +We provide examples on how to perform forward and inverse dynamics, as well as force control. + +References: +- [1] "Robotics: Modelling, Planning and Control", Siciliano et al., 2010 +- [2] "Springer Handbook of Robotics", Siciliano et al., 2008 +- [3] "Rigid Body Dynamics Algorithms", Featherstone, 2008 +- [4] [Lecture on Impedance Control](http://www.diag.uniroma1.it/~deluca/rob2_en/15_ImpedanceControl.pdf) by Prof. De Luca, Universita di Roma diff --git a/examples/dynamics/control/README.md b/examples/dynamics/control/README.md new file mode 100644 index 0000000..1e8b5d3 --- /dev/null +++ b/examples/dynamics/control/README.md @@ -0,0 +1,20 @@ +### Force control + +In a nutshell, you have different control modes: + +* motion control: specify the desired task (or joint) positions / velocities +* force control: specify the desired task (or joint) forces + * indirect force control: + * impedance control + * admittance control + * direct force control: + * hybrid force/position control + * parallel force/position control + +Here are the few examples that you can find in this folder: +1. `no_forces.py`: this example loads a RRBot robot and disable the motors. It does not apply any joint torques. +2. `gravity_compensation.py`: compute the necessary joint torques to compensate for gravity. +3. `attractor_point.py`: compute the necessary joint torques (using impedance control) such that the end-effector +is attracted by a 3D Cartesian point. + +For these 3 above examples, try to move the robot's end effector with your mouse and see what happens. diff --git a/examples/dynamics/control/attractor_point.py b/examples/dynamics/control/attractor_point.py new file mode 100644 index 0000000..794672d --- /dev/null +++ b/examples/dynamics/control/attractor_point.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python +"""Attractor point using impedance control with RRBot + +Try to move the end-effector using the mouse, and see what happens. Compare the obtained results with +`force/no_forces.py` and `force/gravity_compensation.py`. +""" + +import numpy as np +from itertools import count + +import pyrobolearn as prl + + +# Create simulator +sim = prl.simulators.Bullet() + +# create world +world = prl.worlds.BasicWorld(sim) + +# load robot +robot = prl.robots.RRBot(sim) +robot.disable_motor() # disable motors; comment the `robot.set_joint_torques(torques)` to see what happens +robot.print_info() +robot.change_transparency() + +# define variables +link_id = robot.get_link_ids('hokuyo_link') # the link we are interested to +com_frame = robot.get_link_states(link_id)[2] +x_des = robot.get_link_world_positions(link_id) # desired cartesian position + +# gains +K = 100 * np.identity(3) +D = 2 * np.sqrt(K) # critically damped +D = 3 * D # manually increase damping + +# draw a sphere at the desired location +world.load_visual_sphere(position=x_des, radius=0.1, color=(0, 1, 0, 0.5)) + + +# run simulator +for _ in count(): + # get current joint positions, velocities, accelerations + q = robot.get_joint_positions() + dq = robot.get_joint_velocities() + ddq = np.zeros(len(q)) + + # get current link position and velocity + x = robot.get_link_world_positions(link_id) + dx = robot.get_link_world_linear_velocities(link_id) + + # compute torques (Coriolis, centrifugal and gravity compensation) using inverse dynamics + torques = robot.calculate_inverse_dynamics(ddq, dq, q) + + # get linear jacobian + Jlin = robot.get_linear_jacobian(link_id=link_id, local_position=com_frame) + + # attractor point: compute cartesian forces (PD control) + F = K.dot(x_des - x) - D.dot(dx) + + # add torques resulting from them + torques += Jlin.T.dot(F) + # torques += Jlin.T.dot(- D.dot(dx)) # active compliance + # torques = Jlin.T.dot(F) + + # impedance control + robot.set_joint_torques(torques=torques) + + # perform a step in the world + world.step(sleep_dt=1./240) diff --git a/examples/dynamics/control/gravity_compensation.py b/examples/dynamics/control/gravity_compensation.py new file mode 100644 index 0000000..6d13738 --- /dev/null +++ b/examples/dynamics/control/gravity_compensation.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +"""Force control: gravity compensation with RRBot + +Try to move the end-effector using the mouse, and see what happens. Compare the obtained results with +`force/no_forces.py` and `impedance/attractor_point.py`. +""" + +import numpy as np +from itertools import count + +import pyrobolearn as prl + + +# Create simulator +sim = prl.simulators.Bullet() + +# create world +world = prl.worlds.BasicWorld(sim) + +# load robot +robot = prl.robots.RRBot(sim) +robot.disable_motor() # disable motors; comment the `robot.set_joint_torques(torques)` to see what happens +robot.print_info() +robot.change_transparency() + + +# run simulator +for _ in count(): + # get current joint positions, velocities, accelerations + q = robot.get_joint_positions() + dq = robot.get_joint_velocities() + ddq = np.zeros(len(q)) + + # compute torques (Coriolis, centrifugal and gravity compensation) using inverse dynamics + torques = robot.calculate_inverse_dynamics(ddq, dq, q) + + # force control + robot.set_joint_torques(torques=torques) + + # perform a step in the world + world.step(sleep_dt=sim.dt) diff --git a/examples/dynamics/control/no_forces.py b/examples/dynamics/control/no_forces.py new file mode 100644 index 0000000..24dd125 --- /dev/null +++ b/examples/dynamics/control/no_forces.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python +"""Force control: apply no forces/torques. + +Try to move the end-effector using the mouse, and see what happens. Compare the obtained results with +`force/gravity_compensation.py` and `impedance/attractor_point.py`. +""" + +import numpy as np +from itertools import count + +import pyrobolearn as prl + + +# Create simulator +sim = prl.simulators.Bullet() + +# create world +world = prl.worlds.BasicWorld(sim) + +# load robot +robot = prl.robots.RRBot(sim) +robot.disable_motor() # disable motors +robot.print_info() +robot.change_transparency() + + +# run simulator +for _ in count(): + + # force control: apply no forces/torques + robot.set_joint_torques(torques=np.zeros(len(robot.joints))) + + # perform a step in the world + world.step(sleep_dt=sim.dt) diff --git a/examples/environments/README.rst b/examples/environments/README.rst new file mode 100644 index 0000000..3f7eb46 --- /dev/null +++ b/examples/environments/README.rst @@ -0,0 +1,92 @@ +Environments +============ + +In this folder, we provide examples on how to define and use environments which are notably useful for imitation and reinforcement learning. + +An environment is defined as the following figures (inspired by [1]_): + +.. image:: ../../docs/figures/environment.png + :alt: environment + :align: center + +In PRL, the environment is an abstraction layer class that regroups: + +- the world; an instance of ``World`` which will be used to perform a step in the world (simulator). This is called at each step performed by the environment. +- the states: an instance of ``State`` (or a list of them). The states are updated at each time step by the environment. +- the rewards (optional): an instance of ``Reward`` (or a list of them). It is optional because some environments like in imitation learning does not require a reward function. The reward functions are computed at each time step. +- the terminal conditions (optional): an instance of ``TerminalCondition`` (or a list of them) that checks at each time step if the goal of the environment has been achieved. A ``TerminalCondition`` also details if the environment ended with a success or failure. +- the initial state generators (optional): an instance of ``StateGenerator`` (or a list of them) which are called to generate the initial states each time the environment is reset. +- the physics randomizers (optional): an instance of ``PhysicsRandomizer`` (or a list of them) to randomize the physical properties of bodies in the simulator, or the simulator itself, each time the environment is reset. +- the actions (optional): an instance of ``Action`` (or a list of them). The actions are not used nor updated by the environment. This is left to the ``Policy`` or ``Controller``. + + +By favoring `composition over inheritance `_ for the environment class, we improve the flexibility of the framework and the reuse of different modules. +This leads ultimately to less code duplication, and ease the process of creating environments. + +Here is a short snippet showing the basic usage of an environment: + +.. code-block:: python + :linenos: + + import pyrobolearn as prl + + # define the simulator and world (and load what you want in it) + sim = ... + world = ... + robot = ... + + # define state, action, and reward (and possibly action) + state = ... + action = ... + reward = ... + + # you can give the reward function to your RL environment + # which will use it when calling `env.step()`. + env = prl.envs.Env(world, state, reward) + + # like in OpenAI gym environments, you can reset and step in the environment + obs = env.reset() + for t in count(): + obs, rew, done, info = env.step() + + +Few notes regarding the code above: + +- the ``action`` can also be given to the environment but it won't be called by the environment. This is carried out by the policy(ies)/agent(s). The main reason why you can give an action to an environment is when later you will create your own environment class (that inherits from ``prl.envs.Env``), you will be able to get the states and actions for your policies in the following way: + +.. code-block:: python + :linenos: + + import pyrobolearn as prl + + # define your environment + class MyEnv(prl.envs.Env): + ... + + # create the environment and provide possible arguments + env = MyEnv(args) + + # get states and actions from your environment + states, actions = env.states, env.actions + + # create policy + policy = Policy(states, actions) + +- the observation ``obs`` is a list of arrays that are returned by the environment. This is a bit different from what it is usually returned by gym environments (which is an array). The reason is that the states returned by the environment might have different dimensions (e.g. joint positions = 1D array, camera = 2D/3D array, etc) so you can not return one array. +- You can easily update the state, reward function, world, and other modules that are given to environment. This results in less code duplication and greater flexibility. + + +For more info, please check the documentation. + + +Examples +~~~~~~~~ + +Here are few examples that you can find in this folder that better demonstrate how to use the environment: + +1. ``basics.py``: show the flexibility of how to build an environment and use it. +2. ``manipulator.py``: show how to define an environment where the goal is to reach a target object using a manipulator. + +References: + +.. [1] "Reinforcement Learning: An Introduction", Sutton and Barto, 1998 diff --git a/examples/interfaces/README.md b/examples/interfaces/README.md index 0a26b1a..7b07e1c 100644 --- a/examples/interfaces/README.md +++ b/examples/interfaces/README.md @@ -1,4 +1,17 @@ -## Interfaces +## Interfaces and Bridges In this folder, you will find examples on what interfaces you can use and on how you can collect the data from them. -You will also be able to connect an interface with an element of the world (in this case, a robot) using bridges, and see that different bridges can lead to different behaviors while getting the data from the same interface. +You will also be able to connect an interface with an element of the world (in this case, a robot) using bridges, +and see that different bridges can lead to different behaviors while getting the data from the same interface. + +Here are few examples that depict the various interfaces available to the user: +1. `mouse_keyboard.py`: use the mouse keyboard interface +2. `webcam.py`: use the webcam interface +3. `playstation.py`: use the Playstation game controller interface +4. `xbox.py`: use the Xbox game controller interface +5. `asus_xtion.py`: use the Asus Xtion interface +6. `openpose.py`: use the Openpose interface +7. `speech.py`: use the speech (recognizer/translator) interface +8. `spacemouse.py`: use the (3Dconnexion) SpaceMouse interface + +**Note**: some interfaces require to install different libraries, and possibly to configure them. Check the raised errors. diff --git a/examples/interfaces/asus_xtion.py b/examples/interfaces/asus_xtion.py new file mode 100644 index 0000000..d51845c --- /dev/null +++ b/examples/interfaces/asus_xtion.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python +"""Run the Asus Xtion interface. + +Make sure that the `openni` library is installed with all the correct environment variables set, and that the Asus +Xtion is connected before running this code. Note that it can take some time to initialize the interface. +""" + +import argparse +import matplotlib.pyplot as plt + +from pyrobolearn.tools.interfaces.camera.asus_xtion import AsusXtionInterface + + +# create parser +parser = argparse.ArgumentParser() +parser.add_argument('-t', '--use_thread', help='If we should run the webcam interface in a thread.', type=bool, + default=False) +parser.add_argument('-r', '--use_rgb', help='If we should get RGB images. Note that RGB and IR images can not be ' + 'captured at the same time.', type=bool, + default=True) +parser.add_argument('-d', '--use_depth', help='If we should get depth images.', type=bool, + default=True) +parser.add_argument('-i', '--use_ir', help='If we should get IR images. Note that RGB and IR images can not be ' + 'captured at the same time.', type=bool, + default=False) +args = parser.parse_args() + + +# get which pictures to capture +use_rgb, use_depth, use_ir = args.use_rgb, args.use_depth, args.use_ir +if use_rgb and use_ir: + use_ir = False + + +# create Asus Xtion interface +interface = AsusXtionInterface(use_rgb=use_rgb, use_depth=use_depth, use_ir=use_ir) + + +# plotting using matplotlib in interactive mode +fig, axes = plt.subplots(1, 2) +plots = [None]*2 +titles = [] +if use_rgb: + titles.append('RGB') +if use_ir: + titles.append('IR') +if use_depth: + titles.append('Depth') + +plt.ion() # interactive mode on + +while True: + # if don't use thread call `step` or `run` + data = interface.run() + + # get the frame and plot it with matplotlib + if plots[0] is None: + for i in range(len(plots)): + plots[i] = axes[i].imshow(data[i]) + axes[i].set_title(titles[i]) + else: + for plot, img in zip(plots, data): + plot.set_data(img) + + # pause a bit + plt.pause(0.01) + + # check if the figure is closed, and if so, get out of the loop + if not plt.fignum_exists(fig.number): + break + +plt.ioff() # interactive mode off +plt.show() diff --git a/examples/interfaces/mouse_keyboard.py b/examples/interfaces/mouse_keyboard.py new file mode 100644 index 0000000..e110767 --- /dev/null +++ b/examples/interfaces/mouse_keyboard.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +"""Load the mouse keyboard interface. +""" + +from itertools import count + +import pyrobolearn as prl +from pyrobolearn.tools.interfaces.mouse_keyboard import MouseKeyboardInterface + + +# create simulator +sim = prl.simulators.Bullet() + +# create mouse keyboard interface +# Note that to give the simulator `sim` to the interface can be optional especially if there is only one simulator. +# The interface will look in the memory to check the instantiated simulators and take the first one if it exists. +interface = MouseKeyboardInterface(sim) + +# run interface +for _ in count(): + # perform a step with the interface + interface.step() + + # print pressed keys + if len(interface.key_pressed) > 0: + print("Keys that are pressed: {}".format(interface.key_pressed)) + if len(interface.key_down) > 0: + print("Keys that are down: {}".format(interface.key_down)) + + # perform a step with the simulator + sim.step(sleep_time=sim.dt) diff --git a/examples/interfaces/openpose.py b/examples/interfaces/openpose.py new file mode 100644 index 0000000..96e0bf7 --- /dev/null +++ b/examples/interfaces/openpose.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +"""Run the Openpose interface. + +Make sure that the webcam is connected, and that the openpose framework has been installed before running this code. +For this code to work, you have to specify the path to the openpose framework, or set the `OPENPOSE_PATH` environment +variable. Note that it can take some time to initialize the interface. +""" + +import cv2 +import argparse + +from pyrobolearn.tools.interfaces.camera.openpose import OpenPoseInterface + + +# create parser +parser = argparse.ArgumentParser() +parser.add_argument('-p', '--path', help='Absolute path to the openpose framework. If not specified, it will check ' + 'for the environment variable `OPENPOSE_PATH`.', type=str, default='') +parser.add_argument('-t', '--use_thread', help='If we should run the openpose interface in a thread.', type=bool, + default=False) +parser.add_argument('-f', '--detect_face', help='If we should detect the face with openpose.', type=bool, + default=True) +parser.add_argument('-a', '--detect_hands', help='If we should detect the hands with openpose.', type=bool, + default=False) +args = parser.parse_args() +path = None if args.path == '' else args.path + + +# create openpose interface +if args.use_thread: + # create and run interface in a thread + interface = OpenPoseInterface(openpose_path=path, detect_face=args.detect_face, detect_hands=args.detect_hands, + use_thread=True, sleep_dt=1. / 10, verbose=True) + raw_input('Press key to stop the openpose interface') +else: + # create interface + interface = OpenPoseInterface(openpose_path=path, detect_face=args.detect_face, detect_hands=args.detect_hands) + + # run interface + while True: + frame, keypoints = interface.run() + cv2.imshow("OpenPose 1.4.0 - Tutorial Python API", frame) + + # quit display if 'esc' button is pressed + key = cv2.waitKey(15) & 0xFF + if key == 27: + cv2.destroyWindow('frame') diff --git a/examples/interfaces/playstation.py b/examples/interfaces/playstation.py new file mode 100644 index 0000000..78a96f6 --- /dev/null +++ b/examples/interfaces/playstation.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +"""Load the Playstation game controller interface + +How to run: +``` +$ python playstation.py --help # for help +$ python playstation.py --controller ps # to use any PS game controller (by default) +$ python playstation.py --controller ps3 # to use PS3 game controller +$ python playstation.py --controller ps4 # to use PS4 game controller +``` + +Note that these game controllers are blocking by default, thus set `use_thread` to True to avoid to be blocked. +""" + +import time +import argparse + +from pyrobolearn.tools.interfaces.controllers.playstation import * + + +# create parser to select the game controller +parser = argparse.ArgumentParser() +parser.add_argument('-t', '--use_thread', help='If we should run the PlayStation controller in a thread.', type=bool, + default=True) +parser.add_argument('-c', '--controller', help='The Playstation game controller to use (ps, ps3, or ps4)', type=str, + choices=['ps', 'ps3', 'ps4'], default='ps') +args = parser.parse_args() + + +# load corresponding Playstation controller interface +if args.controller == 'ps': + controller = PSControllerInterface(use_thread=args.use_thread, verbose=False) +if args.controller == 'ps3': + controller = PS3ControllerInterface(use_thread=args.use_thread, verbose=False) +elif args.controller == 'ps4': + controller = PS4ControllerInterface(use_thread=args.use_thread, verbose=False) +else: + raise NotImplementedError("Unknown game controller") + + +# run controller +print('Running controller...') +while True: + + # run one step with the interface + controller.step() # same as `step()` if we are not using threads + + # get the last update and print it + b = controller.last_updated_button + print("Last updated button: {} with value: {}".format(b, controller[b])) + + # sleep a bit + time.sleep(0.01) diff --git a/examples/interfaces/robots/quadcopter_controller.py b/examples/interfaces/robots/quadcopter_controller.py new file mode 100644 index 0000000..2274649 --- /dev/null +++ b/examples/interfaces/robots/quadcopter_controller.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +"""Control a quadcopter in the air using an Xbox or Playstation game controller. + +how to run: +``` +$ python quadcopter_controller.py --help # for help +$ python quadcopter_controller.py --controller keyboard # to use the keyboard +$ python quadcopter_controller.py --controller xbox # to use Xbox game controller +$ python quadcopter_controller.py --controller ps # to use PS game controller +``` + +Mapping of the keyboard interface: +- `top arrow`: move forward +- `bottom arrow`: move backward +- `left arrow`: move sideways to the left +- `right arrow`: move sideways to the right +- `ctrl + top arrow`: ascend +- `ctrl + bottom arrow`: descend +- `ctrl + left arrow`: turn to the right +- `ctrl + right arrow`: turn to the left +- `space`: switch between first-person and third-person view + +Mapping between the controller and the quadcopter: +- left joystick: use to move the quadcopter +- right joystick: use to ascend/descend and turn +- south button (X on PlayStation and A on Xbox): change between the first-person and third-person view. +- east button (circle on PlayStation and B on Xbox): increase the speed +- west button (square on PlayStation and X on Xbox): decrease the speed +""" + +# import numpy as np +from itertools import count +import argparse + +import pyrobolearn as prl + + +# create parser to select the game controller +parser = argparse.ArgumentParser() +parser.add_argument('-c', '--controller', help='the controller to use', type=str, + choices=['keyboard', 'xbox', 'ps'], default='keyboard') +args = parser.parse_args() + + +# load corresponding interface +if args.controller == 'keyboard': # keyboard interface + from pyrobolearn.tools.interfaces.mouse_keyboard.mousekeyboard import MouseKeyboardInterface as Controller + from pyrobolearn.tools.bridges.mouse_keyboard.bridge_mousekeyboard_quadcopter \ + import BridgeMouseKeyboardQuadcopter as Bridge +elif args.controller == 'xbox': # Xbox interface + from pyrobolearn.tools.interfaces.controllers.xbox import XboxControllerInterface as Controller + from pyrobolearn.tools.bridges.controllers.robots.bridge_controller_quadcopter import BridgeControllerQuadcopter \ + as Bridge +elif args.controller == 'ps': # PS interface + from pyrobolearn.tools.interfaces.controllers.playstation import PSControllerInterface as Controller + from pyrobolearn.tools.bridges.controllers.robots.bridge_controller_quadcopter import BridgeControllerQuadcopter \ + as Bridge +else: + raise NotImplementedError("Unknown game controller") + + +# create simulator +sim = prl.simulators.Bullet() + +# create basic world (with a floor and gravity enabled by default) +world = prl.worlds.BasicWorld(sim) + +# load quadcopter +robot = prl.robots.Quadcopter(sim, position=[0., 0., 2.]) +world.load_robot(robot) + +# load interface that accepts input events +controller = Controller(use_thread=True, verbose=False) + +# load bridge that connects the interface/controller with the quadcopter +# The bridge is the one that maps the input events from the interface to commands sent to the quadcopter +bridge = Bridge(quadcopter=robot, interface=controller) + +# run simulator +for t in count(): + # perform a step with the bridge and interface + bridge.step(update_interface=True) + + # perform one step in the world + world.step(sleep_dt=1. / 240) diff --git a/examples/interfaces/robots/quadcopter_speech.py b/examples/interfaces/robots/quadcopter_speech.py new file mode 100644 index 0000000..c77dae6 --- /dev/null +++ b/examples/interfaces/robots/quadcopter_speech.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +"""Control a quadcopter in the air using speech. + +Try to say: +- turn right/left +- move/go higher/lower/forward/backward/right/left +- go faster/slower +- anything else will ask the robot to hover +""" + +from itertools import count + +import pyrobolearn as prl +from pyrobolearn.tools.bridges.audio.robots.bridge_speech_quadcopter import BridgeSpeechRecognizerQuadcopter + + +# create simulator +sim = prl.simulators.Bullet() + +# create basic world (with a floor and gravity enabled by default) +world = prl.worlds.BasicWorld(sim) + +# load quadcopter +robot = prl.robots.Quadcopter(sim, position=[0., 0., 2.]) +world.load_robot(robot) + +# load bridge that connects the speech interface with the quadcopter +# Note that it will create automatically the Speech Recognizer interface inside the bridge +bridge = BridgeSpeechRecognizerQuadcopter(robot=robot, interface=None, verbose=True) + + +# run simulator +for t in count(): + # perform a step with the bridge and interface + bridge.step(update_interface=True) + + # ask the world camera to follow the wheeled robot + world.follow(robot, distance=2) + + # perform one step in the world + world.step(sleep_dt=1. / 240) diff --git a/examples/interfaces/robots/wheeled_controller.py b/examples/interfaces/robots/wheeled_controller.py new file mode 100644 index 0000000..6d73334 --- /dev/null +++ b/examples/interfaces/robots/wheeled_controller.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python +"""Control a wheeled robot using a keyboard, an Xbox or Playstation game controller. + +how to run: +``` +$ python wheeled_controller.py --help # for help +$ python wheeled_controller.py --controller keyboard # to use the keyboard +$ python wheeled_controller.py --controller xbox # to use Xbox game controller +$ python wheeled_controller.py --controller ps # to use PS game controller +``` + +Mapping of the keyboard interface: +* `top arrow`: move forward +* `bottom arrow`: move backward +* `left arrow`: turn/steer to the left +* `right arrow`: turn/steer to the right + +Mapping between the controller and the wheeled robot: +- left joystick: velocity of the wheeled robot +- east button (circle on PlayStation and B on Xbox): increase the speed +- west button (square on PlayStation and X on Xbox): decrease the speed +""" + +# import numpy as np +from itertools import count +import argparse + +import pyrobolearn as prl + + +# create parser to select the game controller +parser = argparse.ArgumentParser() +parser.add_argument('-c', '--controller', help='the controller to use', type=str, + choices=['keyboard', 'xbox', 'ps'], default='keyboard') +args = parser.parse_args() + + +# load corresponding interface +if args.controller == 'keyboard': # keyboard interface + from pyrobolearn.tools.interfaces.mouse_keyboard.mousekeyboard import MouseKeyboardInterface as Controller + from pyrobolearn.tools.bridges.mouse_keyboard.bridge_mousekeyboard_wheeled \ + import BridgeMouseKeyboardDifferentialWheeledRobot as Bridge +elif args.controller == 'xbox': # Xbox interface + from pyrobolearn.tools.interfaces.controllers.xbox import XboxControllerInterface as Controller + from pyrobolearn.tools.bridges.controllers.robots.bridge_controller_wheeled import BridgeControllerWheeledRobot \ + as Bridge +elif args.controller == 'ps': # PS interface + from pyrobolearn.tools.interfaces.controllers.playstation import PSControllerInterface as Controller + from pyrobolearn.tools.bridges.controllers.robots.bridge_controller_wheeled import \ + BridgeControllerWheeledRobot as Bridge +else: + raise NotImplementedError("Unknown game controller") + + +# create simulator +sim = prl.simulators.Bullet() + +# create basic world (with a floor and gravity enabled by default) +world = prl.worlds.BasicWorld(sim) + +# load wheeled robot +robot = prl.robots.Epuck(sim, position=[0., 0.]) +world.load_robot(robot) + +# load interface that accepts input events +controller = Controller(use_thread=True, verbose=False) + +# load bridge that connects the interface/controller with the quadcopter +# The bridge is the one that maps the input events from the interface to commands sent to the quadcopter +bridge = Bridge(robot=robot, interface=controller) + + +# run simulator +for t in count(): + # perform a step with the bridge and interface + bridge.step(update_interface=True) + + # perform one step in the world + world.step(sleep_dt=1. / 240) diff --git a/examples/interfaces/robots/wheeled_speech.py b/examples/interfaces/robots/wheeled_speech.py new file mode 100644 index 0000000..b320eff --- /dev/null +++ b/examples/interfaces/robots/wheeled_speech.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +"""Control a wheeled robot in the air using speech. + +Try to say: +- turn right/left +- move/go forward/backward +- go faster/slower +- anything else will ask the robot to hover +""" + +from itertools import count + +import pyrobolearn as prl +from pyrobolearn.tools.bridges.audio.robots.bridge_speech_wheeled import BridgeSpeechRecognizerDifferentialWheeledRobot + + +# create simulator +sim = prl.simulators.Bullet() + +# create basic world (with a floor and gravity enabled by default) +world = prl.worlds.BasicWorld(sim) + +# load wheeled robot +robot = prl.robots.Epuck(sim, position=[0., 0.]) +world.load_robot(robot) + +# load bridge that connects the speech interface with the wheeled robot +# Note that it will create automatically the Speech Recognizer interface inside the bridge +bridge = BridgeSpeechRecognizerDifferentialWheeledRobot(robot=robot, interface=None, verbose=True) + + +# run simulator +for t in count(): + # perform a step with the bridge and interface + bridge.step(update_interface=True) + + # ask the world camera to follow the wheeled robot + world.follow(robot, distance=2) + + # perform one step in the world + world.step(sleep_dt=1. / 240) diff --git a/examples/interfaces/spacemouse.py b/examples/interfaces/spacemouse.py new file mode 100644 index 0000000..10243fa --- /dev/null +++ b/examples/interfaces/spacemouse.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +"""Run the Space mouse interface. + +Make sure that the `spnav` library is installed, and the space mouse (by 3Dconnexion) is connected to the computer +before running this code. +""" + +import argparse +import time + +from pyrobolearn.tools.interfaces.mouse_keyboard.spacemouse import SpaceMouseInterface + + +# create parser +parser = argparse.ArgumentParser() +parser.add_argument('-t', '--use_thread', help='If we should run the webcam interface in a thread.', type=bool, + default=True) +args = parser.parse_args() + + +# create webcam interface +if args.use_thread: + # create and run interface in a thread + interface = SpaceMouseInterface(use_thread=True, sleep_dt=0.001, verbose=True) + raw_input('Press key to stop the space mouse interface') +else: + # create interface + interface = SpaceMouseInterface(use_thread=False, verbose=True) + + while True: + # perform a `step` with the interface + interface.step() + time.sleep(0.001) diff --git a/examples/interfaces/speech.py b/examples/interfaces/speech.py new file mode 100644 index 0000000..a47ec2a --- /dev/null +++ b/examples/interfaces/speech.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python +"""Run the speech interface. + +This will perform speech recognition, translation, and synthesization. Make sure that your computer has a microphone +connected. + +In the future, interfaces using the Google assistant, Alexa, or a similar tool will be implemented. +""" + +import argparse + +from pyrobolearn.tools.interfaces.audio.speech import SpeechRecognizerInterface, SpeechTranslatorInterface + + +# get the available languages. +languages = SpeechRecognizerInterface.available_languages +print("Available languages are: {}".format(languages)) + +# create parser +parser = argparse.ArgumentParser() +# parser.add_argument('-t', '--use_thread', help='If we should run the webcam interface in a thread.', type=bool, +# default=False) +parser.add_argument('-l', '--lang', help='The language that needs to be recognized.', type=str, choices=languages, + default='english') +parser.add_argument('-a', '--target_lang', help='If we should get depth images.', type=str, choices=languages, + default='english') +args = parser.parse_args() + + +# create speech recognizer/translator interface +# interface = SpeechRecognizerInterface(verbose=True, lang=args.lang) +interface = SpeechTranslatorInterface(verbose=True, from_lang=args.lang, target_lang=args.target_lang) + +# run the interface +while True: + data = interface.step() diff --git a/examples/interfaces/webcam.py b/examples/interfaces/webcam.py index 1c46d6d..e839fe0 100644 --- a/examples/interfaces/webcam.py +++ b/examples/interfaces/webcam.py @@ -1,34 +1,52 @@ #!/usr/bin/env python -"""Load the Webcam interface. +"""Run the Webcam interface. + +Make sure that the webcam is connected before running this code. Note that it can take some time to initialize +the interface. """ -from itertools import count +import argparse import matplotlib.pyplot as plt + from pyrobolearn.tools.interfaces.camera.webcam import WebcamInterface -# create interface -interface = WebcamInterface(use_thread=True, sleep_dt=1./10, verbose=False) -# plotting using matplotlib in interactive mode -fig = plt.figure() -plot = None -plt.ion() # interactive mode on +# create parser +parser = argparse.ArgumentParser() +parser.add_argument('-t', '--use_thread', help='If we should run the webcam interface in a thread.', type=bool, + default=False) +args = parser.parse_args() -for _ in count(): - # # if don't use thread call `step` or `run` (note that `run` returns the frame but not - # interface.step() - # get the frame and plot it with matplotlib - frame = interface.frame - if plot is None: - plot = plt.imshow(frame) - else: - plot.set_data(frame) - plt.pause(0.01) +# create webcam interface +if args.use_thread: + # create and run interface in a thread + interface = WebcamInterface(use_thread=True, sleep_dt=1./10, verbose=True) + raw_input('Press key to stop the webcam interface') +else: + # create interface + interface = WebcamInterface() - # check if the figure is closed, and if so, get out of the loop - if not plt.fignum_exists(fig.number): - break + # plotting using matplotlib in interactive mode + fig = plt.figure() + plot = None + plt.ion() # interactive mode on -plt.ioff() # interactive mode off -plt.show() + while True: + # perform a `step` with the interface + interface.step() + + # get the frame and plot it with matplotlib + frame = interface.frame + if plot is None: + plot = plt.imshow(frame) + else: + plot.set_data(frame) + plt.pause(0.01) + + # check if the figure is closed, and if so, get out of the loop + if not plt.fignum_exists(fig.number): + break + + plt.ioff() # interactive mode off + plt.show() diff --git a/examples/interfaces/xbox.py b/examples/interfaces/xbox.py new file mode 100644 index 0000000..03a8ca8 --- /dev/null +++ b/examples/interfaces/xbox.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +"""Load the Xbox game controller interface + +How to run: +``` +$ python xbox.py --help # for help +$ python xbox.py --controller xbox # to use any Xbox game controller (by default) +$ python xbox.py --controller xbox-360 # to use Xbox 360 game controller +$ python xbox.py --controller xbox-one # to use Xbox One game controller +``` + +Note that these game controllers are blocking by default, thus set `use_thread` to True to avoid to be blocked. +""" + +import time +import argparse + +from pyrobolearn.tools.interfaces.controllers.xbox import XboxControllerInterface, XboxOneControllerInterface, \ + Xbox360ControllerInterface + + +# create parser to select the game controller +parser = argparse.ArgumentParser() +parser.add_argument('-t', '--use_thread', help='If we should run the Xbox controller in a thread.', type=bool, + default=True) +parser.add_argument('-c', '--controller', help='The Xbox game controller to use.', type=str, + choices=['xbox', 'xbox-360', 'xbox-one'], default='xbox') +args = parser.parse_args() + + +# load corresponding Xbox controller interface +if args.controller == 'xbox': + controller = XboxControllerInterface(use_thread=args.use_thread, verbose=False) +elif args.controller == 'xbox-360': + controller = Xbox360ControllerInterface(use_thread=args.use_thread, verbose=False) +elif args.controller == 'xbox-one': + controller = XboxOneControllerInterface(use_thread=args.use_thread, verbose=False) +else: + raise NotImplementedError("Unknown game controller") + + +# run controller +print('Running controller...') +while True: + + # run one step with the interface + controller.step() + + # get the last update and print it + b = controller.last_updated_button + print("Last updated button: {} with value: {}".format(b, controller[b])) + + # sleep a bit + time.sleep(0.01) diff --git a/examples/kinematics/README.md b/examples/kinematics/README.md index 951c700..c4f317b 100644 --- a/examples/kinematics/README.md +++ b/examples/kinematics/README.md @@ -2,6 +2,19 @@ We provide examples on how to perform forward and inverse kinematics. +Here are the forward kinematics (FK) examples that the user can try: +1. `fk.py`: simple forward kinematics example where we directly sent desired joint positions to the Kuka +manipulator. + +Here are the inverse kinematics (IK) examples that the user can try: +1. `ik.py`: simple inverse kinematics example where the Kuka manipulator has to reach a certain target position +in the world. In this example, the user can also choose the damped-least-squares IK solver. +2. `ik_libraries.py`: comparison between different IK libraries including `pybullet`, `PyKDL`, `trac_ik`, and +`rbdl` using the Kuka manipulator. +3. `moving_sphere.py`: damped-least-squares IK with the Kuka manipulator where the goal is to follow a sphere +that moves in a circular manner. + + References: - [1] "Robotics: Modelling, Planning and Control", Siciliano et al., 2010 - [2] "Springer Handbook of Robotics", Siciliano et al., 2008 diff --git a/examples/kinematics/forward/fk.py b/examples/kinematics/forward/fk.py index fa813c0..5f3bce8 100644 --- a/examples/kinematics/forward/fk.py +++ b/examples/kinematics/forward/fk.py @@ -43,7 +43,7 @@ sphere = Body(sim, body_id=sphere) for t in count(): # if no more joint positions, get out of the loop - if t > len(positions): + if t >= len(positions): break # set joint positions diff --git a/examples/kinematics/inverse/ik.py b/examples/kinematics/inverse/ik.py index 6f0f28a..a5bc89b 100644 --- a/examples/kinematics/inverse/ik.py +++ b/examples/kinematics/inverse/ik.py @@ -8,16 +8,25 @@ Set the `solver_flag` to a number between 0 and 1 (see lines [19,22]) to select import numpy as np from itertools import count +import argparse from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import KukaIIWA +# create parser to select the IK solver +parser = argparse.ArgumentParser() +parser.add_argument('-s', '--solver', help='the IK solver to select (0: use robot.calculate_inverse_kinematics(), ' + '1: use damped-least-squares IK using Jacobian)', type=int, + choices=[0, 1], default=1) +args = parser.parse_args() + + # select IK solver, by setting the flag: # 0 = pybullet + calculate_inverse_kinematics() # 1 = pybullet + damped-least-squares IK using Jacobian (provided by pybullet) -solver_flag = 1 # 1 and 4 gives pretty good results +solver_flag = args.solver # 1 gives a pretty good result # Create simulator @@ -34,6 +43,7 @@ robot.print_info() dt = 1./240 link_id = robot.get_end_effector_ids(end_effector=0) joint_ids = robot.joints # actuated joint +# joint_ids = joint_ids[2:] damping = 0.01 # for damped-least-squares IK wrt_link_id = -1 # robot.get_link_ids('iiwa_link_1') @@ -41,11 +51,10 @@ wrt_link_id = -1 # robot.get_link_ids('iiwa_link_1') xd = np.array([0.5, 0., 0.5]) world.load_visual_sphere(xd, radius=0.05, color=(1, 0, 0, 0.5)) -# joint_ids = joint_ids[2:] - +# change the robot visual robot.change_transparency() -robot.draw_link_frames([-1, 0]) -robot.draw_bounding_boxes(joint_ids[0]) +robot.draw_link_frames(link_ids=[-1, 0]) +robot.draw_bounding_boxes(link_ids=joint_ids[0]) # robot.draw_link_coms([-1,0]) qIdx = robot.get_q_indices(joint_ids) diff --git a/examples/kinematics/inverse/ik_libraries.py b/examples/kinematics/inverse/ik_libraries.py index a736247..ab8d51f 100644 --- a/examples/kinematics/inverse/ik_libraries.py +++ b/examples/kinematics/inverse/ik_libraries.py @@ -14,40 +14,23 @@ Set the `solver_flag` to a number between 0 and 4 (see lines [53,60]) to select import os import numpy as np from itertools import count +import argparse from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import KukaIIWA -# import PyKDL -try: - import PyKDL as kdl -except ImportError as e: - raise ImportError(repr(e) + '\nTry to install `PyKDL`: ' - 'sudo apt-get install ros--python-orocos-kdl' - 'or install it manually from `https://github.com/orocos/orocos_kinematics_dynamics`') - -# import kdl_parser_py -try: - import kdl_parser_py.urdf as KDLParser -except ImportError as e: - raise ImportError(repr(e) + '\nTry to install `kdl_parser_py`: ' - 'sudo apt-get install ros--kdl-parser-py') - -# import track_ik_python -try: - from trac_ik_python.trac_ik import IK as TracIK -except ImportError as e: - raise ImportError(repr(e) + '\nTry to install `trac_ik_python`: ' - 'sudo apt-get install ros--trac-ik-python') - -# import rbdl -try: - import rbdl -except ImportError as e: - raise ImportError(repr(e) + '\nTry to install `rbdl` manually from `https://bitbucket.org/rbdl/rbdl`') - +# create parser to select the IK solver +parser = argparse.ArgumentParser() +parser.add_argument('-s', '--solver', help='the IK solver to select:\n' + '0: use robot.calculate_inverse_kinematics()\n' + '1: use damped-least-squares IK using Jacobian (provided by simulator)\n' + '2: use PyKDL\n' + '3: use trac_ik\n' + '4: use rbdl + damped-least-squares IK using Jacobian (provided by rbdl)', + type=int, choices=[0, 1, 2, 3, 4], default=1) +args = parser.parse_args() # TO BE SET BY THE USER # select IK solver, by setting the flag: @@ -56,7 +39,39 @@ except ImportError as e: # 2 = PyKDL # 3 = trac_ik # 4 = rbdl + damped-least-squares IK using Jacobian (provided by rbdl) -solver_flag = 1 # 1 and 4 gives pretty good results +solver_flag = args.solver # 1 and 4 gives pretty good results + +if solver_flag == 2: # PyKDL + # import PyKDL + try: + import PyKDL as kdl + except ImportError as e: + raise ImportError(repr(e) + '\nTry to install `PyKDL`: ' + 'sudo apt-get install ros--python-orocos-kdl' + 'or install it manually from ' + '`https://github.com/orocos/orocos_kinematics_dynamics`') + + # import kdl_parser_py + try: + import kdl_parser_py.urdf as kdl_parser + except ImportError as e: + raise ImportError(repr(e) + '\nTry to install `kdl_parser_py`: ' + 'sudo apt-get install ros--kdl-parser-py') + +elif solver_flag == 3: # trac_ik_python + # import trac_ik_python + try: + from trac_ik_python.trac_ik import IK as trac_ik + except ImportError as e: + raise ImportError(repr(e) + '\nTry to install `trac_ik_python`: ' + 'sudo apt-get install ros--trac-ik-python') + +elif solver_flag == 4: # rbdl + # import rbdl + try: + import rbdl + except ImportError as e: + raise ImportError(repr(e) + '\nTry to install `rbdl` manually from `https://bitbucket.org/rbdl/rbdl`') # Create simulator @@ -181,7 +196,7 @@ elif solver_flag == 1: ################## elif solver_flag == 2: print("Using PyKDL:") - model = KDLParser.treeFromFile(urdf) + model = kdl_parser.treeFromFile(urdf) if model[0]: model = model[1] else: @@ -237,7 +252,7 @@ elif solver_flag == 3: urdf_string = open(urdf, 'r').read() # create IK solver - ik_solver = TracIK(base_link=base_name, tip_link=end_effector_name, urdf_string=urdf_string, solve_type='Distance') + ik_solver = trac_ik(base_link=base_name, tip_link=end_effector_name, urdf_string=urdf_string, solve_type='Distance') # define upper and lower limits (optional) # lb, ub = -np.ones(6)*100, np.ones(6)*100 diff --git a/examples/manipulability/2d_manipulability.py b/examples/manipulability/2d_manipulability.py new file mode 100644 index 0000000..85350d8 --- /dev/null +++ b/examples/manipulability/2d_manipulability.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +"""Draw the 2D velocity and force manipulability ellipsoids on the end-effector of a 3-link planar manipulator. + +References: + [1] "Robotics: Modelling, Planning and Control" (section 3.9), Siciliano et al., 2010 +""" + +import time +# from itertools import count +import numpy as np + +import pyrobolearn as prl + + +# create simulator +sim = prl.simulators.Bullet() + +# create world +world = prl.worlds.BasicWorld(sim) + +# create robot +robot = world.load_robot('manipulator2d') +robot.reset_joint_states(q=[0.64453457, -1.65045902, -0.31141744]) + +# change camera view +world.camera.reset(distance=2, yaw=-np.pi / 2, pitch=-np.pi/2.01) + +# draw 2d velocity manipulability ellipsoid +# print(robot.end_effector_names) +end_effector_id = robot.get_link_ids('gripper') +jacobian = robot.get_linear_jacobian(link_id=end_effector_id) +jjt = robot.get_JJT(jacobian) +robot.draw_velocity_manipulability_ellipsoid(link_id=end_effector_id, JJT=jjt, color=(0, 1, 0, 0.7)) # green +robot.draw_force_manipulability_ellipsoid(link_id=end_effector_id, JJT=jjt, color=(1, 0, 0, 0.7)) # red + +# TODO: fix bug + +time.sleep(10000) +# run simulator +# for t in count(): +# world.step(sleep_dt=1./240) diff --git a/examples/manipulability/README.md b/examples/manipulability/README.md index 3c9e9a8..8f2b826 100644 --- a/examples/manipulability/README.md +++ b/examples/manipulability/README.md @@ -2,6 +2,16 @@ We provide examples on how to use manipulability ellipsoids. +Here are a short description of the various examples the user can try: +1. `2d_manipulability.py`: draw the 2D velocity and force manipulability ellipsoids on the end-effector of a +3-link planar manipulator. +2. `com_manipulability_tracking.py`: track the velocity manipulability ellipsoid of the center of mass of a robot +with a fixed base. +3. `com_manipulability_tracking_with_balance.py`: track the velocity manipulability ellipsoid of the center of mass +of a floating-base robot while keeping its balance. +4. `com_dynamic_manipulability_tracking_with_balance.py`: track the dynamic manipulability ellipsoid of the center +of mass of a floating-base robot while keeping its balance. + References: - [1] "Robotics: Modelling, Planning and Control", Siciliano et al., 2010 - [2] "Springer Handbook of Robotics", Siciliano et al., 2008 diff --git a/examples/manipulability/com_dynamic_manipulability_tracking_with_balance.py b/examples/manipulability/com_dynamic_manipulability_tracking_with_balance.py index a4f029c..9154ca7 100644 --- a/examples/manipulability/com_dynamic_manipulability_tracking_with_balance.py +++ b/examples/manipulability/com_dynamic_manipulability_tracking_with_balance.py @@ -185,13 +185,13 @@ CoMr = robot.get_center_of_mass_position() # Desired CoM print("CoMr: {}".format(CoMr)) if robot.name == 'centauro': - xref_l1f = robot.get_link_frame_world_positions(left_foot1_id) # Desired position for left foot - xref_r1f = robot.get_link_frame_world_positions(right_foot1_id) # Desired position for right foot - xref_l2f = robot.get_link_frame_world_positions(left_foot2_id) # Desired position for left foot - xref_r2f = robot.get_link_frame_world_positions(right_foot2_id) # Desired position for right foot + xref_l1f = robot.get_link_world_frame_positions(left_foot1_id) # Desired position for left foot + xref_r1f = robot.get_link_world_frame_positions(right_foot1_id) # Desired position for right foot + xref_l2f = robot.get_link_world_frame_positions(left_foot2_id) # Desired position for left foot + xref_r2f = robot.get_link_world_frame_positions(right_foot2_id) # Desired position for right foot else: - xref_lf = robot.get_link_frame_world_positions(left_foot_id) # Desired position for left foot - xref_rf = robot.get_link_frame_world_positions(right_foot_id) # Desired position for right foot + xref_lf = robot.get_link_world_frame_positions(left_foot_id) # Desired position for left foot + xref_rf = robot.get_link_world_frame_positions(right_foot_id) # Desired position for right foot # Display initial and desired manipulability ellipsoid @@ -220,13 +220,13 @@ for i in range(num_samples): robot.draw_com_position(0.03) if robot.name == 'centauro': - xt_l1f = robot.get_link_frame_world_positions(left_foot1_id) # Current position for left foot - xt_r1f = robot.get_link_frame_world_positions(right_foot1_id) # Current position for right foot - xt_l2f = robot.get_link_frame_world_positions(left_foot2_id) # Current position for left foot - xt_r2f = robot.get_link_frame_world_positions(right_foot2_id) # Current position for right foot + xt_l1f = robot.get_link_world_frame_positions(left_foot1_id) # Current position for left foot + xt_r1f = robot.get_link_world_frame_positions(right_foot1_id) # Current position for right foot + xt_l2f = robot.get_link_world_frame_positions(left_foot2_id) # Current position for left foot + xt_r2f = robot.get_link_world_frame_positions(right_foot2_id) # Current position for right foot else: - xt_lf = robot.get_link_frame_world_positions(left_foot_id) # Current left foot pos - xt_rf = robot.get_link_frame_world_positions(right_foot_id) # Current right foot pos + xt_lf = robot.get_link_world_frame_positions(left_foot_id) # Current left foot pos + xt_rf = robot.get_link_world_frame_positions(right_foot_id) # Current right foot pos # Simple balance control with IK kinematics for CoM and feet # Get Jacobians: Jcom, Jlf, and Jrf diff --git a/examples/manipulability/com_manipulability_tracking_with_balance.py b/examples/manipulability/com_manipulability_tracking_with_balance.py index c83c1a9..09752eb 100644 --- a/examples/manipulability/com_manipulability_tracking_with_balance.py +++ b/examples/manipulability/com_manipulability_tracking_with_balance.py @@ -181,15 +181,15 @@ CoMr = robot.get_center_of_mass_position() # Desired CoM print("CoMr: {}".format(CoMr)) if robot.name == 'centauro': - xref_l1f = robot.get_link_frame_world_positions(left_foot1_id) # Desired position for left foot - xref_r1f = robot.get_link_frame_world_positions(right_foot1_id) # Desired position for right foot - xref_l2f = robot.get_link_frame_world_positions(left_foot2_id) # Desired position for left foot - xref_r2f = robot.get_link_frame_world_positions(right_foot2_id) # Desired position for right foot + xref_l1f = robot.get_link_world_frame_positions(left_foot1_id) # Desired position for left foot + xref_r1f = robot.get_link_world_frame_positions(right_foot1_id) # Desired position for right foot + xref_l2f = robot.get_link_world_frame_positions(left_foot2_id) # Desired position for left foot + xref_r2f = robot.get_link_world_frame_positions(right_foot2_id) # Desired position for right foot else: - xref_lf = robot.get_link_frame_world_positions(left_foot_id) # Desired position for left foot - # Qref_lf = robot.get_link_frame_world_orientations(leftFootId) - xref_rf = robot.get_link_frame_world_positions(right_foot_id) # Desired position for right foot - # Qref_rf = robot.get_link_frame_world_orientations(rightFootId) + xref_lf = robot.get_link_world_frame_positions(left_foot_id) # Desired position for left foot + # Qref_lf = robot.get_link_world_frame_orientations(leftFootId) + xref_rf = robot.get_link_world_frame_positions(right_foot_id) # Desired position for right foot + # Qref_rf = robot.get_link_world_frame_orientations(rightFootId) # Display initial and desired manipulability ellipsoid @@ -221,14 +221,14 @@ for i in range(400): robot.draw_com_position(0.03) if robot.name == 'centauro': - xt_l1f = robot.get_link_frame_world_positions(left_foot1_id) # Current position for left foot - xt_r1f = robot.get_link_frame_world_positions(right_foot1_id) # Current position for right foot - xt_l2f = robot.get_link_frame_world_positions(left_foot2_id) # Current position for left foot - xt_r2f = robot.get_link_frame_world_positions(right_foot2_id) # Current position for right foot + xt_l1f = robot.get_link_world_frame_positions(left_foot1_id) # Current position for left foot + xt_r1f = robot.get_link_world_frame_positions(right_foot1_id) # Current position for right foot + xt_l2f = robot.get_link_world_frame_positions(left_foot2_id) # Current position for left foot + xt_r2f = robot.get_link_world_frame_positions(right_foot2_id) # Current position for right foot else: - xt_lf = robot.get_link_frame_world_positions(left_foot_id) # Current left foot pos - # Qt_lf = robot.get_link_frame_world_orientations(leftFootId) - xt_rf = robot.get_link_frame_world_positions(right_foot_id) # Current right foot pos + xt_lf = robot.get_link_world_frame_positions(left_foot_id) # Current left foot pos + # Qt_lf = robot.get_link_world_frame_orientations(leftFootId) + xt_rf = robot.get_link_world_frame_positions(right_foot_id) # Current right foot pos # Simple balance control with IK kinematics for CoM and feet # Get Jacobians: Jcom, Jlf, and Jrf diff --git a/examples/rewards/README.rst b/examples/rewards/README.rst new file mode 100644 index 0000000..7662883 --- /dev/null +++ b/examples/rewards/README.rst @@ -0,0 +1,73 @@ +Rewards +======= + +In this folder, we provide examples on how to use reward/cost functions which are provided to reinforcement learning environments. +We show the available operations you can use on these. + +The reward function might be defined as [1]_: + +- :math:`r: \mathcal{S} \rightarrow \mathbb{R}`: given the state :math:`s \in \mathcal{S}`, it returns the reward value :math:`r(s)`. +- :math:`r: \mathcal{S} \times \mathcal{A} \rightarrow \mathbb{R}`: given the state :math:`s \in \mathcal{S}` and action :math:`a \in \mathcal{A}`, it returns the reward value :math:`r(s,a)`. +- :math:`r: \mathcal{S} \times \mathcal{A} \times \mathcal{S} \rightarrow \mathbb{R}`: given the state :math:`s \in \mathcal{S}`, action :math:`a \in \mathcal{A}`, and next state :math:`s' \in \mathcal{S}`, it returns the reward value :math:`r(s,a,s')`. + +Note that the cost function is just minus the reward function, i.e. it is given by :math:`c(s,a,s') = -r(s,a,s')`. + +In PRL, all reward functions inherit from the abstract ``Reward`` class defined in `pyrobolearn/rewards/reward.py `_, and several methods and operations are provided. +You can for instance: + +* provide the ``State`` and/or ``Action`` instances to some reward functions that will compute the reward value based on their value. +* access to the range of the reward function. +* add, multiply, divide, subtract, and apply basic functions such as :math:`\exp`, :math:`\cos`, :math:`\sin`, and others on reward functions. The resulting range is automatically scaled based on the operations. +* define your own rewards/costs and reuse them in your code. + +Here is a short snippet showing the basic usage of reward functions: + +.. code-block:: python + :linenos: + + import pyrobolearn as prl + from pyrobolearn.rewards import FixedReward, YourReward + + # define the simulator and world (and load what you want in it) + sim = ... + world = ... + ... + + # define your state / action for your reward function + state = ... + action = ... + + # define the reward function + reward = 2 * FixedReward(3) + 0.5 * YourReward(state, action) + + # print the range of the reward function + print(reward.range) + + # compute the reward value + value = reward() + print(value) + + # update the state for instance + state() # this will modify the internal state data + + # recompute the reward value + value = reward() + print(value) # you will normally get a different value + + # you can give the reward function to your RL environment + # which will use it when calling `env.step()`. + env = prl.envs.Env(world, state, reward) + + +Examples +~~~~~~~~ + +Here are few examples that you can find in this folder that better demonstrate how to use the reward functions: + +1. ``basics.py``: demonstrate the various features (operations) you can use with the ``Reward`` class. +2. ``manipulator.py``: show how the distance cost decreases as you move the manipulator (with your mouse) closer to the target object in the world. +3. ``forward_progress.py``: show how the reward function that measures how much a robot has moved forward increases / decreases based on the robot velocity. Use the arrow keys on your keyboard to move the robot, and observe how the computed reward value changes. + +References: + +.. [1] "Reinforcement Learning: An Introduction", Sutton and Barto, 1998 \ No newline at end of file diff --git a/examples/rewards/basics.py b/examples/rewards/basics.py new file mode 100644 index 0000000..7ce4dd4 --- /dev/null +++ b/examples/rewards/basics.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +"""Demonstrate the various features (operations) you can use with the ``Reward`` class. + +To illustrate the various operations we use the ``FixedReward``. + +See the other examples to see how to use more complex reward functions. +""" + +import numpy as np + +# You can import in two ways reward functions +import pyrobolearn as prl # import PRL +from pyrobolearn.rewards import FixedReward # specify which function you want to import + +# You can also import all the reward functions and the mathematical functions but I usually avoid it because +# we do not know while reading the code where the various classes and other functionalities come from +# from pyrobolearn.rewards import * + + +# define two fixed reward functions +r1 = prl.rewards.FixedReward(value=3) +r2 = FixedReward(value=2, range=(-2, 2)) + +# print their value by calling them +print("\nInitial rewards: r1 = {}, and r2 = {}".format(r1, r2)) +print("Initial reward value: r1() = {}, and r2() = {}".format(r1(), r2())) +print("Initial reward range: range(r1) = {}, and range(r2) = {}".format(r1.range, r2.range)) + +# try to define a fixed reward function where the initial value is not in the defined range +try: + r3 = FixedReward(value=2, range=(-1, 1)) +except ValueError as e: + print("\nTrying `r3=FixedReward(value=2, range=(-1,1))` results in an error: \n" + str(e) + "\n") + + +# perform some mathematical operations on them +r4 = 2 * prl.rewards.cos(r1) - 3 * r2 + +# print its value and range +print("Perform mathematical operations on r1 and r2:") +print("r4 = 2 * cos(r1) - 3 * r2 = {}".format(r4())) +print("2 * cos(3) - 3 * 2 = {}".format(2 * np.cos(3) - 3 * 2)) +print("range(r4) = {}".format(r4.range)) + + +# try to perform an operation which it not authorized +try: + r5 = r1 / r2 # the range of r2 is [-2, 2] and thus there is a chance it could be 0 at one point +except ValueError as e: + print("\nTrying `r5 = r1 / r2` results in an error: \n" + str(e) + "\n") + + +# The range of r2 is [-2, 2], if a reward function computes a reward value which is not in the range, +# it will automatically be clipped. +r2.value = 3 # you can only set the value for the FixedReward +print("Setting r2.value=3 while its range is [-2, 2], and computing the reward will result in: r2={}".format(r2())) diff --git a/examples/rewards/forward_progress.py b/examples/rewards/forward_progress.py new file mode 100644 index 0000000..14a9af7 --- /dev/null +++ b/examples/rewards/forward_progress.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +"""Demonstrate how the reward function that measures how much a robot has moved forward increases / decreases based on +the robot velocity. Use the arrow keys on your keyboard to move the robot, and observe how the computed reward value +changes. +""" + +from itertools import count +import pyrobolearn as prl + + +# Create simulator +sim = prl.simulators.Bullet() + +# create world +world = prl.worlds.BasicWorld(sim) + +# create wheeled robot +robot = world.load_robot('epuck') + +# create interface and bridge to control the robot with the keyboard +interface = prl.tools.interfaces.MouseKeyboardInterface() +bridge = prl.tools.bridges.BridgeMouseKeyboardDifferentialWheeledRobot(robot=robot, interface=interface) + +# create state +state = prl.states.BasePositionState(robot) + +# create reward +reward = 1000 * prl.rewards.ForwardProgressReward(state=state, direction=(1, 0, 0)) + + +# run simulation +for t in count(): + # perform a step with the bridge and interface + bridge.step(update_interface=True) + + # update state: in this case it will get the base position state and will save it in the state instance + state() + + # compute reward: this will look in the previously given state instance its current state data + print("Reward value = {}".format(reward())) + + # perform a step in the simulator + world.step(sim.dt) diff --git a/examples/rewards/manipulator.py b/examples/rewards/manipulator.py new file mode 100644 index 0000000..c234ba9 --- /dev/null +++ b/examples/rewards/manipulator.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +"""Demonstrate how the distance cost decreases as you move the manipulator (with your mouse) closer to the target +object in the world. +""" + +from itertools import count +import pyrobolearn as prl + + +# Create simulator +sim = prl.simulators.Bullet() + +# create world +world = prl.worlds.BasicWorld(sim) + +# create robot +robot = world.load_robot('kuka_iiwa') +end_effector_id = robot.end_effectors[0] +robot.print_info() + +# desired position +sphere = world.load_visual_sphere([0.5, 0., 0.], radius=0.05, color=(1, 0, 0, 0.5), return_body=True) + +# create state +state = prl.states.LinkWorldPositionState(robot, link_ids=end_effector_id) + +# create reward +# note that the given 'sphere' to the cost is not a state, and thus a PositionState will automatically be created +# for that 'sphere', and called at each time the reward is computed. +reward = prl.rewards.DistanceCost(state, sphere) + +# run simulation +for t in count(): + # update state + state() + + # compute reward + print("Reward value = {}".format(reward())) + + # perform a step in the simulator + world.step(sim.dt) diff --git a/examples/robots/README.md b/examples/robots/README.md index 3a46ca9..e945c60 100644 --- a/examples/robots/README.md +++ b/examples/robots/README.md @@ -1,5 +1,22 @@ ## Robot examples -You can try to load different robot by typing `python .py`. +More than 60 robots (of various types) are available through `pyrobolearn`. -To turn the camera in the simulator, keep pressing the `ctrl` key and the left button on the mouse, and move this last one. +Here are the few examples that you can find in this folder: +1. `load_robot.py `: load the given robot in the world. +2. `visualize_robot.py `: test different visualization tools that can be used on the robot to show its +joint axis, bounding boxes, and others. +3. `robot_with_sliders.py `: load the given robot in the world and allow you to manipulate the robot's +joints with sliders. +4. `distribute_epucks.py`: distribute several e-pucks in the world and make them move forward. +5. `quadcopter_controller.py`: move a quadcopter in the air using an Xbox or Playstation game controller. +6. `robots/.py`: load the given robot in the simulator by directly instantiating it. Some of these files do +more than just loading the robot. + +Notes: to turn the camera in the simulator, keep pressing the `ctrl` key and the left button on the mouse, and +move this last one. + + +#### What to check next? + +Check the `pyrobolearn/examples/interfaces` or `pyrobolearn/examples/kinematics` folder. diff --git a/examples/robots/distribute_epucks.py b/examples/robots/distribute_epucks.py new file mode 100644 index 0000000..3519785 --- /dev/null +++ b/examples/robots/distribute_epucks.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +"""Distribute several e-pucks in the world and make them move forward. + +You can move in the world using the keyboard and mouse: +- `ctrl + left click`: rotate the camera +- `scroll wheel` or `ctrl + right click`: zoom in/out +- `ctrl + middle click`: move the camera +- `left click` on an object: if the object has a mass and a collision shape, you can interact with it with the mouse +- `w`: wireframe (see collision shapes) +- `g`: show/hide menu +- `esc`: quit the simulator +""" + +import numpy as np +from itertools import count +import argparse + +import pyrobolearn as prl + + +# create function for the parser to check the number of robots +def check(number): + """check that the number of robots is between 1 and 100.""" + number = int(number) + if number < 1: + number = 1 + if number > 100: + number = 100 + return number + + +# create parser to select the robot +parser = argparse.ArgumentParser() +parser.add_argument('-n', '--number', help='the number of epucks in the world', type=check, default=10) +args = parser.parse_args() + + +# create simulator +sim = prl.simulators.Bullet() + +# create basic world (with a floor and gravity enabled by default) +world = prl.worlds.BasicWorld(sim, scaling=1) + +# specify distribution ranges for position (x,y,z) and orientation (r,p,y) +low_position, high_position = [-3, -3, 0], [3, 3, 0] # x,y,z +low_orientation, high_orientation = [0, 0, -np.pi], [0, 0, np.pi] # r,p,y + +# distribute the epucks in the world +robots = world.distribute(world.load_robot, size=args.number, position_range=(low_position, high_position), + rpy_range=(low_orientation, high_orientation), return_body=True, robot='epuck') + +# run simulator +for t in count(): + + # move each robot forward + for robot in robots: + robot.drive(speed=5) + + # perform one step in the world + world.step(sleep_dt=1. / 240) diff --git a/examples/robots/load_robot.py b/examples/robots/load_robot.py index d13c838..125df9e 100644 --- a/examples/robots/load_robot.py +++ b/examples/robots/load_robot.py @@ -1,33 +1,44 @@ -# This file creates a basic world, load each robot that can be found in the PRL framework +#!/usr/bin/env python +"""Load a robot in a basic world. -from pyrobolearn.simulators import BulletSim -from pyrobolearn.worlds import BasicWorld -from pyrobolearn.robots import implemented_robots +You can move in the world using the keyboard and mouse: +- `ctrl + left click`: rotate the camera +- `scroll wheel` or `ctrl + right click`: zoom in/out +- `ctrl + middle click`: move the camera +- `left click` on an object: if the object has a mass and a collision shape, you can interact with it with the mouse +- `w`: wireframe (see collision shapes) +- `g`: show/hide menu +- `esc`: quit the simulator +""" -robot_not_working = set(['icub']) +from itertools import count +import argparse + +import pyrobolearn as prl + + +# get implemented robots +robots = prl.robots.implemented_robots +print("All the robots (total number of robots = {}): {}".format(len(robots), robots)) + +# create parser to select the robot +parser = argparse.ArgumentParser() +parser.add_argument('-r', '--robot', help='the robot to load in the world', type=str, + choices=robots, default='hyq2max') +args = parser.parse_args() -print("All the robots (total number of robots = {}): {}".format(len(implemented_robots), implemented_robots)) # create simulator -sim = BulletSim() +sim = prl.simulators.Bullet() # create basic world with floor and gravity -world = BasicWorld(sim) +world = prl.worlds.BasicWorld(sim) -# create one robot at a time -for i, robot_name in enumerate(implemented_robots): - if robot_name not in robot_not_working: - # instantiate the given robot - robot = world.load_robot(robot_name) +# load the robot in the world (note that you can create the robot outside the world (not recommended), +# and then give it to the `world.load_robot` method to let know the world that a robot was loaded) +robot = world.load_robot(robot=args.robot, position=[0., 0.]) - # print info about the robot - print("Robot n{}: {}".format(i+1, robot)) - # robot.print_info() - - # run for few moments in the world - for t in range(250): - # run one step and sleep a bit - world.step(sleep_dt=1./240) - - # remove the robot from the world - world.remove(robot) +# run simulator +for _ in count(): + # perform one step in the world + world.step(sleep_dt=1. / 240) diff --git a/examples/robots/quadcopter_controller.py b/examples/robots/quadcopter_controller.py new file mode 100644 index 0000000..2274649 --- /dev/null +++ b/examples/robots/quadcopter_controller.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +"""Control a quadcopter in the air using an Xbox or Playstation game controller. + +how to run: +``` +$ python quadcopter_controller.py --help # for help +$ python quadcopter_controller.py --controller keyboard # to use the keyboard +$ python quadcopter_controller.py --controller xbox # to use Xbox game controller +$ python quadcopter_controller.py --controller ps # to use PS game controller +``` + +Mapping of the keyboard interface: +- `top arrow`: move forward +- `bottom arrow`: move backward +- `left arrow`: move sideways to the left +- `right arrow`: move sideways to the right +- `ctrl + top arrow`: ascend +- `ctrl + bottom arrow`: descend +- `ctrl + left arrow`: turn to the right +- `ctrl + right arrow`: turn to the left +- `space`: switch between first-person and third-person view + +Mapping between the controller and the quadcopter: +- left joystick: use to move the quadcopter +- right joystick: use to ascend/descend and turn +- south button (X on PlayStation and A on Xbox): change between the first-person and third-person view. +- east button (circle on PlayStation and B on Xbox): increase the speed +- west button (square on PlayStation and X on Xbox): decrease the speed +""" + +# import numpy as np +from itertools import count +import argparse + +import pyrobolearn as prl + + +# create parser to select the game controller +parser = argparse.ArgumentParser() +parser.add_argument('-c', '--controller', help='the controller to use', type=str, + choices=['keyboard', 'xbox', 'ps'], default='keyboard') +args = parser.parse_args() + + +# load corresponding interface +if args.controller == 'keyboard': # keyboard interface + from pyrobolearn.tools.interfaces.mouse_keyboard.mousekeyboard import MouseKeyboardInterface as Controller + from pyrobolearn.tools.bridges.mouse_keyboard.bridge_mousekeyboard_quadcopter \ + import BridgeMouseKeyboardQuadcopter as Bridge +elif args.controller == 'xbox': # Xbox interface + from pyrobolearn.tools.interfaces.controllers.xbox import XboxControllerInterface as Controller + from pyrobolearn.tools.bridges.controllers.robots.bridge_controller_quadcopter import BridgeControllerQuadcopter \ + as Bridge +elif args.controller == 'ps': # PS interface + from pyrobolearn.tools.interfaces.controllers.playstation import PSControllerInterface as Controller + from pyrobolearn.tools.bridges.controllers.robots.bridge_controller_quadcopter import BridgeControllerQuadcopter \ + as Bridge +else: + raise NotImplementedError("Unknown game controller") + + +# create simulator +sim = prl.simulators.Bullet() + +# create basic world (with a floor and gravity enabled by default) +world = prl.worlds.BasicWorld(sim) + +# load quadcopter +robot = prl.robots.Quadcopter(sim, position=[0., 0., 2.]) +world.load_robot(robot) + +# load interface that accepts input events +controller = Controller(use_thread=True, verbose=False) + +# load bridge that connects the interface/controller with the quadcopter +# The bridge is the one that maps the input events from the interface to commands sent to the quadcopter +bridge = Bridge(quadcopter=robot, interface=controller) + +# run simulator +for t in count(): + # perform a step with the bridge and interface + bridge.step(update_interface=True) + + # perform one step in the world + world.step(sleep_dt=1. / 240) diff --git a/examples/robots/robot_with_sliders.py b/examples/robots/robot_with_sliders.py new file mode 100644 index 0000000..9016de8 --- /dev/null +++ b/examples/robots/robot_with_sliders.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +"""Manipulate the robot's joints with sliders. + +You can move in the world using the keyboard and mouse: +- `ctrl + left click`: rotate the camera +- `scroll wheel` or `ctrl + right click`: zoom in/out +- `ctrl + middle click`: move the camera +- `left click` on an object: if the object has a mass and a collision shape, you can interact with it with the mouse +- `w`: wireframe (see collision shapes) +- `g`: show/hide menu +- `esc`: quit the simulator +""" + +from itertools import count +import argparse + +import pyrobolearn as prl + + +# create parser to select the robot +parser = argparse.ArgumentParser() +parser.add_argument('-r', '--robot', help='the robot to load in the world', type=str, + choices=prl.robots.implemented_robots, default='coman') +parser.add_argument('-f', '--fixed_base', help='if we should fix the base when the robot has initially a floating ' + 'base', type=bool, default=True) +args = parser.parse_args() + + +# create simulator +sim = prl.simulators.Bullet() + +# create basic world with floor and gravity +world = prl.worlds.BasicWorld(sim) + +# load the robot in the world +robot = world.load_robot(robot=args.robot, position=[0., 0.], fixed_base=args.fixed_base) + +# add a slider for each specified joint +robot.add_joint_slider(joint_ids=robot.joints) + +# run simulator +for _ in count(): + # update the joint slider + robot.update_joint_slider() + + # perform one step in the world + world.step(sleep_dt=1. / 240) diff --git a/examples/robots/aibo.py b/examples/robots/robots/aibo.py similarity index 89% rename from examples/robots/aibo.py rename to examples/robots/robots/aibo.py index 33ebdff..6d98797 100644 --- a/examples/robots/aibo.py +++ b/examples/robots/robots/aibo.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Aibo # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/allegrohand.py b/examples/robots/robots/allegrohand.py similarity index 91% rename from examples/robots/allegrohand.py rename to examples/robots/robots/allegrohand.py index c91507e..c617da0 100644 --- a/examples/robots/allegrohand.py +++ b/examples/robots/robots/allegrohand.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import AllegroHand # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/ant.py b/examples/robots/robots/ant.py similarity index 89% rename from examples/robots/ant.py rename to examples/robots/robots/ant.py index 8147102..39b1c84 100644 --- a/examples/robots/ant.py +++ b/examples/robots/robots/ant.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Ant # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/atlas.py b/examples/robots/robots/atlas.py similarity index 88% rename from examples/robots/atlas.py rename to examples/robots/robots/atlas.py index a82c71d..ec7496b 100644 --- a/examples/robots/atlas.py +++ b/examples/robots/robots/atlas.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Atlas # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/ballbot.py b/examples/robots/robots/ballbot.py similarity index 87% rename from examples/robots/ballbot.py rename to examples/robots/robots/ballbot.py index c9baeb3..7c0cdd9 100644 --- a/examples/robots/ballbot.py +++ b/examples/robots/robots/ballbot.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Ballbot # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/baxter.py b/examples/robots/robots/baxter.py similarity index 88% rename from examples/robots/baxter.py rename to examples/robots/robots/baxter.py index 1fedbed..8ed66d7 100644 --- a/examples/robots/baxter.py +++ b/examples/robots/robots/baxter.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Baxter # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/bb8.py b/examples/robots/robots/bb8.py similarity index 87% rename from examples/robots/bb8.py rename to examples/robots/robots/bb8.py index b1b5546..20c72c1 100644 --- a/examples/robots/bb8.py +++ b/examples/robots/robots/bb8.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import BB8 # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/cartpole.py b/examples/robots/robots/cartpole.py similarity index 98% rename from examples/robots/cartpole.py rename to examples/robots/robots/cartpole.py index 423bd20..138a055 100644 --- a/examples/robots/cartpole.py +++ b/examples/robots/robots/cartpole.py @@ -85,12 +85,12 @@ class LQR(object): if __name__ == "__main__": import numpy as np from itertools import count - from pyrobolearn.simulators import BulletSim + from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import World from pyrobolearn.robots import CartPole # Create simulator - sim = BulletSim() + sim = Bullet() # create world world = World(sim) diff --git a/examples/robots/cassie.py b/examples/robots/robots/cassie.py similarity index 89% rename from examples/robots/cassie.py rename to examples/robots/robots/cassie.py index 92c83af..30684fb 100644 --- a/examples/robots/cassie.py +++ b/examples/robots/robots/cassie.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Cassie # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/centauro.py b/examples/robots/robots/centauro.py similarity index 90% rename from examples/robots/centauro.py rename to examples/robots/robots/centauro.py index 2b9024a..ecd56b3 100644 --- a/examples/robots/centauro.py +++ b/examples/robots/robots/centauro.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Centauro # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/cogimon.py b/examples/robots/robots/cogimon.py similarity index 88% rename from examples/robots/cogimon.py rename to examples/robots/robots/cogimon.py index 8761d06..fb63156 100644 --- a/examples/robots/cogimon.py +++ b/examples/robots/robots/cogimon.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Cogimon # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/coman.py b/examples/robots/robots/coman.py similarity index 92% rename from examples/robots/coman.py rename to examples/robots/robots/coman.py index a853b93..9a7a68a 100644 --- a/examples/robots/coman.py +++ b/examples/robots/robots/coman.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Coman # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/crab.py b/examples/robots/robots/crab.py similarity index 89% rename from examples/robots/crab.py rename to examples/robots/robots/crab.py index 88a0add..5da82ac 100644 --- a/examples/robots/crab.py +++ b/examples/robots/robots/crab.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Crab # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/cubli.py b/examples/robots/robots/cubli.py similarity index 94% rename from examples/robots/cubli.py rename to examples/robots/robots/cubli.py index 405f4d3..f67b6a7 100644 --- a/examples/robots/cubli.py +++ b/examples/robots/robots/cubli.py @@ -5,12 +5,12 @@ import numpy as np from itertools import count from pyrobolearn.utils.transformation import get_rpy_from_quaternion -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Cubli # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/darwin.py b/examples/robots/robots/darwin.py similarity index 89% rename from examples/robots/darwin.py rename to examples/robots/robots/darwin.py index af420af..2035b7b 100644 --- a/examples/robots/darwin.py +++ b/examples/robots/robots/darwin.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Darwin # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/edo.py b/examples/robots/robots/edo.py similarity index 87% rename from examples/robots/edo.py rename to examples/robots/robots/edo.py index 6b7b4e9..7f23baa 100644 --- a/examples/robots/edo.py +++ b/examples/robots/robots/edo.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Edo # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/epuck.py b/examples/robots/robots/epuck.py similarity index 91% rename from examples/robots/epuck.py rename to examples/robots/robots/epuck.py index 8ec101d..f93e0fd 100644 --- a/examples/robots/epuck.py +++ b/examples/robots/robots/epuck.py @@ -4,12 +4,12 @@ import numpy as np from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Epuck # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/f10_racecar.py b/examples/robots/robots/f10_racecar.py similarity index 89% rename from examples/robots/f10_racecar.py rename to examples/robots/robots/f10_racecar.py index cf06cf0..bdb079c 100644 --- a/examples/robots/f10_racecar.py +++ b/examples/robots/robots/f10_racecar.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import F10Racecar # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/fetch.py b/examples/robots/robots/fetch.py similarity index 88% rename from examples/robots/fetch.py rename to examples/robots/robots/fetch.py index ab1bbc7..cb07619 100644 --- a/examples/robots/fetch.py +++ b/examples/robots/robots/fetch.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Fetch # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/franka.py b/examples/robots/robots/franka.py similarity index 90% rename from examples/robots/franka.py rename to examples/robots/robots/franka.py index e04f5ff..0585912 100644 --- a/examples/robots/franka.py +++ b/examples/robots/robots/franka.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Franka # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/half_cheetah.py b/examples/robots/robots/half_cheetah.py similarity index 87% rename from examples/robots/half_cheetah.py rename to examples/robots/robots/half_cheetah.py index f99115d..fdcaa86 100644 --- a/examples/robots/half_cheetah.py +++ b/examples/robots/robots/half_cheetah.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import HalfCheetah # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/hopper.py b/examples/robots/robots/hopper.py similarity index 86% rename from examples/robots/hopper.py rename to examples/robots/robots/hopper.py index dd17a83..8ddb43b 100644 --- a/examples/robots/hopper.py +++ b/examples/robots/robots/hopper.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Hopper # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/hubo.py b/examples/robots/robots/hubo.py similarity index 88% rename from examples/robots/hubo.py rename to examples/robots/robots/hubo.py index 1eb633a..51bc465 100644 --- a/examples/robots/hubo.py +++ b/examples/robots/robots/hubo.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Hubo # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/humanoid.py b/examples/robots/robots/humanoid.py similarity index 89% rename from examples/robots/humanoid.py rename to examples/robots/robots/humanoid.py index 889c1a9..aa71159 100644 --- a/examples/robots/humanoid.py +++ b/examples/robots/robots/humanoid.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Humanoid # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/husky.py b/examples/robots/robots/husky.py similarity index 88% rename from examples/robots/husky.py rename to examples/robots/robots/husky.py index 68a1ac8..9e8f4fc 100644 --- a/examples/robots/husky.py +++ b/examples/robots/robots/husky.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Husky # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/hyq.py b/examples/robots/robots/hyq.py similarity index 90% rename from examples/robots/hyq.py rename to examples/robots/robots/hyq.py index 633a9b1..1fcdab7 100644 --- a/examples/robots/hyq.py +++ b/examples/robots/robots/hyq.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import HyQ # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/hyq2max.py b/examples/robots/robots/hyq2max.py similarity index 90% rename from examples/robots/hyq2max.py rename to examples/robots/robots/hyq2max.py index 7ed24fc..2f34c2f 100644 --- a/examples/robots/hyq2max.py +++ b/examples/robots/robots/hyq2max.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import HyQ2Max # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/jaco.py b/examples/robots/robots/jaco.py similarity index 86% rename from examples/robots/jaco.py rename to examples/robots/robots/jaco.py index 6d86cea..2f2a463 100644 --- a/examples/robots/jaco.py +++ b/examples/robots/robots/jaco.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Jaco # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/kr5.py b/examples/robots/robots/kr5.py similarity index 88% rename from examples/robots/kr5.py rename to examples/robots/robots/kr5.py index 94d39f4..afbf260 100644 --- a/examples/robots/kr5.py +++ b/examples/robots/robots/kr5.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import KR5 # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/kuka_iiwa.py b/examples/robots/robots/kuka_iiwa.py similarity index 95% rename from examples/robots/kuka_iiwa.py rename to examples/robots/robots/kuka_iiwa.py index a2582a0..a2296dc 100644 --- a/examples/robots/kuka_iiwa.py +++ b/examples/robots/robots/kuka_iiwa.py @@ -4,12 +4,12 @@ import numpy as np from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import KukaIIWA # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/kuka_lwr.py b/examples/robots/robots/kuka_lwr.py similarity index 88% rename from examples/robots/kuka_lwr.py rename to examples/robots/robots/kuka_lwr.py index 696b77c..62f5e5d 100644 --- a/examples/robots/kuka_lwr.py +++ b/examples/robots/robots/kuka_lwr.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import KukaLWR # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/laikago.py b/examples/robots/robots/laikago.py similarity index 89% rename from examples/robots/laikago.py rename to examples/robots/robots/laikago.py index 12fb442..9edfc10 100644 --- a/examples/robots/laikago.py +++ b/examples/robots/robots/laikago.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Laikago # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/littledog.py b/examples/robots/robots/littledog.py similarity index 90% rename from examples/robots/littledog.py rename to examples/robots/robots/littledog.py index 4767b59..39a87f6 100644 --- a/examples/robots/littledog.py +++ b/examples/robots/robots/littledog.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import LittleDog # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/manipulator2d.py b/examples/robots/robots/manipulator2d.py similarity index 89% rename from examples/robots/manipulator2d.py rename to examples/robots/robots/manipulator2d.py index c881564..2636b67 100644 --- a/examples/robots/manipulator2d.py +++ b/examples/robots/robots/manipulator2d.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Manipulator2D # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/minitaur.py b/examples/robots/robots/minitaur.py similarity index 90% rename from examples/robots/minitaur.py rename to examples/robots/robots/minitaur.py index 11df4f1..1fdf45e 100644 --- a/examples/robots/minitaur.py +++ b/examples/robots/robots/minitaur.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Minitaur # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/mkz.py b/examples/robots/robots/mkz.py similarity index 89% rename from examples/robots/mkz.py rename to examples/robots/robots/mkz.py index 96e6119..6817fa0 100644 --- a/examples/robots/mkz.py +++ b/examples/robots/robots/mkz.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import MKZ # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/morphex.py b/examples/robots/robots/morphex.py similarity index 86% rename from examples/robots/morphex.py rename to examples/robots/robots/morphex.py index 2c3a8cf..06e572a 100644 --- a/examples/robots/morphex.py +++ b/examples/robots/robots/morphex.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Morphex # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/nao.py b/examples/robots/robots/nao.py similarity index 88% rename from examples/robots/nao.py rename to examples/robots/robots/nao.py index 36da221..fd44718 100644 --- a/examples/robots/nao.py +++ b/examples/robots/robots/nao.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Nao # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/opendog.py b/examples/robots/robots/opendog.py similarity index 88% rename from examples/robots/opendog.py rename to examples/robots/robots/opendog.py index 991de4a..6fd94c7 100644 --- a/examples/robots/opendog.py +++ b/examples/robots/robots/opendog.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import OpenDog # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/pepper.py b/examples/robots/robots/pepper.py similarity index 89% rename from examples/robots/pepper.py rename to examples/robots/robots/pepper.py index 2bc433d..b547a7e 100644 --- a/examples/robots/pepper.py +++ b/examples/robots/robots/pepper.py @@ -3,13 +3,13 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Pepper # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/phantomx.py b/examples/robots/robots/phantomx.py similarity index 86% rename from examples/robots/phantomx.py rename to examples/robots/robots/phantomx.py index 4e5ea5e..d12dfc4 100644 --- a/examples/robots/phantomx.py +++ b/examples/robots/robots/phantomx.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import PhantomX # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/pleurobot.py b/examples/robots/robots/pleurobot.py similarity index 90% rename from examples/robots/pleurobot.py rename to examples/robots/robots/pleurobot.py index 16477c5..65acfe1 100644 --- a/examples/robots/pleurobot.py +++ b/examples/robots/robots/pleurobot.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Pleurobot # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/pr2.py b/examples/robots/robots/pr2.py similarity index 88% rename from examples/robots/pr2.py rename to examples/robots/robots/pr2.py index 0ae5c64..93152f8 100644 --- a/examples/robots/pr2.py +++ b/examples/robots/robots/pr2.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import PR2 # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/quadcopter.py b/examples/robots/robots/quadcopter.py similarity index 86% rename from examples/robots/quadcopter.py rename to examples/robots/robots/quadcopter.py index 1e03960..6b6db19 100644 --- a/examples/robots/quadcopter.py +++ b/examples/robots/robots/quadcopter.py @@ -4,14 +4,14 @@ import numpy as np from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Quadcopter from pyrobolearn.utils.units import rpm_to_rad_per_second # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) @@ -24,7 +24,7 @@ robot.print_info() rpm = robot.get_stationary_rpm() print("Stationary RPM: {}".format(rpm)) -v = rpm_to_rad_per_second(rpm+20) +v = rpm_to_rad_per_second(rpm + 20) v = [v, -v, v, -v] # run simulation diff --git a/examples/robots/rhex.py b/examples/robots/robots/rhex.py similarity index 89% rename from examples/robots/rhex.py rename to examples/robots/robots/rhex.py index fb14874..2bb55cb 100644 --- a/examples/robots/rhex.py +++ b/examples/robots/robots/rhex.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Rhex # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/rrbot.py b/examples/robots/robots/rrbot.py similarity index 94% rename from examples/robots/rrbot.py rename to examples/robots/robots/rrbot.py index a0047d3..efeb5d4 100644 --- a/examples/robots/rrbot.py +++ b/examples/robots/robots/rrbot.py @@ -4,12 +4,12 @@ import numpy as np from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import RRBot # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) @@ -103,7 +103,7 @@ J = sim.calculate_jacobian(robot.id, 1, [0., 0., 0.]) print(np.array(J[0])) a = robot.get_joint_positions() -# print(robot.get_jacobian(1, np.array([0.,0.]))) # TODO: need to convert numpy array to list +# print(robot.get_jacobian(1, np.array([0., 0.]))) # TODO: need to convert numpy array to list linkId = 2 com_frame = robot.get_link_states(linkId)[2] @@ -125,14 +125,14 @@ for i in range(10000): dx = np.array(robot.get_link_world_linear_velocities(linkId)) tau = robot.calculate_inverse_dynamics(ddq, dq, q) # Coriolis, centrifugal and gravity compensation Jlin = np.array(sim.calculate_jacobian(robot.id, linkId, com_frame)[0]) - F = K.dot(xdes - x) - D.dot(dx) # compute cartesian forces + F = K.dot(xdes - x) - D.dot(dx) # evaluate cartesian forces # print("force: {}".format(F)) tau += Jlin.T.dot(F) # cartesian PD with gravity compensation # tau += Jlin.T.dot(- D.dot(dx)) # active compliance # tau = Jlin.T.dot(F) - # compute manipulability measure :math:`w = sqrt(det(JJ^T))` + # evaluate manipulability measure :math:`w = sqrt(det(JJ^T))` Jlin = Jlin[[0, 2], :] w = np.sqrt(np.linalg.det(Jlin.dot(Jlin.T))) # print("manipulability: {}".format(w)) diff --git a/examples/robots/sawyer.py b/examples/robots/robots/sawyer.py similarity index 88% rename from examples/robots/sawyer.py rename to examples/robots/robots/sawyer.py index b47e062..a60aa0e 100644 --- a/examples/robots/sawyer.py +++ b/examples/robots/robots/sawyer.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Sawyer # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/sea_hexapod.py b/examples/robots/robots/sea_hexapod.py similarity index 86% rename from examples/robots/sea_hexapod.py rename to examples/robots/robots/sea_hexapod.py index 37ee317..5d59a27 100644 --- a/examples/robots/sea_hexapod.py +++ b/examples/robots/robots/sea_hexapod.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import SEAHexapod # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/sea_snake.py b/examples/robots/robots/sea_snake.py similarity index 86% rename from examples/robots/sea_snake.py rename to examples/robots/robots/sea_snake.py index 042a8df..0b1f5b8 100644 --- a/examples/robots/sea_snake.py +++ b/examples/robots/robots/sea_snake.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import SEASnake # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/softhand.py b/examples/robots/robots/softhand.py similarity index 93% rename from examples/robots/softhand.py rename to examples/robots/robots/softhand.py index 7f8d171..64d5ab1 100644 --- a/examples/robots/softhand.py +++ b/examples/robots/robots/softhand.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import SoftHand # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/swimmer.py b/examples/robots/robots/swimmer.py similarity index 86% rename from examples/robots/swimmer.py rename to examples/robots/robots/swimmer.py index 5668c4a..c85b93c 100644 --- a/examples/robots/swimmer.py +++ b/examples/robots/robots/swimmer.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Swimmer # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/walker2d.py b/examples/robots/robots/walker2d.py similarity index 86% rename from examples/robots/walker2d.py rename to examples/robots/robots/walker2d.py index 95b408b..e8b5afa 100644 --- a/examples/robots/walker2d.py +++ b/examples/robots/robots/walker2d.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Walker2D # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/walkman.py b/examples/robots/robots/walkman.py similarity index 91% rename from examples/robots/walkman.py rename to examples/robots/robots/walkman.py index c05d76c..f98e8d2 100644 --- a/examples/robots/walkman.py +++ b/examples/robots/robots/walkman.py @@ -3,12 +3,12 @@ """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import Walkman # Create simulator -sim = BulletSim() +sim = Bullet() # Create world world = BasicWorld(sim) diff --git a/examples/robots/wam.py b/examples/robots/robots/wam.py similarity index 95% rename from examples/robots/wam.py rename to examples/robots/robots/wam.py index d9787c4..c932802 100644 --- a/examples/robots/wam.py +++ b/examples/robots/robots/wam.py @@ -4,12 +4,12 @@ import numpy as np from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import WAM # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/youbot.py b/examples/robots/robots/youbot.py similarity index 93% rename from examples/robots/youbot.py rename to examples/robots/robots/youbot.py index e8824de..e0dede3 100644 --- a/examples/robots/youbot.py +++ b/examples/robots/robots/youbot.py @@ -5,12 +5,12 @@ These include: YoubotBase, KukaYoubotArm, Youbot, YoubotDualArm """ from itertools import count -from pyrobolearn.simulators import BulletSim +from pyrobolearn.simulators import Bullet from pyrobolearn.worlds import BasicWorld from pyrobolearn.robots import YoubotBase, KukaYoubotArm, Youbot, YoubotDualArm # Create simulator -sim = BulletSim() +sim = Bullet() # create world world = BasicWorld(sim) diff --git a/examples/robots/visualize_robot.py b/examples/robots/visualize_robot.py new file mode 100644 index 0000000..2f93b6c --- /dev/null +++ b/examples/robots/visualize_robot.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python +"""Test different visualization tools that can be used on the robot. + + +Test different visualization tools on a robot. You can notably: +- render the robot semi-transparent +- draw the robot center of mass and the projected center of mass +- draw the center of mass of each link +- draw the link frames +- draw the joint axis +- draw bounding boxes around links +- for legged robots: + - draw ground reference points such as the ZMP, COP, FRI, and CMP + - draw the support polygon + - draw friction cones +- draw velocity and dynamic manipulability ellipsoids + + +You can move in the world using the keyboard and mouse: +- `ctrl + left click`: rotate the camera +- `scroll wheel` or `ctrl + right click`: zoom in/out +- `ctrl + middle click`: move the camera +- `left click` on an object: if the object has a mass and a collision shape, you can interact with it with the mouse +- `w`: wireframe (see collision shapes) +- `g`: show/hide menu +- `esc`: quit the simulator +""" + +import time +from itertools import count +import argparse + +import pyrobolearn as prl + + +# create parser to select the robot +robots = ['coman', 'hyq2max'] # prl.robots.implemented_robots +parser = argparse.ArgumentParser() +parser.add_argument('-r', '--robot', help='the robot to load in the world', type=str, choices=robots, default='hyq2max') +args = parser.parse_args() + + +# create simulator +sim = prl.simulators.Bullet() + +# create basic world with floor and gravity +world = prl.worlds.BasicWorld(sim) + +# load the robot in the world +robot = world.load_robot(robot=args.robot, position=[0., 0.]) + +# move the simulation a bit forward (such that the robot touches the floor) +for _ in range(100): + world.step() + +# change visualization +robot.change_transparency() +robot.draw_link_coms() +robot.draw_link_frames(robot.legs[0]) +robot.draw_joint_frames(robot.legs[0]) +robot.draw_bounding_boxes(link_ids=-1) + +robot.draw_friction_cone(floor_id=world.floor_id) +robot.draw_support_polygon(floor_id=world.floor_id, lifetime=0) + +robot.compute_and_draw_com_position() +robot.compute_and_draw_projected_com_position() +# robot.draw_cop(cop=world.floor_id) +# robot.draw_zmp(zmp=world.floor_id) +# robot.draw_cmp(cmp=world.floor_id) + +time.sleep(10000) +# run simulator +# for t in count(): +# # perform one step in the world +# world.step(sleep_dt=1. / 240) diff --git a/examples/robots/wheeled_controller.py b/examples/robots/wheeled_controller.py new file mode 100644 index 0000000..6d73334 --- /dev/null +++ b/examples/robots/wheeled_controller.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python +"""Control a wheeled robot using a keyboard, an Xbox or Playstation game controller. + +how to run: +``` +$ python wheeled_controller.py --help # for help +$ python wheeled_controller.py --controller keyboard # to use the keyboard +$ python wheeled_controller.py --controller xbox # to use Xbox game controller +$ python wheeled_controller.py --controller ps # to use PS game controller +``` + +Mapping of the keyboard interface: +* `top arrow`: move forward +* `bottom arrow`: move backward +* `left arrow`: turn/steer to the left +* `right arrow`: turn/steer to the right + +Mapping between the controller and the wheeled robot: +- left joystick: velocity of the wheeled robot +- east button (circle on PlayStation and B on Xbox): increase the speed +- west button (square on PlayStation and X on Xbox): decrease the speed +""" + +# import numpy as np +from itertools import count +import argparse + +import pyrobolearn as prl + + +# create parser to select the game controller +parser = argparse.ArgumentParser() +parser.add_argument('-c', '--controller', help='the controller to use', type=str, + choices=['keyboard', 'xbox', 'ps'], default='keyboard') +args = parser.parse_args() + + +# load corresponding interface +if args.controller == 'keyboard': # keyboard interface + from pyrobolearn.tools.interfaces.mouse_keyboard.mousekeyboard import MouseKeyboardInterface as Controller + from pyrobolearn.tools.bridges.mouse_keyboard.bridge_mousekeyboard_wheeled \ + import BridgeMouseKeyboardDifferentialWheeledRobot as Bridge +elif args.controller == 'xbox': # Xbox interface + from pyrobolearn.tools.interfaces.controllers.xbox import XboxControllerInterface as Controller + from pyrobolearn.tools.bridges.controllers.robots.bridge_controller_wheeled import BridgeControllerWheeledRobot \ + as Bridge +elif args.controller == 'ps': # PS interface + from pyrobolearn.tools.interfaces.controllers.playstation import PSControllerInterface as Controller + from pyrobolearn.tools.bridges.controllers.robots.bridge_controller_wheeled import \ + BridgeControllerWheeledRobot as Bridge +else: + raise NotImplementedError("Unknown game controller") + + +# create simulator +sim = prl.simulators.Bullet() + +# create basic world (with a floor and gravity enabled by default) +world = prl.worlds.BasicWorld(sim) + +# load wheeled robot +robot = prl.robots.Epuck(sim, position=[0., 0.]) +world.load_robot(robot) + +# load interface that accepts input events +controller = Controller(use_thread=True, verbose=False) + +# load bridge that connects the interface/controller with the quadcopter +# The bridge is the one that maps the input events from the interface to commands sent to the quadcopter +bridge = Bridge(robot=robot, interface=controller) + + +# run simulator +for t in count(): + # perform a step with the bridge and interface + bridge.step(update_interface=True) + + # perform one step in the world + world.step(sleep_dt=1. / 240) diff --git a/examples/simulators/README.md b/examples/simulators/README.md new file mode 100644 index 0000000..0927ac1 --- /dev/null +++ b/examples/simulators/README.md @@ -0,0 +1,28 @@ +## Simulator examples + +In this folder, you will have simple examples on how to use different simulators by loading a simple world (with a +floor and gravity enabled), and a simple robot. + +The various files can be called by `python .py`. Note that they are mostly identical, and only the line + +```python +sim = Simulator(args) # Bullet, BulletROS, ROS, etc +``` + +need to be changed. The basic idea is that your code should work without depending on which simulator you use. Note +that currently, the `Bullet` simulator is the only fully functional API, while the others are partially implemented +or still need to be implemented. + +Here are the few examples that you can find in this folder: +1. `bullet.py`: simple example where we use the `Bullet` simulator, load a basic world (with a floor and gravity +enabled) and the RRBot robot in it. +2. `bullet_ros_publisher.py`: example where we use the `BulletROS(publish=True)` simulator which publishes the +joint position values that were returned by the Bullet simulator on the corresponding ROS topic. +3. `bullet_ros_subscriber.py`: example where we use the `BulletROS(subscribe=True)` simulator which gets the joint +values from the ROS topics and change them in the simulator. This works with the `bullet_ros_publisher.py` code +presented above. By moving the robot with your mouse in the publisher version, you will see the robot in this +subscriber version moves in accordance with. This can be useful if you have access to the real platform as well. + +Later, a `ROS`/`ROS_RBDL` "simulator" (without passing by a real simulator like `Bullet`) will allow you to make +your code works on a real platform using ROS without changing any other lines of code. This is one of the big +TODOs but is not currently my priority. diff --git a/examples/simulators/bullet.py b/examples/simulators/bullet.py new file mode 100644 index 0000000..ec767b7 --- /dev/null +++ b/examples/simulators/bullet.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python +"""Example on how to use the Bullet simulator in pyrobolearn. + +Simple example where we use the bullet simulator, load a basic world (with a floor and gravity enabled) and the RRBot +robot in it. + +You can move inside the world using your mouse and keyboard: +- `ctrl + left click`: rotate the camera +- `scroll wheel` or `ctrl + right click`: zoom in/out +- `ctrl + middle click`: move the camera +- `left click` on an object: if the object has a mass and a collision shape, you can interact with it with the mouse +- `w`: wireframe (see collision shapes) +- `g`: show/hide menu +- `esc`: quit the simulator +""" + +from itertools import count +import pyrobolearn as prl + + +# create simulator +sim = prl.simulators.Bullet(render=True) + +# create basic world (i.e. with a floor and gravity enabled) +world = prl.worlds.BasicWorld(sim) + +# load rrbot +robot = prl.robots.RRBot(sim) + + +# run simulator +for t in count(): + # perform a step in the simulator and sleep for `sim.dt` (which is 1./240 in this case) + sim.step(sim.dt) diff --git a/examples/simulators/bullet_ros_publisher.py b/examples/simulators/bullet_ros_publisher.py new file mode 100644 index 0000000..8a911f4 --- /dev/null +++ b/examples/simulators/bullet_ros_publisher.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +"""Example on how to use the Bullet-ROS simulator (the publisher version) in PRL. + +The publisher version publish the various data on the corresponding topics every time the joints are set. If the +:attr:`teleoperate` is set to True, it will also publish every time we call a `get_*()` method. + +Before running this file, run in the terminal: +```bash +$ roscore # note that roscore is launched automatically by this file if has not already been launched +$ rostopic list # to show the list of published topics +``` + +The last command should print the following: +```bash +/rosout +/rosout_agg +``` + +Now, run this file and check the published topics again: +```bash +$ rostopic list +``` + +This time, you should get as well: +```bash +/rosout +/rosout_agg +/rrbot/joint_states +``` + +You can print the output of the topic with: +```bash +$ rostopic echo /rrbot/joint_states +``` + +Try to move the robot with the mouse, and see that the published joint position values changed as well. + +You can run this code in parallel with `bullet_ros_subscriber.py`, which implements the subscriber version, that is, +it listens to the topics and set them in the bullet simulator. So by moving the robot in this simulator, you should +see that it also moves in the other simulator. + +Note: this code also works with other robots. +""" + +from itertools import count +import pyrobolearn as prl + + +# create simulator (ros core will automatically be launched if it has not already been launched) +sim = prl.simulators.BulletROS(subscribe=False, publish=True, teleoperate=True) + +# load world +world = prl.worlds.BasicWorld(sim) + +# load rrbot +robot = prl.robots.RRBot(sim) + + +# run simulation +for t in count(): + # get the joint positions from the Bullet simulator (because :attr:`teleoperate` has been set to True, + # it will publish these read positions on the corresponding topic) + q = robot.get_joint_positions() + + # perform a step in the simulator (and sleep for `sim.dt`) + world.step(sim.dt) diff --git a/examples/simulators/bullet_ros_subscriber.py b/examples/simulators/bullet_ros_subscriber.py new file mode 100644 index 0000000..d5e6683 --- /dev/null +++ b/examples/simulators/bullet_ros_subscriber.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +"""Example on how to use the Bullet-ROS simulator (the subscriber version) in PRL. + +The subscriber version subscribe to various topics related to the loaded robot. + +This code works in parallel with the `bullet_ros_publisher.py`, which implements the publisher version, that is, +it publish to the topics the various data. By moving the robot in the publisher version of the simulator, you should +see that the robot in this simulator should move in accordance. + +Note: this code also works with other robots. +""" + +from itertools import count +import pyrobolearn as prl + + +# create simulator (ros core will automatically be launched if it has not already been launched) +sim = prl.simulators.BulletROS(subscribe=True, publish=False) + +# load world +world = prl.worlds.BasicWorld(sim) + +# load rrbot +robot = prl.robots.RRBot(sim) + + +# run simulation +for t in count(): + # get the joint positions from the ROS subscribers (if possible) + robot.get_joint_positions() + + # perform a step in the world, and sleep for `sim.dt` + world.step(sim.dt) diff --git a/examples/states/README.md b/examples/states/README.md deleted file mode 100644 index a537157..0000000 --- a/examples/states/README.md +++ /dev/null @@ -1,52 +0,0 @@ -## States - -In this folder, you will find some examples on how to use the `pyrobolearn.states.*` states. - -States are classes defined outside the environment and are basically containers. They can be updated by calling them `state()` (same as `state.read()`), or by setting their `data` variable. - -They can be combined using the addition operator. For instance, `s_a = s1 + s2`, `s_b = s2 + s3`, and `s=s_a + s_b`. Calling `s_a()` will update the states `s1` and `s2`, and thus the data contained in `s_b` as well (as it contains a pointer to `s2` which has been updated). You can just call `s()` to update in one loop `s1, s2, s3` altogether (`s_a` and `s_b` will reflect that change because they contain a pointer to these states `s1, s2, s3`). - -States are given to the policy and the environment. The environment is responsible to update them while policies read their `data` and feed it to the underlying learning model. In the case we use a physics simulator like PyBullet, the environment performs one step in the simulation and calls the `states()` which updates the `data` they contained. Instead, if you have a dynamical model function, the environment can call this one to update the `data` of the various `states` without having to call the `states()` itself to update their values. - -States can also be given to dynamical models (which predicts the next state given the current state and last action), value function approximators (which predicts a scalar value given a state and possibly an action), reward functions, etc. - - -### Simple Example - -```python -import pyrobolearn.states as states - -s1 = states.CumulativeTimeState() -s2 = states.AbsoluteTimeState() -s = s1 + s2 -print(s) - -# update s1 -s1.read() # or s1() -print(s1) -print(s) # just s1 changed - -# update s1 and s2 by calling s -s() -print(s) -print(s1) -print(s2) - -# get the data -print(s.data) # this will return a list of 2 arrays; each one of shape (1,). The size of the list is equal to the number of states that it contains -print(s1.data) # this will return a list with one array of shape (1,) -print(s.merged_data) # this will return a merged state; it will merge the states that have the same dimensions together and return a list of arrays which has a size equal to the number of different dimensions. The arrays inside that list are ordered by their dimensionality in an ascending way. -``` - -## What to test first? - -Try to launch `basics.py` first. - - -## For the programmer - -Why states are defined outside and not inside the environments like usually done in `gym.envs`. States are defined outside for a better modularity, reusability, flexibility, and lower coupling. -* Why better modularity? Because you define a module for each possible state which you can combine at your taste later on. -* Why better reusability? Because it avoids you to define how to read similar state in different environments which often lead to code duplication. -* Why lower coupling? Coupling between two modules measures how much they are dependent on each other. There is a lower coupling, because instead of having a composition relationship between the modules we have an aggregation relationship (see [UML Association vs Aggregation vs Composition](https://www.visual-paradigm.com/guide/uml-unified-modeling-language/uml-aggregation-vs-composition/)). That is, because states are defined outside of the environment and given to the environment, even if we destroyed the environment, the states still exist. -* Why better flexibility? Because we favor [composition over inheritance](https://en.wikipedia.org/wiki/Composition_over_inheritance). you can combine different states as you wish, give different states to different policies, and provide them at the end to the environment (which will update them). diff --git a/examples/states/README.rst b/examples/states/README.rst new file mode 100644 index 0000000..3899807 --- /dev/null +++ b/examples/states/README.rst @@ -0,0 +1,60 @@ +States +====== + +In this folder, you will find some examples on how to use the ``pyrobolearn.states.*`` states. + +States are classes defined outside the environment and are basically containers. They can be updated by calling them ``state()`` (same as ``state.read()``), or by setting their ``data`` variable. + +They can be combined using the addition operator. For instance, ``s_a = s1 + s2``, ``s_b = s2 + s3``, and ``s=s_a + s_b``. Calling ``s_a()`` will update the states ``s1`` and ``s2``, and thus the data contained in ``s_b`` as well (as it contains a pointer to ``s2`` which has been updated). You can just call ``s()`` to update in one loop ``s1, s2, s3`` altogether (``s_a`` and ``s_b`` will reflect that change because they contain a pointer to these states ``s1, s2, s3``). + +States are given to the policy and the environment. The environment is responsible to update them while policies read their ``data`` and feed it to the underlying learning model. In the case we use a physics simulator like PyBullet, the environment performs one step in the simulation and calls the ``states()`` which updates the ``data`` they contained. Instead, if you have a dynamical model function, the environment can call this one to update the ``data`` of the various ``states`` without having to call the ``states()`` itself to update their values. + +States can also be given to dynamical models (which predicts the next state given the current state and last action), value function approximators (which predicts a scalar value given a state and possibly an action), reward functions, etc. + + +Here are few examples that you can find in this folder: + +1. ``basics.py``: demonstrate the various features of the ``State`` class. +2. ``world.py``: get the pose state of an object loaded in the world. +3. ``robot.py``: get the joint states of a specific robot and print them. + + +Simple Example +-------------- + +.. code-block:: python + :linenos: + + import pyrobolearn.states as states + + s1 = states.CumulativeTimeState() + s2 = states.AbsoluteTimeState() + s = s1 + s2 + print(s) + + # update s1 + s1.read() # or s1() + print(s1) + print(s) # just s1 changed + + # update s1 and s2 by calling s + s() + print(s) + print(s1) + print(s2) + + # get the data + print(s.data) # this will return a list of 2 arrays; each one of shape (1,). The size of the list is equal to the number of states that it contains + print(s1.data) # this will return a list with one array of shape (1,) + print(s.merged_data) # this will return a merged state; it will merge the states that have the same dimensions together and return a list of arrays which has a size equal to the number of different dimensions. The arrays inside that list are ordered by their dimensionality in an ascending way. + + +For the programmer +------------------ + +Why states are defined outside and not inside the environments like usually done in ``gym.envs``. States are defined outside for a better modularity, reusability, flexibility, and lower coupling. + +- Why better modularity? Because you define a module for each possible state which you can combine at your taste later on. +- Why better reusability? Because it avoids you to define how to read similar state in different environments which often lead to code duplication. +- Why lower coupling? Coupling between two modules measures how much they are dependent on each other. There is a lower coupling, because instead of having a composition relationship between the modules we have an aggregation relationship (see `UML Association vs Aggregation vs Composition `_). That is, because states are defined outside of the environment and given to the environment, even if we destroyed the environment, the states still exist. +- Why better flexibility? Because we favor `composition over inheritance `_. you can combine different states as you wish, give different states to different policies, and provide them at the end to the environment (which will update them). diff --git a/examples/states/robot.py b/examples/states/robot.py new file mode 100644 index 0000000..1d25ac4 --- /dev/null +++ b/examples/states/robot.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python +"""Get the robot's joint position and velocity states. + +In this example, we load a Kuka manipulator and print the joint position and velocity states. You can try to move the +robot and see how it affects the states. +""" + +from itertools import count +import pyrobolearn as prl + + +# Create simulator +sim = prl.simulators.Bullet() + +# create world +world = prl.worlds.BasicWorld(sim) + +# load the kuka robot +robot = world.load_robot('kuka_iiwa') + +# create joint states +state = prl.states.JointPositionState(robot, joint_ids=[1, 2]) + prl.states.JointVelocityState(robot, joint_ids=1) + +# perform simulation +for t in count(): + + # update the state + state() # or state.read() + + # print the state + print(state) + + # step in simulation + world.step(sleep_dt=sim.dt) diff --git a/examples/states/world.py b/examples/states/world.py new file mode 100644 index 0000000..91757b2 --- /dev/null +++ b/examples/states/world.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python +"""Get the cartesian position state of an object loaded in the world. + +In this example, we load a sphere in the world which can be moved using the mouse. At every time step, we print the +cartesian position state of the sphere. +""" + +from itertools import count +import pyrobolearn as prl + + +# Create simulator +sim = prl.simulators.Bullet() + +# create world +world = prl.worlds.BasicWorld(sim) + +# load a sphere in the world +sphere = world.load_sphere(position=(0., 0., 1.), mass=1., radius=0.2, color=(0.8, 0, 0, 1.), return_body=True) + +# create state +state = prl.states.PositionState(sphere) + +# perform simulation +for t in count(): + + # update the state + state() # or state.read() + + # print the state + print(state) + + # step in simulation + world.step(sleep_dt=sim.dt) diff --git a/examples/worlds/README.md b/examples/worlds/README.md index 47368eb..4fd4b29 100644 --- a/examples/worlds/README.md +++ b/examples/worlds/README.md @@ -9,6 +9,13 @@ The world is usually created once the simulator has been selected. Here are the examples that the user can try: 1. `load_world.py`: load a basic world (i.e. with a floor and gravity enabled) with different objects (only visual, and with collisions) that are movable, fixed, or are moving. -2. `load_robot.py`: load a robot in a basic world and distribute randomly few objects on the floor. -3. `load_heightmap.py`: load a terrain from a heightmap (png) and load a robot on it. -4. `generate_terrain.py`: generate a terrain and distribute randomly few objects on the terrain. +2. `follow_moving_body.py`: follow a moving body with the world camera. +3. `move_camera.py`: get the world camera and move it in the world using the keyboard interface. +4. `load_robot.py`: load a robot in a basic world and distribute randomly few objects on the floor. +5. `load_heightmap.py`: load a terrain from a heightmap (png) and load a robot on it. +6. `generate_terrain.py`: generate a terrain and distribute randomly few objects on the terrain. + + +#### What to check next? + +Check the `pyrobolearn/examples/robots` folder. diff --git a/examples/worlds/follow_moving_body.py b/examples/worlds/follow_moving_body.py new file mode 100644 index 0000000..1a98020 --- /dev/null +++ b/examples/worlds/follow_moving_body.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +"""Follow a body with the main camera in the world. + +Try to move the sphere with the mouse (left-click on the object). +""" + +from itertools import count + +import pyrobolearn as prl + +# create simulator +sim = prl.simulators.Bullet() + +# create basic world (with a floor and gravity enabled by default) +world = prl.worlds.BasicWorld(sim) + +# load sphere +sphere = world.load_sphere(position=[0, 0, 15.], radius=0.2, mass=1, color=(1, 0, 0, 1)) + +# run simulator +for _ in count(): + # follow sphere + world.follow(sphere) + # perform one step in the world + world.step(sleep_dt=1. / 240) diff --git a/examples/worlds/move_camera.py b/examples/worlds/move_camera.py new file mode 100644 index 0000000..010247a --- /dev/null +++ b/examples/worlds/move_camera.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python +"""Move main camera in the world. + +Move the main camera in the world using the keyboard: +- top arrow: move forward +- bottom arrow: move backward +- left arrow: move sideways to the left +- right arrow: move sideways to the right +- ctrl + top arrow: turn downward +- ctrl + bottom arrow: turn upward +- ctrl + left arrow: turn to the right +- ctrl + right arrow: turn to the left +""" + +from itertools import count + +import pyrobolearn as prl + +# create simulator +sim = prl.simulators.Bullet() + +# create basic world (with a floor and gravity enabled by default) +world = prl.worlds.BasicWorld(sim) + +# get world camera +camera = world.camera + +# create mouse-keyboard interface +interface = prl.tools.interfaces.MouseKeyboardInterface(sim) + +# run simulator +for _ in count(): + # perform a step with the interface (i.e. get events from interface) + interface.step() + + # check the keys that are down + key, key_down = interface.key, interface.key_down + if key.ctrl in key_down: + if key.top_arrow in key_down: + camera.pitch -= 0.005 # turn downward + elif key.bottom_arrow in key_down: + camera.pitch += 0.005 # turn upward + elif key.left_arrow in key_down: + camera.yaw -= 0.005 # turn to the right + elif key.right_arrow in key_down: + camera.yaw += 0.005 # turn to the left + else: + if key.top_arrow in key_down: + camera.target_position += 0.01 * camera.forward_vector # move forward + elif key.bottom_arrow in key_down: + camera.target_position -= 0.01 * camera.forward_vector # move backward + elif key.left_arrow in key_down: + camera.target_position -= 0.01 * camera.lateral_vector # move to the left + elif key.right_arrow in key_down: + camera.target_position += 0.01 * camera.lateral_vector # move to the right + + # perform one step in the world + world.step(sleep_dt=1. / 254) diff --git a/pyrobolearn/__init__.py b/pyrobolearn/__init__.py index e9e9824..98240c7 100644 --- a/pyrobolearn/__init__.py +++ b/pyrobolearn/__init__.py @@ -1,6 +1,10 @@ +"""PyRoboLearn: a Python framework in Robot Learning for Education and Research. +""" + name = "pyrobolearn" import sys +import signal # logging import logging @@ -83,13 +87,22 @@ from . import algos __author__ = "Brian Delhaisse" __copyright__ = "Copyright 2018, PyRoboLearn" __credits__ = ["Brian Delhaisse"] -__license__ = "GNU GPLv3" +__license__ = "MIT" __version__ = "1.0.0" __maintainer__ = "Brian Delhaisse" __email__ = "briandelhaisse@gmail.com" __status__ = "Development" +# Capture a SIGINT in Python: make sure we quit PRL when Ctrl+C is pressed +def signal_handler(sig, frame): + print('You pressed Ctrl+C!') + sys.exit(0) + + +signal.signal(signal.SIGINT, signal_handler) + + # https://stackoverflow.com/questions/30483246/how-to-check-if-a-python-module-has-been-imported # https://stackoverflow.com/questions/14050281/how-to-check-if-a-python-module-exists-without-importing-it/25045228 def module_imported(module_name): # TODO: improve this method diff --git a/pyrobolearn/approximators/polynomial.py b/pyrobolearn/approximators/polynomial.py new file mode 100644 index 0000000..7f5952a --- /dev/null +++ b/pyrobolearn/approximators/polynomial.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +"""Define linear function approximator. + +Dependencies: +- `pyrobolearn.models` +- `pyrobolearn.states` +- `pyrobolearn.actions` +""" + +from pyrobolearn.approximators.approximator import Approximator +from pyrobolearn.models.basics.polynomial import Polynomial, PolynomialFunction + + +__author__ = "Brian Delhaisse" +__copyright__ = "Copyright 2018, PyRoboLearn" +__credits__ = ["Brian Delhaisse"] +__license__ = "GNU GPLv3" +__version__ = "1.0.0" +__maintainer__ = "Brian Delhaisse" +__email__ = "briandelhaisse@gmail.com" +__status__ = "Development" + + +class PolynomialApproximator(Approximator): + r"""Polynomial Function Approximator + + The polynomial function approximator is a discriminative deterministic model expressed mathematically as + :math:`y = f(x) = W \phi(x)`, where :math:`x` is the input vector, :math:`y` is the output vector, :math:`W` + is the weight matrix, and :math:`\phi` is the polynomial function which returns the transformed input vector. + This transformed input vector is often of higher dimension, based on the idea that if it is not linear with + respect to the parameters in the current space, it might be in a higher dimensional space. + """ + + def __init__(self, inputs, outputs, degree=1, preprocessors=None, postprocessors=None): + """ + Initialize the polynomial approximator. + + Args: + inputs (State, Action, np.array, torch.Tensor): inputs of the inner models (instance of Action/State) + outputs (State, Action, np.array, torch.Tensor): outputs of the inner models (instance of Action/State) + degree (int, list of int, np.array[D]): degree(s) of the polynomial. Setting `degree=3`, will apply + `[1,x,x^2,x^3]` to the inputs, while setting `degree=[1,3]` will apply `[x,x^3]` to the inputs. + preprocessors (None, Processor, list of Processor): the inputs are first given to the preprocessors then + to the model. + postprocessors (None, Processor, list of Processor): the predicted outputs by the model are given to the + processors before being returned. + """ + # create inner model + polynomial_fct = PolynomialFunction(degree=degree) + model = Polynomial(num_inputs=self._size(inputs), num_outputs=self._size(outputs), + polynomial_fct=polynomial_fct) + + # call parent class + super(PolynomialApproximator, self).__init__(inputs, outputs, model=model, preprocessors=preprocessors, + postprocessors=postprocessors) diff --git a/pyrobolearn/control/__init__.py b/pyrobolearn/control/__init__.py index 1321419..377bf21 100644 --- a/pyrobolearn/control/__init__.py +++ b/pyrobolearn/control/__init__.py @@ -2,7 +2,7 @@ # import some control algorithms # PID -from pid import PID +from .pid import PID # LQR -from lqr import LQR +from .lqr import LQR diff --git a/pyrobolearn/datasets/README.md b/pyrobolearn/datasets/README.md new file mode 100644 index 0000000..e69de29 diff --git a/pyrobolearn/datasets/parsers/3d/README.md b/pyrobolearn/datasets/parsers/3d/README.md new file mode 100644 index 0000000..1f59f1b --- /dev/null +++ b/pyrobolearn/datasets/parsers/3d/README.md @@ -0,0 +1,54 @@ +## 3D datasets + +This repo contains a brief description of 3D datasets that I could find online. It also contains the Python code to load, parse, and plot some of these datasets. + + +### List of datasets + +Here is a non-exhaustive list of datasets that could be used: + +* [**TUM Kitchen**: "The TUM Kitchen Data Set of Everyday Manipulation Activities for Motion Tracking and Action Recognition", 2009](https://ias.in.tum.de/dokuwiki/software/kitchen-activity-data) + * scenarios: "everyday manipulation activities in a natural kitchen environment" + * labeled segmented data: 51 DOF articulated human model, 3D joint positions, videos and labels +* [**CMU-MMAC**: "Guide to the Carnegie Mellon University Multimodal Activity database", 2009](http://kitchen.cs.cmu.edu/) + * scenarios: human activity of subjects performing the tasks involved in cooking and food preparation +* [**HumanEva**: "HumanEva: Synchronized Video and Motion Capture Dataset and Baseline Algorithm for Evaluation of Articulated Human Motion", 2010](http://humaneva.is.tue.mpg.de/) + * 6 scenarios: walking, jogging, gesturing, throwing and catching a ball, boxing, combo (=walking+jogging+balancing) + * nb of subjects: 4 + * data: 2D and 3D pose estimation +* [**MPII Cooking**: "A database for fine grained activity detection of cooking activities", 2012](https://www.mpi-inf.mpg.de/departments/computer-vision-and-multimodal-computing/research/human-activity-recognition/mpii-cooking-activities-dataset/) +Datasets + * nb of subjects: 12 + * 65 fine-grained cooking activities: background activity, change temperature, cut apart, cut dice, cut in, cut off ends, cut out inside, cut slices, cut stripes, dry, fill water from tap, grate, lid: put on, lid: remove, mix, move from X to Y, open egg, open tin, open/close cupboard, open/close drawer, open/close fridge, open/close oven, package X, peel, plug in/out, pour, pull out, puree, put in bowl, put in pan/pot, put on bread/dough, put on cutting-board, put on plate, read, remove from package, rip open, scratch off, screw close, screw open, shake, smell, spice, spread, squeeze, stamp, stir, strew, take & put in cupboard, take & put in drawer, take & put in fridge, take & put in oven, take & put in spice holder, take ingredient apart, take out from cupboard, take out from drawer, take out from fridge, take out from oven, take out from spice holder, taste, throw in garbage, unroll dough, wash hands, wash objects, whisk, wipe clean + * labeled and segmented data: 2D body joint positions +* [**J-HMDB**: "Joint-annotated Human Motion Data Base", 2013](http://jhmdb.is.tue.mpg.de/) +Datasets + * 21 scenarios: brush hair, catch, clap, climb stairs, golf, jump, kick ball, pick, pour, pull-up, push, run, shoot +ball, shoot bow, shoot gun, sit, stand, swing baseball, throw, walk, wave + * labeled and segmented data: 36-55 clips per action class with each clip containing 15-40 frames + 2D joint positions. 10 body parts connected by 13 joints (shoulder, elbow, wrist, hip, knee, ankle, neck) and two landmarks (face and belly). +* [**Human 3.6M**: "Human3.6M: Large Scale Datasets and Predictive Methods for 3D Human Sensing in Natural Environments", 2014](http://vision.imar.ro/human3.6m/description.php) + * 3.6 million 3D human poses and corresponding images + * nb of subjects: 11 + * 15 scenarios: direction, discussion, eating, activitie while seated, greeting, taking photo, posing, making purchases, smoking, waiting, walking, sitting on chair, talking on the phone, walking dog, walking together + * data: 3D joint positions and joint angles +* [**UTD-MHAD**: "UTD-MHAD: A Multimodal Dataset for Human Action Recognition utilizing a Depth Camera and a Wearable Inertial Sensor", 2015](http://www.utdallas.edu/~kehtar/UTD-MHAD.html) + * nb of subjects: 8 + * 27 different actions: (1) right arm swipe to the left, (2) right arm swipe to the right, (3) right hand wave, (4) two hand front clap, (5) right arm throw, (6) cross arms in the chest, (7) basketball shoot, (8) right hand draw x, (9) right hand draw circle (clockwise), (10) right hand draw circle (counter clockwise), (11) draw triangle, (12) bowling (right hand), (13) front boxing, (14) baseball swing from right, (15) tennis right hand forehand swing, (16) arm curl (two arms), (17) tennis serve, (18) two hand push, (19) right hand knock on door, (20) right hand catch an object, (21) right hand pick up and throw, (22) jogging in place, (23) walking in place, (24) sit to stand, (25) stand to sit, (26) forward lunge (left foot forward), (27) squat (two arms stretch out). + * labeled and segmented data: 861 data sequences, 3D skeleton joint positions +* [**G3D**: "G3D: A Gaming Action Dataset and Real Time Action Recognition Evaluation Framework", 2012](http://dipersec.king.ac.uk/G3D/index.html) + * nb of subjects: 10 + * 20 gaming actions: punch right, punch left, kick right, kick left, defend, golf swing, tennis swing forehand, tennis swing backhand, tennis serve, throw bowling ball, aim and fire gun, walk, run, jump, climb, crouch, steer a car, wave, flap and clap + * data: 3D joint positions +* [**CMU-Datasets**](mocap.cs.cmu.edu/search.php) + * dataset: very diverse, contains data such as sport activities (soccer, dancing, etc), everyday movements/activities, locomotion (walk/run, jump, etc), interaction with environment and other agents, human subjects imitating animal behaviors (such as snake, dog, chicken, etc), stretching, finegrained movements, and so on. + * data: 3D joint positions and videos. +* Others: MSRC-12 Kinect Gesture Datase, MPI HDM05 Motion Capture Database, MSR Action3D Database, VGG Human Pose Estimation datasets, etc. + + + +### Python Code + +The python code to load, parse, and plot (using animations) has been implemented for the following datasets: + +* UTD-MHAD: see `utd-mhad.ipynb` +* CMU-Datasets: see `cmu.ipynb` diff --git a/pyrobolearn/datasets/parsers/3d/cmu.ipynb b/pyrobolearn/datasets/parsers/3d/cmu.ipynb new file mode 100644 index 0000000..ae3fef6 --- /dev/null +++ b/pyrobolearn/datasets/parsers/3d/cmu.ipynb @@ -0,0 +1,1769 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### [CMU-Datasets](mocap.cs.cmu.edu/search.php)\n", + "\n", + "* dataset: very diverse, contains data such as sport activities (soccer, dancing, etc), everyday movements/activities, locomotion (walk/run, jump, etc), interaction with environment and other agents, human subjects imitating animal behaviors (such as snake, dog, chicken, etc), stretching, finegrained movements, and so on.\n", + "* data: 3D joint positions and videos.\n", + "\n", + "The CMU datasets is composed of '.asf/.amc' files. More info about the this file format can be found on this [link](http://research.cs.wisc.edu/graphics/Courses/cs-838-1999/Jeff/ASF-AMC.html).\n", + "\n", + "To parse these files, we will need the `cgkit` module: http://cgkit.sourceforge.net/\n", + "\n", + "The relevant documentation can be found here: http://cgkit.sourceforge.net/doc2/asfamc.html\n", + "\n", + "Clone and install the following github repo: https://github.com/VanushVaswani/amcparser" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "import matplotlib.animation as animation\n", + "\n", + "from IPython.display import HTML\n", + "\n", + "#%matplotlib inline\n", + "%matplotlib notebook\n", + "\n", + "from amcparser.skeleton import Skeleton\n", + "from amcparser.motion import SkelMotion" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "PATH = 'data/CMU'" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 343/343 [00:00<00:00, 585.49it/s] | 51/343 [00:00<00:00, 509.01it/s]\n" + ] + } + ], + "source": [ + "# Define some variables\n", + "links = ['upperback', 'rfoot', 'lradius', 'lthumb', 'rradius', 'lwrist', 'rhand', 'rhumerus',\n", + " 'lowerneck', 'lhand', 'ltibia', 'head', 'rwrist', 'lfingers', 'rtoes', 'lowerback',\n", + " 'lhipjoint', 'rhipjoint', 'lclavicle', 'upperneck', 'rfemur', 'thorax', 'rclavicle',\n", + " 'rtibia', 'lfoot', 'lhumerus', 'rthumb', 'rfingers', 'root', 'ltoes', 'lfemur']\n", + "Nl = len(links)\n", + "\n", + "# File paths\n", + "skeleton_filename = PATH+'/02.asf'\n", + "motion_filename = PATH+'/02_01.amc'\n", + "#video_filename = PATH+'/02_01.avi'\n", + "framerate = 120.\n", + "\n", + "# Create skeleton and motion\n", + "skel = Skeleton(skeleton_filename)\n", + "skelMot = SkelMotion(skel, motion_filename, (1./framerate))\n", + "\n", + "# Compute all the trajectories\n", + "skelMot.traverse(None, 0, -1)\n", + "\n", + "# Data\n", + "X_TO = np.array([skel.bones[jnt].xyz_data for jnt in ['head', 'upperneck', 'lowerneck',\n", + " 'upperback', 'thorax', 'lowerback', 'root']])\n", + "X_RA = np.array([skel.bones[jnt].xyz_data for jnt in ['rclavicle', 'rhumerus', 'rradius',\n", + " 'rwrist', 'rhand', 'rthumb', 'rfingers']])\n", + "X_LA = np.array([skel.bones[jnt].xyz_data for jnt in ['lclavicle', 'lhumerus', 'lradius',\n", + " 'lwrist', 'lhand', 'lthumb', 'lfingers']])\n", + "X_RL = np.array([skel.bones[jnt].xyz_data for jnt in ['rhipjoint', 'rfemur', 'rtibia', 'rfoot', 'rtoes']])\n", + "X_LL = np.array([skel.bones[jnt].xyz_data for jnt in ['lhipjoint', 'lfemur', 'ltibia', 'lfoot', 'ltoes']])\n", + "X = np.vstack((X_TO, X_RA, X_LA, X_RL, X_LL))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≄ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width);\n", + " canvas.attr('height', height);\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot trajectory profiles\n", + "plt.figure()\n", + "plt.subplot(2,2,1)\n", + "plt.title('X')\n", + "plt.plot(range(T), X[11,:,2] - X[6,:,2])\n", + "\n", + "plt.subplot(2,2,2)\n", + "plt.title('Y')\n", + "plt.plot(range(T), X[11,:,0] - X[6,:,0])\n", + "\n", + "plt.subplot(2,2,3)\n", + "plt.title('Z')\n", + "plt.plot(range(T), X[11,:,1] - X[6,:,1])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/pyrobolearn/datasets/parsers/3d/data/CMU/02.asf b/pyrobolearn/datasets/parsers/3d/data/CMU/02.asf new file mode 100644 index 0000000..c2c869f --- /dev/null +++ b/pyrobolearn/datasets/parsers/3d/data/CMU/02.asf @@ -0,0 +1,338 @@ +# AST/ASF file generated using VICON BodyLanguage +# ----------------------------------------------- +:version 1.10 +:name VICON +:units + mass 1.0 + length 0.45 + angle deg +:documentation + .ast/.asf automatically generated from VICON data using + VICON BodyBuilder and BodyLanguage model FoxedUp or BRILLIANT.MOD +:root + order TX TY TZ RX RY RZ + axis XYZ + position 0 0 0 + orientation 0 0 0 +:bonedata + begin + id 1 + name lhipjoint + direction 0.655637 -0.713449 0.247245 + length 2.52691 + axis 0 0 0 XYZ + end + begin + id 2 + name lfemur + direction 0.34202 -0.939693 0 + length 7.59371 + axis 0 0 20 XYZ + dof rx ry rz + limits (-160.0 20.0) + (-70.0 70.0) + (-60.0 70.0) + end + begin + id 3 + name ltibia + direction 0.34202 -0.939693 0 + length 7.28717 + axis 0 0 20 XYZ + dof rx + limits (-10.0 170.0) + end + begin + id 4 + name lfoot + direction 0.0886837 -0.243657 0.965798 + length 2.2218 + axis -90 7.62852e-016 20 XYZ + dof rx rz + limits (-45.0 90.0) + (-70.0 20.0) + end + begin + id 5 + name ltoes + direction 1.53547e-011 -4.22004e-011 1 + length 1.11249 + axis -90 7.62852e-016 20 XYZ + dof rx + limits (-90.0 20.0) + end + begin + id 6 + name rhipjoint + direction -0.645062 -0.722004 0.250209 + length 2.49697 + axis 0 0 0 XYZ + end + begin + id 7 + name rfemur + direction -0.34202 -0.939693 0 + length 7.58734 + axis 0 0 -20 XYZ + dof rx ry rz + limits (-160.0 20.0) + (-70.0 70.0) + (-70.0 60.0) + end + begin + id 8 + name rtibia + direction -0.34202 -0.939693 0 + length 7.21538 + axis 0 0 -20 XYZ + dof rx + limits (-10.0 170.0) + end + begin + id 9 + name rfoot + direction -0.102907 -0.282735 0.953662 + length 2.23735 + axis -90 -7.62852e-016 -20 XYZ + dof rx rz + limits (-45.0 90.0) + (-20.0 70.0) + end + begin + id 10 + name rtoes + direction -1.5354e-011 -4.21751e-011 1 + length 1.11569 + axis -90 -7.62852e-016 -20 XYZ + dof rx + limits (-90.0 20.0) + end + begin + id 11 + name lowerback + direction 0.00952301 0.997604 -0.0685217 + length 2.05943 + axis 0 0 0 XYZ + dof rx ry rz + limits (-20.0 45.0) + (-30.0 30.0) + (-30.0 30.0) + end + begin + id 12 + name upperback + direction 0.00494399 0.999577 -0.0286701 + length 2.06523 + axis 0 0 0 XYZ + dof rx ry rz + limits (-20.0 45.0) + (-30.0 30.0) + (-30.0 30.0) + end + begin + id 13 + name thorax + direction 0.000729686 0.999992 0.00388603 + length 2.06807 + axis 0 0 0 XYZ + dof rx ry rz + limits (-20.0 45.0) + (-30.0 30.0) + (-30.0 30.0) + end + begin + id 14 + name lowerneck + direction 0.00452882 0.995459 0.0950816 + length 1.57426 + axis 0 0 0 XYZ + dof rx ry rz + limits (-20.0 45.0) + (-30.0 30.0) + (-30.0 30.0) + end + begin + id 15 + name upperneck + direction 0.021922 0.997711 -0.0639762 + length 1.56399 + axis 0 0 0 XYZ + dof rx ry rz + limits (-20.0 45.0) + (-30.0 30.0) + (-30.0 30.0) + end + begin + id 16 + name head + direction 0.008024 0.999444 -0.0323691 + length 1.6265 + axis 0 0 0 XYZ + dof rx ry rz + limits (-20.0 45.0) + (-30.0 30.0) + (-30.0 30.0) + end + begin + id 17 + name lclavicle + direction 0.967826 0.247107 -0.0474446 + length 3.6598 + axis 0 0 0 XYZ + dof ry rz + limits (-20.0 10.0) + (0.0 20.0) + end + begin + id 18 + name lhumerus + direction 1 -4.48971e-011 -2.90544e-027 + length 4.86513 + axis 180 -30 -90 XYZ + dof rx ry rz + limits (-60.0 90.0) + (-90.0 90.0) + (-90.0 90.0) + end + begin + id 19 + name lradius + direction 1 -4.48958e-011 1.79638e-026 + length 3.35554 + axis 180 -30 -90 XYZ + dof rx + limits (-10.0 170.0) + end + begin + id 20 + name lwrist + direction 1 -4.48952e-011 3.34345e-026 + length 1.67777 + axis -2.22354e-014 90 90 XYZ + dof ry + limits (-180.0 0.0) + end + begin + id 21 + name lhand + direction 1 -4.49055e-011 6.6869e-026 + length 0.661175 + axis -4.26681e-014 90 90 XYZ + dof rx rz + limits (-90.0 90.0) + (-45.0 45.0) + end + begin + id 22 + name lfingers + direction 1 -4.48731e-011 1.33738e-025 + length 0.533057 + axis -8.53362e-014 90 90 XYZ + dof rx + limits (0.0 90.0) + end + begin + id 23 + name lthumb + direction 0.707107 -6.35005e-011 0.707107 + length 0.765366 + axis -90 45 2.85299e-015 XYZ + dof rx rz + limits (-45.0 45.0) + (-45.0 45.0) + end + begin + id 24 + name rclavicle + direction -0.973174 0.211421 -0.0907389 + length 3.59444 + axis 0 0 0 XYZ + dof ry rz + limits (-10.0 20.0) + (-20.0 0.0) + end + begin + id 25 + name rhumerus + direction -1 -4.48964e-011 1.56311e-027 + length 5.02649 + axis 180 30 90 XYZ + dof rx ry rz + limits (-90.0 60.0) + (-90.0 90.0) + (-90.0 90.0) + end + begin + id 26 + name rradius + direction -1 -4.48948e-011 2.01724e-026 + length 3.36431 + axis 180 30 90 XYZ + dof rx + limits (-10.0 170.0) + end + begin + id 27 + name rwrist + direction -1 -4.49008e-011 3.34345e-026 + length 1.68216 + axis -2.22354e-014 -90 -90 XYZ + dof ry + limits (-180.0 0.0) + end + begin + id 28 + name rhand + direction -1 -4.49013e-011 6.6869e-026 + length 0.730406 + axis -4.26681e-014 -90 -90 XYZ + dof rx rz + limits (-90.0 90.0) + (-45.0 45.0) + end + begin + id 29 + name rfingers + direction -1 -4.48867e-011 1.33738e-025 + length 0.588872 + axis -8.53362e-014 -90 -90 XYZ + dof rx + limits (0.0 90.0) + end + begin + id 30 + name rthumb + direction -0.707107 -6.34907e-011 0.707107 + length 0.845506 + axis -90 -45 -2.85299e-015 XYZ + dof rx rz + limits (-45.0 45.0) + (-45.0 45.0) + end +:hierarchy + begin + root lhipjoint rhipjoint lowerback + lhipjoint lfemur + lfemur ltibia + ltibia lfoot + lfoot ltoes + rhipjoint rfemur + rfemur rtibia + rtibia rfoot + rfoot rtoes + lowerback upperback + upperback thorax + thorax lowerneck lclavicle rclavicle + lowerneck upperneck + upperneck head + lclavicle lhumerus + lhumerus lradius + lradius lwrist + lwrist lhand lthumb + lhand lfingers + rclavicle rhumerus + rhumerus rradius + rradius rwrist + rwrist rhand rthumb + rhand rfingers + end diff --git a/pyrobolearn/datasets/parsers/3d/data/CMU/02_01.amc b/pyrobolearn/datasets/parsers/3d/data/CMU/02_01.amc new file mode 100644 index 0000000..c19815a --- /dev/null +++ b/pyrobolearn/datasets/parsers/3d/data/CMU/02_01.amc @@ -0,0 +1,10293 @@ +#!OML:ASF H:\Terrain\Patient Classification 1\Takeo\Monday\TakeoMonday.ASF +:FULLY-SPECIFIED +:DEGREES +1 +root 10.4194 16.7048 -30.1003 -2.48972 -9.82194 -3.00914 +lowerback 7.86573 1.57272 6.3571 +upperback 3.47255 2.55226 1.65684 +thorax -0.599593 1.31944 -2.05527 +lowerneck -12.4901 4.06706 1.03438 +upperneck 1.61784 5.61246 -6.40733 +head 2.97226 2.54741 -1.92752 +rclavicle -1.6201e-014 -1.43125e-014 +rhumerus -9.40273 14.8795 -82.1974 +rradius 46.2257 +rwrist -16.7798 +rhand -25.9429 18.5743 +rfingers 7.12502 +rthumb 0.600913 -11.4046 +lclavicle -1.6201e-014 -1.43125e-014 +lhumerus -51.9812 32.3861 64.939 +lradius 20.3824 +lwrist 12.631 +lhand -21.8909 22.8474 +lfingers 7.12502 +lthumb 4.5141 52.7793 +rfemur 16.1777 1.96704 29.9133 +rtibia 11.5302 +rfoot -15.9687 0.925564 +rtoes 4.33359 +lfemur -28.0191 -1.02078 -20.1783 +ltibia 22.3977 +lfoot -12.1104 13.478 +ltoes -10.2227 +2 +root 10.4117 16.684 -29.9168 -2.69729 -10.0082 -2.83243 +lowerback 7.44596 1.65374 6.09331 +upperback 3.91254 2.58553 1.67171 +thorax 0.0784557 1.35992 -1.86912 +lowerneck -13.0403 4.1508 1.03655 +upperneck 1.41954 5.71695 -6.43796 +head 3.01316 2.59206 -1.92353 +rclavicle -3.06128e-014 -7.95139e-016 +rhumerus -8.66985 14.6305 -81.9822 +rradius 46.032 +rwrist -16.5037 +rhand -25.3579 18.1254 +rfingers 7.12502 +rthumb 1.16593 -11.8512 +lclavicle -3.06128e-014 -7.95139e-016 +lhumerus -51.4595 32.9736 65.2094 +lradius 20.3072 +lwrist 12.3811 +lhand -21.901 23.0332 +lfingers 7.12502 +lthumb 4.50436 52.9653 +rfemur 17.2048 2.06921 29.6756 +rtibia 11.2385 +rfoot -15.6726 0.950482 +rtoes 2.11338 +lfemur -27.7269 -0.953135 -20.5822 +ltibia 22.4395 +lfoot -12.3785 13.6867 +ltoes -8.45391 +3 +root 10.4037 16.6749 -29.7319 -2.73684 -10.1104 -2.67905 +lowerback 7.31519 1.74924 5.93159 +upperback 3.96845 2.68906 1.61541 +thorax 0.211031 1.41449 -1.83734 +lowerneck -13.1188 4.14188 1.06949 +upperneck 1.08186 5.66983 -6.25219 +head 2.90215 2.582 -1.8696 +rclavicle 3.97569e-015 -1.03368e-014 +rhumerus -8.50177 14.3985 -81.9469 +rradius 45.6568 +rwrist -16.2262 +rhand -25.4816 18.2851 +rfingers 7.12502 +rthumb 1.04638 -11.6921 +lclavicle 3.97569e-015 -1.03368e-014 +lhumerus -51.3593 33.2859 65.0346 +lradius 20.0295 +lwrist 11.6134 +lhand -21.8378 22.427 +lfingers 7.12502 +lthumb 4.56542 52.3578 +rfemur 17.7116 2.03566 29.3786 +rtibia 11.6107 +rfoot -15.695 1.22609 +rtoes 0.922151 +lfemur -27.6281 -0.810148 -21.0041 +ltibia 22.6869 +lfoot -12.2625 13.6748 +ltoes -9.11447 +4 +root 10.3951 16.6696 -29.54 -2.6529 -10.1914 -2.43014 +lowerback 7.19363 1.82368 5.74365 +upperback 3.81888 2.77415 1.4497 +thorax 0.127573 1.4515 -1.90802 +lowerneck -12.9178 4.12991 1.31882 +upperneck 0.706102 5.58519 -6.09066 +head 2.73437 2.55894 -1.86943 +rclavicle 1.37658e-014 0 +rhumerus -8.68107 14.2787 -82.1702 +rradius 45.2994 +rwrist -16.0827 +rhand -25.8239 18.565 +rfingers 7.12502 +rthumb 0.715839 -11.4136 +lclavicle 1.37658e-014 0 +lhumerus -51.4118 33.3294 64.7565 +lradius 19.8149 +lwrist 11.1137 +lhand -21.9155 21.714 +lfingers 7.12502 +lthumb 4.49033 51.6464 +rfemur 18.2149 2.09324 28.9948 +rtibia 11.7512 +rfoot -15.3617 1.42214 +rtoes 0.396563 +lfemur -27.6637 -0.391122 -21.6105 +ltibia 23.2309 +lfoot -11.8145 13.2795 +ltoes -11.1406 +5 +root 10.3841 16.6488 -29.3447 -2.50765 -10.3526 -2.46894 +lowerback 6.93084 1.85711 5.71898 +upperback 3.70601 2.80336 1.40701 +thorax 0.158931 1.46518 -1.93228 +lowerneck -12.7095 4.17378 1.546 +upperneck 0.38896 5.58739 -5.9898 +head 2.59153 2.57436 -1.87971 +rclavicle -2.04251e-014 -7.15625e-015 +rhumerus -8.88558 14.3777 -82.4627 +rradius 45.0282 +rwrist -16.0025 +rhand -26.022 18.4229 +rfingers 7.12502 +rthumb 0.524504 -11.5562 +lclavicle -2.04251e-014 -7.15625e-015 +lhumerus -51.3723 33.2687 64.7988 +lradius 19.8026 +lwrist 11.3747 +lhand -21.8573 21.6385 +lfingers 7.12502 +lthumb 4.54656 51.5698 +rfemur 18.5238 2.05559 28.8937 +rtibia 12.2574 +rfoot -15.0286 1.70983 +rtoes -0.597689 +lfemur -27.6786 -0.161279 -21.8039 +ltibia 24.1117 +lfoot -11.5185 12.8466 +ltoes -11.8881 +6 +root 10.3736 16.6153 -29.1487 -2.27833 -10.4567 -2.74192 +lowerback 6.39393 1.89875 5.83274 +upperback 3.70818 2.82625 1.52352 +thorax 0.460678 1.48492 -1.85437 +lowerneck -12.6363 4.16435 1.46386 +upperneck 0.109727 5.56187 -5.76511 +head 2.46892 2.57522 -1.79365 +rclavicle -9.39258e-015 -3.33958e-014 +rhumerus -8.94255 14.3995 -82.5464 +rradius 44.7054 +rwrist -16.0208 +rhand -26.1876 18.2668 +rfingers 7.12502 +rthumb 0.36451 -11.7126 +lclavicle -9.39258e-015 -3.33958e-014 +lhumerus -51.2401 33.4019 64.9731 +lradius 19.7523 +lwrist 11.4084 +lhand -21.7171 21.9356 +lfingers 7.12502 +lthumb 4.68197 51.8639 +rfemur 18.7716 1.97435 29.0445 +rtibia 12.8488 +rfoot -15.001 1.96046 +rtoes -2.66505 +lfemur -27.737 -0.266955 -21.6658 +ltibia 25.1808 +lfoot -11.2938 12.5502 +ltoes -10.5823 +7 +root 10.3599 16.5715 -28.9534 -2.2599 -10.3619 -2.59234 +lowerback 6.0578 1.87772 5.45535 +upperback 3.7224 2.75505 1.55572 +thorax 0.634688 1.44776 -1.59433 +lowerneck -12.5777 4.15989 1.23641 +upperneck -0.237379 5.55495 -5.38302 +head 2.31528 2.59066 -1.62948 +rclavicle 1.9133e-014 -2.38542e-015 +rhumerus -8.99603 14.4498 -82.5553 +rradius 44.2949 +rwrist -16.2697 +rhand -26.0908 18.2072 +rfingers 7.12502 +rthumb 0.458083 -11.7721 +lclavicle 1.9133e-014 -2.38542e-015 +lhumerus -51.2191 33.6162 65.0468 +lradius 19.7851 +lwrist 11.1488 +lhand -21.4715 21.9958 +lfingers 7.12502 +lthumb 4.91905 51.9187 +rfemur 19.3145 2.03164 28.8841 +rtibia 13.2441 +rfoot -15.2026 1.8636 +rtoes -5.73873 +lfemur -27.7804 -0.346391 -22.0273 +ltibia 26.364 +lfoot -10.3924 12.4866 +ltoes -10.2688 +8 +root 10.3458 16.5643 -28.7542 -2.36002 -10.2713 -2.44292 +lowerback 5.94446 1.79342 4.97885 +upperback 3.73693 2.61242 1.65782 +thorax 0.673863 1.36867 -1.21366 +lowerneck -12.6639 4.23843 0.871191 +upperneck -0.503805 5.68322 -4.98816 +head 2.21473 2.66958 -1.42777 +rclavicle 1.9133e-014 1.31198e-014 +rhumerus -9.04388 14.801 -82.5439 +rradius 43.7541 +rwrist -16.5425 +rhand -25.8764 18.1624 +rfingers 7.12502 +rthumb 0.665108 -11.8163 +lclavicle 1.9133e-014 1.31198e-014 +lhumerus -51.1759 33.8174 65.2761 +lradius 19.8353 +lwrist 11.135 +lhand -21.4038 22.1568 +lfingers 7.12502 +lthumb 4.98449 52.0782 +rfemur 19.7277 2.06085 28.7127 +rtibia 13.9784 +rfoot -15.0329 1.75063 +rtoes -8.99435 +lfemur -27.7763 -0.479807 -22.3193 +ltibia 27.6883 +lfoot -9.30166 13.1214 +ltoes -11.1841 +9 +root 10.3343 16.5753 -28.5503 -2.28592 -10.2581 -2.54086 +lowerback 5.87195 1.73346 5.11106 +upperback 3.56428 2.54204 1.52084 +thorax 0.544173 1.33202 -1.42625 +lowerneck -12.8389 4.28669 0.757051 +upperneck -0.501307 5.7362 -4.30349 +head 2.21631 2.71548 -1.17916 +rclavicle -1.33186e-014 -1.03368e-014 +rhumerus -9.46188 14.6013 -83.1637 +rradius 43.0615 +rwrist -16.2744 +rhand -25.7951 18.6118 +rfingers 7.12502 +rthumb 0.743616 -11.3667 +lclavicle -1.33186e-014 -1.03368e-014 +lhumerus -50.921 33.424 65.3926 +lradius 19.7381 +lwrist 11.3958 +lhand -21.7051 22.6165 +lfingers 7.12502 +lthumb 4.69349 52.5445 +rfemur 19.9706 2.02266 28.6945 +rtibia 14.6633 +rfoot -14.231 1.88766 +rtoes -11.8154 +lfemur -27.9258 -0.751252 -22.2513 +ltibia 29.0729 +lfoot -8.74962 14.2092 +ltoes -10.7542 +10 +root 10.323 16.5366 -28.3523 -2.23404 -10.2098 -2.46793 +lowerback 5.65422 1.7393 4.99464 +upperback 3.45035 2.53558 1.41083 +thorax 0.546233 1.32679 -1.469 +lowerneck -12.567 4.24422 0.659075 +upperneck -0.942763 5.65924 -3.82541 +head 1.99407 2.70184 -1.02124 +rclavicle -1.70955e-014 -8.34896e-015 +rhumerus -9.9406 14.2338 -83.6317 +rradius 42.4407 +rwrist -15.9523 +rhand -25.841 19.0222 +rfingers 7.12502 +rthumb 0.699333 -10.9564 +lclavicle -1.70955e-014 -8.34896e-015 +lhumerus -50.6293 33.2714 65.479 +lradius 19.5341 +lwrist 11.2062 +lhand -21.9528 22.825 +lfingers 7.12502 +lthumb 4.45433 52.7581 +rfemur 20.2443 2.00486 28.5326 +rtibia 15.5901 +rfoot -13.7856 1.94695 +rtoes -15.0767 +lfemur -28.1653 -1.09442 -22.327 +ltibia 30.3575 +lfoot -8.43111 15.001 +ltoes -8.05829 +11 +root 10.3113 16.4997 -28.1612 -2.38897 -10.1522 -2.38425 +lowerback 5.69251 1.74104 4.85984 +upperback 3.4436 2.53459 1.32498 +thorax 0.515306 1.32455 -1.48382 +lowerneck -12.4188 4.20035 0.693845 +upperneck -1.41542 5.57606 -3.7145 +head 1.80474 2.67141 -1.00325 +rclavicle 3.23025e-015 3.97569e-016 +rhumerus -10.3454 13.8752 -84.0076 +rradius 41.8169 +rwrist -15.7038 +rhand -26.0009 19.0243 +rfingers 7.12502 +rthumb 0.544899 -10.9548 +lclavicle 3.23025e-015 3.97569e-016 +lhumerus -50.4439 33.6313 65.1218 +lradius 19.1743 +lwrist 10.1843 +lhand -21.7547 22.4258 +lfingers 7.12502 +lthumb 4.64563 52.3548 +rfemur 20.654 1.76938 28.3617 +rtibia 16.9931 +rfoot -13.6701 1.75689 +rtoes -19.9638 +lfemur -28.1914 -1.14051 -22.458 +ltibia 31.6336 +lfoot -8.26969 14.9866 +ltoes -3.29597 +12 +root 10.296 16.5225 -27.9723 -2.45678 -10.0637 -2.62042 +lowerback 5.77311 1.73311 4.96082 +upperback 3.41008 2.53532 1.36846 +thorax 0.438799 1.32382 -1.49916 +lowerneck -12.5776 4.12989 0.795294 +upperneck -1.52592 5.46276 -3.67055 +head 1.79557 2.61545 -1.01107 +rclavicle -1.57537e-014 -1.98785e-015 +rhumerus -10.7201 13.3374 -84.3669 +rradius 40.9751 +rwrist -15.2939 +rhand -26.1969 19.0964 +rfingers 7.12502 +rthumb 0.355561 -10.8831 +lclavicle -1.57537e-014 -1.98785e-015 +lhumerus -50.1928 34.053 64.7921 +lradius 18.8125 +lwrist 8.89169 +lhand -21.3185 21.9844 +lfingers 7.12502 +lthumb 5.06679 51.9039 +rfemur 19.9049 2.00137 28.5691 +rtibia 19.183 +rfoot -12.4956 2.24959 +rtoes -17.4671 +lfemur -28.031 -0.865269 -22.3005 +ltibia 32.7282 +lfoot -8.18919 14.3282 +ltoes 1.08808 +13 +root 10.2812 16.5332 -27.7894 -2.33861 -9.80673 -2.70045 +lowerback 5.60711 1.65368 4.87884 +upperback 3.3577 2.41805 1.39148 +thorax 0.464702 1.26376 -1.41987 +lowerneck -12.7739 4.06239 0.450837 +upperneck -1.6763 5.40044 -3.09814 +head 1.74626 2.60136 -0.771107 +rclavicle 1.8487e-014 1.03368e-014 +rhumerus -10.9953 12.7085 -84.7104 +rradius 40.0358 +rwrist -14.6971 +rhand -26.2269 19.2215 +rfingers 7.12502 +rthumb 0.326626 -10.758 +lclavicle 1.8487e-014 1.03368e-014 +lhumerus -49.5948 34.004 65.2109 +lradius 18.77 +lwrist 8.43357 +lhand -21.2367 22.5867 +lfingers 7.12502 +lthumb 5.1458 52.5042 +rfemur 18.9127 1.91993 28.515 +rtibia 21.72 +rfoot -11.405 2.64816 +rtoes -18.8452 +lfemur -28.0007 -0.715941 -22.3575 +ltibia 33.5756 +lfoot -8.01088 13.4488 +ltoes 3.26039 +14 +root 10.2653 16.5408 -27.6087 -2.37794 -9.47526 -2.00127 +lowerback 5.47096 1.58356 4.10241 +upperback 3.30749 2.28457 1.11127 +thorax 0.458045 1.18837 -1.266 +lowerneck -12.7164 4.02932 0.0169304 +upperneck -2.04348 5.3872 -2.27071 +head 1.57093 2.6239 -0.442091 +rclavicle -4.87022e-014 -3.57812e-015 +rhumerus -11.4226 12.0067 -85.1867 +rradius 39.188 +rwrist -14.1214 +rhand -26.0299 19.2531 +rfingers 7.12502 +rthumb 0.51682 -10.726 +lclavicle -4.87022e-014 -3.57812e-015 +lhumerus -48.7697 33.5874 65.7817 +lradius 18.6798 +lwrist 8.50975 +lhand -21.6456 23.6679 +lfingers 7.12502 +lthumb 4.75098 53.5947 +rfemur 17.7478 1.74726 27.5953 +rtibia 24.7832 +rfoot -10.6926 3.0188 +rtoes -21.3214 +lfemur -27.7673 -0.722927 -23.2709 +ltibia 34.181 +lfoot -7.96696 12.6847 +ltoes 4.13725 +15 +root 10.2471 16.5388 -27.4292 -2.57416 -9.35085 -1.05682 +lowerback 5.57659 1.64752 3.08759 +upperback 3.15787 2.33293 0.779749 +thorax 0.217375 1.19689 -1.04957 +lowerneck -12.4243 3.93395 -0.215653 +upperneck -2.31082 5.27697 -1.82614 +head 1.40889 2.58635 -0.278815 +rclavicle -7.35503e-015 5.1684e-015 +rhumerus -12.224 11.5491 -85.6049 +rradius 38.4797 +rwrist -14.1185 +rhand -25.9421 19.2987 +rfingers 7.12502 +rthumb 0.601682 -10.6802 +lclavicle -7.35503e-015 5.1684e-015 +lhumerus -48.1356 33.1709 66.0856 +lradius 18.4419 +lwrist 8.51712 +lhand -21.7629 23.8315 +lfingers 7.12502 +lthumb 4.63775 53.7607 +rfemur 16.7005 1.79325 26.4355 +rtibia 27.9131 +rfoot -9.52492 3.45135 +rtoes -23.0206 +lfemur -27.3797 -0.546801 -24.4309 +ltibia 34.7738 +lfoot -8.25455 12.1527 +ltoes 5.06689 +16 +root 10.2351 16.5316 -27.2485 -2.74737 -9.28235 -0.623118 +lowerback 5.65335 1.66132 2.58291 +upperback 3.11311 2.33145 0.727901 +thorax 0.109222 1.18873 -0.824706 +lowerneck -12.4044 3.79883 -0.684866 +upperneck -2.43886 5.15455 -1.58762 +head 1.34171 2.53518 -0.13422 +rclavicle -3.46879e-014 8.74653e-015 +rhumerus -12.8363 11.2784 -85.7916 +rradius 37.6851 +rwrist -14.051 +rhand -26.2018 19.3446 +rfingers 7.12502 +rthumb 0.35081 -10.6349 +lclavicle -3.46879e-014 8.74653e-015 +lhumerus -47.7233 33.5268 66.1589 +lradius 18.2309 +lwrist 8.07415 +lhand -21.2583 22.8057 +lfingers 7.12502 +lthumb 5.12493 52.7238 +rfemur 15.7124 1.78298 25.7415 +rtibia 30.8981 +rfoot -7.46614 4.03586 +rtoes -24.7717 +lfemur -26.9492 -0.427832 -25.0387 +ltibia 35.36 +lfoot -8.66092 11.8686 +ltoes 5.48688 +17 +root 10.2264 16.5416 -27.0655 -2.77736 -9.12624 -0.553813 +lowerback 5.52656 1.58751 2.51064 +upperback 3.14013 2.22525 0.700521 +thorax 0.202112 1.13634 -0.802328 +lowerneck -12.3924 3.7559 -0.866388 +upperneck -2.76906 5.11421 -1.48244 +head 1.22307 2.52197 -0.0780849 +rclavicle 2.65874e-015 7.55382e-015 +rhumerus -13.2385 10.6611 -86.1583 +rradius 36.7545 +rwrist -13.5562 +rhand -26.3999 19.2757 +rfingers 7.12502 +rthumb 0.159486 -10.704 +lclavicle 2.65874e-015 7.55382e-015 +lhumerus -47.105 33.804 66.397 +lradius 18.1811 +lwrist 7.86003 +lhand -20.93 22.0764 +lfingers 7.12502 +lthumb 5.4419 51.9865 +rfemur 14.5209 1.64198 25.3496 +rtibia 33.6611 +rfoot -4.81812 4.5746 +rtoes -25.3536 +lfemur -26.5916 -0.534902 -25.247 +ltibia 35.9695 +lfoot -9.00507 11.7654 +ltoes 5.58897 +18 +root 10.2174 16.5687 -26.8842 -2.65485 -9.1461 -0.674536 +lowerback 5.33207 1.55657 2.70627 +upperback 3.08843 2.18747 0.597589 +thorax 0.267656 1.12123 -1.00999 +lowerneck -12.1311 3.78641 -0.909975 +upperneck -3.34553 5.14568 -1.27167 +head 0.98306 2.54944 -0.0181747 +rclavicle -3.04141e-014 2.5842e-015 +rhumerus -13.7447 10.5135 -86.7087 +rradius 35.9162 +rwrist -13.6948 +rhand -26.4741 19.2271 +rfingers 7.12502 +rthumb 0.0878886 -10.7526 +lclavicle -3.04141e-014 2.5842e-015 +lhumerus -46.1765 33.1278 67.2041 +lradius 18.4271 +lwrist 8.60134 +lhand -20.9189 22.295 +lfingers 7.12502 +lthumb 5.45264 52.2048 +rfemur 13.1363 1.7222 25.1718 +rtibia 36.322 +rfoot -2.03097 4.96652 +rtoes -25.3019 +lfemur -26.3208 -0.471223 -25.2333 +ltibia 36.5153 +lfoot -9.23423 11.6437 +ltoes 5.95827 +19 +root 10.2116 16.595 -26.7066 -2.64375 -9.47236 -0.906176 +lowerback 5.35971 1.59829 2.95251 +upperback 2.99441 2.25698 0.626842 +thorax 0.167076 1.15653 -1.12354 +lowerneck -11.873 3.78317 -1.18256 +upperneck -3.63994 5.1669 -0.996609 +head 0.828896 2.57184 0.102144 +rclavicle 2.08475e-014 1.11319e-014 +rhumerus -14.1527 10.6689 -87.0533 +rradius 34.7797 +rwrist -13.9105 +rhand -26.5787 19.2819 +rfingers 7.12502 +rthumb -0.0132171 -10.6978 +lclavicle 2.08475e-014 1.11319e-014 +lhumerus -45.5274 32.7665 67.7481 +lradius 18.5376 +lwrist 8.61715 +lhand -20.7085 22.3064 +lfingers 7.12502 +lthumb 5.6558 52.211 +rfemur 11.8255 2.18092 25.1794 +rtibia 39.0073 +rfoot 0.970365 5.24151 +rtoes -26.2188 +lfemur -25.8179 -0.188503 -25.0714 +ltibia 36.8614 +lfoot -9.48037 11.4488 +ltoes 6.7712 +20 +root 10.2079 16.6059 -26.532 -2.76211 -9.71522 -0.831247 +lowerback 5.50538 1.66041 2.93481 +upperback 2.90156 2.34591 0.562099 +thorax -0.00381363 1.19807 -1.19127 +lowerneck -11.6598 3.77938 -1.05344 +upperneck -3.71046 5.1424 -1.06767 +head 0.775655 2.55822 0.0521623 +rclavicle -1.16786e-014 -4.57205e-015 +rhumerus -14.5919 10.3516 -87.3364 +rradius 33.5697 +rwrist -13.6888 +rhand -26.4409 19.1413 +rfingers 7.12502 +rthumb 0.119896 -10.8384 +lclavicle -1.16786e-014 -4.57205e-015 +lhumerus -44.7917 32.4641 68.2811 +lradius 18.5555 +lwrist 8.21876 +lhand -20.6797 22.267 +lfingers 7.12502 +lthumb 5.68363 52.1708 +rfemur 10.5421 2.73802 24.9329 +rtibia 41.7647 +rfoot 4.00122 5.37432 +rtoes -28.8772 +lfemur -25.0736 -0.212494 -25.2099 +ltibia 36.9829 +lfoot -10.1491 11.4734 +ltoes 8.24508 +21 +root 10.2053 16.6108 -26.3646 -2.87346 -9.75401 -0.483466 +lowerback 5.52006 1.67179 2.7017 +upperback 2.95522 2.34853 0.385611 +thorax 0.0409631 1.19935 -1.24158 +lowerneck -11.8208 3.80164 -0.714414 +upperneck -3.6633 5.13316 -1.37352 +head 0.835843 2.54306 -0.0937211 +rclavicle 1.02374e-014 -1.19271e-015 +rhumerus -15.1582 10.4121 -87.5933 +rradius 32.917 +rwrist -13.6668 +rhand -25.7393 18.5255 +rfingers 7.12502 +rthumb 0.79752 -11.4528 +lclavicle 1.02374e-014 -1.19271e-015 +lhumerus -43.4994 31.796 69.4447 +lradius 18.776 +lwrist 8.89272 +lhand -21.1838 22.4007 +lfingers 7.12502 +lthumb 5.19684 52.317 +rfemur 9.16722 3.17685 24.3989 +rtibia 44.5987 +rfoot 6.86027 5.32986 +rtoes -31.3544 +lfemur -24.2638 -0.506674 -25.6603 +ltibia 36.9165 +lfoot -11.1636 11.7608 +ltoes 8.18009 +22 +root 10.2009 16.6294 -26.2013 -2.98547 -9.89509 -0.18855 +lowerback 5.64796 1.68973 2.39825 +upperback 2.96474 2.3611 0.312339 +thorax -0.0296161 1.20204 -1.15216 +lowerneck -12.0539 3.7714 -0.585206 +upperneck -3.42828 5.0834 -1.61344 +head 0.961871 2.50871 -0.182978 +rclavicle 7.20594e-015 -4.37326e-015 +rhumerus -15.6491 10.39 -87.7576 +rradius 31.9656 +rwrist -13.1947 +rhand -24.7677 18.4469 +rfingers 7.12502 +rthumb 1.73595 -11.5258 +lclavicle 7.20594e-015 -4.37326e-015 +lhumerus -42.3989 31.0818 70.6477 +lradius 19.181 +lwrist 9.80618 +lhand -21.6407 22.5656 +lfingers 7.12502 +lthumb 4.75576 52.4922 +rfemur 7.66378 3.56329 23.8797 +rtibia 47.4777 +rfoot 9.76937 5.04672 +rtoes -32.2426 +lfemur -23.4027 -0.425521 -26.073 +ltibia 36.6925 +lfoot -11.8866 11.6926 +ltoes 7.3666 +23 +root 10.1959 16.6544 -26.0379 -3.06559 -9.97429 0.0240451 +lowerback 5.80185 1.66057 2.12962 +upperback 2.90409 2.31406 0.308223 +thorax -0.19028 1.17349 -1.01045 +lowerneck -12.1524 3.75947 -0.612919 +upperneck -3.47945 5.07136 -1.74081 +head 0.964977 2.49992 -0.217 +rclavicle 1.46604e-015 6.95746e-015 +rhumerus -15.897 9.86339 -87.9284 +rradius 30.4552 +rwrist -12.1604 +rhand -24.2888 18.7827 +rfingers 7.12502 +rthumb 2.19843 -11.1857 +lclavicle 1.46604e-015 6.95746e-015 +lhumerus -41.5506 30.3415 71.7691 +lradius 19.7322 +lwrist 10.533 +lhand -21.8358 22.5209 +lfingers 7.12502 +lthumb 4.56734 52.4517 +rfemur 6.06439 3.82906 23.444 +rtibia 50.3529 +rfoot 12.4521 4.39519 +rtoes -32.747 +lfemur -22.5252 -0.312266 -26.399 +ltibia 36.3381 +lfoot -12.2452 11.4164 +ltoes 7.85444 +24 +root 10.191 16.6758 -25.8812 -3.12009 -9.85684 0.424268 +lowerback 5.86355 1.54267 1.71906 +upperback 2.87436 2.13754 0.228151 +thorax -0.273565 1.08091 -0.855804 +lowerneck -12.1357 3.88825 -0.701862 +upperneck -3.82207 5.24692 -1.83706 +head 0.852133 2.58966 -0.229438 +rclavicle 5.61567e-015 2.5842e-015 +rhumerus -16.1283 9.28047 -88.1629 +rradius 29.1965 +rwrist -11.1125 +rhand -23.9589 18.823 +rfingers 7.12502 +rthumb 2.51702 -11.1419 +lclavicle 5.61567e-015 2.5842e-015 +lhumerus -40.6642 29.7012 72.7805 +lradius 20.2411 +lwrist 11.1396 +lhand -21.5526 21.8344 +lfingers 7.12502 +lthumb 4.84079 51.7591 +rfemur 4.42558 4.03313 22.8688 +rtibia 53.2019 +rfoot 14.456 3.25013 +rtoes -33.8301 +lfemur -21.7124 -0.382305 -26.9344 +ltibia 35.9175 +lfoot -12.5158 11.313 +ltoes 8.38674 +25 +root 10.1836 16.693 -25.7312 -3.27414 -9.67182 1.29586 +lowerback 6.00092 1.4254 0.857163 +upperback 2.84556 1.93645 -0.0269578 +thorax -0.405531 0.973316 -0.628076 +lowerneck -11.8151 4.06863 -0.675089 +upperneck -4.14643 5.47376 -2.04131 +head 0.701715 2.70401 -0.298635 +rclavicle -2.15681e-014 3.77691e-015 +rhumerus -16.5241 8.5869 -88.3951 +rradius 28.2981 +rwrist -10.0436 +rhand -22.9397 19.3162 +rfingers 7.12502 +rthumb 3.50134 -10.6348 +lclavicle -2.15681e-014 3.77691e-015 +lhumerus -39.6537 28.5102 73.9517 +lradius 20.8096 +lwrist 12.2555 +lhand -21.2693 21.2352 +lfingers 7.12502 +lthumb 5.11429 51.1535 +rfemur 2.7889 4.25044 21.8315 +rtibia 56.0081 +rfoot 15.3701 1.42992 +rtoes -34.0435 +lfemur -20.9134 -0.392911 -27.9778 +ltibia 35.514 +lfoot -12.8177 11.2125 +ltoes 8.59077 +26 +root 10.1755 16.7062 -25.5801 -3.50789 -9.55608 1.96007 +lowerback 6.13681 1.35635 0.171234 +upperback 2.93884 1.80599 -0.208612 +thorax -0.402839 0.903325 -0.424554 +lowerneck -11.7821 4.1557 -0.461975 +upperneck -4.20458 5.56175 -2.44725 +head 0.697939 2.73897 -0.456327 +rclavicle 1.20265e-014 -5.96354e-016 +rhumerus -16.8583 7.96362 -88.4781 +rradius 27.4729 +rwrist -8.96968 +rhand -21.8569 19.3574 +rfingers 7.12502 +rthumb 4.54694 -10.5738 +lclavicle 1.20265e-014 -5.96354e-016 +lhumerus -38.3949 26.6564 75.6308 +lradius 21.6024 +lwrist 14.3147 +lhand -22.1556 20.5546 +lfingers 7.12502 +lthumb 4.25855 50.4918 +rfemur 1.24403 4.36926 20.9999 +rtibia 58.6577 +rfoot 15.2925 -0.888256 +rtoes -31.9282 +lfemur -19.9924 -0.409026 -28.7856 +ltibia 35.1374 +lfoot -13.128 11.1528 +ltoes 8.39805 +27 +root 10.167 16.72 -25.4265 -3.59078 -9.52366 1.95526 +lowerback 6.13958 1.32708 0.126083 +upperback 3.07221 1.76461 -0.18048 +thorax -0.269839 0.882313 -0.365774 +lowerneck -12.1591 4.19364 -0.445049 +upperneck -3.94886 5.61926 -2.53958 +head 0.847841 2.75994 -0.473727 +rclavicle 1.83876e-015 -4.96962e-015 +rhumerus -17.0793 7.49798 -88.451 +rradius 26.7054 +rwrist -8.21149 +rhand -21.2513 18.2329 +rfingers 7.12502 +rthumb 5.13171 -11.685 +lclavicle 1.83876e-015 -4.96962e-015 +lhumerus -37.1529 25.1476 77.0963 +lradius 22.3418 +lwrist 15.6283 +lhand -22.9473 19.7706 +lfingers 7.12502 +lthumb 3.49396 49.7217 +rfemur -0.336515 4.39736 20.9068 +rtibia 61.0581 +rfoot 14.836 -2.86159 +rtoes -30.0059 +lfemur -19.1309 -0.378735 -28.8507 +ltibia 34.7486 +lfoot -13.3144 11.067 +ltoes 8.06739 +28 +root 10.1591 16.7399 -25.271 -3.55415 -9.22929 1.95711 +lowerback 6.07036 1.22885 0.0788909 +upperback 3.10939 1.63177 -0.160043 +thorax -0.196092 0.815464 -0.307946 +lowerneck -12.3619 4.21382 -0.668988 +upperneck -3.75195 5.68025 -2.29963 +head 0.931012 2.79386 -0.35283 +rclavicle 1.28216e-014 -1.05356e-014 +rhumerus -17.422 6.87938 -88.4155 +rradius 26.1118 +rwrist -7.71557 +rhand -20.517 17.3705 +rfingers 7.12502 +rthumb 5.84067 -12.529 +lclavicle 1.28216e-014 -1.05356e-014 +lhumerus -36.1102 24.2789 78.0134 +lradius 22.8929 +lwrist 15.7324 +lhand -22.6968 19.6203 +lfingers 7.12502 +lthumb 3.7359 49.5674 +rfemur -1.96718 4.23943 20.836 +rtibia 63.2027 +rfoot 13.95 -4.53643 +rtoes -28.9311 +lfemur -18.3886 -0.585167 -28.9383 +ltibia 34.366 +lfoot -13.6006 10.8912 +ltoes 8.13226 +29 +root 10.1524 16.7688 -25.1155 -3.63399 -8.85992 2.24419 +lowerback 6.05477 1.0978 -0.289542 +upperback 3.17552 1.43818 -0.17692 +thorax -0.129164 0.714818 -0.105942 +lowerneck -12.3898 4.19134 -1.02064 +upperneck -3.8459 5.69343 -2.1193 +head 0.888211 2.80881 -0.239548 +rclavicle 1.33186e-014 -3.97569e-016 +rhumerus -17.8831 6.0822 -88.3206 +rradius 25.5756 +rwrist -6.96904 +rhand -19.8958 17.5459 +rfingers 7.12502 +rthumb 6.44037 -12.3362 +lclavicle 1.33186e-014 -3.97569e-016 +lhumerus -35.1371 23.2344 79.1103 +lradius 23.6276 +lwrist 16.3772 +lhand -23.1086 19.7051 +lfingers 7.12502 +lthumb 3.33827 49.6587 +rfemur -3.47355 4.0613 20.451 +rtibia 65.0947 +rfoot 12.5519 -6.32922 +rtoes -26.9925 +lfemur -17.5266 -0.747072 -29.3503 +ltibia 34.0141 +lfoot -14.1513 10.5942 +ltoes 8.4844 +30 +root 10.1456 16.7963 -24.9598 -3.77834 -8.78159 2.43781 +lowerback 6.12439 1.06112 -0.571197 +upperback 3.2434 1.37443 -0.147449 +thorax -0.105168 0.679324 0.0853386 +lowerneck -12.2315 4.16097 -1.05116 +upperneck -4.20207 5.64728 -2.37249 +head 0.753631 2.7867 -0.323498 +rclavicle 1.44119e-014 1.19271e-015 +rhumerus -18.407 5.21447 -88.1658 +rradius 24.9823 +rwrist -6.12356 +rhand -19.5378 18.0005 +rfingers 7.12502 +rthumb 6.78597 -11.8708 +lclavicle 1.44119e-014 1.19271e-015 +lhumerus -34.2931 21.6521 80.3915 +lradius 24.7908 +lwrist 17.5213 +lhand -23.4771 20.7757 +lfingers 7.12502 +lthumb 2.98231 50.7346 +rfemur -4.87486 4.16769 20.1579 +rtibia 66.7582 +rfoot 10.8353 -8.07272 +rtoes -24.0768 +lfemur -16.5848 -0.526746 -29.6479 +ltibia 33.6404 +lfoot -14.5666 10.358 +ltoes 8.42831 +31 +root 10.1408 16.8155 -24.8004 -3.89459 -8.72858 2.31061 +lowerback 6.28997 1.04874 -0.443491 +upperback 3.21205 1.36392 -0.089269 +thorax -0.227668 0.67531 0.070458 +lowerneck -11.8626 4.16767 -0.587013 +upperneck -4.53936 5.58473 -2.98817 +head 0.618597 2.74605 -0.604412 +rclavicle 1.50331e-014 4.77083e-015 +rhumerus -19.13 4.31631 -88.0351 +rradius 24.4204 +rwrist -5.49362 +rhand -19.2222 18.0211 +rfingers 7.12502 +rthumb 7.09068 -11.8401 +lclavicle 1.50331e-014 4.77083e-015 +lhumerus -33.6716 20.3312 81.2102 +lradius 25.8659 +lwrist 17.6515 +lhand -22.4381 21.88 +lfingers 7.12502 +lthumb 3.9857 51.8225 +rfemur -6.15562 4.2728 20.2255 +rtibia 68.1551 +rfoot 9.31862 -9.60946 +rtoes -21.5562 +lfemur -15.632 -0.467182 -29.6308 +ltibia 33.2531 +lfoot -14.6998 10.4677 +ltoes 6.82678 +32 +root 10.1398 16.8395 -24.6379 -3.91816 -8.70242 2.08631 +lowerback 6.19782 1.02718 -0.107148 +upperback 3.27701 1.35416 -0.0528665 +thorax -0.102885 0.673815 -0.077404 +lowerneck -11.7623 4.1902 -0.466441 +upperneck -4.59747 5.59721 -3.13378 +head 0.592376 2.75004 -0.671471 +rclavicle 1.69215e-014 4.37326e-015 +rhumerus -19.6971 3.65041 -87.9772 +rradius 23.8365 +rwrist -5.11441 +rhand -19.3527 17.7611 +rfingers 7.12502 +rthumb 6.96473 -12.1044 +lclavicle 1.69215e-014 4.37326e-015 +lhumerus -32.8186 19.5065 81.8183 +lradius 26.4342 +lwrist 17.3235 +lhand -21.6441 20.9289 +lfingers 7.12502 +lthumb 4.75242 50.8556 +rfemur -7.4927 4.36558 20.3757 +rtibia 69.3336 +rfoot 7.85513 -10.9648 +rtoes -19.8715 +lfemur -14.7187 -0.542261 -29.5344 +ltibia 32.8259 +lfoot -14.8375 10.7508 +ltoes 4.81515 +33 +root 10.143 16.8659 -24.476 -3.83093 -8.64215 2.06736 +lowerback 5.90499 0.975261 0.0507279 +upperback 3.31943 1.2936 -0.0924463 +thorax 0.107548 0.645975 -0.196691 +lowerneck -11.8233 4.18737 -0.70244 +upperneck -4.40573 5.62876 -2.7398 +head 0.643097 2.77247 -0.506155 +rclavicle 3.16565e-014 3.97569e-015 +rhumerus -20.3023 3.31174 -88.0254 +rradius 23.3542 +rwrist -5.18872 +rhand -19.7375 17.6106 +rfingers 7.12502 +rthumb 6.5932 -12.2668 +lclavicle 3.16565e-014 3.97569e-015 +lhumerus -32.0367 18.2992 82.5081 +lradius 27.1723 +lwrist 17.8073 +lhand -21.5224 20.0605 +lfingers 7.12502 +lthumb 4.86996 49.9845 +rfemur -9.02305 4.56089 20.2604 +rtibia 70.3693 +rfoot 5.97209 -12.3378 +rtoes -17.3773 +lfemur -13.9304 -0.584382 -29.6451 +ltibia 32.3332 +lfoot -15.1445 10.8904 +ltoes 4.5426 +34 +root 10.1435 16.8841 -24.3128 -3.91945 -8.1217 2.52972 +lowerback 5.85621 0.78181 -0.377551 +upperback 3.24248 1.01489 -0.209743 +thorax 0.0491829 0.502347 -0.0611554 +lowerneck -11.685 4.19811 -0.827078 +upperneck -4.1965 5.6618 -2.52697 +head 0.676202 2.79256 -0.419041 +rclavicle 2.24875e-014 4.37326e-015 +rhumerus -21.3135 3.12564 -88.0136 +rradius 23.4158 +rwrist -6.0359 +rhand -19.628 16.9653 +rfingers 7.12502 +rthumb 6.69889 -12.9087 +lclavicle 2.24875e-014 4.37326e-015 +lhumerus -31.7248 16.5846 83.3004 +lradius 28.5155 +lwrist 19.1917 +lhand -21.616 20.919 +lfingers 7.12502 +lthumb 4.77955 50.8451 +rfemur -10.3495 4.41657 19.6179 +rtibia 71.2193 +rfoot 4.45248 -13.6285 +rtoes -14.5613 +lfemur -12.9915 -0.808511 -30.2997 +ltibia 31.8227 +lfoot -15.365 10.8423 +ltoes 4.63439 +35 +root 10.1362 16.9006 -24.152 -4.09677 -7.34104 2.74254 +lowerback 5.89104 0.510346 -0.711074 +upperback 3.27475 0.637729 -0.14218 +thorax 0.0595016 0.309071 0.216478 +lowerneck -11.4387 4.22106 -0.776176 +upperneck -4.24724 5.6819 -2.82684 +head 0.630845 2.79954 -0.524835 +rclavicle -2.08227e-014 4.77083e-015 +rhumerus -22.1225 2.60953 -87.7059 +rradius 23.3538 +rwrist -6.31565 +rhand -19.4184 16.552 +rfingers 7.12502 +rthumb 6.90123 -13.3155 +lclavicle -2.08227e-014 4.77083e-015 +lhumerus -31.2479 15.1018 84.256 +lradius 29.8621 +lwrist 20.5105 +lhand -22.0473 21.9389 +lfingers 7.12502 +lthumb 4.36308 51.8739 +rfemur -11.4217 4.05738 19.3102 +rtibia 71.8847 +rfoot 3.11688 -14.6202 +rtoes -13.1064 +lfemur -11.9244 -1.17344 -30.6848 +ltibia 31.3537 +lfoot -15.4835 10.7246 +ltoes 3.79381 +36 +root 10.1272 16.9077 -24.0001 -4.09685 -6.76747 2.17635 +lowerback 5.88926 0.301506 -0.293584 +upperback 3.36297 0.382298 0.14607 +thorax 0.154151 0.183948 0.293031 +lowerneck -11.4136 4.24879 -0.862836 +upperneck -4.33842 5.72625 -2.92422 +head 0.598426 2.82275 -0.540665 +rclavicle 9.56651e-015 -3.18055e-015 +rhumerus -22.8116 2.15749 -87.4251 +rradius 22.745 +rwrist -5.23315 +rhand -20.5575 17.7626 +rfingers 7.12502 +rthumb 5.80156 -12.138 +lclavicle 9.56651e-015 -3.18055e-015 +lhumerus -30.4664 13.9505 85.1241 +lradius 30.9832 +lwrist 20.9375 +lhand -22.1782 23.1333 +lfingers 7.12502 +lthumb 4.23672 53.0709 +rfemur -12.5852 4.03455 19.9041 +rtibia 72.3604 +rfoot 1.51218 -15.583 +rtoes -12.9406 +lfemur -11.0337 -1.47769 -30.2032 +ltibia 30.9771 +lfoot -15.739 10.6157 +ltoes 2.23461 +37 +root 10.1189 16.9031 -23.8577 -3.95601 -6.2612 1.94277 +lowerback 5.83541 0.154059 -0.184058 +upperback 3.41511 0.19231 0.292534 +thorax 0.238935 0.0889861 0.392806 +lowerneck -11.7419 4.24562 -0.977252 +upperneck -4.17843 5.74531 -2.8503 +head 0.698345 2.82986 -0.489124 +rclavicle 8.99501e-015 -4.37326e-015 +rhumerus -23.6438 2.28764 -87.3618 +rradius 22.9839 +rwrist -5.68614 +rhand -21.2091 17.1883 +rfingers 7.12502 +rthumb 5.17244 -12.7286 +lclavicle 8.99501e-015 -4.37326e-015 +lhumerus -29.5498 12.7676 85.8839 +lradius 32.0358 +lwrist 21.4721 +lhand -21.9871 23.5817 +lfingers 7.12502 +lthumb 4.42126 53.5156 +rfemur -14.04 4.16587 20.0896 +rtibia 72.7023 +rfoot 0.0640253 -16.6706 +rtoes -11.6838 +lfemur -10.4436 -1.79585 -30.0735 +ltibia 30.6972 +lfoot -16.0306 10.5974 +ltoes 0.707499 +38 +root 10.1085 16.9174 -23.7213 -3.81417 -5.65836 2.06556 +lowerback 5.8347 0.0504522 -0.425194 +upperback 3.45567 0.0431187 0.280584 +thorax 0.282244 0.0110365 0.524013 +lowerneck -12.1521 4.16734 -0.734815 +upperneck -3.93478 5.62509 -3.05842 +head 0.859903 2.75605 -0.586375 +rclavicle -2.36057e-014 -7.15625e-015 +rhumerus -24.4104 1.91939 -87.2278 +rradius 23.0073 +rwrist -6.11198 +rhand -21.3254 17.1763 +rfingers 7.12502 +rthumb 5.06019 -12.7433 +lclavicle -2.36057e-014 -7.15625e-015 +lhumerus -28.6088 11.3375 86.5341 +lradius 33.0315 +lwrist 22.4037 +lhand -21.7752 22.8548 +lfingers 7.12502 +lthumb 4.62587 52.7843 +rfemur -15.5909 4.20733 19.9007 +rtibia 72.8764 +rfoot -1.35899 -17.8173 +rtoes -9.49219 +lfemur -9.98161 -2.32537 -30.2858 +ltibia 30.4892 +lfoot -16.4791 10.5348 +ltoes 1.1191 +39 +root 10.1004 16.949 -23.5702 -3.769 -5.08714 1.92672 +lowerback 5.87967 -0.0220035 -0.279418 +upperback 3.43888 -0.0460549 0.243315 +thorax 0.240881 -0.0308641 0.408921 +lowerneck -12.3169 4.07243 -0.385329 +upperneck -3.72129 5.46366 -3.17949 +head 0.970782 2.66493 -0.68327 +rclavicle -2.93207e-015 7.95139e-016 +rhumerus -25.2787 0.723881 -87.0201 +rradius 22.7695 +rwrist -6.33747 +rhand -21.5292 18.0786 +rfingers 7.12502 +rthumb 4.86338 -11.8456 +lclavicle -2.93207e-015 7.95139e-016 +lhumerus -28.048 9.64007 87.0092 +lradius 34.3295 +lwrist 23.146 +lhand -21.6407 23.57 +lfingers 7.12502 +lthumb 4.75571 53.4967 +rfemur -16.8086 4.35999 19.9959 +rtibia 72.7628 +rfoot -2.95199 -18.5525 +rtoes -8.44852 +lfemur -9.33472 -2.83074 -30.2156 +ltibia 30.2536 +lfoot -17.0173 10.4169 +ltoes 2.16527 +40 +root 10.0925 16.9674 -23.411 -3.79725 -4.57712 1.82217 +lowerback 5.95774 -0.138707 -0.264828 +upperback 3.33609 -0.199709 0.343141 +thorax 0.0935611 -0.107729 0.51213 +lowerneck -12.3137 3.97952 -0.419506 +upperneck -3.32935 5.35727 -3.19732 +head 1.09601 2.60646 -0.683753 +rclavicle 4.77083e-015 -1.59028e-015 +rhumerus -26.423 0.232295 -86.7343 +rradius 22.7866 +rwrist -7.45175 +rhand -21.7006 18.7614 +rfingers 7.12502 +rthumb 4.6979 -11.1665 +lclavicle 4.77083e-015 -1.59028e-015 +lhumerus -27.7755 8.33731 87.5682 +lradius 35.7689 +lwrist 23.7354 +lhand -21.505 25.1372 +lfingers 7.12502 +lthumb 4.88677 55.0609 +rfemur -17.7807 4.68982 20.0093 +rtibia 72.4479 +rfoot -4.21103 -18.6411 +rtoes -8.85955 +lfemur -8.59688 -3.0678 -30.197 +ltibia 29.9965 +lfoot -17.1633 10.3185 +ltoes 2.13495 +41 +root 10.0814 16.9567 -23.264 -3.90931 -4.06501 2.17412 +lowerback 6.12596 -0.256508 -0.858031 +upperback 3.30851 -0.386578 0.446828 +thorax -0.0209113 -0.208883 0.963264 +lowerneck -12.3737 3.8921 -0.826429 +upperneck -3.04139 5.30286 -3.02552 +head 1.18113 2.58194 -0.560388 +rclavicle -7.40473e-015 4.37326e-015 +rhumerus -27.4111 0.397736 -86.4184 +rradius 22.8727 +rwrist -8.67909 +rhand -21.3343 16.9749 +rfingers 7.12502 +rthumb 5.05157 -12.9448 +lclavicle -7.40473e-015 4.37326e-015 +lhumerus -27.3449 7.50694 88.1733 +lradius 37.0316 +lwrist 23.9906 +lhand -21.1029 23.9324 +lfingers 7.12502 +lthumb 5.27504 53.8467 +rfemur -18.7053 4.94894 19.5092 +rtibia 72.021 +rfoot -5.04642 -18.5943 +rtoes -10.5896 +lfemur -7.85173 -3.15246 -30.6564 +ltibia 29.7779 +lfoot -17.0744 10.047 +ltoes 2.10419 +42 +root 10.0722 16.9381 -23.1167 -3.87195 -3.56529 2.54337 +lowerback 6.03787 -0.315829 -1.3091 +upperback 3.34994 -0.487905 0.369397 +thorax 0.0765876 -0.265291 1.14203 +lowerneck -12.2278 3.84273 -0.892452 +upperneck -3.25441 5.23555 -2.81239 +head 1.07701 2.55844 -0.491486 +rclavicle -1.16786e-014 -3.18055e-015 +rhumerus -28.2659 0.0515751 -86.2715 +rradius 22.9314 +rwrist -9.00468 +rhand -20.8108 13.7042 +rfingers 7.12502 +rthumb 5.55702 -16.2029 +lclavicle -1.16786e-014 -3.18055e-015 +lhumerus -26.828 6.22658 88.584 +lradius 38.3638 +lwrist 24.3111 +lhand -20.8685 21.1103 +lfingers 7.12502 +lthumb 5.50131 51.0189 +rfemur -19.8065 5.19409 18.9431 +rtibia 71.4213 +rfoot -5.86462 -18.4847 +rtoes -11.9691 +lfemur -7.25211 -3.26304 -31.1284 +ltibia 29.6359 +lfoot -17.221 9.7365 +ltoes 2.1636 +43 +root 10.0642 16.944 -22.9606 -3.77215 -3.16461 2.29397 +lowerback 5.90096 -0.408563 -1.07188 +upperback 3.34717 -0.597469 0.384435 +thorax 0.150335 -0.317497 1.02941 +lowerneck -11.9122 3.81416 -0.641758 +upperneck -3.51829 5.15399 -2.79036 +head 0.943671 2.52244 -0.53909 +rclavicle 5.71506e-015 5.1684e-015 +rhumerus -29.2569 -0.74536 -86.1241 +rradius 22.9893 +rwrist -8.39379 +rhand -20.7564 12.8756 +rfingers 7.12502 +rthumb 5.60957 -17.0301 +lclavicle 5.71506e-015 5.1684e-015 +lhumerus -26.4018 4.64825 88.8602 +lradius 39.6334 +lwrist 24.9381 +lhand -21.1811 20.9655 +lfingers 7.12502 +lthumb 5.19945 50.8817 +rfemur -20.9112 5.75374 19.0346 +rtibia 70.5346 +rfoot -6.81737 -18.1222 +rtoes -12.164 +lfemur -6.65008 -3.44469 -30.9144 +ltibia 29.5147 +lfoot -17.5995 9.58067 +ltoes 2.00423 +44 +root 10.0568 16.9529 -22.8034 -3.83262 -2.82469 1.94033 +lowerback 5.95154 -0.535664 -0.792477 +upperback 3.37072 -0.75232 0.520508 +thorax 0.148524 -0.392487 1.02145 +lowerneck -11.8603 3.77694 -0.598376 +upperneck -3.48192 5.0992 -2.74597 +head 0.946013 2.49553 -0.535475 +rclavicle 1.05853e-014 3.57812e-015 +rhumerus -30.2418 -1.1618 -85.882 +rradius 23.0756 +rwrist -8.01468 +rhand -20.6622 13.7218 +rfingers 7.12502 +rthumb 5.70054 -16.1815 +lclavicle 1.05853e-014 3.57812e-015 +lhumerus -26.0839 3.45675 89.1918 +lradius 40.9582 +lwrist 25.3906 +lhand -21.5255 21.6369 +lfingers 7.12502 +lthumb 4.86697 51.561 +rfemur -21.7378 6.41209 19.2365 +rtibia 69.4167 +rfoot -8.05418 -17.5085 +rtoes -13.0337 +lfemur -5.83829 -3.72837 -30.6084 +ltibia 29.3535 +lfoot -18.0752 9.54502 +ltoes 2.31959 +45 +root 10.052 16.9511 -22.6492 -3.90673 -2.46997 2.02581 +lowerback 6.00438 -0.583539 -0.962145 +upperback 3.39747 -0.824359 0.586004 +thorax 0.152094 -0.431445 1.18844 +lowerneck -11.9014 3.73589 -0.787003 +upperneck -3.37233 5.07088 -2.56908 +head 0.9772 2.48521 -0.448506 +rclavicle -7.7526e-015 5.1684e-015 +rhumerus -31.1955 -1.30752 -85.6009 +rradius 23.1921 +rwrist -8.27246 +rhand -20.3627 14.1737 +rfingers 7.12502 +rthumb 5.98968 -15.7217 +lclavicle -7.7526e-015 5.1684e-015 +lhumerus -25.9135 2.45184 89.624 +lradius 42.5164 +lwrist 25.8342 +lhand -21.8026 21.5041 +lfingers 7.12502 +lthumb 4.59939 51.4342 +rfemur -22.4897 6.92858 18.9286 +rtibia 68.1321 +rfoot -8.93183 -16.9775 +rtoes -14.7498 +lfemur -5.05804 -3.9549 -30.7963 +ltibia 29.2243 +lfoot -18.5084 9.46682 +ltoes 2.26209 +46 +root 10.0411 16.9483 -22.4947 -4.01543 -2.1086 2.11452 +lowerback 6.09449 -0.607947 -1.20596 +upperback 3.43966 -0.869409 0.6561 +thorax 0.151976 -0.458073 1.40073 +lowerneck -12.0597 3.66289 -1.07268 +upperneck -3.14703 5.01675 -2.3352 +head 1.06174 2.46168 -0.325213 +rclavicle -1.08835e-014 1.47101e-014 +rhumerus -32.0372 -1.7342 -85.2796 +rradius 23.0923 +rwrist -8.25783 +rhand -20.3098 14.2064 +rfingers 7.12502 +rthumb 6.04068 -15.6875 +lclavicle -1.08835e-014 1.47101e-014 +lhumerus -25.7251 1.35267 89.9992 +lradius 44.0194 +lwrist 26.4654 +lhand -22.2034 21.6128 +lfingers 7.12502 +lthumb 4.21232 51.5509 +rfemur -23.1187 7.50527 18.6548 +rtibia 66.6764 +rfoot -9.17611 -16.7193 +rtoes -15.1596 +lfemur -4.27272 -3.99542 -30.9362 +ltibia 29.1209 +lfoot -18.8876 9.26146 +ltoes 1.08725 +47 +root 10.0216 16.9413 -22.3361 -4.08841 -1.76374 1.86314 +lowerback 6.14284 -0.700561 -1.17352 +upperback 3.49023 -0.990658 0.780546 +thorax 0.183059 -0.519944 1.51765 +lowerneck -12.4519 3.59149 -1.10383 +upperneck -2.71929 4.94183 -2.2553 +head 1.26534 2.41771 -0.285633 +rclavicle -2.00276e-014 -5.1684e-015 +rhumerus -33.0197 -1.8768 -85.1652 +rradius 23.3428 +rwrist -8.45942 +rhand -20.3284 14.4182 +rfingers 7.12502 +rthumb 6.02278 -15.4762 +lclavicle -2.00276e-014 -5.1684e-015 +lhumerus -25.3898 0.426133 90.1687 +lradius 45.4427 +lwrist 26.8982 +lhand -22.4188 21.9745 +lfingers 7.12502 +lthumb 4.00432 51.9166 +rfemur -23.6599 8.14733 18.7923 +rtibia 65.0495 +rfoot -9.6581 -16.4608 +rtoes -15.1498 +lfemur -3.44107 -4.05346 -30.657 +ltibia 28.8799 +lfoot -19.1829 9.01161 +ltoes 0.822497 +48 +root 10.0064 16.9329 -22.1816 -3.97529 -1.38644 1.87429 +lowerback 6.01295 -0.792835 -1.36985 +upperback 3.53234 -1.12176 0.809942 +thorax 0.307853 -0.589892 1.66286 +lowerneck -12.7305 3.58094 -0.922067 +upperneck -2.48921 4.91405 -2.32441 +head 1.39636 2.39586 -0.330786 +rclavicle 6.36111e-015 5.56597e-015 +rhumerus -34.0921 -1.6048 -85.26 +rradius 23.9569 +rwrist -9.20743 +rhand -20.4828 15.1068 +rfingers 7.12502 +rthumb 5.87367 -14.7917 +lclavicle 6.36111e-015 5.56597e-015 +lhumerus -24.8618 -0.435066 90.2791 +lradius 46.6774 +lwrist 27.252 +lhand -22.4583 22.0991 +lfingers 7.12502 +lthumb 3.96624 52.0419 +rfemur -24.3838 8.61153 18.5183 +rtibia 63.2614 +rfoot -10.5078 -15.9149 +rtoes -15.5579 +lfemur -2.76422 -4.1371 -30.6691 +ltibia 28.4749 +lfoot -19.3781 8.60632 +ltoes 1.89284 +49 +root 9.99755 16.9415 -22.031 -3.79733 -1.00188 2.2401 +lowerback 5.93197 -0.85225 -1.90253 +upperback 3.54298 -1.22567 0.781803 +thorax 0.379594 -0.650275 1.93695 +lowerneck -12.8827 3.54704 -1.05237 +upperneck -2.56314 4.88494 -2.1672 +head 1.39009 2.38614 -0.259141 +rclavicle 6.21202e-015 5.56597e-015 +rhumerus -34.78 -1.6497 -85.1791 +rradius 23.8994 +rwrist -9.59219 +rhand -20.5993 15.9957 +rfingers 7.12502 +rthumb 5.76122 -13.906 +lclavicle 6.21202e-015 5.56597e-015 +lhumerus -24.4462 -1.4016 90.4356 +lradius 47.8506 +lwrist 27.6626 +lhand -22.6079 21.5572 +lfingers 7.12502 +lthumb 3.82171 51.5027 +rfemur -25.2233 8.99146 17.7559 +rtibia 61.3119 +rfoot -11.1575 -15.0955 +rtoes -15.2378 +lfemur -2.11063 -4.27794 -31.1004 +ltibia 27.9561 +lfoot -19.5646 8.40891 +ltoes 1.50086 +50 +root 9.98757 16.9555 -21.8738 -3.75449 -0.660422 2.34142 +lowerback 6.08363 -0.922854 -2.14349 +upperback 3.42458 -1.33446 0.824513 +thorax 0.185923 -0.704987 2.12654 +lowerneck -12.6529 3.47817 -1.23879 +upperneck -2.74064 4.8084 -1.96606 +head 1.28077 2.3582 -0.175601 +rclavicle -1.61016e-014 8.74653e-015 +rhumerus -35.6295 -1.94009 -84.9436 +rradius 23.613 +rwrist -9.58822 +rhand -20.5823 16.9704 +rfingers 7.12502 +rthumb 5.7776 -12.9308 +lclavicle -1.61016e-014 8.74653e-015 +lhumerus -24.5498 -2.20591 90.5838 +lradius 49.3492 +lwrist 27.8265 +lhand -23.033 21.3789 +lfingers 7.12502 +lthumb 3.41124 51.3314 +rfemur -25.8511 9.44726 17.3396 +rtibia 59.2061 +rfoot -11.6624 -14.404 +rtoes -14.4583 +lfemur -1.18799 -4.44423 -31.2338 +ltibia 27.2556 +lfoot -19.5862 8.41491 +ltoes 0.119253 +51 +root 9.97702 16.959 -21.7161 -3.69342 -0.210424 2.17431 +lowerback 6.17809 -1.04908 -2.10793 +upperback 3.25386 -1.50197 0.961065 +thorax -0.0306204 -0.784846 2.26103 +lowerneck -12.0645 3.43917 -1.17253 +upperneck -2.93669 4.73602 -2.10846 +head 1.12073 2.32482 -0.248162 +rclavicle 1.20762e-014 -6.75868e-015 +rhumerus -36.7519 -2.03975 -84.7142 +rradius 23.6169 +rwrist -9.76807 +rhand -20.5876 17.8956 +rfingers 7.12502 +rthumb 5.77255 -12.0058 +lclavicle 1.20762e-014 -6.75868e-015 +lhumerus -24.7236 -2.82424 90.8195 +lradius 50.8082 +lwrist 27.7835 +lhand -23.8929 20.7916 +lfingers 7.12502 +lthumb 2.58084 50.7557 +rfemur -26.3055 9.84302 17.2287 +rtibia 56.9533 +rfoot -12.1128 -14.17 +rtoes -12.573 +lfemur -0.222295 -4.54209 -31.0345 +ltibia 26.4245 +lfoot -19.3614 8.18814 +ltoes -0.224986 +52 +root 9.96821 16.9609 -21.5641 -3.39193 0.24691 2.40613 +lowerback 5.94928 -1.1832 -2.46096 +upperback 3.20623 -1.69402 0.985829 +thorax 0.0698565 -0.886243 2.49056 +lowerneck -12.1504 3.44976 -1.22216 +upperneck -2.84608 4.761 -2.16193 +head 1.16531 2.33471 -0.252674 +rclavicle -8.54774e-015 8.74653e-015 +rhumerus -37.3706 -2.47669 -84.3431 +rradius 23.3807 +rwrist -9.31489 +rhand -20.4287 18.2022 +rfingers 7.12502 +rthumb 5.92589 -11.6949 +lclavicle -8.54774e-015 8.74653e-015 +lhumerus -24.3265 -3.35943 90.9696 +lradius 51.8273 +lwrist 27.689 +lhand -24.8218 19.3509 +lfingers 7.12502 +lthumb 1.6837 49.324 +rfemur -27.0078 10.2095 16.5747 +rtibia 54.5592 +rfoot -12.3208 -14.0856 +rtoes -12.1029 +lfemur 0.398198 -4.58905 -31.2503 +ltibia 25.6242 +lfoot -19.0882 7.94722 +ltoes -0.2648 +53 +root 9.95875 16.9581 -21.4062 -3.12282 0.555952 2.93081 +lowerback 5.60239 -1.24541 -3.02751 +upperback 3.29688 -1.79517 0.831027 +thorax 0.376241 -0.94898 2.64348 +lowerneck -12.6702 3.4538 -1.22923 +upperneck -2.63641 4.78034 -2.10614 +head 1.32214 2.33934 -0.220662 +rclavicle -2.5345e-015 1.07344e-014 +rhumerus -37.7381 -3.2863 -84.0045 +rradius 22.9805 +rwrist -8.42415 +rhand -20.2845 17.6497 +rfingers 7.12502 +rthumb 6.06516 -12.2435 +lclavicle -2.5345e-015 1.07344e-014 +lhumerus -23.8264 -3.92816 90.9018 +lradius 52.9322 +lwrist 27.5819 +lhand -24.8036 18.6646 +lfingers 7.12502 +lthumb 1.70127 48.6375 +rfemur -27.6582 10.6776 15.5882 +rtibia 52.0077 +rfoot -12.3621 -13.9089 +rtoes -14.715 +lfemur 1.06223 -4.49799 -31.7731 +ltibia 24.7799 +lfoot -18.9009 7.76984 +ltoes -0.691317 +54 +root 9.94797 16.9622 -21.236 -3.11886 0.827437 2.8965 +lowerback 5.48676 -1.29347 -3.02659 +upperback 3.33924 -1.85521 0.793949 +thorax 0.486951 -0.981055 2.60355 +lowerneck -12.58 3.42724 -1.07448 +upperneck -2.77635 4.71887 -2.07787 +head 1.26372 2.31088 -0.244068 +rclavicle 1.8487e-014 1.15295e-014 +rhumerus -38.4563 -3.54227 -84.0318 +rradius 22.6985 +rwrist -8.5804 +rhand -20.4635 17.3241 +rfingers 7.12502 +rthumb 5.89233 -12.5739 +lclavicle 1.8487e-014 1.15295e-014 +lhumerus -23.9897 -4.60076 90.7955 +lradius 54.5802 +lwrist 27.5239 +lhand -23.265 19.0069 +lfingers 7.12502 +lthumb 3.18715 48.9628 +rfemur -27.7974 11.231 15.3281 +rtibia 49.2781 +rfoot -12.3211 -13.9355 +rtoes -17.4791 +lfemur 2.15206 -4.44259 -31.6953 +ltibia 23.8212 +lfoot -18.7187 7.50471 +ltoes -0.793847 +55 +root 9.93724 16.9803 -21.0672 -3.1432 1.10282 2.78199 +lowerback 5.51786 -1.3886 -3.03123 +upperback 3.33424 -1.9828 0.848632 +thorax 0.475421 -1.04523 2.66925 +lowerneck -12.3942 3.46022 -0.987246 +upperneck -3.00283 4.74249 -2.04448 +head 1.15896 2.32687 -0.25332 +rclavicle 1.24737e-014 1.23246e-014 +rhumerus -39.0841 -3.77036 -83.9239 +rradius 22.2957 +rwrist -8.68117 +rhand -20.3961 17.4923 +rfingers 7.12502 +rthumb 5.95742 -12.4039 +lclavicle 1.24737e-014 1.23246e-014 +lhumerus -24.1325 -5.11227 90.7294 +lradius 56.0612 +lwrist 27.5838 +lhand -21.1777 19.5885 +lfingers 7.12502 +lthumb 5.20277 49.5046 +rfemur -27.856 11.6724 15.1818 +rtibia 46.4496 +rfoot -12.4496 -14.0175 +rtoes -17.9002 +lfemur 3.27838 -4.52453 -31.5319 +ltibia 22.8357 +lfoot -18.5383 7.19614 +ltoes -0.372539 +56 +root 9.92805 16.991 -20.9046 -3.03239 1.39299 2.90603 +lowerback 5.48623 -1.49347 -3.21373 +upperback 3.32041 -2.12962 0.845938 +thorax 0.496167 -1.12152 2.77468 +lowerneck -12.6491 3.48212 -1.02193 +upperneck -2.9001 4.7806 -1.95729 +head 1.23327 2.34522 -0.212442 +rclavicle -3.58806e-014 1.66979e-014 +rhumerus -39.555 -4.40196 -83.5323 +rradius 21.8385 +rwrist -8.09287 +rhand -19.8674 17.662 +rfingers 7.12502 +rthumb 6.46778 -12.2193 +lclavicle -3.58806e-014 1.66979e-014 +lhumerus -23.8878 -5.54096 90.7163 +lradius 57.0555 +lwrist 27.8451 +lhand -21.8817 18.503 +lfingers 7.12502 +lthumb 4.52296 48.4347 +rfemur -28.1009 11.9327 14.7389 +rtibia 43.6122 +rfoot -12.442 -14.0283 +rtoes -16.2974 +lfemur 4.24418 -4.55088 -31.6153 +ltibia 21.8308 +lfoot -18.3368 6.88408 +ltoes -0.569303 +57 +root 9.92081 16.9871 -20.7412 -2.89655 1.74177 3.0285 +lowerback 5.44281 -1.57718 -3.33777 +upperback 3.25184 -2.24581 0.82594 +thorax 0.462378 -1.17957 2.82865 +lowerneck -12.8763 3.42813 -1.15624 +upperneck -2.71544 4.73191 -1.77388 +head 1.32453 2.32278 -0.128363 +rclavicle -8.59744e-015 -6.36111e-015 +rhumerus -40.2164 -4.81822 -83.2826 +rradius 21.4959 +rwrist -7.79386 +rhand -19.7977 17.9209 +rfingers 7.12502 +rthumb 6.53508 -11.9582 +lclavicle -8.59744e-015 -6.36111e-015 +lhumerus -23.8997 -6.15326 90.7823 +lradius 58.1658 +lwrist 28.11 +lhand -22.0999 18.2152 +lfingers 7.12502 +lthumb 4.31233 48.1513 +rfemur -28.2936 12.0813 14.3153 +rtibia 40.8483 +rfoot -12.2223 -13.971 +rtoes -15.3145 +lfemur 5.19867 -4.53593 -31.6973 +ltibia 20.8402 +lfoot -18.097 6.54001 +ltoes -1.2558 +58 +root 9.9135 16.9782 -20.5784 -2.90421 2.14299 3.23856 +lowerback 5.56906 -1.68902 -3.63911 +upperback 3.18843 -2.41327 0.848971 +thorax 0.353988 -1.2647 3.03467 +lowerneck -12.6923 3.40022 -1.34248 +upperneck -2.83494 4.71528 -1.76401 +head 1.24829 2.31862 -0.100178 +rclavicle 1.83379e-014 -1.07344e-014 +rhumerus -40.8824 -5.21023 -82.9108 +rradius 21.1276 +rwrist -7.37921 +rhand -20.1074 18.0702 +rfingers 7.12502 +rthumb 6.23611 -11.818 +lclavicle 1.83379e-014 -1.07344e-014 +lhumerus -24.0954 -6.5985 90.925 +lradius 59.3755 +lwrist 28.2272 +lhand -22.301 18.6024 +lfingers 7.12502 +lthumb 4.11815 48.5423 +rfemur -28.2146 11.9879 13.923 +rtibia 38.165 +rfoot -12.2191 -13.7657 +rtoes -15.3342 +lfemur 6.2625 -4.57655 -31.8948 +ltibia 19.9697 +lfoot -17.8998 6.23744 +ltoes -1.87882 +59 +root 9.9065 16.9769 -20.4156 -2.94447 2.41979 3.0633 +lowerback 5.72368 -1.80437 -3.48759 +upperback 3.11647 -2.56538 0.953131 +thorax 0.203705 -1.3356 3.07166 +lowerneck -12.3799 3.37807 -1.64459 +upperneck -3.03625 4.71526 -1.64444 +head 1.11775 2.32818 -0.0216595 +rclavicle -2.61402e-014 3.57812e-015 +rhumerus -41.6418 -5.67943 -82.4783 +rradius 20.9151 +rwrist -6.8665 +rhand -20.0461 18.2644 +rfingers 7.12502 +rthumb 6.29532 -11.622 +lclavicle -2.61402e-014 3.57812e-015 +lhumerus -24.1748 -6.82112 90.9846 +lradius 60.3349 +lwrist 28.312 +lhand -23.183 17.6893 +lfingers 7.12502 +lthumb 3.2664 47.644 +rfemur -28.1676 11.8245 14.0696 +rtibia 35.6084 +rfoot -12.3785 -13.6413 +rtoes -15.7887 +lfemur 7.36795 -4.54609 -31.666 +ltibia 19.0996 +lfoot -17.6725 5.95096 +ltoes -2.41522 +60 +root 9.9008 16.9849 -20.2479 -2.84633 2.58438 2.64621 +lowerback 5.62358 -1.83509 -2.95941 +upperback 3.1063 -2.57756 1.00483 +thorax 0.226964 -1.33563 2.82564 +lowerneck -12.5118 3.3009 -1.47624 +upperneck -3.04977 4.59412 -1.75679 +head 1.1433 2.26319 -0.087672 +rclavicle 3.11595e-014 -1.23246e-014 +rhumerus -42.3004 -6.55496 -82.0491 +rradius 20.6651 +rwrist -6.2481 +rhand -19.7888 18.7122 +rfingers 7.12502 +rthumb 6.54368 -11.1667 +lclavicle 3.11595e-014 -1.23246e-014 +lhumerus -24.0226 -7.28204 90.888 +lradius 61.0566 +lwrist 28.3191 +lhand -24.1197 15.6758 +lfingers 7.12502 +lthumb 2.36176 45.6425 +rfemur -28.3934 11.6297 14.505 +rtibia 33.2928 +rfoot -12.7791 -13.3364 +rtoes -15.8308 +lfemur 8.38892 -4.41014 -31.1233 +ltibia 18.0605 +lfoot -17.4139 5.72522 +ltoes -2.85901 +61 +root 9.8951 16.9851 -20.0786 -2.71991 2.84376 2.62663 +lowerback 5.42431 -1.83227 -2.85704 +upperback 3.20221 -2.56295 0.947911 +thorax 0.427944 -1.33104 2.69891 +lowerneck -12.9308 3.20296 -1.04854 +upperneck -2.94789 4.42048 -2.14447 +head 1.26955 2.15997 -0.27938 +rclavicle 1.09332e-015 3.97569e-016 +rhumerus -42.5821 -7.68032 -81.5308 +rradius 20.1545 +rwrist -5.52479 +rhand -19.7515 18.9518 +rfingers 7.12502 +rthumb 6.57974 -10.926 +lclavicle 1.09332e-015 3.97569e-016 +lhumerus -23.698 -7.90109 90.7898 +lradius 61.6435 +lwrist 28.03 +lhand -24.6074 15.2789 +lfingers 7.12502 +lthumb 1.89074 45.2503 +rfemur -28.5378 11.0141 14.5967 +rtibia 31.0913 +rfoot -13.2591 -12.4921 +rtoes -14.4305 +lfemur 9.43577 -4.31456 -31.0292 +ltibia 16.9299 +lfoot -17.2207 5.67235 +ltoes -5.0474 +62 +root 9.89132 16.9736 -19.908 -2.73197 3.15073 2.70474 +lowerback 5.38174 -1.87674 -2.88796 +upperback 3.27938 -2.62159 0.937065 +thorax 0.536159 -1.3635 2.70407 +lowerneck -13.0193 3.13542 -1.2535 +upperneck -2.93724 4.35953 -1.99206 +head 1.27914 2.13433 -0.19872 +rclavicle -2.71341e-014 1.31198e-014 +rhumerus -42.9236 -8.14813 -81.2237 +rradius 19.7527 +rwrist -5.40289 +rhand -19.7322 19.0523 +rfingers 7.12502 +rthumb 6.59832 -10.8249 +lclavicle -2.71341e-014 1.31198e-014 +lhumerus -23.4686 -8.24444 90.797 +lradius 62.1248 +lwrist 27.5728 +lhand -25.025 16.3464 +lfingers 7.12502 +lthumb 1.4874 46.3209 +rfemur -28.4818 9.95706 14.7785 +rtibia 29.1303 +rfoot -13.4321 -11.5985 +rtoes -14.2897 +lfemur 10.6918 -4.16957 -31.0509 +ltibia 15.7591 +lfoot -16.8997 5.50792 +ltoes -7.27511 +63 +root 9.88998 16.9758 -19.7309 -2.86274 3.37962 2.40654 +lowerback 5.39012 -1.98638 -2.52791 +upperback 3.30746 -2.75163 1.05325 +thorax 0.557157 -1.42504 2.62711 +lowerneck -12.8865 3.15494 -1.85717 +upperneck -3.05461 4.45627 -1.381 +head 1.18803 2.2047 0.0937096 +rclavicle -4.06515e-014 5.1684e-015 +rhumerus -43.4477 -8.40769 -80.8804 +rradius 19.3997 +rwrist -5.2545 +rhand -19.5126 19.2039 +rfingers 7.12502 +rthumb 6.81036 -10.6665 +lclavicle -4.06515e-014 5.1684e-015 +lhumerus -23.4551 -8.21372 90.8536 +lradius 62.6117 +lwrist 27.3482 +lhand -25.1712 16.8635 +lfingers 7.12502 +lthumb 1.34618 46.839 +rfemur -28.3752 8.75444 15.5205 +rtibia 27.5961 +rfoot -13.4207 -10.7546 +rtoes -15.7295 +lfemur 12.1505 -3.94123 -30.6435 +ltibia 14.345 +lfoot -16.2135 5.32904 +ltoes -7.75971 +64 +root 9.88396 16.9761 -19.5553 -2.86581 3.6381 2.40948 +lowerback 5.28458 -2.10303 -2.52902 +upperback 3.30042 -2.90472 1.09066 +thorax 0.620565 -1.50296 2.66813 +lowerneck -12.8415 3.18802 -2.10394 +upperneck -3.15227 4.5282 -1.13108 +head 1.13628 2.25004 0.213848 +rclavicle -2.65874e-014 5.56597e-015 +rhumerus -43.9039 -9.06098 -80.2887 +rradius 18.9195 +rwrist -4.60431 +rhand -19.4566 19.508 +rfingers 7.12502 +rthumb 6.86442 -10.3607 +lclavicle -2.65874e-014 5.56597e-015 +lhumerus -23.5818 -8.16679 90.8954 +lradius 63.1446 +lwrist 27.307 +lhand -25.179 16.6433 +lfingers 7.12502 +lthumb 1.33868 46.6189 +rfemur -28.5143 7.54574 15.9037 +rtibia 26.4072 +rfoot -13.5689 -9.54976 +rtoes -16.1018 +lfemur 13.4721 -3.89872 -30.6028 +ltibia 12.8723 +lfoot -15.4805 5.33084 +ltoes -8.69367 +65 +root 9.87399 16.9719 -19.3855 -2.77787 4.00004 2.74242 +lowerback 5.25574 -2.18964 -2.90989 +upperback 3.26214 -3.03566 1.04163 +thorax 0.624096 -1.57337 2.83564 +lowerneck -12.9843 3.18218 -1.61471 +upperneck -3.03874 4.46645 -1.7997 +head 1.22612 2.19672 -0.074862 +rclavicle 2.1916e-014 -1.98785e-015 +rhumerus -44.2742 -10.0721 -79.4848 +rradius 18.3711 +rwrist -3.71562 +rhand -19.8024 19.1454 +rfingers 7.12502 +rthumb 6.53059 -10.7339 +lclavicle 2.1916e-014 -1.98785e-015 +lhumerus -23.7164 -8.29565 90.9652 +lradius 63.5894 +lwrist 27.1856 +lhand -25.3004 16.5802 +lfingers 7.12502 +lthumb 1.22139 46.5564 +rfemur -28.7765 6.21903 15.9275 +rtibia 25.467 +rfoot -13.8378 -8.1516 +rtoes -16.0892 +lfemur 14.6775 -4.04527 -30.935 +ltibia 11.516 +lfoot -14.7577 5.25788 +ltoes -10.1771 +66 +root 9.86326 16.9698 -19.2133 -2.73497 4.20568 2.65984 +lowerback 5.29934 -2.21316 -2.84968 +upperback 3.22969 -3.06556 1.09608 +thorax 0.568267 -1.58654 2.86208 +lowerneck -13.1797 3.17983 -0.957195 +upperneck -2.88225 4.3911 -2.66464 +head 1.35056 2.12877 -0.454481 +rclavicle -2.09221e-014 1.98785e-015 +rhumerus -44.6654 -11.1164 -78.645 +rradius 17.9007 +rwrist -2.77644 +rhand -20.0808 18.0874 +rfingers 7.12502 +rthumb 6.26182 -11.8001 +lclavicle -2.09221e-014 1.98785e-015 +lhumerus -23.873 -8.58712 91.1049 +lradius 63.9795 +lwrist 27.1456 +lhand -25.1219 16.6334 +lfingers 7.12502 +lthumb 1.39388 46.6086 +rfemur -29.0812 5.10358 16.4518 +rtibia 24.9364 +rfoot -14.1515 -7.0619 +rtoes -15.8036 +lfemur 15.8815 -4.13006 -30.8254 +ltibia 10.2927 +lfoot -13.9637 5.32087 +ltoes -11.6966 +67 +root 9.85121 16.9684 -19.0331 -2.52551 4.24228 2.60888 +lowerback 5.05107 -2.1783 -2.84476 +upperback 3.16549 -3.01324 1.1784 +thorax 0.640715 -1.5615 2.93242 +lowerneck -13.3431 3.13924 -0.612947 +upperneck -2.68711 4.3064 -3.2322 +head 1.46778 2.06496 -0.691965 +rclavicle 4.62174e-015 -1.59028e-014 +rhumerus -45.0717 -11.9003 -77.9049 +rradius 17.5148 +rwrist -2.17992 +rhand -19.5968 17.5699 +rfingers 7.12502 +rthumb 6.7291 -12.3032 +lclavicle 4.62174e-015 -1.59028e-014 +lhumerus -24.0808 -8.86511 91.3184 +lradius 64.2585 +lwrist 27.0999 +lhand -24.9735 16.4144 +lfingers 7.12502 +lthumb 1.53714 46.3886 +rfemur -29.5242 4.49384 16.8417 +rtibia 24.6682 +rfoot -14.726 -6.53259 +rtoes -15.2883 +lfemur 16.8159 -4.09029 -30.7106 +ltibia 9.27689 +lfoot -13.3286 5.43883 +ltoes -12.5267 +68 +root 9.83593 16.9528 -18.8478 -2.21698 4.45736 2.8769 +lowerback 4.66969 -2.23733 -3.2404 +upperback 3.04794 -3.09808 1.25009 +thorax 0.76454 -1.61132 3.21623 +lowerneck -13.3669 3.06606 -0.958026 +upperneck -2.622 4.26087 -3.16503 +head 1.48204 2.04495 -0.613751 +rclavicle 4.34841e-014 -4.77083e-015 +rhumerus -45.4392 -12.6672 -76.9705 +rradius 17.0429 +rwrist -1.5291 +rhand -18.7562 17.5754 +rfingers 7.12502 +rthumb 7.54052 -12.2702 +lclavicle 4.34841e-014 -4.77083e-015 +lhumerus -24.228 -8.67758 91.5158 +lradius 64.2484 +lwrist 26.7001 +lhand -25.0729 16.2065 +lfingers 7.12502 +lthumb 1.44111 46.1814 +rfemur -29.8433 4.19006 16.7257 +rtibia 24.3969 +rfoot -15.1593 -6.74108 +rtoes -14.6292 +lfemur 17.2307 -4.23198 -30.9011 +ltibia 9.11272 +lfoot -13.1119 5.39382 +ltoes -12.0276 +69 +root 9.81647 16.925 -18.6677 -2.16659 4.68413 3.09183 +lowerback 4.68229 -2.31061 -3.55103 +upperback 3.00667 -3.20798 1.27938 +thorax 0.743935 -1.67033 3.4255 +lowerneck -13.3078 3.02672 -1.81022 +upperneck -2.88529 4.30768 -2.31832 +head 1.34099 2.10128 -0.204642 +rclavicle -4.12478e-015 -8.74653e-015 +rhumerus -45.7677 -13.7246 -75.9124 +rradius 16.5432 +rwrist -0.308187 +rhand -18.4845 18.2948 +rfingers 7.12502 +rthumb 7.80269 -11.5412 +lclavicle -4.12478e-015 -8.74653e-015 +lhumerus -24.289 -8.37165 91.6126 +lradius 64.1338 +lwrist 26.2362 +lhand -24.4564 16.0839 +lfingers 7.12502 +lthumb 2.03662 46.0539 +rfemur -29.7433 4.16633 16.6321 +rtibia 24.1827 +rfoot -15.0023 -7.49624 +rtoes -13.4143 +lfemur 17.4912 -4.34023 -31.0563 +ltibia 9.68904 +lfoot -13.0648 5.38225 +ltoes -11.7842 +70 +root 9.79981 16.9011 -18.489 -2.32491 4.64741 2.76153 +lowerback 4.85608 -2.30877 -3.24975 +upperback 3.0399 -3.19901 1.39315 +thorax 0.669778 -1.6616 3.38128 +lowerneck -13.5954 3.04233 -2.09256 +upperneck -2.72472 4.37472 -1.9617 +head 1.42843 2.14148 -0.0347661 +rclavicle -5.26779e-015 1.43125e-014 +rhumerus -46.0753 -14.4991 -75.1656 +rradius 16.1919 +rwrist 0.570454 +rhand -18.663 18.5333 +rfingers 7.12502 +rthumb 7.6304 -11.3091 +lclavicle -5.26779e-015 1.43125e-014 +lhumerus -24.5587 -8.32467 91.7912 +lradius 64.1871 +lwrist 26.0739 +lhand -23.6512 16.2044 +lfingers 7.12502 +lthumb 2.81419 46.1655 +rfemur -29.4033 4.39661 17.1714 +rtibia 24.1984 +rfoot -14.5387 -8.40829 +rtoes -13.217 +lfemur 17.8706 -4.19122 -30.6288 +ltibia 10.4633 +lfoot -13.1727 5.22142 +ltoes -11.2972 +71 +root 9.78618 16.8888 -18.3031 -2.44431 4.63632 2.2934 +lowerback 4.84242 -2.35225 -2.87877 +upperback 2.99926 -3.24242 1.59719 +thorax 0.62947 -1.67871 3.38579 +lowerneck -13.7846 3.0942 -1.55469 +upperneck -2.34554 4.39386 -2.72267 +head 1.62054 2.11839 -0.356614 +rclavicle 4.66647e-014 -2.54444e-014 +rhumerus -46.4809 -14.7268 -74.6705 +rradius 16.0284 +rwrist 1.07661 +rhand -18.7503 17.7294 +rfingers 7.12502 +rthumb 7.5462 -12.116 +lclavicle 4.66647e-014 -2.54444e-014 +lhumerus -25.0494 -8.20559 92.0474 +lradius 64.1211 +lwrist 25.9677 +lhand -23.4884 16.1539 +lfingers 7.12502 +lthumb 2.97148 46.1129 +rfemur -29.0443 4.80996 17.7632 +rtibia 24.4044 +rfoot -13.9434 -9.48303 +rtoes -13.914 +lfemur 18.2193 -4.34862 -30.1081 +ltibia 11.4226 +lfoot -13.4704 5.06006 +ltoes -9.44287 +72 +root 9.76663 16.8767 -18.1131 -2.59864 4.74629 2.47873 +lowerback 4.99132 -2.38331 -3.26232 +upperback 2.91827 -3.30335 1.66179 +thorax 0.495178 -1.71154 3.67939 +lowerneck -13.5111 3.1306 -1.15684 +upperneck -2.44114 4.38932 -3.42144 +head 1.57065 2.09812 -0.650709 +rclavicle 3.97569e-016 1.66979e-014 +rhumerus -46.94 -14.964 -74.1149 +rradius 15.902 +rwrist 1.64496 +rhand -18.6466 17.2106 +rfingers 7.12502 +rthumb 7.64626 -12.6312 +lclavicle 3.97569e-016 1.66979e-014 +lhumerus -25.5027 -8.00752 92.2577 +lradius 63.732 +lwrist 25.7759 +lhand -23.6366 15.7848 +lfingers 7.12502 +lthumb 2.82827 45.7458 +rfemur -28.6031 5.43568 17.5336 +rtibia 24.841 +rfoot -13.5594 -10.5548 +rtoes -13.1775 +lfemur 18.3947 -4.20488 -30.1587 +ltibia 12.7974 +lfoot -13.8201 4.71666 +ltoes -9.26728 +73 +root 9.74724 16.8547 -17.9179 -2.67697 4.73883 2.64745 +lowerback 5.02391 -2.40439 -3.55278 +upperback 2.87146 -3.34485 1.7147 +thorax 0.453569 -1.7352 3.90157 +lowerneck -13.1652 3.17838 -1.33158 +upperneck -2.77529 4.45778 -3.37537 +head 1.39409 2.14409 -0.610988 +rclavicle 3.72721e-014 1.59028e-015 +rhumerus -47.1554 -15.6306 -73.2581 +rradius 15.3893 +rwrist 2.65529 +rhand -18.6951 16.6575 +rfingers 7.12502 +rthumb 7.59941 -13.186 +lclavicle 3.72721e-014 1.59028e-015 +lhumerus -25.9522 -7.77701 92.4249 +lradius 63.3825 +lwrist 25.8425 +lhand -24.4072 15.8563 +lfingers 7.12502 +lthumb 2.08406 45.8259 +rfemur -28.2991 6.11789 17.3618 +rtibia 25.5793 +rfoot -13.1652 -11.3535 +rtoes -10.3179 +lfemur 18.5645 -3.99963 -30.1974 +ltibia 13.9709 +lfoot -13.9655 4.37105 +ltoes -10.3471 +74 +root 9.73256 16.8187 -17.7182 -2.593 4.73086 2.32793 +lowerback 4.69878 -2.49762 -3.16268 +upperback 2.83369 -3.44479 1.78418 +thorax 0.584878 -1.78282 3.74209 +lowerneck -13.139 3.25362 -1.08832 +upperneck -2.84403 4.52272 -3.56698 +head 1.37977 2.17109 -0.710162 +rclavicle -1.44119e-015 -4.77083e-015 +rhumerus -47.2947 -16.6898 -72.2811 +rradius 14.6851 +rwrist 4.17755 +rhand -18.6859 15.8541 +rfingers 7.12502 +rthumb 7.60831 -13.989 +lclavicle -1.44119e-015 -4.77083e-015 +lhumerus -26.4086 -7.48273 92.3856 +lradius 63.115 +lwrist 25.8524 +lhand -24.2166 16.2731 +lfingers 7.12502 +lthumb 2.26819 46.2408 +rfemur -28.3178 6.44897 17.8533 +rtibia 26.6973 +rfoot -12.1493 -11.8991 +rtoes -9.48607 +lfemur 18.8116 -4.14817 -29.8195 +ltibia 14.7344 +lfoot -13.8348 4.1338 +ltoes -10.7101 +75 +root 9.71739 16.8005 -17.5182 -2.50282 4.84824 2.35827 +lowerback 4.51825 -2.57181 -3.10336 +upperback 2.68416 -3.53747 1.69107 +thorax 0.529397 -1.82394 3.61059 +lowerneck -13.4166 3.26057 -0.810313 +upperneck -2.39817 4.51442 -3.66227 +head 1.58651 2.15154 -0.780289 +rclavicle -9.49197e-015 1.19271e-014 +rhumerus -47.6922 -17.3861 -71.6883 +rradius 14.4085 +rwrist 4.85125 +rhand -18.2734 15.5657 +rfingers 7.12502 +rthumb 8.00648 -14.2626 +lclavicle -9.49197e-015 1.19271e-014 +lhumerus -27.0567 -7.16335 92.3118 +lradius 62.7705 +lwrist 25.7654 +lhand -21.8805 16.9013 +lfingers 7.12502 +lthumb 4.52417 46.8329 +rfemur -28.3853 6.53383 18.0195 +rtibia 27.9175 +rfoot -10.7524 -12.6281 +rtoes -11.488 +lfemur 19.0405 -4.28888 -29.7814 +ltibia 15.4358 +lfoot -13.528 3.94922 +ltoes -12.0577 +76 +root 9.70459 16.7901 -17.3149 -2.51178 4.88382 2.79321 +lowerback 4.43404 -2.59347 -3.51391 +upperback 2.58989 -3.57996 1.57298 +thorax 0.501505 -1.84721 3.71835 +lowerneck -13.8116 3.21569 -1.27373 +upperneck -1.92226 4.53461 -3.12194 +head 1.78634 2.16694 -0.518473 +rclavicle -6.95746e-016 5.56597e-015 +rhumerus -47.9627 -18.0973 -70.9501 +rradius 14.1246 +rwrist 5.63772 +rhand -18.2338 15.9532 +rfingers 7.12502 +rthumb 8.04465 -13.8737 +lclavicle -6.95746e-016 5.56597e-015 +lhumerus -27.7429 -6.77001 92.4292 +lradius 62.3229 +lwrist 26.0411 +lhand -22.6001 15.7591 +lfingers 7.12502 +lthumb 3.82932 45.7044 +rfemur -28.4286 6.67377 17.7066 +rtibia 29.1291 +rfoot -9.64798 -13.5817 +rtoes -11.8143 +lfemur 19.3263 -4.29719 -30.2256 +ltibia 16.2613 +lfoot -12.9889 4.02854 +ltoes -15.019 +77 +root 9.69635 16.7857 -17.1041 -2.64186 4.78079 2.97729 +lowerback 4.2016 -2.59018 -3.62934 +upperback 2.72038 -3.57176 1.53478 +thorax 0.769887 -1.85237 3.72662 +lowerneck -14.1648 3.18709 -1.42241 +upperneck -1.85354 4.52799 -3.07501 +head 1.86681 2.16068 -0.472225 +rclavicle -1.4561e-014 1.19271e-014 +rhumerus -47.9507 -19.2789 -69.9119 +rradius 13.717 +rwrist 7.15646 +rhand -18.5154 16.3754 +rfingers 7.12502 +rthumb 7.77295 -13.4618 +lclavicle -1.4561e-014 1.19271e-014 +lhumerus -28.0693 -6.48275 92.4852 +lradius 61.6058 +lwrist 25.9037 +lhand -23.2286 15.2179 +lfingers 7.12502 +lthumb 3.22235 45.1733 +rfemur -28.23 6.70648 17.6973 +rtibia 30.1534 +rfoot -8.71162 -13.9007 +rtoes -11.6207 +lfemur 19.7504 -4.2217 -30.4432 +ltibia 17.1383 +lfoot -12.2549 4.34534 +ltoes -18.7109 +78 +root 9.68509 16.7841 -16.896 -2.77449 4.58143 2.88554 +lowerback 4.10688 -2.53468 -3.45158 +upperback 2.71441 -3.4892 1.52587 +thorax 0.796979 -1.80887 3.61112 +lowerneck -14.1117 3.17353 -1.14964 +upperneck -1.90343 4.47267 -3.36922 +head 1.85616 2.12419 -0.617189 +rclavicle -1.89342e-014 -1.03368e-014 +rhumerus -48.1286 -19.9231 -69.3196 +rradius 13.5338 +rwrist 7.77823 +rhand -18.6152 16.6058 +rfingers 7.12502 +rthumb 7.6766 -13.2349 +lclavicle -1.89342e-014 -1.03368e-014 +lhumerus -28.4315 -6.27088 92.4902 +lradius 60.5733 +lwrist 25.1024 +lhand -23.4284 14.9896 +lfingers 7.12502 +lthumb 3.02941 44.9478 +rfemur -27.9727 6.85032 17.9916 +rtibia 30.9606 +rfoot -7.72728 -13.5032 +rtoes -11.3395 +lfemur 19.8281 -3.9442 -30.251 +ltibia 18.4908 +lfoot -11.6213 4.42045 +ltoes -21.7771 +79 +root 9.67192 16.7889 -16.6944 -3.04721 4.35313 1.99902 +lowerback 4.33591 -2.48652 -2.50607 +upperback 2.54199 -3.3986 1.75701 +thorax 0.440005 -1.7439 3.33473 +lowerneck -13.8663 3.18629 -0.94291 +upperneck -1.76745 4.46272 -3.54676 +head 1.86904 2.11315 -0.712467 +rclavicle 1.91827e-014 5.56597e-015 +rhumerus -48.4744 -19.864 -69.143 +rradius 13.4624 +rwrist 7.58067 +rhand -18.5505 16.3835 +rfingers 7.12502 +rthumb 7.73899 -13.4549 +lclavicle 1.91827e-014 5.56597e-015 +lhumerus -29.0949 -5.87336 92.659 +lradius 59.3879 +lwrist 24.7135 +lhand -23.6227 14.3988 +lfingers 7.12502 +lthumb 2.84171 44.3596 +rfemur -27.558 7.04802 19.169 +rtibia 31.5501 +rfoot -7.2136 -12.8421 +rtoes -9.45048 +lfemur 19.6744 -3.604 -29.1312 +ltibia 20.4629 +lfoot -11.138 4.23132 +ltoes -23.3694 +80 +root 9.66633 16.7886 -16.4928 -3.35848 4.19919 0.93584 +lowerback 4.46026 -2.51435 -1.3874 +upperback 2.52003 -3.39488 2.10807 +thorax 0.302372 -1.72968 3.07701 +lowerneck -14.0974 3.22807 -0.828887 +upperneck -1.50204 4.52232 -3.80685 +head 2.01177 2.12658 -0.806618 +rclavicle -1.11816e-014 3.97569e-015 +rhumerus -48.469 -19.9667 -68.8277 +rradius 13.3467 +rwrist 7.7056 +rhand -18.3178 15.7952 +rfingers 7.12502 +rthumb 7.96366 -14.0348 +lclavicle -1.11816e-014 3.97569e-015 +lhumerus -29.5995 -5.15846 92.8618 +lradius 58.1764 +lwrist 24.5533 +lhand -23.5072 14.0353 +lfingers 7.12502 +lthumb 2.95327 43.9946 +rfemur -26.9307 6.77614 20.6188 +rtibia 32.0754 +rfoot -7.25853 -11.8368 +rtoes -7.06499 +lfemur 19.4527 -3.37427 -27.8566 +ltibia 22.7904 +lfoot -10.6624 3.85544 +ltoes -21.8046 +81 +root 9.66588 16.7833 -16.2931 -3.53312 4.04648 0.436171 +lowerback 4.30687 -2.55534 -0.742235 +upperback 2.62935 -3.42739 2.27675 +thorax 0.474162 -1.74258 2.87965 +lowerneck -14.2131 3.29236 -0.917819 +upperneck -1.69815 4.6169 -3.85022 +head 1.9664 2.17441 -0.799161 +rclavicle -1.04362e-014 -8.74653e-015 +rhumerus -48.1368 -20.0566 -68.7327 +rradius 13.267 +rwrist 7.78902 +rhand -18.4491 15.35 +rfingers 7.12502 +rthumb 7.83687 -14.4848 +lclavicle -1.04362e-014 -8.74653e-015 +lhumerus -29.8474 -4.26231 92.8888 +lradius 56.9417 +lwrist 23.8525 +lhand -22.9117 15.1153 +lfingers 7.12502 +lthumb 3.52836 45.0658 +rfemur -26.3667 6.49646 21.4327 +rtibia 32.7494 +rfoot -7.70145 -11.1618 +rtoes -5.17354 +lfemur 19.023 -3.10389 -27.1663 +ltibia 25.1758 +lfoot -9.77668 3.39077 +ltoes -18.4012 +82 +root 9.66438 16.7861 -16.0935 -3.68613 3.74614 0.0795299 +lowerback 4.16292 -2.51364 -0.206906 +upperback 2.67164 -3.35543 2.33951 +thorax 0.566307 -1.70122 2.6341 +lowerneck -13.7997 3.32505 -1.07444 +upperneck -2.22673 4.65011 -3.65317 +head 1.70504 2.21213 -0.7177 +rclavicle 7.50412e-015 0 +rhumerus -47.9285 -19.9469 -68.9409 +rradius 13.39 +rwrist 7.38063 +rhand -18.5421 14.9805 +rfingers 7.12502 +rthumb 7.7471 -14.8576 +lclavicle 7.50412e-015 0 +lhumerus -30.1967 -3.51577 92.8179 +lradius 55.5858 +lwrist 23.0972 +lhand -22.7369 16.4782 +lfingers 7.12502 +lthumb 3.69715 46.4259 +rfemur -25.9358 6.67658 22.0418 +rtibia 33.5977 +rfoot -8.21445 -11.1499 +rtoes -3.68246 +lfemur 18.4642 -2.66154 -26.5598 +ltibia 27.576 +lfoot -8.27747 3.14312 +ltoes -18.4366 +83 +root 9.66025 16.7926 -15.8951 -3.90039 3.37816 0.282076 +lowerback 4.28987 -2.38042 -0.399599 +upperback 2.61918 -3.18233 2.34155 +thorax 0.444145 -1.61588 2.74599 +lowerneck -13.7846 3.28965 -1.21694 +upperneck -2.1145 4.62785 -3.6218 +head 1.73462 2.20059 -0.684009 +rclavicle -2.58917e-014 5.56597e-015 +rhumerus -47.8166 -20.0304 -68.784 +rradius 13.4561 +rwrist 7.2441 +rhand -18.4205 15.0611 +rfingers 7.12502 +rthumb 7.86449 -14.7726 +lclavicle -2.58917e-014 5.56597e-015 +lhumerus -30.5937 -2.7491 92.8879 +lradius 54.0732 +lwrist 22.6603 +lhand -22.6149 17.0204 +lfingers 7.12502 +lthumb 3.81498 46.966 +rfemur -25.4761 7.07439 22.0446 +rtibia 34.4529 +rfoot -8.38247 -11.2658 +rtoes -1.99296 +lfemur 17.8607 -2.14017 -26.5856 +ltibia 30.053 +lfoot -6.33014 3.14558 +ltoes -21.7993 +84 +root 9.64702 16.7965 -15.7074 -4.08637 3.11977 0.452501 +lowerback 4.465 -2.26951 -0.655561 +upperback 2.56741 -3.04156 2.3804 +thorax 0.301999 -1.54726 2.93402 +lowerneck -13.9836 3.26439 -1.25483 +upperneck -1.75235 4.62151 -3.72454 +head 1.89351 2.18511 -0.704673 +rclavicle 9.79014e-015 8.74653e-015 +rhumerus -47.6515 -20.1832 -68.5576 +rradius 13.475 +rwrist 7.39602 +rhand -18.5361 15.4105 +rfingers 7.12502 +rthumb 7.75292 -14.4273 +lclavicle 9.79014e-015 8.74653e-015 +lhumerus -30.8834 -1.97293 92.9859 +lradius 52.3651 +lwrist 22.4562 +lhand -22.2841 16.9783 +lfingers 7.12502 +lthumb 4.13442 46.9179 +rfemur -24.9264 7.56647 22.085 +rtibia 35.1361 +rfoot -8.80402 -11.3283 +rtoes -0.708407 +lfemur 17.0379 -1.56728 -26.4066 +ltibia 32.6428 +lfoot -4.17675 2.7819 +ltoes -23.1228 +85 +root 9.62626 16.8049 -15.5261 -4.15011 3.01815 -0.155061 +lowerback 4.48426 -2.25558 -0.131383 +upperback 2.49789 -3.00109 2.55393 +thorax 0.199689 -1.5211 2.82039 +lowerneck -13.7466 3.27925 -1.18706 +upperneck -1.89529 4.61786 -3.65386 +head 1.80301 2.19075 -0.698681 +rclavicle 2.89232e-014 -3.26007e-014 +rhumerus -47.4648 -20.2607 -68.601 +rradius 13.5903 +rwrist 7.35455 +rhand -18.5858 15.8786 +rfingers 7.12502 +rthumb 7.70493 -13.961 +lclavicle 2.89232e-014 -3.26007e-014 +lhumerus -31.2272 -1.35997 92.899 +lradius 50.5412 +lwrist 22.4027 +lhand -21.9699 17.0516 +lfingers 7.12502 +lthumb 4.43784 46.9851 +rfemur -24.4135 7.81877 22.9951 +rtibia 35.6741 +rfoot -9.68699 -11.1851 +rtoes -0.822071 +lfemur 15.9357 -1.19552 -25.2394 +ltibia 35.3453 +lfoot -1.72127 2.22673 +ltoes -22.3472 +86 +root 9.6095 16.8229 -15.3408 -4.12541 3.06347 -0.78923 +lowerback 4.35629 -2.29837 0.524732 +upperback 2.43551 -3.03375 2.64213 +thorax 0.178981 -1.53051 2.54105 +lowerneck -13.6615 3.28279 -0.975711 +upperneck -1.99405 4.58253 -3.57379 +head 1.75796 2.17754 -0.713354 +rclavicle 4.27884e-014 -2.22639e-014 +rhumerus -47.1249 -20.4068 -68.8431 +rradius 13.5747 +rwrist 7.39498 +rhand -18.7181 16.5914 +rfingers 7.12502 +rthumb 7.57724 -13.2529 +lclavicle 4.27884e-014 -2.22639e-014 +lhumerus -31.5657 -0.852853 92.6464 +lradius 48.8015 +lwrist 22.3701 +lhand -21.5508 17.9175 +lfingers 7.12502 +lthumb 4.8425 47.8421 +rfemur -23.9451 7.4997 23.9406 +rtibia 36.0959 +rfoot -10.4307 -10.8087 +rtoes -0.980823 +lfemur 14.6605 -1.09736 -24.1381 +ltibia 38.1299 +lfoot 1.0638 1.958 +ltoes -22.8527 +87 +root 9.59603 16.8363 -15.1582 -3.90706 3.20153 -0.757792 +lowerback 3.96475 -2.33604 0.531766 +upperback 2.411 -3.092 2.55562 +thorax 0.369 -1.55953 2.43266 +lowerneck -13.9295 3.27023 -0.811 +upperneck -1.8288 4.54984 -3.52575 +head 1.8638 2.15629 -0.722755 +rclavicle -2.03257e-014 2.94201e-014 +rhumerus -46.5145 -20.531 -69.2862 +rradius 13.578 +rwrist 7.42625 +rhand -19.0983 17.0565 +rfingers 7.12502 +rthumb 7.21025 -12.8006 +lclavicle -2.03257e-014 2.94201e-014 +lhumerus -31.6152 -0.197137 92.3863 +lradius 46.9172 +lwrist 22.1308 +lhand -21.4798 18.4403 +lfingers 7.12502 +lthumb 4.91103 48.3634 +rfemur -23.6594 7.24774 24.082 +rtibia 36.4342 +rfoot -11.0684 -10.6945 +rtoes -0.14082 +lfemur 13.094 -1.07343 -23.8385 +ltibia 40.9323 +lfoot 3.93859 1.82719 +ltoes -24.8846 +88 +root 9.58144 16.8366 -14.9914 -3.75028 3.31092 -0.530448 +lowerback 3.86788 -2.34152 0.205026 +upperback 2.35999 -3.11074 2.54201 +thorax 0.38806 -1.57236 2.59872 +lowerneck -14.1362 3.30901 -0.903801 +upperneck -1.73251 4.61681 -3.33625 +head 1.92542 2.19207 -0.638329 +rclavicle 1.54555e-014 1.66979e-014 +rhumerus -45.8321 -20.3578 -69.7517 +rradius 13.7905 +rwrist 7.00984 +rhand -19.1122 17.1403 +rfingers 7.12502 +rthumb 7.19685 -12.7174 +lclavicle 1.54555e-014 1.66979e-014 +lhumerus -31.5952 0.799697 92.2147 +lradius 44.9239 +lwrist 21.6213 +lhand -21.2382 18.5361 +lfingers 7.12502 +lthumb 5.14433 48.4537 +rfemur -23.3193 7.35628 23.9859 +rtibia 36.7136 +rfoot -11.7677 -10.8619 +rtoes 0.651501 +lfemur 11.5063 -1.01074 -23.7914 +ltibia 43.7537 +lfoot 6.48191 1.23363 +ltoes -29.5634 +89 +root 9.56538 16.8499 -14.8327 -3.90736 3.30206 -0.524711 +lowerback 4.28473 -2.28317 0.0376132 +upperback 2.32439 -3.0305 2.59922 +thorax 0.127583 -1.53265 2.76892 +lowerneck -14.4883 3.34787 -0.748804 +upperneck -1.36268 4.66335 -3.37054 +head 2.11976 2.20391 -0.66449 +rclavicle 8.44835e-016 -1.43125e-014 +rhumerus -45.2079 -20.0851 -70.193 +rradius 14.0802 +rwrist 6.33459 +rhand -18.8029 16.4433 +rfingers 7.12502 +rthumb 7.49542 -13.4039 +lclavicle 8.44835e-016 -1.43125e-014 +lhumerus -31.8008 1.5807 92.0972 +lradius 43.1431 +lwrist 21.4097 +lhand -21.029 19.541 +lfingers 7.12502 +lthumb 5.34639 49.4535 +rfemur -22.5382 7.37155 24.1866 +rtibia 36.8766 +rfoot -12.6203 -10.705 +rtoes 1.4202 +lfemur 10.142 -0.914165 -23.5236 +ltibia 46.6498 +lfoot 9.00843 1.0416 +ltoes -30.7474 +90 +root 9.5494 16.8911 -14.6687 -4.04634 3.28379 -0.697483 +lowerback 4.60283 -2.21567 0.119407 +upperback 2.29505 -2.93102 2.60557 +thorax -0.0883729 -1.4805 2.74106 +lowerneck -14.6716 3.21587 -0.446807 +upperneck -1.12935 4.45628 -3.54567 +head 2.24372 2.08883 -0.782055 +rclavicle -2.43511e-015 -3.18055e-015 +rhumerus -44.622 -19.907 -70.8086 +rradius 14.4159 +rwrist 5.60963 +rhand -18.5381 16.0559 +rfingers 7.12502 +rthumb 7.75098 -13.782 +lclavicle -2.43511e-015 -3.18055e-015 +lhumerus -32.0111 2.13089 91.8828 +lradius 41.3259 +lwrist 21.5991 +lhand -21.2568 20.6734 +lfingers 7.12502 +lthumb 5.1264 50.5914 +rfemur -21.6221 7.10647 24.5877 +rtibia 36.8351 +rfoot -13.4432 -10.2881 +rtoes 2.50155 +lfemur 8.54086 -0.923795 -23.0723 +ltibia 49.6646 +lfoot 12.1699 2.95166 +ltoes -24.5973 +91 +root 9.53675 16.9286 -14.5041 -3.97663 3.40307 -0.984316 +lowerback 4.66471 -2.23761 0.408979 +upperback 2.23043 -2.94512 2.62878 +thorax -0.202065 -1.48418 2.60802 +lowerneck -14.5501 3.02898 -0.552874 +upperneck -1.38803 4.20909 -3.37279 +head 2.12212 1.97742 -0.727144 +rclavicle 1.05356e-014 -1.98785e-014 +rhumerus -43.9353 -19.553 -71.6205 +rradius 14.7993 +rwrist 4.72648 +rhand -18.4491 16.241 +rfingers 7.12502 +rthumb 7.83691 -13.5937 +lclavicle 1.05356e-014 -1.98785e-014 +lhumerus -31.9722 3.03798 91.4848 +lradius 39.1885 +lwrist 21.4404 +lhand -21.1967 20.8072 +lfingers 7.12502 +lthumb 5.18439 50.7238 +rfemur -20.8987 6.57139 25.0767 +rtibia 36.5564 +rfoot -13.9517 -10.0017 +rtoes 3.2233 +lfemur 6.54088 -0.913698 -22.5119 +ltibia 52.7373 +lfoot 14.9746 4.16481 +ltoes -23.7415 +92 +root 9.52693 16.946 -14.3452 -3.87238 3.58566 -1.21321 +lowerback 4.66207 -2.27245 0.66341 +upperback 2.22297 -2.98022 2.66912 +thorax -0.217601 -1.49978 2.50888 +lowerneck -14.7627 2.96046 -0.845674 +upperneck -1.36984 4.15453 -2.92696 +head 2.14578 1.9638 -0.533437 +rclavicle 7.70291e-015 -1.11319e-014 +rhumerus -43.0658 -19.3505 -72.263 +rradius 15.1154 +rwrist 3.96258 +rhand -18.7742 15.4368 +rfingers 7.12502 +rthumb 7.52308 -14.4094 +lclavicle 7.70291e-015 -1.11319e-014 +lhumerus -31.6758 4.038 91.0699 +lradius 36.9143 +lwrist 20.8606 +lhand -20.6736 21.232 +lfingers 7.12502 +lthumb 5.68952 51.1356 +rfemur -20.2121 5.96004 25.4686 +rtibia 36.1346 +rfoot -14.3274 -9.77663 +rtoes 3.09275 +lfemur 4.50309 -0.80021 -22.0451 +ltibia 55.7542 +lfoot 16.7469 4.03976 +ltoes -27.4394 +93 +root 9.51932 16.9619 -14.1917 -3.92326 3.61288 -1.62009 +lowerback 4.76711 -2.21779 1.1592 +upperback 2.29002 -2.88467 2.71142 +thorax -0.233101 -1.44833 2.27386 +lowerneck -14.9162 2.88871 -0.919645 +upperneck -1.33726 4.06621 -2.66313 +head 2.17489 1.92762 -0.438987 +rclavicle 2.49475e-014 -1.11319e-014 +rhumerus -42.1427 -19.3702 -72.8343 +rradius 15.3084 +rwrist 3.53825 +rhand -19.1549 14.7771 +rfingers 7.12502 +rthumb 7.15561 -15.0819 +lclavicle 2.49475e-014 -1.11319e-014 +lhumerus -31.4599 5.00675 90.6168 +lradius 34.9054 +lwrist 20.2553 +lhand -20.3181 22.0808 +lfingers 7.12502 +lthumb 6.03276 51.9749 +rfemur -19.3451 5.46684 26.0616 +rtibia 35.6874 +rfoot -14.5771 -9.48978 +rtoes 2.67205 +lfemur 2.71483 -0.545517 -21.4033 +ltibia 58.5725 +lfoot 17.288 5.75769 +ltoes -25.6997 +94 +root 9.51164 16.98 -14.0423 -4.04473 3.44191 -2.07319 +lowerback 5.02885 -2.12714 1.68066 +upperback 2.28599 -2.7311 2.76871 +thorax -0.409012 -1.36767 2.04539 +lowerneck -14.7307 2.74329 -0.891551 +upperneck -1.54763 3.8621 -2.71407 +head 2.07032 1.82905 -0.477388 +rclavicle 1.90833e-014 5.56597e-015 +rhumerus -41.2903 -18.8226 -73.7296 +rradius 15.5545 +rwrist 2.72657 +rhand -19.6049 15.9447 +rfingers 7.12502 +rthumb 6.72128 -13.9286 +lclavicle 1.90833e-014 5.56597e-015 +lhumerus -31.5574 6.0452 90.0917 +lradius 33.0471 +lwrist 19.7652 +lhand -20.4728 22.7109 +lfingers 7.12502 +lthumb 5.88339 52.6093 +rfemur -18.4048 5.07431 26.7143 +rtibia 35.2683 +rfoot -14.6768 -9.12005 +rtoes 2.49898 +lfemur 1.0825 -0.0642193 -20.7178 +ltibia 61.113 +lfoot 16.6279 8.08212 +ltoes -22.4811 +95 +root 9.50412 16.9964 -13.8907 -4.1713 3.21197 -2.20966 +lowerback 5.22205 -2.03372 1.82617 +upperback 2.33224 -2.59408 2.77318 +thorax -0.478285 -1.29822 1.96828 +lowerneck -14.764 2.68123 -1.03156 +upperneck -1.48635 3.80029 -2.55674 +head 2.08949 1.80288 -0.405719 +rclavicle 2.52457e-014 -2.38542e-015 +rhumerus -40.373 -17.8094 -74.8699 +rradius 16.0254 +rwrist 1.29953 +rhand -20.2493 17.5722 +rfingers 7.12502 +rthumb 6.09917 -12.32 +lclavicle 2.52457e-014 -2.38542e-015 +lhumerus -31.5652 6.847 89.6074 +lradius 31.0813 +lwrist 19.3799 +lhand -19.9892 22.7547 +lfingers 7.12502 +lthumb 6.35027 52.6395 +rfemur -17.4565 4.71795 26.9986 +rtibia 34.8774 +rfoot -14.9467 -8.64437 +rtoes 2.37681 +lfemur -0.453843 0.487708 -20.4237 +ltibia 63.3399 +lfoot 15.38 9.78697 +ltoes -20.8765 +96 +root 9.49973 17.0205 -13.736 -4.26307 3.09525 -2.18056 +lowerback 5.24541 -1.9573 1.86455 +upperback 2.493 -2.49561 2.70265 +thorax -0.332814 -1.24805 1.86605 +lowerneck -15.1097 2.66547 -1.19768 +upperneck -1.22365 3.8111 -2.28403 +head 2.23112 1.81175 -0.281721 +rclavicle -3.73218e-014 3.33958e-014 +rhumerus -39.2492 -16.8455 -76.0445 +rradius 16.6112 +rwrist -0.00147448 +rhand -20.7852 17.5109 +rfingers 7.12502 +rthumb 5.58176 -12.3956 +lclavicle -3.73218e-014 3.33958e-014 +lhumerus -31.3053 8.0351 88.9237 +lradius 29.0263 +lwrist 18.3338 +lhand -18.9911 22.1141 +lfingers 7.12502 +lthumb 7.31372 51.9677 +rfemur -16.567 4.34713 27.0685 +rtibia 34.536 +rfoot -15.3609 -8.21254 +rtoes 1.65524 +lfemur -2.00098 0.790769 -20.4076 +ltibia 65.2443 +lfoot 13.6996 11.548 +ltoes -18.9155 +97 +root 9.49713 17.0463 -13.5835 -4.29445 2.99345 -2.10236 +lowerback 5.30295 -1.86862 1.89403 +upperback 2.57441 -2.37736 2.59843 +thorax -0.289033 -1.18787 1.73632 +lowerneck -15.0629 2.57209 -1.14893 +upperneck -1.38797 3.67577 -2.32169 +head 2.16797 1.74588 -0.313024 +rclavicle 0 -3.97569e-014 +rhumerus -38.156 -16.249 -76.9262 +rradius 17.0706 +rwrist -0.751534 +rhand -20.1511 16.5333 +rfingers 7.12502 +rthumb 6.19394 -13.3561 +lclavicle 0 -3.97569e-014 +lhumerus -31.1956 9.63247 88.0588 +lradius 27.1116 +lwrist 16.8644 +lhand -18.7142 22.2782 +lfingers 7.12502 +lthumb 7.58105 52.1223 +rfemur -15.7656 4.13429 27.0873 +rtibia 34.2287 +rfoot -15.6642 -7.97317 +rtoes 0.293983 +lfemur -3.60835 0.978268 -20.5051 +ltibia 66.9116 +lfoot 11.5938 13.4591 +ltoes -15.7442 +98 +root 9.49206 17.0663 -13.4319 -4.44516 2.79255 -2.07173 +lowerback 5.4911 -1.73929 1.93383 +upperback 2.62623 -2.1985 2.50266 +thorax -0.348617 -1.09758 1.61125 +lowerneck -14.4043 2.45546 -1.14116 +upperneck -2.03111 3.48988 -2.2347 +head 1.8294 1.67031 -0.311721 +rclavicle 1.88845e-014 0 +rhumerus -37.2763 -15.866 -77.6132 +rradius 17.5542 +rwrist -1.21599 +rhand -18.9013 16.2238 +rfingers 7.12502 +rthumb 7.40046 -13.6268 +lclavicle 1.88845e-014 0 +lhumerus -31.4066 10.8309 87.2903 +lradius 25.5733 +lwrist 16.0281 +lhand -18.7275 22.8497 +lfingers 7.12502 +lthumb 7.56818 52.6943 +rfemur -14.8073 4.16196 27.1806 +rtibia 33.8602 +rfoot -16.002 -7.80431 +rtoes -0.00173095 +lfemur -4.97629 1.29174 -20.5162 +ltibia 68.3811 +lfoot 9.23643 15.0572 +ltoes -11.8077 +99 +root 9.48084 17.0886 -13.2816 -4.46706 2.54129 -2.14489 +lowerback 5.60484 -1.59275 2.01716 +upperback 2.59444 -1.9947 2.41205 +thorax -0.453485 -0.994807 1.46398 +lowerneck -13.7992 2.33531 -1.40799 +upperneck -2.42758 3.3397 -1.69945 +head 1.57299 1.62227 -0.11612 +rclavicle -2.35063e-014 1.59028e-014 +rhumerus -36.5379 -15.469 -78.3385 +rradius 18.0943 +rwrist -1.4813 +rhand -19.3664 16.5041 +rfingers 7.12502 +rthumb 6.95143 -13.3618 +lclavicle -2.35063e-014 1.59028e-014 +lhumerus -31.7799 11.8894 86.3994 +lradius 24.0676 +lwrist 15.2485 +lhand -19.1714 22.5458 +lfingers 7.12502 +lthumb 7.1397 52.4053 +rfemur -13.9634 4.27334 27.3904 +rtibia 33.4043 +rfoot -16.2774 -7.63512 +rtoes 0.440995 +lfemur -6.45407 1.65802 -20.3491 +ltibia 69.7001 +lfoot 7.05561 16.0922 +ltoes -8.16922 +100 +root 9.46191 17.1086 -13.1364 -4.35104 2.06377 -2.3252 +lowerback 5.68069 -1.40856 2.09961 +upperback 2.55343 -1.74153 2.38513 +thorax -0.54377 -0.867938 1.37791 +lowerneck -13.6545 2.28234 -1.5556 +upperneck -2.43241 3.28172 -1.35127 +head 1.53679 1.6051 0.013795 +rclavicle -2.06239e-015 1.63003e-014 +rhumerus -35.4523 -15.0726 -79.0616 +rradius 18.3415 +rwrist -1.47936 +rhand -21.2611 15.8501 +rfingers 7.12502 +rthumb 5.12225 -14.068 +lclavicle -2.06239e-015 1.63003e-014 +lhumerus -32.1573 13.24 85.3508 +lradius 22.6416 +lwrist 14.0189 +lhand -20.5714 21.4822 +lfingers 7.12502 +lthumb 5.78818 51.3831 +rfemur -13.3047 4.54249 27.7872 +rtibia 32.9103 +rfoot -16.3544 -7.61384 +rtoes 0.0633175 +lfemur -8.16597 2.24934 -20.0031 +ltibia 70.8802 +lfoot 5.44167 16.6653 +ltoes -6.53119 +101 +root 9.44773 17.1212 -12.995 -4.39969 1.4715 -2.65444 +lowerback 5.87817 -1.24715 2.38147 +upperback 2.63385 -1.50652 2.4117 +thorax -0.578937 -0.748662 1.23693 +lowerneck -13.679 2.28514 -1.39225 +upperneck -2.36255 3.26508 -1.46477 +head 1.56936 1.59179 -0.0496781 +rclavicle 2.11209e-015 1.39149e-014 +rhumerus -34.0912 -14.0518 -80.0706 +rradius 18.5459 +rwrist -1.93809 +rhand -19.6393 16.0736 +rfingers 7.12502 +rthumb 6.688 -13.8007 +lclavicle 2.11209e-015 1.39149e-014 +lhumerus -32.5254 14.751 84.2875 +lradius 21.4852 +lwrist 12.862 +lhand -21.0963 20.9221 +lfingers 7.12502 +lthumb 5.28138 50.8363 +rfemur -12.4772 4.90656 28.3665 +rtibia 32.4238 +rfoot -16.3662 -7.62526 +rtoes -0.263879 +lfemur -9.72875 2.82054 -19.5252 +ltibia 71.8496 +lfoot 3.93178 16.9631 +ltoes -6.20038 +102 +root 9.4465 17.1343 -12.8475 -4.59255 0.93035 -2.59557 +lowerback 6.12086 -1.09757 2.44573 +upperback 2.74146 -1.29885 2.3018 +thorax -0.607781 -0.643742 1.07861 +lowerneck -13.5354 2.2401 -1.3272 +upperneck -2.37265 3.19448 -1.53117 +head 1.54321 1.55526 -0.0875028 +rclavicle 8.32411e-015 -3.18055e-015 +rhumerus -33.0347 -12.3626 -81.2451 +rradius 19.1582 +rwrist -2.98744 +rhand -19.4179 15.8064 +rfingers 7.12502 +rthumb 6.90175 -14.0611 +lclavicle 8.32411e-015 -3.18055e-015 +lhumerus -33.009 15.9898 83.3654 +lradius 20.4651 +lwrist 12.6624 +lhand -20.8306 21.1561 +lfingers 7.12502 +lthumb 5.53792 51.0638 +rfemur -11.3877 5.19766 28.4461 +rtibia 31.8951 +rfoot -16.3934 -7.38825 +rtoes -0.00602228 +lfemur -10.9554 3.12289 -19.5838 +ltibia 72.4387 +lfoot 2.39932 17.0992 +ltoes -5.91867 +103 +root 9.44456 17.1491 -12.6952 -4.94255 0.406566 -2.12958 +lowerback 6.45978 -0.931881 2.03413 +upperback 2.9 -1.0958 2.14714 +thorax -0.628783 -0.544368 1.14113 +lowerneck -13.527 2.26055 -1.64067 +upperneck -2.24324 3.26429 -1.24433 +head 1.57389 1.5984 0.0611358 +rclavicle 8.19987e-015 -1.11319e-014 +rhumerus -32.0136 -10.5649 -82.1907 +rradius 19.8962 +rwrist -3.95431 +rhand -19.6203 15.5523 +rfingers 7.12502 +rthumb 6.70641 -14.3215 +lclavicle 8.19987e-015 -1.11319e-014 +lhumerus -33.5434 17.0839 82.666 +lradius 19.6142 +lwrist 13.0389 +lhand -21.6407 21.0609 +lfingers 7.12502 +lthumb 4.75573 50.9875 +rfemur -10.1828 5.53725 28.0944 +rtibia 31.5367 +rfoot -16.7531 -7.21572 +rtoes 0.309023 +lfemur -11.8685 3.34976 -20.1001 +ltibia 72.7075 +lfoot 1.43285 17.0806 +ltoes -5.75201 +104 +root 9.43975 17.1776 -12.5416 -5.1367 -0.0248211 -2.1206 +lowerback 6.65595 -0.79823 2.05354 +upperback 3.00907 -0.914004 2.08497 +thorax -0.627444 -0.452844 1.05583 +lowerneck -13.6244 2.35941 -1.85262 +upperneck -1.90666 3.42823 -0.964201 +head 1.69366 1.68503 0.199733 +rclavicle -1.06101e-014 -6.36111e-015 +rhumerus -30.8145 -8.92985 -83.1073 +rradius 20.3221 +rwrist -4.80113 +rhand -19.8234 15.0828 +rfingers 7.12502 +rthumb 6.51034 -14.7972 +lclavicle -1.06101e-014 -6.36111e-015 +lhumerus -34.0841 18.2694 81.6516 +lradius 18.8213 +lwrist 12.1375 +lhand -22.6486 20.6 +lfingers 7.12502 +lthumb 3.78242 50.5462 +rfemur -9.19986 5.77049 28.2293 +rtibia 31.2756 +rfoot -17.43 -7.09642 +rtoes 1.30788 +lfemur -12.9498 3.4375 -20.0542 +ltibia 72.7551 +lfoot 0.750091 16.7418 +ltoes -5.06734 +105 +root 9.43774 17.1722 -12.3912 -5.01122 -0.432288 -2.26793 +lowerback 6.54652 -0.658341 2.3401 +upperback 2.99273 -0.716322 1.94192 +thorax -0.589295 -0.350696 0.732729 +lowerneck -13.5141 2.36635 -1.61764 +upperneck -1.69378 3.40635 -1.079 +head 1.75159 1.66807 0.122722 +rclavicle 5.54112e-015 -7.95139e-016 +rhumerus -29.7479 -7.89965 -83.9752 +rradius 20.7089 +rwrist -5.20609 +rhand -20.0974 14.4853 +rfingers 7.12502 +rthumb 6.24578 -15.4026 +lclavicle 5.54112e-015 -7.95139e-016 +lhumerus -34.8118 19.4797 80.1894 +lradius 18.158 +lwrist 10.0954 +lhand -23.2921 19.912 +lfingers 7.12502 +lthumb 3.16097 49.8683 +rfemur -8.66243 5.74909 28.4649 +rtibia 31.1036 +rfoot -18.085 -6.70016 +rtoes 2.80185 +lfemur -14.491 3.35068 -19.8933 +ltibia 72.7941 +lfoot -0.217516 16.1235 +ltoes -5.96414 +106 +root 9.43835 17.1713 -12.2411 -4.83284 -0.869034 -2.29378 +lowerback 6.3398 -0.487694 2.57819 +upperback 3.04023 -0.487444 1.75302 +thorax -0.428 -0.231677 0.387112 +lowerneck -13.3751 2.35776 -1.06476 +upperneck -1.74598 3.31816 -1.417 +head 1.72615 1.61364 -0.085989 +rclavicle 1.81391e-015 -5.1684e-015 +rhumerus -28.7429 -7.08626 -84.6735 +rradius 21.4972 +rwrist -5.50062 +rhand -20.1705 13.9456 +rfingers 7.12502 +rthumb 6.17521 -15.9444 +lclavicle 1.81391e-015 -5.1684e-015 +lhumerus -35.4193 20.4405 78.988 +lradius 17.5684 +lwrist 8.87356 +lhand -23.8261 19.3029 +lfingers 7.12502 +lthumb 2.64532 49.2663 +rfemur -8.18725 5.60427 28.5202 +rtibia 30.9357 +rfoot -18.5934 -6.17143 +rtoes 3.05802 +lfemur -16.0117 3.18471 -19.9179 +ltibia 72.6211 +lfoot -1.09616 15.3602 +ltoes -8.01879 +107 +root 9.44497 17.1681 -12.0927 -4.74061 -1.30113 -2.55629 +lowerback 6.19656 -0.339393 3.08219 +upperback 3.1614 -0.273172 1.69461 +thorax -0.22256 -0.116511 0.0297706 +lowerneck -13.308 2.34819 -0.711694 +upperneck -1.83549 3.25533 -1.58743 +head 1.69425 1.57753 -0.205206 +rclavicle 5.61567e-015 8.74653e-015 +rhumerus -27.7165 -5.48727 -85.3741 +rradius 22.5056 +rwrist -6.76902 +rhand -20.0877 13.4732 +rfingers 7.12502 +rthumb 6.25516 -16.4144 +lclavicle 5.61567e-015 8.74653e-015 +lhumerus -35.922 20.8441 78.3171 +lradius 17.2202 +lwrist 8.95733 +lhand -24.0481 19.55 +lfingers 7.12502 +lthumb 2.43092 49.5159 +rfemur -7.70928 5.23019 28.7946 +rtibia 30.9323 +rfoot -18.9299 -5.5352 +rtoes 2.35446 +lfemur -17.3645 3.00844 -19.6712 +ltibia 72.3107 +lfoot -1.9043 14.4615 +ltoes -8.11281 +108 +root 9.45083 17.1615 -11.943 -4.77159 -1.66473 -2.59581 +lowerback 6.29569 -0.264141 3.26257 +upperback 3.16093 -0.15931 1.64573 +thorax -0.275684 -0.0580773 -0.128214 +lowerneck -13.0741 2.32977 -0.856564 +upperneck -1.83625 3.24964 -1.59062 +head 1.6499 1.57635 -0.184848 +rclavicle -8.57259e-015 3.18055e-015 +rhumerus -26.9292 -3.32636 -86.0305 +rradius 23.5481 +rwrist -8.30287 +rhand -19.9218 12.9207 +rfingers 7.12502 +rthumb 6.41528 -16.9621 +lclavicle -8.57259e-015 3.18055e-015 +lhumerus -36.8598 20.8599 77.8387 +lradius 17.3667 +lwrist 9.44354 +lhand -24.0893 20.1796 +lfingers 7.12502 +lthumb 2.39112 50.146 +rfemur -7.12059 4.85359 28.8427 +rtibia 30.933 +rfoot -19.0786 -5.03722 +rtoes 1.54883 +lfemur -18.4966 2.80415 -19.6476 +ltibia 71.7559 +lfoot -2.71887 13.4791 +ltoes -6.95594 +109 +root 9.45026 17.1575 -11.7932 -4.72629 -2.18298 -2.23376 +lowerback 6.45435 -0.124118 2.95551 +upperback 3.03993 0.0186394 1.473 +thorax -0.484646 0.025587 -0.145304 +lowerneck -12.8108 2.38345 -1.12698 +upperneck -1.70777 3.35345 -1.3909 +head 1.63717 1.63474 -0.0727668 +rclavicle -1.22501e-014 1.43125e-014 +rhumerus -26.4348 -1.41624 -86.6319 +rradius 24.9212 +rwrist -9.46575 +rhand -19.8521 13.0887 +rfingers 7.12502 +rthumb 6.48264 -16.7921 +lclavicle -1.22501e-014 1.43125e-014 +lhumerus -37.9416 20.6139 77.3825 +lradius 17.5516 +lwrist 10.0065 +lhand -24.0584 20.3014 +lfingers 7.12502 +lthumb 2.42094 50.2674 +rfemur -6.64535 4.91723 28.4942 +rtibia 30.9734 +rfoot -19.4134 -4.77147 +rtoes 0.625488 +lfemur -19.6588 2.73853 -20.0398 +ltibia 70.9571 +lfoot -3.36427 12.5058 +ltoes -7.3019 +110 +root 9.4554 17.1567 -11.648 -4.57381 -2.82335 -2.00261 +lowerback 6.57892 0.0560555 2.88503 +upperback 2.91165 0.260778 1.30547 +thorax -0.679764 0.14373 -0.294993 +lowerneck -12.4722 2.43761 -1.53655 +upperneck -1.71815 3.46402 -0.845008 +head 1.55584 1.70809 0.16918 +rclavicle 1.22004e-014 -1.43125e-014 +rhumerus -26.0238 0.8523 -87.3964 +rradius 26.4896 +rwrist -11.5709 +rhand -20.8846 14.7522 +rfingers 7.12502 +rthumb 5.48577 -15.1568 +lclavicle 1.22004e-014 -1.43125e-014 +lhumerus -38.8196 20.2764 77.0331 +lradius 17.5927 +lwrist 10.6761 +lhand -24.1362 20.1789 +lfingers 7.12502 +lthumb 2.34583 50.1458 +rfemur -6.3232 4.98001 28.2265 +rtibia 31.068 +rfoot -19.7483 -4.34297 +rtoes 0.0246239 +lfemur -20.8742 2.73463 -20.2924 +ltibia 69.9651 +lfoot -4.19798 11.5728 +ltoes -9.62486 +111 +root 9.46373 17.1466 -11.5036 -4.59027 -3.13208 -2.05037 +lowerback 6.7673 0.105909 3.07902 +upperback 2.91106 0.346117 1.27625 +thorax -0.780822 0.186604 -0.440403 +lowerneck -12.2661 2.47573 -1.82808 +upperneck -1.70729 3.54504 -0.587896 +head 1.51276 1.75708 0.30013 +rclavicle 8.39865e-015 -3.57812e-015 +rhumerus -25.5474 3.66804 -88.1594 +rradius 27.9288 +rwrist -14.5679 +rhand -22.536 16.3936 +rfingers 7.12502 +rthumb 3.8912 -13.5507 +lclavicle 8.39865e-015 -3.57812e-015 +lhumerus -39.5607 20.1036 76.8401 +lradius 17.7031 +lwrist 11.2845 +lhand -24.5372 19.9889 +lfingers 7.12502 +lthumb 1.9585 49.9596 +rfemur -5.76537 4.81278 28.2586 +rtibia 31.101 +rfoot -19.9674 -4.0233 +rtoes -0.198619 +lfemur -21.8783 2.44663 -20.2147 +ltibia 68.8317 +lfoot -5.31789 10.6539 +ltoes -11.0014 +112 +root 9.46104 17.1354 -11.3507 -4.65206 -3.21097 -2.04373 +lowerback 6.82741 0.127886 3.07324 +upperback 3.01383 0.37378 1.22435 +thorax -0.707049 0.202388 -0.492484 +lowerneck -12.4403 2.54498 -1.42883 +upperneck -1.53182 3.59688 -0.975994 +head 1.61571 1.76871 0.11788 +rclavicle -2.48481e-015 -9.93923e-015 +rhumerus -24.7839 4.70351 -88.3119 +rradius 29.1557 +rwrist -14.7718 +rhand -22.6133 16.6706 +rfingers 7.12502 +rthumb 3.81651 -13.275 +lclavicle -2.48481e-015 -9.93923e-015 +lhumerus -40.1762 20.0208 76.5358 +lradius 17.9479 +lwrist 11.5226 +lhand -24.4099 20.4414 +lfingers 7.12502 +lthumb 2.08146 50.411 +rfemur -5.03111 4.83503 28.3267 +rtibia 30.9461 +rfoot -20.3436 -4.08938 +rtoes -0.165389 +lfemur -22.8165 1.88744 -20.1573 +ltibia 67.5371 +lfoot -5.99119 9.90986 +ltoes -12.3382 +113 +root 9.46205 17.133 -11.1946 -4.62551 -3.40149 -2.20319 +lowerback 6.83752 0.204091 3.34386 +upperback 3.07636 0.489547 1.16694 +thorax -0.641066 0.264082 -0.711196 +lowerneck -12.512 2.67671 -0.812666 +upperneck -1.4889 3.70058 -1.48589 +head 1.66536 1.80378 -0.140417 +rclavicle -3.47873e-016 -2.34566e-014 +rhumerus -23.6983 4.12247 -87.9146 +rradius 30.0323 +rwrist -11.9898 +rhand -21.4579 15.7771 +rfingers 7.12502 +rthumb 4.93223 -14.1455 +lclavicle -3.47873e-016 -2.34566e-014 +lhumerus -40.7679 19.9505 76.1175 +lradius 18.1782 +lwrist 11.3263 +lhand -23.5722 21.4125 +lfingers 7.12502 +lthumb 2.89048 51.3727 +rfemur -4.30051 4.9849 28.5498 +rtibia 30.6479 +rfoot -20.661 -4.02735 +rtoes 0.0780414 +lfemur -23.7762 1.36663 -19.9146 +ltibia 66.0587 +lfoot -6.52169 9.3417 +ltoes -14.358 +114 +root 9.47227 17.1309 -11.0423 -4.64297 -3.75463 -2.60622 +lowerback 7.02564 0.295411 3.90182 +upperback 3.03746 0.65715 1.25233 +thorax -0.772334 0.34907 -0.949493 +lowerneck -12.3448 2.72345 -0.708151 +upperneck -1.25938 3.75618 -1.69247 +head 1.71888 1.82409 -0.22087 +rclavicle -7.85199e-015 -1.64991e-014 +rhumerus -22.915 4.77485 -87.6502 +rradius 30.9638 +rwrist -10.8601 +rhand -21.307 15.2785 +rfingers 7.12502 +rthumb 5.07795 -14.6407 +lclavicle -7.85199e-015 -1.64991e-014 +lhumerus -41.7027 20.3555 75.5245 +lradius 18.3286 +lwrist 10.8675 +lhand -23.1569 21.4454 +lfingers 7.12502 +lthumb 3.29156 51.3998 +rfemur -3.46869 4.96349 28.9579 +rtibia 30.2518 +rfoot -20.7154 -3.624 +rtoes -0.145013 +lfemur -24.5388 1.10883 -19.3955 +ltibia 64.4056 +lfoot -7.32984 8.73804 +ltoes -16.0945 +115 +root 9.47927 17.1284 -10.886 -4.70254 -4.10944 -2.6383 +lowerback 7.22396 0.38847 3.99856 +upperback 3.01533 0.798145 1.26305 +thorax -0.897243 0.417571 -1.00536 +lowerneck -12.1645 2.62776 -0.97472 +upperneck -1.08425 3.6654 -1.62507 +head 1.73753 1.78034 -0.160091 +rclavicle 3.95085e-015 2.5842e-015 +rhumerus -22.2866 6.3652 -87.6525 +rradius 32.0569 +rwrist -11.603 +rhand -21.8981 15.8355 +rfingers 7.12502 +rthumb 4.50715 -14.0966 +lclavicle 3.95085e-015 2.5842e-015 +lhumerus -42.6759 20.7359 74.9895 +lradius 18.5343 +lwrist 10.8394 +lhand -22.8813 21.1489 +lfingers 7.12502 +lthumb 3.55773 51.0989 +rfemur -2.53304 4.72307 28.9281 +rtibia 29.715 +rfoot -20.8406 -3.05737 +rtoes -0.257178 +lfemur -25.0677 0.853761 -19.2873 +ltibia 62.5096 +lfoot -7.97402 8.46778 +ltoes -17.5033 +116 +root 9.48273 17.1287 -10.7266 -4.70818 -4.46873 -2.49671 +lowerback 7.25302 0.478284 3.93398 +upperback 3.07435 0.911017 1.16811 +thorax -0.846729 0.475451 -1.07553 +lowerneck -11.8624 2.69679 -1.33233 +upperneck -1.25298 3.78728 -1.23833 +head 1.6123 1.85599 0.0219621 +rclavicle 1.963e-015 -7.35503e-015 +rhumerus -21.3427 7.66013 -87.6631 +rradius 33.0052 +rwrist -12.3568 +rhand -21.9896 16.3258 +rfingers 7.12502 +rthumb 4.41883 -13.6081 +lclavicle 1.963e-015 -7.35503e-015 +lhumerus -43.2024 20.2497 75.0679 +lradius 18.8045 +lwrist 11.7632 +lhand -22.3248 21.323 +lfingers 7.12502 +lthumb 4.0951 51.2634 +rfemur -1.5741 4.68029 28.7397 +rtibia 29.0283 +rfoot -21.2283 -2.57701 +rtoes 0.335916 +lfemur -25.5654 0.535564 -19.3344 +ltibia 60.3591 +lfoot -8.29824 8.48586 +ltoes -16.3888 +117 +root 9.48599 17.1383 -10.5716 -4.67382 -4.8676 -2.52753 +lowerback 7.35117 0.570568 4.09531 +upperback 3.07067 1.04795 1.07174 +thorax -0.893066 0.5445 -1.27698 +lowerneck -11.5556 2.94737 -1.3667 +upperneck -1.27564 4.11129 -0.927916 +head 1.54213 2.02778 0.134997 +rclavicle 2.06985e-014 1.96797e-014 +rhumerus -20.5169 8.72073 -87.6894 +rradius 34.1165 +rwrist -13.1323 +rhand -22.162 16.6284 +rfingers 7.12502 +rthumb 4.25236 -13.3089 +lclavicle 2.06985e-014 1.96797e-014 +lhumerus -43.7098 19.6223 75.1595 +lradius 19.1351 +lwrist 12.6802 +lhand -22.1672 21.4204 +lfingers 7.12502 +lthumb 4.24727 51.3578 +rfemur -0.632006 4.97406 28.7904 +rtibia 28.2801 +rfoot -21.4861 -2.29618 +rtoes 0.965966 +lfemur -26.0495 0.222467 -19.1343 +ltibia 57.9496 +lfoot -8.61033 8.55264 +ltoes -13.7226 +118 +root 9.49054 17.1625 -10.415 -4.62845 -5.19137 -2.46546 +lowerback 7.4602 0.663609 4.18307 +upperback 3.04847 1.18192 0.947295 +thorax -0.964585 0.610947 -1.46674 +lowerneck -11.6588 2.99234 -0.861326 +upperneck -1.07185 4.11993 -1.32944 +head 1.64804 2.01797 -0.0714751 +rclavicle -2.33199e-014 4.77083e-015 +rhumerus -19.8571 9.58525 -87.6619 +rradius 35.5286 +rwrist -13.7845 +rhand -22.4119 16.6677 +rfingers 7.12502 +rthumb 4.011 -13.2743 +lclavicle -2.33199e-014 4.77083e-015 +lhumerus -44.3326 19.5281 74.853 +lradius 19.4082 +lwrist 12.9183 +lhand -22.0818 21.6964 +lfingers 7.12502 +lthumb 4.32975 51.6322 +rfemur 0.294694 5.07801 28.7074 +rtibia 27.4506 +rfoot -21.2981 -2.15018 +rtoes 1.22398 +lfemur -26.4453 -0.127574 -19.0563 +ltibia 55.318 +lfoot -8.98455 8.88935 +ltoes -11.706 +119 +root 9.49702 17.177 -10.2545 -4.57483 -5.42558 -2.21049 +lowerback 7.3903 0.739605 4.01078 +upperback 3.0995 1.26418 0.849184 +thorax -0.87058 0.653794 -1.47598 +lowerneck -11.8738 2.8992 -0.415069 +upperneck -0.925059 3.96056 -1.99081 +head 1.7608 1.91673 -0.358473 +rclavicle 1.21756e-015 -2.3059e-014 +rhumerus -19.1619 10.601 -87.4258 +rradius 37.0395 +rwrist -14.5488 +rhand -22.4002 16.2809 +rfingers 7.12502 +rthumb 4.0223 -13.6609 +lclavicle 1.21756e-015 -2.3059e-014 +lhumerus -44.8842 19.7318 74.5969 +lradius 19.5262 +lwrist 12.99 +lhand -21.8028 22.1415 +lfingers 7.12502 +lthumb 4.59915 52.0716 +rfemur 1.28075 4.8797 28.3566 +rtibia 26.4686 +rfoot -20.901 -1.91498 +rtoes 0.918535 +lfemur -26.8361 -0.504175 -19.198 +ltibia 52.5732 +lfoot -9.18408 9.27382 +ltoes -10.6951 +120 +root 9.5052 17.1772 -10.0934 -4.62423 -5.58912 -2.14512 +lowerback 7.45913 0.768559 4.02418 +upperback 3.16061 1.30447 0.818896 +thorax -0.842224 0.675414 -1.51835 +lowerneck -11.6676 2.89255 -0.237883 +upperneck -1.02116 3.93541 -2.36611 +head 1.70574 1.89588 -0.512239 +rclavicle -8.89561e-015 1.07344e-014 +rhumerus -18.485 11.5882 -87.1211 +rradius 38.4427 +rwrist -15.2509 +rhand -22.4826 16.1481 +rfingers 7.12502 +rthumb 3.94275 -13.7952 +lclavicle -8.89561e-015 1.07344e-014 +lhumerus -45.4135 19.638 74.5941 +lradius 19.7441 +lwrist 13.6198 +lhand -21.8221 22.2796 +lfingers 7.12502 +lthumb 4.58053 52.2101 +rfemur 2.46098 4.632 28.1931 +rtibia 25.3926 +rfoot -20.3824 -1.50196 +rtoes 0.830506 +lfemur -27.041 -1.01128 -19.0916 +ltibia 49.7752 +lfoot -9.40825 9.60657 +ltoes -11.7422 +121 +root 9.51453 17.1818 -9.92888 -4.61911 -5.73506 -2.58742 +lowerback 7.55295 0.76359 4.5837 +upperback 3.18711 1.34159 0.912661 +thorax -0.85198 0.697581 -1.73915 +lowerneck -11.2186 2.88414 -0.263331 +upperneck -1.42337 3.91715 -2.46467 +head 1.49552 1.89196 -0.549008 +rclavicle 6.1996e-015 5.36719e-015 +rhumerus -17.8057 12.2265 -86.8378 +rradius 39.7452 +rwrist -15.5529 +rhand -23.0076 16.451 +rfingers 7.12502 +rthumb 3.4358 -13.5011 +lclavicle 6.1996e-015 5.36719e-015 +lhumerus -45.9065 19.55 74.5289 +lradius 19.9376 +lwrist 14.2323 +lhand -21.6822 21.8915 +lfingers 7.12502 +lthumb 4.71565 51.819 +rfemur 3.61695 4.4737 28.5744 +rtibia 24.3476 +rfoot -19.9529 -1.19686 +rtoes 1.21991 +lfemur -27.1528 -1.57463 -18.4125 +ltibia 46.9688 +lfoot -9.69491 10.0378 +ltoes -13.4383 +122 +root 9.52394 17.187 -9.76114 -4.44179 -5.84749 -3.0977 +lowerback 7.39088 0.779136 5.17487 +upperback 3.21722 1.39307 1.04274 +thorax -0.71449 0.730573 -1.93576 +lowerneck -11.1172 2.93257 -0.121406 +upperneck -1.52304 3.96454 -2.62777 +head 1.45322 1.9131 -0.624208 +rclavicle -6.80837e-015 1.27222e-014 +rhumerus -17.1016 12.7473 -86.4817 +rradius 41.1597 +rwrist -16.038 +rhand -23.441 16.8342 +rfingers 7.12502 +rthumb 3.01717 -13.1242 +lclavicle -6.80837e-015 1.27222e-014 +lhumerus -46.3239 19.8396 74.2601 +lradius 19.9265 +lwrist 14.1732 +lhand -21.392 21.222 +lfingers 7.12502 +lthumb 4.99586 51.1431 +rfemur 4.58972 4.37765 29.0142 +rtibia 23.3363 +rfoot -19.8896 -0.899898 +rtoes 1.86556 +lfemur -27.373 -2.15089 -17.6534 +ltibia 44.1134 +lfoot -9.82134 10.5006 +ltoes -13.2643 +123 +root 9.53085 17.195 -9.59597 -4.24481 -6.00488 -3.07507 +lowerback 7.13206 0.842905 5.15433 +upperback 3.24261 1.45815 1.00895 +thorax -0.539902 0.767709 -1.95802 +lowerneck -10.8702 3.0901 0.137302 +upperneck -1.67183 4.13962 -2.73286 +head 1.37285 2.00082 -0.697384 +rclavicle -9.16894e-015 1.74931e-014 +rhumerus -16.3715 13.2828 -86.1444 +rradius 42.4839 +rwrist -16.6523 +rhand -22.9076 16.9746 +rfingers 7.12502 +rthumb 3.53237 -12.9759 +lclavicle -9.16894e-015 1.74931e-014 +lhumerus -46.8195 20.175 73.9111 +lradius 20.0189 +lwrist 14.038 +lhand -21.6026 21.1157 +lfingers 7.12502 +lthumb 4.7925 51.0415 +rfemur 5.48791 4.39657 28.8881 +rtibia 22.296 +rfoot -19.9055 -0.584107 +rtoes 2.09305 +lfemur -27.5278 -2.69364 -17.4848 +ltibia 41.2156 +lfoot -9.89397 11.2384 +ltoes -12.8876 +124 +root 9.53669 17.2041 -9.43177 -4.0844 -6.23916 -2.641 +lowerback 6.88308 0.935908 4.71894 +upperback 3.27873 1.53631 0.870807 +thorax -0.368557 0.808086 -1.85637 +lowerneck -10.6626 3.16319 -0.103208 +upperneck -1.92353 4.2532 -2.46398 +head 1.24258 2.06891 -0.572394 +rclavicle -3.37561e-014 -7.7526e-015 +rhumerus -15.606 13.8704 -85.7865 +rradius 43.5205 +rwrist -16.9895 +rhand -22.52 17.6365 +rfingers 7.12502 +rthumb 3.90664 -12.3075 +lclavicle -3.37561e-014 -7.7526e-015 +lhumerus -47.3062 20.5682 73.5834 +lradius 20.1699 +lwrist 13.96 +lhand -21.564 21.053 +lfingers 7.12502 +lthumb 4.8298 50.9779 +rfemur 6.43731 4.54985 28.3452 +rtibia 21.1618 +rfoot -19.7394 -0.381982 +rtoes 1.78084 +lfemur -27.6044 -3.07709 -17.7793 +ltibia 38.3854 +lfoot -10.1285 12.1651 +ltoes -14.3427 +125 +root 9.54171 17.2058 -9.26703 -4.04543 -6.44754 -2.47191 +lowerback 6.86676 0.976556 4.57031 +upperback 3.28409 1.57944 0.811802 +thorax -0.354051 0.828911 -1.83646 +lowerneck -10.9502 3.2592 -0.0995073 +upperneck -1.57469 4.38915 -2.42024 +head 1.40667 2.13196 -0.54591 +rclavicle -2.18663e-014 1.98785e-015 +rhumerus -15.0377 14.5324 -85.482 +rradius 44.6004 +rwrist -17.2289 +rhand -22.9563 18.2588 +rfingers 7.12502 +rthumb 3.4853 -11.6925 +lclavicle -2.18663e-014 1.98785e-015 +lhumerus -47.8715 20.9806 73.1679 +lradius 20.2692 +lwrist 13.8323 +lhand -21.0296 20.9212 +lfingers 7.12502 +lthumb 5.34575 50.8337 +rfemur 7.57075 4.58087 28.118 +rtibia 19.9779 +rfoot -19.3648 -0.27787 +rtoes 1.17145 +lfemur -27.6206 -3.48158 -17.7359 +ltibia 35.7207 +lfoot -10.4381 12.9173 +ltoes -15.6014 +126 +root 9.54789 17.2091 -9.10113 -3.99637 -6.63438 -2.94248 +lowerback 6.97916 0.928474 5.03799 +upperback 3.22594 1.55409 0.936915 +thorax -0.467127 0.816317 -1.97072 +lowerneck -10.9633 3.47491 0.385564 +upperneck -1.36717 4.6304 -2.81661 +head 1.50508 2.23898 -0.739319 +rclavicle -1.23122e-014 -8.74653e-015 +rhumerus -14.571 15.329 -85.2236 +rradius 45.8242 +rwrist -17.4665 +rhand -23.396 17.9841 +rfingers 7.12502 +rthumb 3.06068 -11.9737 +lclavicle -1.23122e-014 -8.74653e-015 +lhumerus -48.5479 21.298 72.7513 +lradius 20.3705 +lwrist 13.9598 +lhand -20.8791 20.9984 +lfingers 7.12502 +lthumb 5.49112 50.9073 +rfemur 8.7078 4.46981 28.5838 +rtibia 18.8736 +rfoot -19.0625 -0.328745 +rtoes -0.676133 +lfemur -27.6488 -4.17283 -16.891 +ltibia 33.2629 +lfoot -10.6379 13.7337 +ltoes -14.5971 +127 +root 9.5588 17.207 -8.93025 -3.91048 -6.84744 -3.318 +lowerback 6.8979 0.936884 5.42258 +upperback 3.27042 1.58312 1.09045 +thorax -0.366142 0.836425 -2.02657 +lowerneck -10.5797 3.56665 0.400368 +upperneck -1.82411 4.74405 -3.09912 +head 1.29993 2.29714 -0.835175 +rclavicle -1.78906e-015 1.39149e-014 +rhumerus -13.7685 16.1423 -84.6983 +rradius 46.8141 +rwrist -17.9197 +rhand -23.641 17.7286 +rfingers 7.12502 +rthumb 2.82403 -12.2324 +lclavicle -1.78906e-015 1.39149e-014 +lhumerus -48.8851 21.6658 72.6162 +lradius 20.2537 +lwrist 14.1169 +lhand -21.1895 20.7182 +lfingers 7.12502 +lthumb 5.19134 50.6346 +rfemur 9.76397 4.324 28.8628 +rtibia 17.8517 +rfoot -18.8234 -0.198037 +rtoes -2.0054 +lfemur -27.6411 -4.80413 -16.1755 +ltibia 31.0057 +lfoot -10.9862 14.5472 +ltoes -12.1826 +128 +root 9.56951 17.1948 -8.75917 -3.95354 -7.10053 -3.17638 +lowerback 6.87894 1.0194 5.31635 +upperback 3.3569 1.68107 1.07846 +thorax -0.261975 0.888268 -1.98417 +lowerneck -10.2115 3.67663 0.358108 +upperneck -2.36656 4.88214 -3.28168 +head 1.0677 2.37203 -0.889676 +rclavicle -4.07509e-015 -3.97569e-016 +rhumerus -12.978 16.656 -84.1911 +rradius 47.6769 +rwrist -18.271 +rhand -23.7856 17.5013 +rfingers 7.12502 +rthumb 2.68446 -12.4615 +lclavicle -4.07509e-015 -3.97569e-016 +lhumerus -49.1151 21.9007 72.6036 +lradius 20.1391 +lwrist 14.1393 +lhand -21.2979 20.8107 +lfingers 7.12502 +lthumb 5.08674 50.7297 +rfemur 10.93 4.13705 28.5149 +rtibia 16.7699 +rfoot -18.3548 0.322198 +rtoes -1.2981 +lfemur -27.4879 -5.0337 -16.1574 +ltibia 28.9694 +lfoot -11.2873 14.9517 +ltoes -10.6822 +129 +root 9.579 17.1871 -8.58797 -3.99604 -7.32002 -2.88606 +lowerback 6.94761 1.04123 4.99271 +upperback 3.35174 1.69426 1.00636 +thorax -0.313201 0.890599 -1.88047 +lowerneck -10.0387 3.94139 0.923167 +upperneck -2.49107 5.17548 -3.82359 +head 1.03984 2.50774 -1.14722 +rclavicle -1.02871e-014 -7.7526e-015 +rhumerus -12.4072 16.8331 -83.9737 +rradius 48.5437 +rwrist -18.1081 +rhand -23.6596 17.375 +rfingers 7.12502 +rthumb 2.80606 -12.5863 +lclavicle -1.02871e-014 -7.7526e-015 +lhumerus -49.5755 22.0622 72.4691 +lradius 20.2458 +lwrist 14.2805 +lhand -21.0623 21.3096 +lfingers 7.12502 +lthumb 5.31417 51.223 +rfemur 12.1264 4.10805 28.0653 +rtibia 15.6718 +rfoot -17.8494 0.689892 +rtoes -0.9494 +lfemur -27.3938 -5.25027 -16.3229 +ltibia 27.1887 +lfoot -11.0803 15.3043 +ltoes -12.4651 +130 +root 9.58806 17.1919 -8.41314 -4.06029 -7.59182 -2.67207 +lowerback 7.0081 1.09429 4.68529 +upperback 3.33244 1.74978 0.975717 +thorax -0.372543 0.91366 -1.74592 +lowerneck -9.96949 4.16053 1.56828 +upperneck -2.2878 5.41171 -4.36448 +head 1.14095 2.61 -1.41866 +rclavicle -1.08586e-014 1.68967e-014 +rhumerus -11.8168 16.8411 -83.7949 +rradius 49.1981 +rwrist -17.8754 +rhand -23.6493 17.5021 +rfingers 7.12502 +rthumb 2.81607 -12.4591 +lclavicle -1.08586e-014 1.68967e-014 +lhumerus -50.1056 22.5233 72.0231 +lradius 20.2658 +lwrist 14.0812 +lhand -20.9048 21.4534 +lfingers 7.12502 +lthumb 5.46628 51.3629 +rfemur 13.3615 4.37276 27.7963 +rtibia 14.6369 +rfoot -17.483 0.702178 +rtoes -2.11879 +lfemur -27.2414 -5.47957 -16.3881 +ltibia 25.6199 +lfoot -10.7114 15.9023 +ltoes -16.1187 +131 +root 9.59868 17.1861 -8.23497 -4.21136 -8.01562 -2.82199 +lowerback 7.10507 1.22627 4.87787 +upperback 3.43557 1.93873 0.995657 +thorax -0.300698 1.01287 -1.84635 +lowerneck -10.0664 4.32034 1.72912 +upperneck -2.09118 5.61331 -4.38534 +head 1.23377 2.70614 -1.44079 +rclavicle 2.7805e-014 1.43125e-014 +rhumerus -11.1077 16.8455 -83.4953 +rradius 49.7371 +rwrist -17.6754 +rhand -24.1924 17.3358 +rfingers 7.12502 +rthumb 2.2915 -12.6316 +lclavicle 2.7805e-014 1.43125e-014 +lhumerus -50.3562 22.9938 71.6068 +lradius 20.1314 +lwrist 13.5529 +lhand -21.1206 21.4179 +lfingers 7.12502 +lthumb 5.25792 51.3327 +rfemur 14.7396 4.53906 27.8547 +rtibia 13.4797 +rfoot -17.0149 1.01587 +rtoes -2.93515 +lfemur -27.0039 -5.40645 -16.1146 +ltibia 24.3974 +lfoot -11.1371 16.3101 +ltoes -16.8383 +132 +root 9.61242 17.1702 -8.05305 -4.25999 -8.31696 -2.93033 +lowerback 7.02546 1.30529 5.10358 +upperback 3.5711 2.04676 0.964688 +thorax -0.0986617 1.07647 -2.00625 +lowerneck -10.2439 4.43576 1.65743 +upperneck -2.0465 5.77156 -4.20894 +head 1.27412 2.78652 -1.3612 +rclavicle -8.97016e-015 5.36719e-015 +rhumerus -10.4152 17.0838 -83.1489 +rradius 50.3513 +rwrist -17.3912 +rhand -24.5518 17.8659 +rfingers 7.12502 +rthumb 1.94448 -12.105 +lclavicle -8.97016e-015 5.36719e-015 +lhumerus -50.333 23.4051 71.2969 +lradius 19.8404 +lwrist 13.1132 +lhand -21.3456 21.2469 +lfingers 7.12502 +lthumb 5.04065 51.167 +rfemur 16.0984 4.32717 27.7239 +rtibia 12.0037 +rfoot -16.2504 1.67856 +rtoes -3.61449 +lfemur -27.014 -5.37461 -15.925 +ltibia 23.6407 +lfoot -12.1721 16.2341 +ltoes -14.7377 +133 +root 9.62218 17.1486 -7.87113 -4.19983 -8.39888 -3.07785 +lowerback 6.9763 1.29024 5.24037 +upperback 3.50462 2.03465 0.980118 +thorax -0.136225 1.06994 -2.06572 +lowerneck -9.98296 4.53302 1.72807 +upperneck -2.168 5.89106 -4.16496 +head 1.19382 2.851 -1.3598 +rclavicle -1.34677e-014 -6.75868e-015 +rhumerus -10.1459 17.3825 -82.9197 +rradius 51.026 +rwrist -17.2235 +rhand -24.4582 19.5233 +rfingers 7.12502 +rthumb 2.03483 -10.4468 +lclavicle -1.34677e-014 -6.75868e-015 +lhumerus -50.6145 23.9089 70.7556 +lradius 19.4992 +lwrist 12.6241 +lhand -21.2238 21.0308 +lfingers 7.12502 +lthumb 5.15829 50.9481 +rfemur 17.3574 4.10322 27.7139 +rtibia 10.5958 +rfoot -15.4248 1.93755 +rtoes -4.97565 +lfemur -27.19 -5.5433 -15.6929 +ltibia 23.263 +lfoot -12.9512 15.9208 +ltoes -12.6527 +134 +root 9.63278 17.129 -7.68599 -4.18414 -8.57514 -3.57794 +lowerback 7.02067 1.27458 5.68243 +upperback 3.42934 2.04829 1.17088 +thorax -0.227052 1.07643 -2.11923 +lowerneck -9.71701 4.73194 1.84651 +upperneck -2.20861 6.14653 -4.27552 +head 1.15134 2.97927 -1.40944 +rclavicle 1.51076e-014 7.55382e-015 +rhumerus -9.96076 17.4226 -82.7388 +rradius 51.6641 +rwrist -17.2317 +rhand -24.2915 20.1252 +rfingers 7.12502 +rthumb 2.1958 -9.84322 +lclavicle 1.51076e-014 7.55382e-015 +lhumerus -51.1617 24.4994 70.3006 +lradius 19.4547 +lwrist 12.0853 +lhand -21.109 21.3517 +lfingers 7.12502 +lthumb 5.26913 51.2662 +rfemur 18.5113 4.15016 28.1983 +rtibia 9.73963 +rfoot -14.8569 1.84969 +rtoes -6.55341 +lfemur -27.1606 -5.54414 -15.133 +ltibia 23.044 +lfoot -13.0941 15.7497 +ltoes -12.3479 +135 +root 9.65115 17.1209 -7.49324 -4.18899 -8.72888 -3.71096 +lowerback 6.8766 1.3145 5.9083 +upperback 3.46807 2.10303 1.22167 +thorax -0.0952477 1.1101 -2.19087 +lowerneck -9.79825 4.95584 1.92904 +upperneck -2.1329 6.43838 -4.33944 +head 1.20467 3.12157 -1.42829 +rclavicle 1.50331e-014 1.31198e-014 +rhumerus -9.47506 17.4419 -82.4654 +rradius 52.1368 +rwrist -17.4112 +rhand -24.5197 19.2003 +rfingers 7.12502 +rthumb 1.97542 -10.7703 +lclavicle 1.50331e-014 1.31198e-014 +lhumerus -51.4075 25.035 69.9528 +lradius 19.2897 +lwrist 11.4259 +lhand -21.0303 22.1194 +lfingers 7.12502 +lthumb 5.34512 52.0319 +rfemur 19.3265 4.23426 28.2301 +rtibia 9.53232 +rfoot -14.6088 1.88771 +rtoes -8.3287 +lfemur -27.0055 -5.35334 -15.1145 +ltibia 22.9357 +lfoot -12.7051 15.6079 +ltoes -14.4915 +136 +root 9.66557 17.1124 -7.3002 -4.23819 -8.71838 -3.36687 +lowerback 6.74913 1.33235 5.66281 +upperback 3.46608 2.10227 1.05569 +thorax -0.0305628 1.11012 -2.22127 +lowerneck -9.6468 5.11721 2.23784 +upperneck -2.16825 6.62417 -4.49519 +head 1.19241 3.21197 -1.5261 +rclavicle -1.05604e-014 7.15625e-015 +rhumerus -9.07012 17.3998 -82.3367 +rradius 52.4061 +rwrist -17.1311 +rhand -25.0293 17.9819 +rfingers 7.12502 +rthumb 1.48329 -11.9927 +lclavicle -1.05604e-014 7.15625e-015 +lhumerus -51.2526 25.2795 69.6143 +lradius 18.5935 +lwrist 10.9386 +lhand -20.9936 22.1345 +lfingers 7.12502 +lthumb 5.38048 52.0462 +rfemur 19.8142 4.21097 27.7297 +rtibia 9.92146 +rfoot -14.5449 2.01962 +rtoes -9.46307 +lfemur -26.7434 -5.25747 -15.6495 +ltibia 22.9026 +lfoot -12.1126 15.4593 +ltoes -17.1281 +137 +root 9.67399 17.0981 -7.11041 -4.37891 -8.80549 -2.89903 +lowerback 6.77034 1.34277 5.08897 +upperback 3.42266 2.08514 0.931159 +thorax -0.107604 1.09317 -2.03016 +lowerneck -9.37126 5.31107 2.52509 +upperneck -2.15843 6.85951 -4.60525 +head 1.17307 3.32926 -1.60608 +rclavicle 1.51325e-014 2.18663e-015 +rhumerus -9.02323 17.2959 -82.3082 +rradius 52.8106 +rwrist -16.4233 +rhand -24.6056 17.3724 +rfingers 7.12502 +rthumb 1.89251 -12.599 +lclavicle 1.51325e-014 2.18663e-015 +lhumerus -51.2012 25.5794 69.363 +lradius 18.0312 +lwrist 10.5909 +lhand -20.9996 21.7164 +lfingers 7.12502 +lthumb 5.37471 51.6282 +rfemur 20.1872 4.27212 27.1593 +rtibia 10.7293 +rfoot -14.6869 1.95335 +rtoes -10.7638 +lfemur -26.3044 -5.32946 -16.2055 +ltibia 22.9461 +lfoot -11.45 15.6116 +ltoes -18.2034 +138 +root 9.68216 17.0854 -6.91671 -4.5515 -8.96925 -2.46287 +lowerback 6.79795 1.42062 4.51773 +upperback 3.40053 2.15704 0.86196 +thorax -0.161801 1.1215 -1.78846 +lowerneck -9.35502 5.47144 2.35846 +upperneck -1.97261 7.09045 -4.24668 +head 1.21413 3.45058 -1.45086 +rclavicle -5.80203e-015 1.98785e-015 +rhumerus -9.10896 17.217 -82.1902 +rradius 53.3318 +rwrist -16.3221 +rhand -23.7842 18.0435 +rfingers 7.12502 +rthumb 2.68581 -11.9194 +lclavicle -5.80203e-015 1.98785e-015 +lhumerus -51.3697 26.1987 68.8855 +lradius 17.6954 +lwrist 9.73938 +lhand -20.8224 21.7104 +lfingers 7.12502 +lthumb 5.54578 51.6179 +rfemur 20.5877 4.55095 26.7136 +rtibia 11.5835 +rfoot -14.7874 1.63017 +rtoes -12.666 +lfemur -25.8295 -5.11829 -16.8324 +ltibia 23.2226 +lfoot -11.0555 15.8767 +ltoes -17.0334 +139 +root 9.68622 17.0719 -6.71191 -4.54266 -9.17587 -2.50572 +lowerback 6.5441 1.53556 4.4716 +upperback 3.41886 2.29264 0.882161 +thorax 0.00361831 1.19232 -1.74134 +lowerneck -9.34465 5.57623 2.14663 +upperneck -1.86893 7.24915 -3.90774 +head 1.22533 3.5365 -1.29923 +rclavicle 6.03808e-015 -1.2921e-014 +rhumerus -9.12803 16.9034 -82.1126 +rradius 53.7469 +rwrist -16.4949 +rhand -23.4646 18.6263 +rfingers 7.12502 +rthumb 2.99438 -11.3324 +lclavicle 6.03808e-015 -1.2921e-014 +lhumerus -51.3246 26.7367 68.4179 +lradius 17.2251 +lwrist 8.81408 +lhand -20.5613 21.6261 +lfingers 7.12502 +lthumb 5.7979 51.5268 +rfemur 20.9477 5.07695 26.8907 +rtibia 12.326 +rfoot -14.6276 1.23179 +rtoes -13.7016 +lfemur -25.554 -4.35388 -17.1382 +ltibia 23.8132 +lfoot -10.8323 16.1433 +ltoes -14.1745 +140 +root 9.69135 17.0587 -6.49825 -4.31279 -9.34024 -2.85458 +lowerback 5.98167 1.59292 4.68742 +upperback 3.42231 2.34893 1.00952 +thorax 0.326961 1.22902 -1.71428 +lowerneck -9.31297 5.77293 2.15168 +upperneck -1.75636 7.51297 -3.83323 +head 1.26054 3.66907 -1.26397 +rclavicle 3.76448e-015 1.0138e-014 +rhumerus -9.13054 16.6941 -82.0397 +rradius 54.106 +rwrist -16.6003 +rhand -23.1283 18.3115 +rfingers 7.12502 +rthumb 3.31917 -11.6424 +lclavicle 3.76448e-015 1.0138e-014 +lhumerus -51.1437 27.051 68.3275 +lradius 16.8647 +lwrist 8.35758 +lhand -20.3592 21.4728 +lfingers 7.12502 +lthumb 5.99302 51.3681 +rfemur 21.2843 5.37226 27.2716 +rtibia 12.8312 +rfoot -14.3049 1.11018 +rtoes -13.5815 +lfemur -25.5257 -3.352 -17.193 +ltibia 24.6588 +lfoot -10.1046 16.4106 +ltoes -12.0758 +141 +root 9.7012 17.0542 -6.2879 -4.22407 -9.42515 -2.96002 +lowerback 5.78838 1.5913 4.59442 +upperback 3.23873 2.33837 1.10582 +thorax 0.235569 1.2171 -1.56046 +lowerneck -9.02292 6.02567 2.74224 +upperneck -1.56605 7.80941 -4.2549 +head 1.33012 3.80847 -1.48915 +rclavicle 1.32689e-014 -8.15017e-015 +rhumerus -9.48563 16.8142 -82.0898 +rradius 54.3434 +rwrist -16.8357 +rhand -23.023 18.2905 +rfingers 7.12502 +rthumb 3.42091 -11.6618 +lclavicle 1.32689e-014 -8.15017e-015 +lhumerus -51.4777 27.4121 67.9838 +lradius 16.7295 +lwrist 7.85285 +lhand -20.2423 21.5055 +lfingers 7.12502 +lthumb 6.10593 51.3975 +rfemur 21.8665 5.47186 27.3238 +rtibia 12.9166 +rfoot -13.6811 1.03601 +rtoes -13.7894 +lfemur -25.4767 -2.43899 -17.5173 +ltibia 25.7394 +lfoot -8.79116 17.1205 +ltoes -11.0812 +142 +root 9.71492 17.0561 -6.08219 -4.38661 -9.46228 -2.58557 +lowerback 5.97046 1.6039 4.04827 +upperback 2.95241 2.34802 1.04698 +thorax -0.182243 1.20446 -1.32977 +lowerneck -8.5299 6.20018 3.52689 +upperneck -1.35464 7.99653 -4.78391 +head 1.38609 3.89418 -1.79495 +rclavicle -1.43746e-014 -8.34896e-015 +rhumerus -10.1613 16.8761 -82.2942 +rradius 54.4852 +rwrist -16.9733 +rhand -23.444 18.7616 +rfingers 7.12502 +rthumb 3.01433 -11.1969 +lclavicle -1.43746e-014 -8.34896e-015 +lhumerus -52.1185 28.0056 67.102 +lradius 16.4782 +lwrist 6.87741 +lhand -20.3264 21.5676 +lfingers 7.12502 +lthumb 6.02473 51.462 +rfemur 22.705 5.7478 26.9652 +rtibia 12.7594 +rfoot -12.8231 0.778087 +rtoes -16.0535 +lfemur -25.3257 -1.8371 -18.2941 +ltibia 26.9478 +lfoot -7.39005 18.4616 +ltoes -9.87627 +143 +root 9.73028 17.0549 -5.87 -4.6113 -9.31299 -2.12033 +lowerback 5.92054 1.58908 3.51527 +upperback 2.91309 2.29903 0.925097 +thorax -0.215262 1.17491 -1.1542 +lowerneck -8.70599 6.28912 3.39395 +upperneck -0.853107 8.12906 -4.38874 +head 1.55762 3.96299 -1.62726 +rclavicle -4.43538e-015 -2.16675e-014 +rhumerus -10.5124 16.6218 -82.4625 +rradius 54.5074 +rwrist -16.6533 +rhand -23.9264 19.0044 +rfingers 7.12502 +rthumb 2.54847 -10.9602 +lclavicle -4.43538e-015 -2.16675e-014 +lhumerus -52.2567 28.8246 66.3303 +lradius 16.0789 +lwrist 5.76749 +lhand -20.4042 21.6483 +lfingers 7.12502 +lthumb 5.94963 51.5448 +rfemur 23.6442 6.03859 26.5592 +rtibia 12.7288 +rfoot -11.8956 0.476088 +rtoes -19.0479 +lfemur -25.1726 -1.56381 -19.0976 +ltibia 28.134 +lfoot -6.30865 19.3509 +ltoes -9.77544 +144 +root 9.73846 17.0562 -5.65619 -4.76379 -9.07097 -2.24082 +lowerback 5.81083 1.55001 3.52712 +upperback 2.94738 2.24241 0.989222 +thorax -0.123701 1.14818 -1.08756 +lowerneck -8.90628 6.33318 2.89433 +upperneck -0.521144 8.22375 -3.73726 +head 1.6442 4.02023 -1.31958 +rclavicle -4.73977e-014 -1.19271e-015 +rhumerus -10.8385 16.201 -82.5883 +rradius 54.3891 +rwrist -16.2229 +rhand -24.0127 18.598 +rfingers 7.12502 +rthumb 2.46509 -11.3675 +lclavicle -4.73977e-014 -1.19271e-015 +lhumerus -51.9771 29.1332 66.3085 +lradius 15.8647 +lwrist 5.31705 +lhand -20.5265 21.6409 +lfingers 7.12502 +lthumb 5.83148 51.5407 +rfemur 24.2163 6.16116 26.814 +rtibia 13.3646 +rfoot -10.9318 0.0976763 +rtoes -21.1562 +lfemur -25.0742 -1.46074 -19.1676 +ltibia 29.3292 +lfoot -5.6509 19.1056 +ltoes -12.1034 +145 +root 9.74327 17.0624 -5.44667 -4.78451 -8.72369 -2.45168 +lowerback 5.63899 1.46313 3.60508 +upperback 2.84093 2.12693 1.05896 +thorax -0.14269 1.08947 -1.05007 +lowerneck -8.60169 6.41388 2.76261 +upperneck -0.537774 8.34373 -3.45327 +head 1.56685 4.08963 -1.21135 +rclavicle 6.54747e-015 -1.98785e-016 +rhumerus -11.4937 15.861 -82.8528 +rradius 54.2346 +rwrist -16.1988 +rhand -23.9704 17.8758 +rfingers 7.12502 +rthumb 2.50593 -12.0892 +lclavicle 6.54747e-015 -1.98785e-016 +lhumerus -51.6747 28.8519 66.6464 +lradius 15.7953 +lwrist 5.42136 +lhand -20.6246 21.6342 +lfingers 7.12502 +lthumb 5.73676 51.5366 +rfemur 24.2879 6.06448 27.1071 +rtibia 14.5703 +rfoot -9.95337 -0.23003 +rtoes -22.3979 +lfemur -25.0595 -1.31934 -19.1423 +ltibia 30.4667 +lfoot -5.29794 17.6992 +ltoes -12.9656 +146 +root 9.75155 17.049 -5.24207 -4.80421 -8.32083 -2.15853 +lowerback 5.30797 1.36218 3.2914 +upperback 2.74656 1.96555 0.914896 +thorax -0.0693014 1.00726 -1.00659 +lowerneck -8.07984 6.48177 2.96554 +upperneck -0.680427 8.42458 -3.42918 +head 1.44048 4.13641 -1.25241 +rclavicle 4.24902e-015 -2.26615e-014 +rhumerus -12.2247 15.4234 -83.2837 +rradius 54.1624 +rwrist -16.2514 +rhand -24.0052 17.9707 +rfingers 7.12502 +rthumb 2.47238 -11.9948 +lclavicle 4.24902e-015 -2.26615e-014 +lhumerus -51.2894 28.7078 66.762 +lradius 15.6329 +lwrist 5.42444 +lhand -20.3221 21.8416 +lfingers 7.12502 +lthumb 6.02886 51.7358 +rfemur 24.0373 6.00378 26.8104 +rtibia 16.4522 +rfoot -9.38249 -0.364696 +rtoes -22.1765 +lfemur -25.1041 -1.0377 -19.7222 +ltibia 31.5769 +lfoot -4.99528 15.72 +ltoes -9.21781 +147 +root 9.75611 17.0576 -5.03974 -4.71984 -8.1127 -2.11862 +lowerback 5.04009 1.33851 3.18787 +upperback 2.59076 1.92254 0.839727 +thorax -0.0834314 0.983773 -1.01902 +lowerneck -7.70439 6.50394 3.24613 +upperneck -0.572456 8.44306 -3.45449 +head 1.42621 4.14849 -1.31667 +rclavicle -1.16041e-014 -3.97569e-015 +rhumerus -12.9636 14.8124 -83.7718 +rradius 54.019 +rwrist -16.1089 +rhand -24.1144 18.733 +rfingers 7.12502 +rthumb 2.36685 -11.2336 +lclavicle -1.16041e-014 -3.97569e-015 +lhumerus -51.0791 29.1086 66.2814 +lradius 15.4203 +lwrist 4.63844 +lhand -19.7454 21.9211 +lfingers 7.12502 +lthumb 6.58563 51.7987 +rfemur 23.3187 6.07026 26.7478 +rtibia 18.9115 +rfoot -8.72491 -0.375269 +rtoes -21.9816 +lfemur -25.1079 -0.582078 -19.9941 +ltibia 32.5029 +lfoot -4.67281 14.1081 +ltoes -6.11962 +148 +root 9.75406 17.0654 -4.84024 -4.52328 -8.00063 -2.43066 +lowerback 4.79054 1.3019 3.28949 +upperback 2.44079 1.87246 0.918006 +thorax -0.099947 0.95752 -0.988927 +lowerneck -8.05781 6.60411 3.27519 +upperneck 0.0664918 8.57329 -3.30335 +head 1.69383 4.21113 -1.2468 +rclavicle -2.09842e-014 9.93923e-016 +rhumerus -13.5769 14.4825 -84.2204 +rradius 53.6526 +rwrist -16.207 +rhand -24.6317 18.7781 +rfingers 7.12502 +rthumb 1.86726 -11.1935 +lclavicle -2.09842e-014 9.93923e-016 +lhumerus -50.8235 29.729 65.7862 +lradius 15.198 +lwrist 3.62169 +lhand -19.496 21.8759 +lfingers 7.12502 +lthumb 6.82639 51.7459 +rfemur 22.1911 6.08249 27.0267 +rtibia 21.7212 +rfoot -7.54005 -0.373003 +rtoes -23.0382 +lfemur -25.1033 -0.184297 -19.8325 +ltibia 33.2971 +lfoot -4.65027 13.3917 +ltoes -6.61233 +149 +root 9.75741 17.0723 -4.64168 -4.50249 -7.6941 -2.18263 +lowerback 4.53684 1.26685 2.90719 +upperback 2.41389 1.80113 0.870522 +thorax -0.000300873 0.920149 -0.814717 +lowerneck -8.50796 6.65811 3.17809 +upperneck 0.616867 8.64997 -3.2023 +head 1.94669 4.24522 -1.17165 +rclavicle -2.93922e-014 0 +rhumerus -14.4279 14.4073 -84.4125 +rradius 53.6351 +rwrist -16.8268 +rhand -25.0171 18.215 +rfingers 7.12502 +rthumb 1.49504 -11.7595 +lclavicle -2.93922e-014 0 +lhumerus -50.1218 29.9137 66.02 +lradius 14.9199 +lwrist 3.26228 +lhand -19.589 21.4962 +lfingers 7.12502 +lthumb 6.73658 51.3691 +rfemur 21.1139 5.84504 26.6013 +rtibia 24.5482 +rfoot -6.08474 -0.26791 +rtoes -24.0394 +lfemur -24.7991 -0.151918 -20.2965 +ltibia 33.9165 +lfoot -4.91701 13.3678 +ltoes -7.27338 +150 +root 9.77006 17.0822 -4.442 -4.61349 -7.28737 -1.52744 +lowerback 4.40541 1.29129 2.25837 +upperback 2.32108 1.80622 0.6901 +thorax -0.0375996 0.917312 -0.635391 +lowerneck -8.64236 6.59532 2.97033 +upperneck 1.07613 8.58437 -2.95292 +head 2.0961 4.21524 -1.04958 +rclavicle -1.59804e-014 5.96354e-016 +rhumerus -15.7674 14.1027 -84.5424 +rradius 53.9009 +rwrist -17.2496 +rhand -25.0618 18.3276 +rfingers 7.12502 +rthumb 1.45193 -11.6472 +lclavicle -1.59804e-014 5.96354e-016 +lhumerus -49.52 29.7145 66.4574 +lradius 14.8947 +lwrist 3.10617 +lhand -19.3066 21.2669 +lfingers 7.12502 +lthumb 7.00915 51.1308 +rfemur 20.075 5.37255 25.5602 +rtibia 27.3814 +rfoot -4.27589 0.0129007 +rtoes -24.5479 +lfemur -24.2685 -0.230332 -21.2392 +ltibia 34.436 +lfoot -5.4799 13.1857 +ltoes -5.85782 +151 +root 9.78373 17.0928 -4.24664 -4.79164 -7.05289 -0.98022 +lowerback 4.52383 1.32667 1.77494 +upperback 2.13122 1.8398 0.457269 +thorax -0.305743 0.928317 -0.6114 +lowerneck -8.5251 6.5758 2.83784 +upperneck 1.54505 8.56576 -2.49802 +head 2.1982 4.21751 -0.880662 +rclavicle -1.2087e-014 -5.66536e-015 +rhumerus -16.8641 13.3933 -85.023 +rradius 53.3887 +rwrist -17.1442 +rhand -25.2843 19.2231 +rfingers 7.12502 +rthumb 1.23699 -10.7531 +lclavicle -1.2087e-014 -5.66536e-015 +lhumerus -48.8201 28.9785 67.143 +lradius 15.0556 +lwrist 3.62987 +lhand -19.0523 21.4869 +lfingers 7.12502 +lthumb 7.25462 51.3425 +rfemur 19.0158 5.1101 24.6496 +rtibia 30.2263 +rfoot -1.9529 0.236088 +rtoes -24.8182 +lfemur -23.6262 -0.301356 -21.9994 +ltibia 34.7774 +lfoot -6.27767 12.7019 +ltoes -3.61358 +152 +root 9.79773 17.1117 -4.05672 -4.8786 -6.9369 -0.847351 +lowerback 4.65825 1.3107 1.75443 +upperback 1.94372 1.82206 0.292126 +thorax -0.568757 0.916794 -0.774961 +lowerneck -8.21941 6.63638 3.00688 +upperneck 1.81258 8.63159 -2.243 +head 2.22842 4.261 -0.830522 +rclavicle 2.97478e-014 -7.00716e-015 +rhumerus -17.4932 12.6423 -85.6371 +rradius 52.2624 +rwrist -16.922 +rhand -25.2857 19.5642 +rfingers 7.12502 +rthumb 1.23559 -10.412 +lclavicle 2.97478e-014 -7.00716e-015 +lhumerus -48.049 28.2209 67.8146 +lradius 15.2802 +lwrist 4.49008 +lhand -19.1188 21.2202 +lfingers 7.12502 +lthumb 7.19049 51.078 +rfemur 17.7376 5.12273 24.2925 +rtibia 33.1583 +rfoot 0.804203 0.209522 +rtoes -25.2903 +lfemur -23.0139 -0.326648 -22.3073 +ltibia 34.9689 +lfoot -6.9852 12.269 +ltoes -4.19949 +153 +root 9.81709 17.1329 -3.8695 -4.86794 -6.88858 -0.823667 +lowerback 4.67357 1.27995 1.83733 +upperback 1.80056 1.78678 0.263917 +thorax -0.721638 0.897371 -0.851233 +lowerneck -8.05132 6.68127 3.20515 +upperneck 2.07998 8.68936 -2.40897 +head 2.30863 4.2878 -0.914014 +rclavicle 1.45206e-015 9.29318e-015 +rhumerus -18.1407 12.4472 -85.91 +rradius 51.4167 +rwrist -16.9654 +rhand -25.0779 19.164 +rfingers 7.12502 +rthumb 1.43629 -10.8109 +lclavicle 1.45206e-015 9.29318e-015 +lhumerus -47.538 27.7101 68.5843 +lradius 15.9051 +lwrist 5.30532 +lhand -19.178 20.8437 +lfingers 7.12502 +lthumb 7.13331 50.7035 +rfemur 16.2744 5.31566 24.0759 +rtibia 36.1426 +rfoot 3.92477 0.034159 +rtoes -26.2165 +lfemur -22.3562 -0.241393 -22.5554 +ltibia 35.0946 +lfoot -7.59518 12.1552 +ltoes -5.3621 +154 +root 9.84051 17.1508 -3.68862 -4.8425 -6.91919 -0.592802 +lowerback 4.68842 1.29232 1.72315 +upperback 1.64335 1.79984 0.193848 +thorax -0.892256 0.901343 -0.86276 +lowerneck -7.9483 6.70706 3.49919 +upperneck 2.46775 8.72408 -2.78135 +head 2.45818 4.29744 -1.07675 +rclavicle 3.01916e-014 1.80894e-014 +rhumerus -18.9409 12.4193 -86.1188 +rradius 50.7933 +rwrist -17.1387 +rhand -25.1052 18.9655 +rfingers 7.12502 +rthumb 1.41001 -11.0096 +lclavicle 3.01916e-014 1.80894e-014 +lhumerus -46.9254 27.0417 69.5358 +lradius 16.515 +lwrist 6.21283 +lhand -19.32 20.8409 +lfingers 7.12502 +lthumb 6.99628 50.7052 +rfemur 14.6818 5.63401 23.61 +rtibia 39.1905 +rfoot 7.14064 -0.0434277 +rtoes -28.466 +lfemur -21.6499 -0.250705 -23.0062 +ltibia 35.0983 +lfoot -8.18517 12.3235 +ltoes -4.67723 +155 +root 9.85552 17.1761 -3.51782 -4.582 -6.88662 -0.640872 +lowerback 4.62752 1.28249 1.7944 +upperback 1.41885 1.7914 0.176099 +thorax -1.08613 0.89413 -0.922395 +lowerneck -7.97641 6.77455 3.54887 +upperneck 2.84426 8.81308 -2.72376 +head 2.59263 4.34329 -1.05473 +rclavicle -1.56034e-014 -8.54774e-015 +rhumerus -19.6677 12.1562 -86.4445 +rradius 50.0926 +rwrist -17.2995 +rhand -25.0333 19.1126 +rfingers 7.12502 +rthumb 1.47938 -10.862 +lclavicle -1.56034e-014 -8.54774e-015 +lhumerus -46.1009 26.2245 70.525 +lradius 17.0158 +lwrist 7.13865 +lhand -19.4399 21.2335 +lfingers 7.12502 +lthumb 6.88055 51.1017 +rfemur 12.6663 5.84495 23.5057 +rtibia 42.3843 +rfoot 10.2717 -0.0584503 +rtoes -31.4799 +lfemur -21.2453 -0.350063 -23.0902 +ltibia 34.9269 +lfoot -8.56942 12.3334 +ltoes -3.57998 +156 +root 9.86069 17.2088 -3.34634 -4.42632 -6.82723 -0.383995 +lowerback 4.61861 1.28657 1.40743 +upperback 1.32819 1.77934 0.126491 +thorax -1.18495 0.887024 -0.757296 +lowerneck -8.21608 6.84666 3.42657 +upperneck 2.98779 8.90799 -2.5715 +head 2.67289 4.39137 -0.969531 +rclavicle -1.021e-014 -5.2181e-015 +rhumerus -20.1422 11.8901 -86.7094 +rradius 49.2849 +rwrist -17.4115 +rhand -24.8773 19.013 +rfingers 7.12502 +rthumb 1.63009 -10.9605 +lclavicle -1.021e-014 -5.2181e-015 +lhumerus -45.1128 25.059 71.9648 +lradius 17.8421 +lwrist 8.52027 +lhand -19.4353 21.624 +lfingers 7.12502 +lthumb 6.88497 51.4921 +rfemur 10.651 5.97104 23.1278 +rtibia 45.5634 +rfoot 12.9861 -0.208148 +rtoes -33.9045 +lfemur -20.7615 -0.355485 -23.4825 +ltibia 34.7402 +lfoot -8.95265 12.2126 +ltoes -2.04657 +157 +root 9.87286 17.2457 -3.16564 -4.52944 -6.87987 0.35339 +lowerback 4.64079 1.31361 0.576502 +upperback 1.40845 1.77476 -0.0191168 +thorax -1.13592 0.885911 -0.440556 +lowerneck -8.53004 6.94997 3.64321 +upperneck 3.15678 9.03598 -2.92464 +head 2.82646 4.44263 -1.09801 +rclavicle -2.00866e-014 -9.44227e-015 +rhumerus -20.4134 11.7997 -86.9169 +rradius 48.2984 +rwrist -17.2737 +rhand -24.9046 18.8975 +rfingers 7.12502 +rthumb 1.60369 -11.0762 +lclavicle -2.00866e-014 -9.44227e-015 +lhumerus -43.9964 23.6226 73.7589 +lradius 18.8462 +lwrist 10.3614 +lhand -19.57 21.6192 +lfingers 7.12502 +lthumb 6.75491 51.4915 +rfemur 8.79379 6.09921 22.1268 +rtibia 48.7373 +rfoot 15.0791 -0.400735 +rtoes -35.9796 +lfemur -19.8279 -0.368076 -24.4302 +ltibia 34.4104 +lfoot -9.40906 12.3626 +ltoes -1.5111 +158 +root 9.89098 17.2527 -2.99476 -4.42914 -7.00189 0.645283 +lowerback 4.50806 1.29284 0.310449 +upperback 1.35842 1.7343 -0.044747 +thorax -1.12078 0.865812 -0.313101 +lowerneck -8.66447 7.09563 3.92924 +upperneck 3.6157 9.23137 -3.33202 +head 3.05821 4.52689 -1.25386 +rclavicle 6.94038e-015 -4.07509e-015 +rhumerus -20.8422 11.7585 -87.1546 +rradius 47.1274 +rwrist -16.8732 +rhand -24.8027 19.5124 +rfingers 7.12502 +rthumb 1.70217 -10.4606 +lclavicle 6.94038e-015 -4.07509e-015 +lhumerus -43.1284 22.2269 75.3546 +lradius 19.919 +lwrist 12.1978 +lhand -19.8059 21.5147 +lfingers 7.12502 +lthumb 6.52722 51.3941 +rfemur 6.95869 6.24463 21.5933 +rtibia 51.7097 +rfoot 16.3357 -0.982304 +rtoes -37.2669 +lfemur -19.0969 -0.473336 -24.8965 +ltibia 33.9645 +lfoot -9.82068 12.6358 +ltoes -1.16362 +159 +root 9.90291 17.275 -2.82548 -4.36442 -7.04243 1.23887 +lowerback 4.40919 1.26406 -0.301887 +upperback 1.24865 1.66766 -0.134566 +thorax -1.19345 0.832985 -0.0580451 +lowerneck -8.73162 7.21821 3.91412 +upperneck 4.15073 9.41646 -3.42811 +head 3.26846 4.61238 -1.25948 +rclavicle 2.39757e-014 1.2921e-015 +rhumerus -21.4337 11.5748 -87.416 +rradius 45.9827 +rwrist -16.2161 +rhand -24.5245 19.9567 +rfingers 7.12502 +rthumb 1.9708 -10.014 +lclavicle 2.39757e-014 1.2921e-015 +lhumerus -42.4966 21.1448 76.5636 +lradius 21.0039 +lwrist 13.7716 +lhand -20.284 20.9042 +lfingers 7.12502 +lthumb 6.06561 50.7974 +rfemur 5.05906 6.28255 20.7783 +rtibia 54.5315 +rfoot 16.5218 -1.7075 +rtoes -38.5197 +lfemur -18.34 -0.51276 -25.6709 +ltibia 33.4763 +lfoot -10.3084 12.7217 +ltoes -0.0897713 +160 +root 9.90986 17.3025 -2.66171 -4.47574 -6.97999 2.01315 +lowerback 4.50209 1.149 -1.26395 +upperback 1.23311 1.46974 -0.16559 +thorax -1.28411 0.735708 0.457258 +lowerneck -8.86328 7.43905 3.5033 +upperneck 4.48099 9.75255 -3.25618 +head 3.38436 4.77519 -1.10075 +rclavicle -7.95333e-015 4.17448e-015 +rhumerus -21.8629 11.8216 -87.5701 +rradius 44.9273 +rwrist -15.8747 +rhand -24.2626 19.4073 +rfingers 7.12502 +rthumb 2.22378 -10.5609 +lclavicle -7.95333e-015 4.17448e-015 +lhumerus -41.9485 20.2874 77.8042 +lradius 22.4251 +lwrist 15.5609 +lhand -21.1738 20.1591 +lfingers 7.12502 +lthumb 5.20654 50.0751 +rfemur 3.36334 6.17928 19.8267 +rtibia 57.0848 +rfoot 15.8891 -3.58823 +rtoes -37.0196 +lfemur -17.4586 -0.445842 -26.637 +ltibia 33.0791 +lfoot -10.7052 12.6882 +ltoes -0.168149 +161 +root 9.92251 17.3265 -2.5007 -4.51049 -6.90601 1.95344 +lowerback 4.64847 1.01472 -1.19279 +upperback 1.20582 1.29259 -0.107214 +thorax -1.3905 0.647717 0.484142 +lowerneck -8.76622 7.67063 3.26551 +upperneck 4.57434 10.077 -2.99877 +head 3.37714 4.94236 -0.957529 +rclavicle 1.11925e-014 6.75868e-015 +rhumerus -22.3063 11.9707 -87.7839 +rradius 43.8608 +rwrist -15.9774 +rhand -23.9351 19.0618 +rfingers 7.12502 +rthumb 2.54003 -10.9028 +lclavicle 1.11925e-014 6.75868e-015 +lhumerus -41.4137 18.9931 78.9568 +lradius 24.0276 +lwrist 17.2136 +lhand -21.7171 20.3595 +lfingers 7.12502 +lthumb 4.68197 50.2878 +rfemur 1.7589 6.02709 19.8217 +rtibia 59.403 +rfoot 14.8725 -5.73486 +rtoes -33.3814 +lfemur -16.5553 -0.332622 -26.7153 +ltibia 32.6115 +lfoot -10.9668 12.588 +ltoes -0.692326 +162 +root 9.94213 17.3494 -2.33308 -4.59209 -6.69566 1.9886 +lowerback 4.79044 0.983957 -0.935758 +upperback 1.15421 1.25866 -0.286534 +thorax -1.51266 0.630646 0.155065 +lowerneck -8.37802 7.68908 3.50503 +upperneck 4.55229 10.0854 -2.98602 +head 3.31015 4.95608 -1.00889 +rclavicle -2.3431e-015 -7.35503e-015 +rhumerus -22.8467 11.2469 -88.068 +rradius 42.673 +rwrist -15.739 +rhand -23.6084 19.2186 +rfingers 7.12502 +rthumb 2.85556 -10.742 +lclavicle -2.3431e-015 -7.35503e-015 +lhumerus -40.6046 17.4028 79.7389 +lradius 24.8821 +lwrist 17.9034 +lhand -21.8352 20.2892 +lfingers 7.12502 +lthumb 4.56787 50.2199 +rfemur 0.273185 5.67947 19.6145 +rtibia 61.5213 +rfoot 13.751 -6.97973 +rtoes -30.5886 +lfemur -15.5543 -0.231299 -26.9465 +ltibia 32.1065 +lfoot -11.3306 12.361 +ltoes -1.34917 +163 +root 9.95572 17.3673 -2.17954 -4.82503 -6.36373 2.3482 +lowerback 5.14258 0.918131 -1.19287 +upperback 1.21071 1.14985 -0.458147 +thorax -1.65166 0.57725 0.124243 +lowerneck -8.25678 7.72967 3.77775 +upperneck 4.5621 10.1254 -3.14383 +head 3.32028 4.97628 -1.10767 +rclavicle -3.49019e-015 -5.36719e-015 +rhumerus -23.0893 10.5291 -88.2224 +rradius 41.2856 +rwrist -15.0936 +rhand -22.8551 18.4791 +rfingers 7.12502 +rthumb 3.58304 -11.4705 +lclavicle -3.49019e-015 -5.36719e-015 +lhumerus -39.5943 16.1098 80.5519 +lradius 25.496 +lwrist 18.4865 +lhand -21.9889 19.7004 +lfingers 7.12502 +lthumb 4.41948 49.6343 +rfemur -1.19216 5.15235 19.0963 +rtibia 63.4851 +rfoot 12.456 -8.30892 +rtoes -29.2808 +lfemur -14.4861 -0.167976 -27.4959 +ltibia 31.5879 +lfoot -11.6076 12.0831 +ltoes -2.36052 +164 +root 9.96088 17.3881 -2.0299 -5.04367 -6.0756 2.77825 +lowerback 5.46561 0.861072 -1.70401 +upperback 1.3489 1.03936 -0.542873 +thorax -1.69605 0.523283 0.327227 +lowerneck -8.52004 7.86107 3.87869 +upperneck 4.69383 10.2961 -3.30495 +head 3.44078 5.05272 -1.15245 +rclavicle 3.87397e-015 -7.35503e-015 +rhumerus -23.28 9.96332 -88.2585 +rradius 39.9965 +rwrist -14.5261 +rhand -21.7133 17.5708 +rfingers 7.12502 +rthumb 4.68559 -12.3574 +lclavicle 3.87397e-015 -7.35503e-015 +lhumerus -38.8737 14.9591 81.5174 +lradius 27.0399 +lwrist 19.4265 +lhand -22.0033 20.0845 +lfingers 7.12502 +lthumb 4.40555 50.0187 +rfemur -2.75557 4.80033 18.5679 +rtibia 65.3092 +rfoot 10.517 -10.0306 +rtoes -27.5143 +lfemur -13.4724 -0.198588 -28.0672 +ltibia 31.0463 +lfoot -11.7632 11.9431 +ltoes -3.38667 +165 +root 9.97099 17.4085 -1.86301 -5.13617 -5.88153 3.16532 +lowerback 5.55644 0.836747 -2.08496 +upperback 1.34934 0.981158 -0.638732 +thorax -1.74975 0.495791 0.444923 +lowerneck -8.30091 7.82733 4.02393 +upperneck 4.6682 10.2616 -3.56335 +head 3.41625 5.03126 -1.27255 +rclavicle -1.39025e-014 3.67752e-015 +rhumerus -23.9829 9.4472 -88.3729 +rradius 38.9476 +rwrist -14.2742 +rhand -21.4301 17.6175 +rfingers 7.12502 +rthumb 4.95905 -12.3044 +lclavicle -1.39025e-014 3.67752e-015 +lhumerus -38.6751 14.065 82.2017 +lradius 29.0608 +lwrist 20.0561 +lhand -21.652 21.1769 +lfingers 7.12502 +lthumb 4.74479 51.1038 +rfemur -4.33428 4.69062 18.0147 +rtibia 66.9339 +rfoot 7.90562 -11.6811 +rtoes -23.23 +lfemur -12.5166 -0.202286 -28.6431 +ltibia 30.5327 +lfoot -12.0246 11.9733 +ltoes -4.2507 +166 +root 9.9821 17.4243 -1.69968 -5.15665 -5.7121 2.9542 +lowerback 5.7056 0.737225 -1.92288 +upperback 1.26361 0.85537 -0.515955 +thorax -1.91776 0.434367 0.486466 +lowerneck -7.73667 7.74677 4.11526 +upperneck 4.4112 10.1752 -3.80796 +head 3.23884 4.98957 -1.39998 +rclavicle -9.5238e-015 -2.38542e-015 +rhumerus -24.7698 9.14264 -88.4728 +rradius 37.8579 +rwrist -13.9595 +rhand -21.6061 17.519 +rfingers 7.12502 +rthumb 4.78909 -12.4069 +lclavicle -9.5238e-015 -2.38542e-015 +lhumerus -38.2529 13.0477 82.9266 +lradius 30.3822 +lwrist 21.0471 +lhand -21.5142 21.8698 +lfingers 7.12502 +lthumb 4.87784 51.7937 +rfemur -5.82202 4.56988 18.2113 +rtibia 68.2247 +rfoot 5.53668 -13.0213 +rtoes -19.795 +lfemur -11.6347 -0.0848513 -28.5752 +ltibia 30.1196 +lfoot -12.312 11.9164 +ltoes -4.37776 +167 +root 9.99086 17.4471 -1.54326 -5.09548 -5.40598 2.61434 +lowerback 5.81491 0.570484 -1.73453 +upperback 1.23831 0.647751 -0.249688 +thorax -2.00102 0.331112 0.668519 +lowerneck -7.64668 7.78136 3.80262 +upperneck 4.36208 10.2589 -3.85259 +head 3.19069 5.02536 -1.36055 +rclavicle 3.57191e-015 7.7526e-015 +rhumerus -25.2545 8.77227 -88.3262 +rradius 36.5609 +rwrist -13.3806 +rhand -21.3748 17.2284 +rfingers 7.12502 +rthumb 5.01245 -12.6923 +lclavicle 3.57191e-015 7.7526e-015 +lhumerus -37.4435 12.1035 83.7859 +lradius 31.3216 +lwrist 21.9676 +lhand -21.9954 21.8302 +lfingers 7.12502 +lthumb 4.41325 51.7642 +rfemur -7.34099 4.25525 18.5977 +rtibia 69.22 +rfoot 3.60686 -14.1387 +rtoes -20.2684 +lfemur -10.9163 -0.106793 -28.3268 +ltibia 29.8271 +lfoot -12.5463 11.6971 +ltoes -4.77306 +168 +root 10.006 17.4717 -1.37638 -5.12584 -5.05091 2.39824 +lowerback 5.82528 0.408775 -1.50213 +upperback 1.31874 0.45096 -0.07858 +thorax -1.91885 0.231072 0.729005 +lowerneck -7.85986 7.85338 3.55053 +upperneck 4.60922 10.3827 -3.84193 +head 3.30429 5.0781 -1.29374 +rclavicle -1.50828e-014 -7.7526e-015 +rhumerus -25.732 8.24754 -88.1698 +rradius 35.1819 +rwrist -12.8945 +rhand -21.4122 17.4462 +rfingers 7.12502 +rthumb 4.97635 -12.4754 +lclavicle -1.50828e-014 -7.7526e-015 +lhumerus -36.7368 11.3897 84.447 +lradius 32.6144 +lwrist 22.1607 +lhand -22.0605 21.8691 +lfingers 7.12502 +lthumb 4.35031 51.8044 +rfemur -8.64957 3.88228 18.7642 +rtibia 69.9562 +rfoot 1.70787 -15.0981 +rtoes -21.5297 +lfemur -10.1312 -0.426104 -28.2318 +ltibia 29.6735 +lfoot -12.9685 11.5962 +ltoes -4.90672 +169 +root 10.021 17.4811 -1.20628 -5.31563 -4.7104 2.29472 +lowerback 5.88171 0.316624 -1.27942 +upperback 1.46294 0.342482 -0.0500188 +thorax -1.79837 0.174604 0.641578 +lowerneck -8.05571 7.86938 3.61656 +upperneck 4.97518 10.4054 -3.85865 +head 3.47585 5.0847 -1.29436 +rclavicle -1.92573e-015 -3.57812e-015 +rhumerus -26.3053 7.61437 -88.1091 +rradius 33.9878 +rwrist -12.5245 +rhand -21.9204 17.5105 +rfingers 7.12502 +rthumb 4.48563 -12.422 +lclavicle -1.92573e-015 -3.57812e-015 +lhumerus -36.0511 10.1801 85.0868 +lradius 34.0423 +lwrist 22.729 +lhand -21.713 22.0747 +lfingers 7.12502 +lthumb 4.68593 52.0029 +rfemur -9.78234 3.63444 18.8017 +rtibia 70.5087 +rfoot 0.248041 -15.7853 +rtoes -21.3593 +lfemur -9.16412 -0.876721 -28.3049 +ltibia 29.496 +lfoot -13.6856 11.7129 +ltoes -3.40909 +170 +root 10.0274 17.4758 -1.04525 -5.40944 -4.30259 2.22195 +lowerback 5.90478 0.232997 -1.21114 +upperback 1.58126 0.236559 -0.0106853 +thorax -1.6873 0.120385 0.651613 +lowerneck -8.14319 7.79945 3.38368 +upperneck 5.13057 10.3241 -3.65343 +head 3.51371 5.04558 -1.18735 +rclavicle -1.38963e-014 -8.15017e-015 +rhumerus -26.8571 6.49179 -87.8667 +rradius 33.0235 +rwrist -11.8873 +rhand -21.8094 17.1387 +rfingers 7.12502 +rthumb 4.59284 -12.7915 +lclavicle -1.38963e-014 -8.15017e-015 +lhumerus -35.3669 8.96992 85.7515 +lradius 35.4501 +lwrist 23.5314 +lhand -21.7604 22.1696 +lfingers 7.12502 +lthumb 4.64015 52.0988 +rfemur -11.1208 3.49953 18.8863 +rtibia 70.9144 +rfoot -0.687449 -16.4073 +rtoes -19.7501 +lfemur -8.30306 -1.11871 -28.4032 +ltibia 29.2635 +lfoot -14.3386 11.6845 +ltoes -1.82501 +171 +root 10.0355 17.4751 -0.882741 -5.38283 -3.78668 2.22581 +lowerback 5.81289 0.0827189 -1.29016 +upperback 1.62165 0.0341782 0.0205778 +thorax -1.59046 0.0188091 0.742776 +lowerneck -8.11187 7.86086 3.42751 +upperneck 5.26292 10.4029 -3.60032 +head 3.5563 5.08713 -1.17088 +rclavicle 7.25564e-015 1.88845e-014 +rhumerus -27.5145 5.19926 -87.5963 +rradius 32.1097 +rwrist -11.2968 +rhand -21.4423 16.6028 +rfingers 7.12502 +rthumb 4.94726 -13.3194 +lclavicle 7.25564e-015 1.88845e-014 +lhumerus -34.7879 7.8703 86.3006 +lradius 36.8517 +lwrist 24.2043 +lhand -21.8721 22.8374 +lfingers 7.12502 +lthumb 4.53229 52.7689 +rfemur -12.459 3.31568 18.8503 +rtibia 71.0699 +rfoot -1.65494 -17.0333 +rtoes -17.1344 +lfemur -7.59575 -1.17707 -28.5723 +ltibia 29.152 +lfoot -14.7845 11.3859 +ltoes -1.18288 +172 +root 10.0457 17.4888 -0.718195 -5.4313 -3.29661 2.29999 +lowerback 5.85237 -0.0388515 -1.48499 +upperback 1.64948 -0.138147 0.0848596 +thorax -1.57924 -0.0670936 0.930415 +lowerneck -8.2311 7.97376 3.73995 +upperneck 5.69552 10.5508 -3.83765 +head 3.7762 5.15261 -1.27803 +rclavicle -5.00378e-015 -1.03368e-014 +rhumerus -28.2491 4.39065 -87.3481 +rradius 31.1487 +rwrist -11.0629 +rhand -21.6932 16.092 +rfingers 7.12502 +rthumb 4.70505 -13.8357 +lclavicle -5.00378e-015 -1.03368e-014 +lhumerus -34.2322 6.78183 86.8355 +lradius 38.2845 +lwrist 24.8015 +lhand -21.7191 23.7687 +lfingers 7.12502 +lthumb 4.68004 53.697 +rfemur -13.5603 3.19948 18.7109 +rtibia 70.9398 +rfoot -2.57929 -17.515 +rtoes -16.5192 +lfemur -6.90952 -1.34504 -28.7908 +ltibia 29.145 +lfoot -15.1221 11.2424 +ltoes -2.31511 +173 +root 10.0491 17.4969 -0.566534 -5.47399 -2.89219 1.94008 +lowerback 6.12235 -0.0800112 -1.21041 +upperback 1.65202 -0.176381 0.279293 +thorax -1.72631 -0.0856759 0.979738 +lowerneck -8.22539 7.84869 3.60419 +upperneck 5.77357 10.4083 -3.91386 +head 3.79299 5.07543 -1.28901 +rclavicle 3.71789e-015 1.55052e-014 +rhumerus -28.9875 3.47736 -86.9592 +rradius 30.1162 +rwrist -10.8338 +rhand -21.8057 16.0018 +rfingers 7.12502 +rthumb 4.59635 -13.9283 +lclavicle 3.71789e-015 1.55052e-014 +lhumerus -33.6773 5.5576 87.4286 +lradius 39.7974 +lwrist 25.3089 +lhand -21.6387 24.2731 +lfingers 7.12502 +lthumb 4.75768 54.1997 +rfemur -14.7142 3.27394 19.1646 +rtibia 70.6261 +rfoot -3.70782 -17.9602 +rtoes -16.8007 +lfemur -6.36423 -1.57476 -28.4704 +ltibia 29.1849 +lfoot -15.2858 11.2482 +ltoes -5.19661 +174 +root 10.053 17.4919 -0.415291 -5.30593 -2.43244 1.73264 +lowerback 6.19351 -0.183131 -1.03977 +upperback 1.5336 -0.30189 0.379519 +thorax -1.8849 -0.147063 0.997145 +lowerneck -7.87081 7.68952 3.51452 +upperneck 5.54274 10.2101 -3.95101 +head 3.63112 4.98082 -1.31777 +rclavicle -2.73018e-015 3.57812e-015 +rhumerus -29.9024 2.91855 -86.7728 +rradius 29.155 +rwrist -11.3082 +rhand -21.7488 16.5983 +rfingers 7.12502 +rthumb 4.65138 -13.3307 +lclavicle -2.73018e-015 3.57812e-015 +lhumerus -33.3358 4.22249 87.8563 +lradius 41.4027 +lwrist 26.0201 +lhand -21.8351 24.4909 +lfingers 7.12502 +lthumb 4.56797 54.4217 +rfemur -16.1207 3.24398 19.3793 +rtibia 70.2049 +rfoot -5.20642 -18.1927 +rtoes -16.0092 +lfemur -6.02353 -1.76561 -28.3258 +ltibia 29.2331 +lfoot -15.6413 11.088 +ltoes -6.41975 +175 +root 10.059 17.4812 -0.255929 -5.15368 -1.94495 1.98147 +lowerback 6.11904 -0.325515 -1.4174 +upperback 1.47927 -0.514121 0.391382 +thorax -1.8904 -0.251167 1.23733 +lowerneck -7.61408 7.62961 3.62528 +upperneck 5.4438 10.1361 -4.12467 +head 3.56333 4.94424 -1.41011 +rclavicle 3.23957e-015 8.74653e-015 +rhumerus -30.7708 2.58198 -86.6218 +rradius 28.3143 +rwrist -12.0282 +rhand -21.7717 17.5639 +rfingers 7.12502 +rthumb 4.62923 -12.3655 +lclavicle 3.23957e-015 8.74653e-015 +lhumerus -33.0292 3.30342 88.1765 +lradius 43.1379 +lwrist 26.5445 +lhand -22.062 24.6419 +lfingers 7.12502 +lthumb 4.34887 54.5772 +rfemur -17.4667 3.11691 18.9978 +rtibia 69.6486 +rfoot -5.89846 -18.1553 +rtoes -16.6456 +lfemur -5.56286 -1.99575 -28.7097 +ltibia 29.1893 +lfoot -16.3924 10.7773 +ltoes -4.50573 +176 +root 10.0619 17.4592 -0.0945323 -5.21635 -1.49787 2.28088 +lowerback 6.08261 -0.406509 -1.77901 +upperback 1.63144 -0.643729 0.347399 +thorax -1.70574 -0.317501 1.40357 +lowerneck -7.6095 7.58577 3.47839 +upperneck 5.29499 10.0772 -4.0006 +head 3.4895 4.91808 -1.35102 +rclavicle -6.34869e-015 -5.1684e-015 +rhumerus -31.1773 1.38438 -86.1975 +rradius 27.1793 +rwrist -11.5351 +rhand -21.6287 17.1335 +rfingers 7.12502 +rthumb 4.76731 -12.7929 +lclavicle -6.34869e-015 -5.1684e-015 +lhumerus -32.3814 2.5114 88.4461 +lradius 44.7569 +lwrist 26.7537 +lhand -22.2541 23.9575 +lfingers 7.12502 +lthumb 4.16338 53.8966 +rfemur -18.5428 3.15045 18.6113 +rtibia 68.9749 +rfoot -6.20741 -17.9112 +rtoes -17.3253 +lfemur -4.74869 -2.14547 -29.1502 +ltibia 28.9552 +lfoot -16.9223 10.6 +ltoes -4.47493 +177 +root 10.0681 17.4354 0.0837746 -5.55002 -1.01939 2.68461 +lowerback 6.12039 -0.509378 -2.13007 +upperback 1.86071 -0.803207 0.222639 +thorax -1.48164 -0.400829 1.4827 +lowerneck -7.49189 7.58475 3.2456 +upperneck 5.12792 10.0769 -3.73978 +head 3.37544 4.92607 -1.23397 +rclavicle -8.90183e-015 -5.56597e-015 +rhumerus -31.6515 0.195823 -85.7644 +rradius 26.0515 +rwrist -10.5474 +rhand -21.5089 15.4914 +rfingers 7.12502 +rthumb 4.88302 -14.4323 +lclavicle -8.90183e-015 -5.56597e-015 +lhumerus -31.7521 1.78945 88.5974 +lradius 46.2022 +lwrist 26.9886 +lhand -22.4689 22.2116 +lfingers 7.12502 +lthumb 3.95597 52.1546 +rfemur -19.0905 3.19912 18.0652 +rtibia 68.0619 +rfoot -7.12117 -17.4391 +rtoes -17.2033 +lfemur -3.49272 -2.27668 -29.7609 +ltibia 28.689 +lfoot -17.3405 10.5733 +ltoes -5.82484 +178 +root 10.0793 17.4154 0.25961 -5.84433 -0.410641 2.96835 +lowerback 6.41524 -0.680641 -2.47863 +upperback 1.93036 -1.05955 0.206268 +thorax -1.55703 -0.528268 1.684 +lowerneck -7.52896 7.61362 3.3533 +upperneck 5.32031 10.1201 -3.86338 +head 3.46686 4.94298 -1.28485 +rclavicle -3.72721e-015 3.57812e-015 +rhumerus -32.5387 -0.736722 -85.1749 +rradius 25.2596 +rwrist -9.74473 +rhand -21.3301 14.9051 +rfingers 7.12502 +rthumb 5.05559 -15.0145 +lclavicle -3.72721e-015 3.57812e-015 +lhumerus -31.452 1.33486 88.7816 +lradius 47.7273 +lwrist 27.0594 +lhand -22.4447 21.0411 +lfingers 7.12502 +lthumb 3.97939 50.9837 +rfemur -19.5115 3.1117 17.5738 +rtibia 66.8651 +rfoot -8.38933 -16.883 +rtoes -16.6488 +lfemur -2.33107 -2.48934 -30.2484 +ltibia 28.5334 +lfoot -17.994 10.3365 +ltoes -4.98556 +179 +root 10.0833 17.4057 0.409062 -5.63743 0.0679078 2.50815 +lowerback 6.66236 -0.831997 -2.20707 +upperback 1.75203 -1.24586 0.453759 +thorax -1.86985 -0.615865 1.80729 +lowerneck -7.79094 7.59612 3.45361 +upperneck 5.73514 10.1013 -3.95222 +head 3.675 4.92543 -1.31503 +rclavicle -6.62201e-015 -7.95139e-016 +rhumerus -33.3773 -2.14283 -84.3285 +rradius 24.3403 +rwrist -8.75041 +rhand -20.9169 15.0591 +rfingers 7.12502 +rthumb 5.4546 -14.8507 +lclavicle -6.62201e-015 -7.95139e-016 +lhumerus -31.261 0.609932 89.0196 +lradius 49.3169 +lwrist 27.1781 +lhand -22.2127 20.8545 +lfingers 7.12502 +lthumb 4.20334 50.7928 +rfemur -20.5734 3.28478 18.0063 +rtibia 65.3947 +rfoot -9.51606 -16.5949 +rtoes -15.1092 +lfemur -1.95485 -2.68368 -29.7948 +ltibia 28.4665 +lfoot -18.4487 10.0862 +ltoes -4.97425 +180 +root 10.083 17.4078 0.5631 -5.39987 0.405124 1.87194 +lowerback 6.72082 -0.94769 -1.69152 +upperback 1.57229 -1.36112 0.695956 +thorax -2.08855 -0.670782 1.78014 +lowerneck -7.65828 7.57104 3.38297 +upperneck 5.87805 10.0702 -3.78111 +head 3.68183 4.9162 -1.25167 +rclavicle 2.842e-014 -3.57812e-015 +rhumerus -34.2679 -3.3399 -83.6807 +rradius 23.3699 +rwrist -8.11933 +rhand -20.7634 15.5236 +rfingers 7.12502 +rthumb 5.60275 -14.3823 +lclavicle 2.842e-014 -3.57812e-015 +lhumerus -31.076 -0.524006 89.1771 +lradius 50.787 +lwrist 27.6112 +lhand -22.1833 20.8374 +lfingers 7.12502 +lthumb 4.23179 50.7751 +rfemur -21.6341 3.68951 18.6458 +rtibia 63.6266 +rfoot -10.312 -16.3514 +rtoes -15.6714 +lfemur -1.63133 -2.84273 -29.1165 +ltibia 28.4361 +lfoot -18.9933 9.94667 +ltoes -5.22461 +181 +root 10.083 17.4116 0.732727 -5.38701 0.785344 1.73627 +lowerback 6.64683 -1.0637 -1.70636 +upperback 1.62829 -1.5124 0.810934 +thorax -1.97961 -0.747837 1.91668 +lowerneck -7.70921 7.58628 3.00199 +upperneck 5.96053 10.0989 -3.37232 +head 3.66861 4.93704 -1.04823 +rclavicle -3.21161e-015 3.97569e-016 +rhumerus -35.0821 -4.03239 -83.162 +rradius 22.5289 +rwrist -8.0212 +rhand -20.7566 16.4609 +rfingers 7.12502 +rthumb 5.60935 -13.4448 +lclavicle -3.21161e-015 3.97569e-016 +lhumerus -30.6446 -1.37108 89.2925 +lradius 52.1097 +lwrist 27.976 +lhand -22.4872 20.0733 +lfingers 7.12502 +lthumb 3.93828 50.0167 +rfemur -22.2408 4.01798 18.6571 +rtibia 61.6159 +rfoot -11.0779 -15.885 +rtoes -17.8603 +lfemur -0.944289 -2.84783 -28.9916 +ltibia 28.3368 +lfoot -19.6309 9.74282 +ltoes -5.11573 +182 +root 10.0827 17.4079 0.905031 -5.55571 1.23144 1.95152 +lowerback 6.7338 -1.10567 -2.04002 +upperback 1.83191 -1.59166 0.796647 +thorax -1.80565 -0.790427 2.09469 +lowerneck -8.07363 7.51597 2.5909 +upperneck 6.01231 10.0085 -2.96542 +head 3.70044 4.89478 -0.837088 +rclavicle 3.18925e-014 -9.54166e-015 +rhumerus -35.767 -5.4536 -82.3161 +rradius 21.7166 +rwrist -7.32229 +rhand -20.4915 16.9872 +rfingers 7.12502 +rthumb 5.86527 -12.9116 +lclavicle 3.18925e-014 -9.54166e-015 +lhumerus -30.1255 -2.13384 89.4016 +lradius 53.6665 +lwrist 28.1822 +lhand -22.8587 19.1669 +lfingers 7.12502 +lthumb 3.57952 49.1166 +rfemur -22.457 4.19501 18.2956 +rtibia 59.4949 +rfoot -11.8707 -15.3965 +rtoes -18.0326 +lfemur 0.0835221 -2.87429 -29.2569 +ltibia 27.9208 +lfoot -19.6473 9.53553 +ltoes -5.79001 +183 +root 10.0848 17.4011 1.07854 -5.75465 1.67745 2.14085 +lowerback 7.01858 -1.12518 -2.24952 +upperback 1.91576 -1.63821 0.743724 +thorax -1.87066 -0.813014 2.16762 +lowerneck -7.95784 7.37301 2.52469 +upperneck 5.69188 9.81355 -2.92989 +head 3.55288 4.80226 -0.838103 +rclavicle -1.27719e-014 -3.18055e-015 +rhumerus -36.63 -7.22316 -81.3193 +rradius 20.8772 +rwrist -6.1905 +rhand -20.406 17.0093 +rfingers 7.12502 +rthumb 5.94787 -12.8872 +lclavicle -1.27719e-014 -3.18055e-015 +lhumerus -29.8988 -2.94044 89.469 +lradius 55.4192 +lwrist 28.3088 +lhand -23.0388 19.4326 +lfingers 7.12502 +lthumb 3.40567 49.3851 +rfemur -22.5906 4.43415 17.9486 +rtibia 57.2801 +rfoot -12.4943 -14.9602 +rtoes -16.6037 +lfemur 1.33905 -3.12487 -29.5414 +ltibia 27.1043 +lfoot -19.492 9.26286 +ltoes -4.90083 +184 +root 10.0883 17.4056 1.25185 -5.54908 2.08022 2.67943 +lowerback 6.95361 -1.16735 -2.83822 +upperback 1.7799 -1.73731 0.662578 +thorax -1.95376 -0.858085 2.42325 +lowerneck -7.62824 7.25719 2.41984 +upperneck 5.45749 9.67296 -2.97486 +head 3.39979 4.73431 -0.861261 +rclavicle 4.93234e-015 5.1684e-015 +rhumerus -37.6143 -8.27407 -80.4279 +rradius 19.9703 +rwrist -5.48983 +rhand -20.5619 17.2479 +rfingers 7.12502 +rthumb 5.79733 -12.6528 +lclavicle 4.93234e-015 5.1684e-015 +lhumerus -29.7692 -3.58836 89.58 +lradius 56.8271 +lwrist 28.3756 +lhand -23.7656 18.708 +lfingers 7.12502 +lthumb 2.70371 48.6706 +rfemur -23.2785 4.886 17.0625 +rtibia 54.9371 +rfoot -12.9406 -14.6043 +rtoes -14.9983 +lfemur 2.27647 -3.46415 -30.2142 +ltibia 26.0469 +lfoot -19.4057 9.18692 +ltoes -4.38626 +185 +root 10.0898 17.4188 1.4221 -5.24269 2.43414 3.18871 +lowerback 6.72695 -1.20663 -3.457 +upperback 1.67524 -1.8277 0.619286 +thorax -1.91134 -0.900711 2.72878 +lowerneck -7.41849 7.17657 2.45892 +upperneck 5.35415 9.578 -3.18171 +head 3.33651 4.68339 -0.950314 +rclavicle 5.31749e-015 -9.14409e-015 +rhumerus -38.5058 -9.03299 -79.5981 +rradius 19.0653 +rwrist -4.88552 +rhand -20.7109 17.5736 +rfingers 7.12502 +rthumb 5.65346 -12.331 +lclavicle 5.31749e-015 -9.14409e-015 +lhumerus -29.458 -4.14477 89.7202 +lradius 57.9649 +lwrist 28.3371 +lhand -25.2061 15.9404 +lfingers 7.12502 +lthumb 1.3125 45.9161 +rfemur -24.0689 5.41455 16.1581 +rtibia 52.4319 +rfoot -12.7432 -14.5092 +rtoes -14.1154 +lfemur 3.16464 -3.66306 -30.8125 +ltibia 24.8952 +lfoot -19.0515 9.3065 +ltoes -6.3891 +186 +root 10.0912 17.4301 1.59136 -5.20611 2.79451 3.0296 +lowerback 6.73951 -1.3025 -3.4693 +upperback 1.77324 -1.95174 0.762748 +thorax -1.80263 -0.966288 2.89206 +lowerneck -7.60788 7.15527 2.66314 +upperneck 5.19908 9.53946 -3.44658 +head 3.34706 4.65733 -1.06845 +rclavicle -8.07563e-015 -2.38542e-015 +rhumerus -39.1527 -10.1847 -78.6098 +rradius 18.1711 +rwrist -3.82404 +rhand -20.6571 18.2242 +rfingers 7.12502 +rthumb 5.70545 -11.679 +lclavicle -8.07563e-015 -2.38542e-015 +lhumerus -28.9828 -4.47588 89.7798 +lradius 59.2393 +lwrist 28.3117 +lhand -25.6599 14.6423 +lfingers 7.12502 +lthumb 0.874221 44.6202 +rfemur -24.3461 5.93074 16.0526 +rtibia 49.6599 +rfoot -12.1599 -14.626 +rtoes -15.0928 +lfemur 4.31889 -3.68794 -30.6349 +ltibia 23.7708 +lfoot -18.7397 9.1729 +ltoes -7.639 +187 +root 10.0933 17.4382 1.76828 -5.16492 3.3025 2.94704 +lowerback 6.64087 -1.42625 -3.45192 +upperback 1.96023 -2.10823 0.799511 +thorax -1.54223 -1.05259 2.92498 +lowerneck -8.35294 7.11553 2.67885 +upperneck 5.39049 9.4694 -3.38156 +head 3.55163 4.61448 -1.02369 +rclavicle -2.63017e-014 2.10712e-014 +rhumerus -39.7191 -12.0734 -77.3468 +rradius 17.254 +rwrist -2.19435 +rhand -20.3428 19.3339 +rfingers 7.12502 +rthumb 6.00887 -10.5609 +lclavicle -2.63017e-014 2.10712e-014 +lhumerus -28.4821 -5.00863 89.7292 +lradius 60.6599 +lwrist 28.4794 +lhand -25.0704 15.9485 +lfingers 7.12502 +lthumb 1.44358 45.9233 +rfemur -24.391 6.26473 15.8287 +rtibia 46.7199 +rfoot -12.4357 -14.6536 +rtoes -16.7811 +lfemur 5.40281 -3.77291 -30.5199 +ltibia 22.7647 +lfoot -18.5779 8.86398 +ltoes -7.26462 +188 +root 10.0928 17.4419 1.94724 -4.91573 3.678 2.74526 +lowerback 6.34123 -1.50018 -3.19067 +upperback 1.98691 -2.17971 0.787792 +thorax -1.35338 -1.09232 2.76042 +lowerneck -8.84225 7.03162 2.57186 +upperneck 5.75569 9.35013 -3.13123 +head 3.74906 4.55445 -0.907392 +rclavicle 3.18055e-015 -6.75868e-015 +rhumerus -40.5812 -13.9216 -76.1555 +rradius 16.4113 +rwrist -0.743732 +rhand -20.2553 19.704 +rfingers 7.12502 +rthumb 6.0933 -10.1884 +lclavicle 3.18055e-015 -6.75868e-015 +lhumerus -28.1445 -5.7447 89.5919 +lradius 61.9088 +lwrist 28.6555 +lhand -24.9331 16.2837 +lfingers 7.12502 +lthumb 1.57617 46.2576 +rfemur -24.6096 6.6726 15.7351 +rtibia 43.6888 +rfoot -13.0931 -14.7031 +rtoes -16.9833 +lfemur 6.15861 -3.83079 -30.2261 +ltibia 21.9255 +lfoot -18.427 8.46738 +ltoes -6.93748 +189 +root 10.0949 17.4347 2.11868 -4.67406 3.95599 2.57844 +lowerback 6.35086 -1.54346 -2.9588 +upperback 1.80861 -2.22463 0.808361 +thorax -1.54774 -1.10868 2.65873 +lowerneck -8.70317 6.93445 2.43151 +upperneck 5.71348 9.21823 -2.89231 +head 3.67968 4.49836 -0.82027 +rclavicle 9.77772e-015 5.96354e-015 +rhumerus -41.7107 -14.6071 -75.3796 +rradius 15.6856 +rwrist -0.343016 +rhand -20.3656 18.9842 +rfingers 7.12502 +rthumb 5.98687 -10.9112 +lclavicle 9.77772e-015 5.96354e-015 +lhumerus -28.1164 -6.23218 89.531 +lradius 63.0381 +lwrist 28.9717 +lhand -25.3611 14.4828 +lfingers 7.12502 +lthumb 1.16283 44.4594 +rfemur -24.8106 6.97475 15.6475 +rtibia 40.6521 +rfoot -13.3669 -14.4581 +rtoes -16.9804 +lfemur 6.87519 -3.8771 -29.9941 +ltibia 21.2005 +lfoot -18.3346 8.0387 +ltoes -6.73386 +190 +root 10.097 17.4355 2.2918 -4.70342 4.32419 2.68321 +lowerback 6.56599 -1.60075 -3.09372 +upperback 1.7885 -2.31568 0.825448 +thorax -1.67577 -1.15124 2.76678 +lowerneck -8.64872 6.80608 2.24753 +upperneck 5.51001 9.05469 -2.79125 +head 3.57592 4.41991 -0.772604 +rclavicle -3.76448e-015 4.77083e-015 +rhumerus -42.6358 -15.1007 -74.5448 +rradius 14.9664 +rwrist 0.265644 +rhand -20.5412 17.764 +rfingers 7.12502 +rthumb 5.81728 -12.1361 +lclavicle -3.76448e-015 4.77083e-015 +lhumerus -28.0753 -6.59044 89.5586 +lradius 64.2644 +lwrist 29.4202 +lhand -25.8383 13.481 +lfingers 7.12502 +lthumb 0.70196 43.4596 +rfemur -24.6562 7.15557 15.3282 +rtibia 37.7105 +rfoot -13.6659 -13.9615 +rtoes -17.4241 +lfemur 7.92795 -4.06166 -30.1128 +ltibia 20.4634 +lfoot -18.3843 7.73783 +ltoes -5.34281 +191 +root 10.0891 17.4442 2.4758 -4.79695 4.60835 2.42393 +lowerback 6.52642 -1.66949 -3.04166 +upperback 1.95312 -2.39701 1.00965 +thorax -1.47239 -1.19839 2.92829 +lowerneck -8.88342 6.70308 2.10892 +upperneck 5.41928 8.93758 -2.92939 +head 3.58675 4.3512 -0.794913 +rclavicle -1.78906e-015 -9.14409e-015 +rhumerus -43.4924 -16.5184 -73.0486 +rradius 14.3401 +rwrist 2.22915 +rhand -20.7644 16.5008 +rfingers 7.12502 +rthumb 5.60178 -13.4051 +lclavicle -1.78906e-015 -9.14409e-015 +lhumerus -27.7506 -6.99228 89.5493 +lradius 65.3578 +lwrist 29.6913 +lhand -26.1197 13.988 +lfingers 7.12502 +lthumb 0.430092 43.9673 +rfemur -24.4946 7.78357 15.436 +rtibia 34.942 +rfoot -14.412 -14.1787 +rtoes -17.3105 +lfemur 9.11973 -4.17769 -29.7614 +ltibia 19.5586 +lfoot -18.4552 7.4522 +ltoes -4.19091 +192 +root 10.0813 17.4377 2.66226 -4.72269 4.98026 2.27728 +lowerback 6.33851 -1.77726 -3.05938 +upperback 2.03811 -2.53305 1.1413 +thorax -1.26347 -1.27202 3.0741 +lowerneck -8.73641 6.58097 2.01013 +upperneck 4.93025 8.7932 -3.19019 +head 3.3931 4.27315 -0.885642 +rclavicle -1.4884e-014 5.96354e-015 +rhumerus -44.597 -18.2181 -71.271 +rradius 13.8231 +rwrist 4.50226 +rhand -20.6752 15.6691 +rfingers 7.12502 +rthumb 5.68798 -14.2345 +lclavicle -1.4884e-014 5.96354e-015 +lhumerus -27.4201 -7.37274 89.5245 +lradius 66.2729 +lwrist 29.6255 +lhand -26.1939 14.3467 +lfingers 7.12502 +lthumb 0.358509 44.3261 +rfemur -24.5821 8.28945 15.3979 +rtibia 32.4076 +rfoot -15.2061 -14.8275 +rtoes -18.0119 +lfemur 10.2446 -4.20429 -29.4837 +ltibia 18.4045 +lfoot -18.2237 7.13053 +ltoes -4.58802 +193 +root 10.0865 17.4283 2.8431 -4.50019 5.38768 2.48385 +lowerback 6.1119 -1.91905 -3.22031 +upperback 2.00372 -2.72643 1.0753 +thorax -1.15386 -1.37043 3.10024 +lowerneck -8.83596 6.55746 1.82495 +upperneck 4.93772 8.77197 -3.05551 +head 3.39601 4.26317 -0.808309 +rclavicle -3.03147e-014 4.37326e-015 +rhumerus -45.8195 -19.6857 -69.7064 +rradius 13.3852 +rwrist 6.29719 +rhand -20.4638 15.4729 +rfingers 7.12502 +rthumb 5.89207 -14.4252 +lclavicle -3.03147e-014 4.37326e-015 +lhumerus -27.3895 -7.5149 89.4203 +lradius 67.2585 +lwrist 29.209 +lhand -26.3327 14.0716 +lfingers 7.12502 +lthumb 0.224423 44.0512 +rfemur -24.8637 8.04692 15.0399 +rtibia 30.172 +rfoot -15.7538 -15.031 +rtoes -19.6248 +lfemur 11.308 -4.28736 -29.6616 +ltibia 17.0965 +lfoot -17.7118 6.87614 +ltoes -4.94562 +194 +root 10.0983 17.4349 3.02221 -4.27789 5.63148 2.56801 +lowerback 5.98406 -2.04669 -3.19249 +upperback 1.90642 -2.89296 1.0099 +thorax -1.17516 -1.45156 3.02447 +lowerneck -9.56845 6.64125 1.7356 +upperneck 5.73124 8.88445 -2.73469 +head 3.79636 4.31431 -0.641498 +rclavicle -2.26366e-014 4.37326e-015 +rhumerus -46.8925 -20.4749 -68.6714 +rradius 12.9455 +rwrist 7.3341 +rhand -20.2568 15.5141 +rfingers 7.12502 +rthumb 6.09191 -14.3783 +lclavicle -2.26366e-014 4.37326e-015 +lhumerus -27.4525 -7.52317 89.2087 +lradius 68.113 +lwrist 28.9264 +lhand -26.3773 13.8674 +lfingers 7.12502 +lthumb 0.181297 43.8471 +rfemur -25.2096 7.13068 15.0193 +rtibia 28.3198 +rfoot -16.3312 -14.5452 +rtoes -19.9964 +lfemur 12.4857 -4.3216 -29.7372 +ltibia 15.5811 +lfoot -17.1239 6.66143 +ltoes -5.32156 +195 +root 10.107 17.4356 3.20308 -4.19651 5.85077 2.55584 +lowerback 6.07136 -2.14958 -3.10038 +upperback 1.78722 -3.02804 1.02098 +thorax -1.34074 -1.51395 3.00009 +lowerneck -9.78995 6.55636 1.78275 +upperneck 6.03429 8.7754 -2.78191 +head 3.9507 4.25373 -0.659268 +rclavicle 4.24902e-015 2.22639e-014 +rhumerus -47.8843 -20.815 -67.7788 +rradius 12.4392 +rwrist 8.08912 +rhand -20.0166 15.3512 +rfingers 7.12502 +rthumb 6.32382 -14.5344 +lclavicle 4.24902e-015 2.22639e-014 +lhumerus -27.5261 -7.51925 89.1077 +lradius 68.7537 +lwrist 28.7689 +lhand -26.165 13.8918 +lfingers 7.12502 +lthumb 0.386383 43.8712 +rfemur -25.494 5.91603 15.2738 +rtibia 26.8185 +rfoot -16.6016 -13.5631 +rtoes -18.9168 +lfemur 13.8042 -4.19725 -29.6588 +ltibia 14.0372 +lfoot -16.5107 6.42198 +ltoes -6.83292 +196 +root 10.1088 17.436 3.39427 -4.19763 6.05413 2.53738 +lowerback 6.04369 -2.18609 -3.06635 +upperback 1.77787 -3.07287 1.07745 +thorax -1.33034 -1.53656 3.04103 +lowerneck -9.71211 6.4096 1.64341 +upperneck 5.92262 8.5963 -2.79971 +head 3.88448 4.16315 -0.65857 +rclavicle -1.72197e-014 8.34896e-015 +rhumerus -49.0207 -21.4953 -66.5675 +rradius 12.1541 +rwrist 9.07982 +rhand -19.7969 15.0297 +rfingers 7.12502 +rthumb 6.53588 -14.8494 +lclavicle -1.72197e-014 8.34896e-015 +lhumerus -27.5783 -7.68052 89.1772 +lradius 69.312 +lwrist 28.6142 +lhand -26.2036 13.4507 +lfingers 7.12502 +lthumb 0.349123 43.4302 +rfemur -25.6478 4.7972 15.6163 +rtibia 25.5585 +rfoot -16.7375 -12.412 +rtoes -17.5344 +lfemur 15.1374 -4.02179 -29.5398 +ltibia 12.6414 +lfoot -15.8826 6.26357 +ltoes -8.57475 +197 +root 10.1053 17.4319 3.59304 -4.10831 6.19729 2.53725 +lowerback 5.73658 -2.14338 -3.04467 +upperback 1.88945 -3.00487 1.09063 +thorax -1.04996 -1.50973 3.02063 +lowerneck -10.0001 6.29319 1.48867 +upperneck 5.86249 8.44472 -2.67495 +head 3.9008 4.08777 -0.592857 +rclavicle 2.29596e-014 3.18055e-015 +rhumerus -50.1229 -22.491 -65.3174 +rradius 11.9476 +rwrist 10.2177 +rhand -19.3883 14.7046 +rfingers 7.12502 +rthumb 6.93028 -15.162 +lclavicle 2.29596e-014 3.18055e-015 +lhumerus -27.3598 -8.15817 89.2482 +lradius 69.651 +lwrist 28.6757 +lhand -26.3832 12.7948 +lfingers 7.12502 +lthumb 0.175612 42.7745 +rfemur -25.877 3.60134 16.0734 +rtibia 24.5641 +rfoot -16.8868 -11.6501 +rtoes -17.9172 +lfemur 16.3531 -3.97147 -29.4723 +ltibia 11.4674 +lfoot -15.4184 6.3231 +ltoes -9.89646 +198 +root 10.1055 17.4131 3.7806 -4.0362 6.46454 2.66236 +lowerback 5.65499 -2.18374 -3.08912 +upperback 1.95355 -3.05866 1.04903 +thorax -0.934448 -1.53969 3.00003 +lowerneck -10.3715 6.15153 1.41831 +upperneck 5.8547 8.26534 -2.72916 +head 3.96678 3.99082 -0.598993 +rclavicle -3.67752e-015 1.19271e-014 +rhumerus -51.0917 -23.3531 -64.1216 +rradius 11.6039 +rwrist 11.4726 +rhand -19.1611 14.6291 +rfingers 7.12502 +rthumb 7.14965 -15.2301 +lclavicle -3.67752e-015 1.19271e-014 +lhumerus -27.1979 -8.29153 89.2465 +lradius 70.0848 +lwrist 28.6492 +lhand -26.2046 12.8585 +lfingers 7.12502 +lthumb 0.348141 42.8379 +rfemur -26.1566 1.89862 16.5276 +rtibia 23.7966 +rfoot -16.8429 -11.0242 +rtoes -21.0003 +lfemur 17.4906 -3.9508 -29.517 +ltibia 10.535 +lfoot -15.0864 6.11624 +ltoes -10.4234 +199 +root 10.1057 17.3942 3.96558 -4.11219 6.84933 2.6731 +lowerback 5.82842 -2.3366 -3.07643 +upperback 1.98726 -3.26542 1.08286 +thorax -0.979526 -1.64266 3.04689 +lowerneck -10.4684 6.03127 1.34557 +upperneck 5.6951 8.12687 -2.93738 +head 3.93356 3.9115 -0.664536 +rclavicle -5.44173e-015 7.15625e-015 +rhumerus -52.0329 -24.1531 -62.7277 +rradius 11.236 +rwrist 12.8897 +rhand -19.1381 15.2838 +rfingers 7.12502 +rthumb 7.17185 -14.5747 +lclavicle -5.44173e-015 7.15625e-015 +lhumerus -27.3052 -8.10292 89.2155 +lradius 70.6645 +lwrist 28.5245 +lhand -26.2487 13.2766 +lfingers 7.12502 +lthumb 0.305514 43.2561 +rfemur -26.2972 0.174403 17.062 +rtibia 23.308 +rfoot -16.8842 -10.122 +rtoes -21.2073 +lfemur 18.622 -4.27716 -29.5075 +ltibia 9.80395 +lfoot -14.6651 5.98331 +ltoes -10.835 +200 +root 10.0943 17.3797 4.15853 -4.0308 7.0624 2.6887 +lowerback 5.78828 -2.40443 -3.25803 +upperback 1.96137 -3.36377 1.17329 +thorax -0.960129 -1.69276 3.24601 +lowerneck -10.4075 5.93055 1.38119 +upperneck 5.47699 8.00704 -3.24597 +head 3.85976 3.84199 -0.786322 +rclavicle 1.66482e-015 4.77083e-015 +rhumerus -52.8212 -24.672 -61.5903 +rradius 10.8675 +rwrist 13.8946 +rhand -18.6125 16.0455 +rfingers 7.12502 +rthumb 7.67921 -13.795 +lclavicle 1.66482e-015 4.77083e-015 +lhumerus -27.5643 -8.05524 89.3121 +lradius 71.1289 +lwrist 28.5966 +lhand -26.4832 13.5273 +lfingers 7.12502 +lthumb 0.0790309 43.507 +rfemur -26.5968 -0.526344 17.3992 +rtibia 23.1711 +rfoot -16.8617 -10.0008 +rtoes -23.7833 +lfemur 19.5686 -4.4678 -29.4591 +ltibia 9.0468 +lfoot -14.0041 5.92728 +ltoes -11.8718 +201 +root 10.0775 17.3584 4.35258 -3.81365 7.08415 2.93185 +lowerback 5.66647 -2.3809 -3.7224 +upperback 1.82697 -3.35567 1.20177 +thorax -1.00221 -1.68699 3.53289 +lowerneck -10.5746 5.85963 1.41073 +upperneck 5.63583 7.92861 -3.42893 +head 3.959 3.79118 -0.850357 +rclavicle -2.07481e-014 1.59028e-015 +rhumerus -53.4409 -24.5835 -61.2506 +rradius 10.7863 +rwrist 13.9172 +rhand -17.2958 15.3365 +rfingers 7.12502 +rthumb 8.9499 -14.4536 +lclavicle -2.07481e-014 1.59028e-015 +lhumerus -28.0114 -7.99076 89.5281 +lradius 71.4898 +lwrist 28.7566 +lhand -26.4901 13.2712 +lfingers 7.12502 +lthumb 0.0723581 43.2509 +rfemur -26.937 -0.423683 17.3586 +rtibia 23.2115 +rfoot -16.6754 -10.3744 +rtoes -23.7431 +lfemur 20.2423 -4.47197 -29.6153 +ltibia 8.599 +lfoot -13.4583 5.87954 +ltoes -11.859 +202 +root 10.0672 17.3323 4.54881 -3.78205 7.01136 2.97546 +lowerback 5.63794 -2.38634 -3.84771 +upperback 1.74055 -3.36995 1.2101 +thorax -1.06623 -1.69146 3.61373 +lowerneck -10.8997 5.78041 1.54021 +upperneck 6.06979 7.82587 -3.51753 +head 4.18832 3.72941 -0.894805 +rclavicle 9.91439e-015 6.36111e-015 +rhumerus -54.369 -25.1294 -60.1529 +rradius 10.6888 +rwrist 15.0377 +rhand -18.0226 13.1766 +rfingers 7.12502 +rthumb 8.24852 -16.6424 +lclavicle 9.91439e-015 6.36111e-015 +lhumerus -28.4828 -7.87689 89.5794 +lradius 71.6451 +lwrist 28.7897 +lhand -26.5523 12.626 +lfingers 7.12502 +lthumb 0.0123447 42.6057 +rfemur -26.9282 -0.248435 17.5172 +rtibia 23.3474 +rfoot -16.1944 -10.5651 +rtoes -22.1604 +lfemur 20.9332 -4.36723 -29.5884 +ltibia 8.59962 +lfoot -13.2294 5.85805 +ltoes -11.7198 +203 +root 10.0596 17.3099 4.74696 -3.85535 6.86463 2.54804 +lowerback 5.5229 -2.43046 -3.43489 +upperback 1.81234 -3.39949 1.35003 +thorax -0.941591 -1.71008 3.52013 +lowerneck -11.2151 5.68667 1.50094 +upperneck 6.21086 7.71203 -3.55137 +head 4.29928 3.66455 -0.897195 +rclavicle -8.99501e-015 -5.56597e-015 +rhumerus -54.8409 -25.6204 -59.2451 +rradius 9.97023 +rwrist 16.4458 +rhand -18.8613 12.9578 +rfingers 7.12502 +rthumb 7.43907 -16.8914 +lclavicle -8.99501e-015 -5.56597e-015 +lhumerus -28.6875 -7.64054 89.5111 +lradius 71.626 +lwrist 28.6528 +lhand -26.4816 12.9792 +lfingers 7.12502 +lthumb 0.0805905 42.9589 +rfemur -26.8045 0.304282 18.0889 +rtibia 23.757 +rfoot -15.9508 -11.1231 +rtoes -20.6012 +lfemur 21.7224 -4.22002 -29.0741 +ltibia 8.56469 +lfoot -12.9621 5.81385 +ltoes -12.8762 +204 +root 10.0519 17.2914 4.94904 -3.91691 6.80318 2.1853 +lowerback 5.36778 -2.4713 -3.03143 +upperback 1.91338 -3.42605 1.46235 +thorax -0.76625 -1.72793 3.39992 +lowerneck -11.2992 5.59716 1.32857 +upperneck 5.91805 7.61115 -3.60761 +head 4.2018 3.61045 -0.894802 +rclavicle 1.1778e-014 9.54166e-015 +rhumerus -55.49 -26.1059 -58.2054 +rradius 10.1421 +rwrist 17.3017 +rhand -17.8685 12.5396 +rfingers 7.12502 +rthumb 8.39723 -17.2734 +lclavicle 1.1778e-014 9.54166e-015 +lhumerus -28.8206 -7.17885 89.4236 +lradius 71.429 +lwrist 27.7686 +lhand -25.8613 13.7077 +lfingers 7.12502 +lthumb 0.679663 43.6863 +rfemur -26.7014 1.23307 18.4074 +rtibia 24.526 +rfoot -16.9941 -11.6042 +rtoes -17.0387 +lfemur 22.3211 -4.1566 -28.6229 +ltibia 8.95943 +lfoot -12.8578 5.63437 +ltoes -14.3919 +205 +root 10.0478 17.2678 5.1589 -3.88108 6.90413 2.57332 +lowerback 5.25053 -2.51201 -3.38108 +upperback 1.86341 -3.49668 1.35359 +thorax -0.732098 -1.76405 3.4823 +lowerneck -11.1498 5.54162 1.26794 +upperneck 5.74823 7.54556 -3.66908 +head 4.10922 3.57791 -0.915934 +rclavicle 1.16041e-014 7.95139e-016 +rhumerus -55.9444 -26.1396 -57.9079 +rradius 10.1463 +rwrist 17.3542 +rhand -16.8436 13.551 +rfingers 7.12502 +rthumb 9.38623 -16.22 +lclavicle 1.16041e-014 7.95139e-016 +lhumerus -29.2883 -6.70301 89.3858 +lradius 71.152 +lwrist 26.6537 +lhand -25.4098 13.9559 +lfingers 7.12502 +lthumb 1.11575 43.9327 +rfemur -26.5673 1.79426 17.918 +rtibia 25.3841 +rfoot -17.7715 -11.6253 +rtoes -15.1594 +lfemur 22.6858 -4.17842 -28.9985 +ltibia 9.84189 +lfoot -12.8899 5.50879 +ltoes -15.6452 +206 +root 10.0404 17.2207 5.37282 -3.78659 6.92031 3.30551 +lowerback 5.06058 -2.56683 -4.17652 +upperback 1.7964 -3.60546 1.17894 +thorax -0.646867 -1.82153 3.74407 +lowerneck -11.0529 5.53672 1.24927 +upperneck 5.73683 7.547 -3.72616 +head 4.08796 3.5768 -0.934448 +rclavicle 2.1419e-014 -1.59028e-015 +rhumerus -56.1182 -26.1248 -57.8227 +rradius 9.78701 +rwrist 17.3408 +rhand -16.5843 15.734 +rfingers 7.12502 +rthumb 9.63641 -14.0256 +lclavicle 2.1419e-014 -1.59028e-015 +lhumerus -29.9248 -6.49367 89.4525 +lradius 71.0173 +lwrist 27.0722 +lhand -25.8948 14.2065 +lfingers 7.12502 +lthumb 0.647315 44.1853 +rfemur -26.4793 2.1208 17.2424 +rtibia 26.2687 +rfoot -16.9257 -11.9186 +rtoes -16.6304 +lfemur 22.9835 -4.09044 -29.725 +ltibia 10.6798 +lfoot -12.7768 5.45616 +ltoes -16.5446 +207 +root 10.0247 17.1999 5.58369 -3.84393 6.74625 3.32021 +lowerback 4.951 -2.59878 -4.2642 +upperback 1.79469 -3.64805 1.16873 +thorax -0.578527 -1.84491 3.77832 +lowerneck -11.2365 5.52977 1.3997 +upperneck 5.94018 7.54046 -3.91717 +head 4.21546 3.56225 -1.01812 +rclavicle -4.89507e-015 -5.56597e-015 +rhumerus -56.3193 -26.0626 -57.7626 +rradius 9.54288 +rwrist 17.3984 +rhand -18.5284 12.501 +rfingers 7.12502 +rthumb 7.76031 -17.3366 +lclavicle -4.89507e-015 -5.56597e-015 +lhumerus -30.605 -6.47911 89.5202 +lradius 70.9411 +lwrist 28.1727 +lhand -26.5995 13.8423 +lfingers 7.12502 +lthumb -0.0332311 43.822 +rfemur -26.2629 2.80353 17.4107 +rtibia 27.1831 +rfoot -15.5061 -12.6067 +rtoes -18.7386 +lfemur 23.2403 -3.77125 -29.565 +ltibia 11.6122 +lfoot -12.5959 5.29766 +ltoes -17.7637 +208 +root 10.0096 17.212 5.79258 -3.93915 6.61725 2.84293 +lowerback 4.94815 -2.61834 -3.80406 +upperback 1.74555 -3.65172 1.28121 +thorax -0.649541 -1.84294 3.63863 +lowerneck -11.4484 5.47201 1.47293 +upperneck 6.2112 7.46988 -3.99803 +head 4.36217 3.51824 -1.05543 +rclavicle 1.2424e-014 -7.15625e-015 +rhumerus -56.7131 -26.0466 -57.5406 +rradius 9.64545 +rwrist 17.4596 +rhand -18.4507 11.4981 +rfingers 7.12502 +rthumb 7.83538 -18.3367 +lclavicle 1.2424e-014 -7.15625e-015 +lhumerus -31.3157 -6.41907 89.6316 +lradius 70.6061 +lwrist 28.5012 +lhand -26.9775 13.1838 +lfingers 7.12502 +lthumb -0.398382 43.1632 +rfemur -26.0556 3.4737 18.0846 +rtibia 27.9382 +rfoot -14.0572 -13.371 +rtoes -17.7621 +lfemur 23.2775 -3.60364 -28.8867 +ltibia 12.9458 +lfoot -12.3078 5.22176 +ltoes -19.6886 +209 +root 9.99974 17.2109 6.00614 -4.01834 6.48897 2.36279 +lowerback 4.88774 -2.67082 -3.29861 +upperback 1.67537 -3.69507 1.40868 +thorax -0.708609 -1.86107 3.48821 +lowerneck -11.3473 5.42804 1.32296 +upperneck 6.17597 7.41932 -3.85795 +head 4.31256 3.49854 -0.988743 +rclavicle -1.05107e-014 -3.18055e-015 +rhumerus -57.054 -25.975 -57.3567 +rradius 9.9084 +rwrist 17.5477 +rhand -17.5635 12.0033 +rfingers 7.12502 +rthumb 8.69162 -17.7978 +lclavicle -1.05107e-014 -3.18055e-015 +lhumerus -31.8914 -6.04397 89.6849 +lradius 69.9808 +lwrist 28.4056 +lhand -26.9029 13.0997 +lfingers 7.12502 +lthumb -0.326281 43.0792 +rfemur -25.8874 4.04422 18.7188 +rtibia 28.4905 +rfoot -12.5592 -13.8201 +rtoes -17.7948 +lfemur 23.1973 -3.49039 -28.2391 +ltibia 14.5244 +lfoot -11.8955 5.13593 +ltoes -21.9749 +210 +root 9.99309 17.206 6.22041 -4.17929 6.2467 1.68079 +lowerback 4.81041 -2.73888 -2.56103 +upperback 1.66854 -3.74724 1.59816 +thorax -0.703726 -1.88572 3.26914 +lowerneck -11.1771 5.44079 1.1027 +upperneck 5.9946 7.44958 -3.72046 +head 4.19545 3.51981 -0.907984 +rclavicle -4.12478e-014 2.38542e-015 +rhumerus -57.0965 -25.9138 -57.3237 +rradius 9.96322 +rwrist 17.5327 +rhand -17.4004 12.2275 +rfingers 7.12502 +rthumb 8.84894 -17.567 +lclavicle -4.12478e-014 2.38542e-015 +lhumerus -32.3744 -5.47829 89.646 +lradius 69.2762 +lwrist 28.271 +lhand -26.6343 13.3575 +lfingers 7.12502 +lthumb -0.0669253 43.3372 +rfemur -25.5871 4.67526 19.5309 +rtibia 29.1795 +rfoot -11.5453 -13.6151 +rtoes -15.0299 +lfemur 23.0348 -3.20674 -27.3369 +ltibia 16.4802 +lfoot -11.6079 4.91429 +ltoes -23.2037 +211 +root 9.9901 17.198 6.43462 -4.4164 6.17057 1.04166 +lowerback 4.80181 -2.81755 -1.86228 +upperback 1.69754 -3.81734 1.78883 +thorax -0.697164 -1.91978 3.07662 +lowerneck -10.9863 5.44532 1.07891 +upperneck 5.80122 7.47135 -3.93413 +head 4.09839 3.5249 -0.980978 +rclavicle -1.94312e-014 6.36111e-015 +rhumerus -56.9748 -26.015 -57.2387 +rradius 9.77274 +rwrist 17.4073 +rhand -17.4651 12.9477 +rfingers 7.12502 +rthumb 8.78656 -16.8494 +lclavicle -1.94312e-014 6.36111e-015 +lhumerus -32.9174 -5.06068 89.7114 +lradius 68.5092 +lwrist 28.1061 +lhand -26.7687 13.1037 +lfingers 7.12502 +lthumb -0.196708 43.0834 +rfemur -25.249 4.91571 20.3263 +rtibia 30.1452 +rfoot -10.777 -13.2795 +rtoes -12.6795 +lfemur 22.8675 -3.01941 -26.4831 +ltibia 18.6059 +lfoot -11.2239 4.6434 +ltoes -23.283 +212 +root 9.98737 17.1679 6.64782 -4.58112 6.19278 0.629053 +lowerback 4.76199 -2.86681 -1.4102 +upperback 1.67571 -3.86003 1.9344 +thorax -0.714728 -1.93974 2.97434 +lowerneck -11.0212 5.37701 1.15497 +upperneck 5.89631 7.40299 -4.25992 +head 4.15869 3.47493 -1.10695 +rclavicle 4.20057e-014 -2.3059e-014 +rhumerus -56.947 -26.1676 -56.9887 +rradius 9.60629 +rwrist 17.4653 +rhand -17.0588 13.6354 +rfingers 7.12502 +rthumb 9.1786 -16.1448 +lclavicle 4.20057e-014 -2.3059e-014 +lhumerus -33.5684 -4.45125 89.8989 +lradius 67.6153 +lwrist 27.6658 +lhand -26.9894 12.1142 +lfingers 7.12502 +lthumb -0.409872 42.0936 +rfemur -25.144 4.93584 20.9082 +rtibia 31.3293 +rfoot -10.1246 -13.1653 +rtoes -10.9797 +lfemur 22.5248 -2.96225 -25.9014 +ltibia 20.902 +lfoot -10.7179 4.40845 +ltoes -23.0823 +213 +root 9.98518 17.1548 6.8608 -4.61239 6.05199 0.494722 +lowerback 4.6287 -2.8975 -1.21862 +upperback 1.62004 -3.89088 1.98848 +thorax -0.704916 -1.95441 2.91851 +lowerneck -11.2858 5.31278 1.19794 +upperneck 6.17864 7.33795 -4.41631 +head 4.32229 3.42741 -1.16317 +rclavicle -3.38804e-014 1.43125e-014 +rhumerus -56.7659 -26.3103 -56.9275 +rradius 9.4772 +rwrist 17.6174 +rhand -16.8968 13.4664 +rfingers 7.12502 +rthumb 9.33493 -16.307 +lclavicle -3.38804e-014 1.43125e-014 +lhumerus -34.1718 -3.59754 89.9831 +lradius 66.4483 +lwrist 26.9799 +lhand -26.8506 11.6995 +lfingers 7.12502 +lthumb -0.275792 41.6791 +rfemur -25.1514 5.03257 21.2098 +rtibia 32.581 +rfoot -9.96795 -12.9601 +rtoes -8.29427 +lfemur 21.9117 -2.75485 -25.6133 +ltibia 23.435 +lfoot -9.88021 4.226 +ltoes -24.0094 +214 +root 9.98338 17.1462 7.06803 -4.8201 5.82906 0.434852 +lowerback 4.71025 -2.91718 -1.13018 +upperback 1.62003 -3.91305 2.00713 +thorax -0.753713 -1.96474 2.89424 +lowerneck -11.3173 5.30504 1.26271 +upperneck 6.581 7.34882 -4.64023 +head 4.02677 3.4078 -1.12105 +rclavicle -6.41453e-014 1.11319e-014 +rhumerus -56.5466 -26.4477 -56.9693 +rradius 9.55259 +rwrist 17.8043 +rhand -17.0748 13.1461 +rfingers 7.12502 +rthumb 9.16312 -16.6348 +lclavicle -6.41453e-014 1.11319e-014 +lhumerus -34.6412 -3.03553 90.0274 +lradius 64.9897 +lwrist 26.3841 +lhand -26.7503 11.8826 +lfingers 7.12502 +lthumb -0.17895 41.8623 +rfemur -24.8314 5.01225 21.5262 +rtibia 33.7642 +rfoot -10.1158 -12.6359 +rtoes -7.12998 +lfemur 21.2841 -2.32488 -25.3068 +ltibia 26.2221 +lfoot -8.61898 3.80936 +ltoes -26.8509 +215 +root 9.9732 17.1441 7.26363 -5.0116 5.47277 0.183295 +lowerback 4.80833 -2.86306 -0.977765 +upperback 1.66783 -3.83334 2.09956 +thorax -0.767509 -1.92507 2.90464 +lowerneck -11.2572 5.28413 1.3977 +upperneck 6.45608 7.30992 -4.79895 +head 3.98886 3.38665 -1.19637 +rclavicle 1.55673e-014 -9.54166e-015 +rhumerus -56.3199 -26.6479 -56.9701 +rradius 9.74193 +rwrist 17.9679 +rhand -17.1203 13.2313 +rfingers 7.12502 +rthumb 9.11927 -16.5516 +lclavicle 1.55673e-014 -9.54166e-015 +lhumerus -35.0063 -2.51421 90.1088 +lradius 63.4691 +lwrist 25.9316 +lhand -26.3863 12.3686 +lfingers 7.12502 +lthumb 0.172638 42.3483 +rfemur -24.3923 5.18594 22.1223 +rtibia 34.7052 +rfoot -10.4108 -12.442 +rtoes -5.35884 +lfemur 20.5012 -1.68669 -24.6174 +ltibia 29.0356 +lfoot -7.09436 3.13917 +ltoes -28.4564 +216 +root 9.95721 17.1424 7.45042 -5.05458 4.96596 -0.471139 +lowerback 4.83057 -2.79104 -0.419305 +upperback 1.67795 -3.70903 2.28388 +thorax -0.799993 -1.86164 2.77748 +lowerneck -11.1971 5.26244 1.51267 +upperneck 5.87461 7.24208 -4.76693 +head 4.2256 3.37675 -1.34966 +rclavicle 6.79595e-015 -8.74653e-015 +rhumerus -55.8848 -26.9021 -57.075 +rradius 9.83684 +rwrist 17.992 +rhand -17.0433 13.2413 +rfingers 7.12502 +rthumb 9.19357 -16.5383 +lclavicle 6.79595e-015 -8.74653e-015 +lhumerus -35.3172 -1.84114 90.0626 +lradius 61.8614 +lwrist 25.6668 +lhand -25.1213 13.6003 +lfingers 7.12502 +lthumb 1.39445 43.5755 +rfemur -24.1245 5.76189 23.1218 +rtibia 35.5005 +rfoot -10.952 -12.2302 +rtoes -1.96068 +lfemur 19.373 -0.968443 -23.3922 +ltibia 31.9119 +lfoot -5.08286 2.63426 +ltoes -27.3346 +217 +root 9.94659 17.1418 7.63867 -5.15361 4.60442 -0.814365 +lowerback 5.03499 -2.73403 -0.0779966 +upperback 1.57284 -3.61101 2.37146 +thorax -1.04236 -1.80927 2.68729 +lowerneck -10.8808 5.19146 1.4096 +upperneck 5.59315 7.13637 -4.62201 +head 4.04488 3.33867 -1.29986 +rclavicle -1.93007e-014 2.38542e-015 +rhumerus -55.6719 -27.0297 -56.9809 +rradius 10.1332 +rwrist 18.1472 +rhand -16.7828 12.3891 +rfingers 7.12502 +rthumb 9.44489 -17.3792 +lclavicle -1.93007e-014 2.38542e-015 +lhumerus -35.8209 -1.25914 90.0496 +lradius 60.1079 +lwrist 25.5163 +lhand -23.8908 14.8023 +lfingers 7.12502 +lthumb 2.58278 44.7664 +rfemur -23.6554 6.30316 23.7311 +rtibia 36.1305 +rfoot -11.5586 -11.9097 +rtoes 1.10925 +lfemur 18.1638 -0.497838 -22.6068 +ltibia 34.8158 +lfoot -2.53712 2.52892 +ltoes -26.1154 +218 +root 9.94001 17.1429 7.83078 -5.23068 4.54283 -0.466264 +lowerback 5.15903 -2.69396 -0.44598 +upperback 1.46964 -3.57461 2.28237 +thorax -1.20236 -1.78903 2.8096 +lowerneck -10.4677 5.04614 1.2221 +upperneck 5.39063 6.94173 -4.41481 +head 3.86493 3.25744 -1.22253 +rclavicle -3.18118e-014 1.59028e-015 +rhumerus -54.6832 -25.8323 -58.8756 +rradius 10.4572 +rwrist 16.1933 +rhand -16.764 12.0959 +rfingers 7.12502 +rthumb 9.46305 -17.6717 +lclavicle -3.18118e-014 1.59028e-015 +lhumerus -36.3471 -0.639433 90.1238 +lradius 58.4061 +lwrist 25.2729 +lhand -23.278 16.19 +lfingers 7.12502 +lthumb 3.17467 46.1461 +rfemur -23.0816 6.52893 23.5652 +rtibia 36.6814 +rfoot -12.1541 -11.8495 +rtoes 3.29277 +lfemur 16.9778 -0.31511 -22.7114 +ltibia 37.6883 +lfoot 0.164408 2.60782 +ltoes -25.5754 +219 +root 9.92783 17.1484 8.01526 -5.35324 4.5878 -0.538405 +lowerback 5.24046 -2.72493 -0.516167 +upperback 1.54391 -3.61955 2.32006 +thorax -1.16216 -1.81262 2.89213 +lowerneck -10.4843 4.9232 1.03861 +upperneck 5.26901 6.78134 -4.23295 +head 3.80276 3.1841 -1.14136 +rclavicle -4.91992e-015 2.22639e-014 +rhumerus -53.8931 -25.8557 -59.5309 +rradius 10.6108 +rwrist 15.6487 +rhand -16.5166 13.2474 +rfingers 7.12502 +rthumb 9.70177 -16.5091 +lclavicle -4.91992e-015 2.22639e-014 +lhumerus -36.4952 0.0289172 90.1829 +lradius 56.6723 +lwrist 25.1363 +lhand -23.4889 17.0616 +lfingers 7.12502 +lthumb 2.97097 47.0206 +rfemur -22.5419 6.65737 23.8754 +rtibia 37.1956 +rfoot -12.628 -12.1566 +rtoes 4.00787 +lfemur 15.7478 -0.196776 -22.2935 +ltibia 40.6387 +lfoot 3.01707 2.41454 +ltoes -26.0916 +220 +root 9.90969 17.1577 8.18895 -5.48439 4.55644 -0.782186 +lowerback 5.44763 -2.75694 -0.492037 +upperback 1.62325 -3.65909 2.40681 +thorax -1.18953 -1.83294 2.97932 +lowerneck -10.5275 4.79735 1.00891 +upperneck 5.04967 6.60427 -4.19792 +head 3.72545 3.10026 -1.13753 +rclavicle -3.4601e-015 1.19271e-014 +rhumerus -53.1973 -26.6694 -59.4504 +rradius 10.7 +rwrist 16.0717 +rhand -16.3304 13.8998 +rfingers 7.12502 +rthumb 9.88144 -15.8483 +lclavicle -3.4601e-015 1.19271e-014 +lhumerus -36.5153 0.656937 90.204 +lradius 54.7392 +lwrist 25.2003 +lhand -23.943 16.6965 +lfingers 7.12502 +lthumb 2.53238 46.6612 +rfemur -21.9595 6.92595 24.4123 +rtibia 37.5939 +rfoot -12.9157 -12.4984 +rtoes 4.12546 +lfemur 14.2525 -0.0491049 -21.6676 +ltibia 43.8317 +lfoot 5.93292 2.25065 +ltoes -27.2647 +221 +root 9.8926 17.1688 8.35512 -5.39911 4.51423 -0.884461 +lowerback 5.53052 -2.73912 -0.478293 +upperback 1.57306 -3.63334 2.37924 +thorax -1.29139 -1.81848 2.94825 +lowerneck -10.3969 4.64306 1.006 +upperneck 4.85591 6.38187 -4.09984 +head 3.62046 2.9993 -1.12396 +rclavicle 2.43263e-014 4.77083e-015 +rhumerus -52.4038 -26.9367 -60.123 +rradius 10.8668 +rwrist 15.7571 +rhand -16.8201 13.9648 +rfingers 7.12502 +rthumb 9.40893 -15.8052 +lclavicle 2.43263e-014 4.77083e-015 +lhumerus -36.5425 1.07521 90.073 +lradius 52.71 +lwrist 25.2241 +lhand -23.7307 17.1325 +lfingers 7.12502 +lthumb 2.73748 47.0947 +rfemur -21.4091 7.17955 24.7744 +rtibia 37.7966 +rfoot -13.2262 -12.6472 +rtoes 4.51031 +lfemur 12.2682 0.188374 -21.1999 +ltibia 47.2541 +lfoot 8.77688 2.75062 +ltoes -25.8314 +222 +root 9.87862 17.1782 8.51422 -5.17471 4.56702 -1.47757 +lowerback 5.4514 -2.7468 0.142287 +upperback 1.51126 -3.60719 2.46475 +thorax -1.34532 -1.8046 2.68585 +lowerneck -10.4676 4.51846 0.591464 +upperneck 4.83362 6.22593 -3.53861 +head 3.58022 2.93801 -0.874466 +rclavicle 1.75303e-014 4.77083e-015 +rhumerus -51.18 -26.3112 -61.9495 +rradius 11.2299 +rwrist 13.899 +rhand -17.4738 14.3144 +rfingers 7.12502 +rthumb 8.7781 -15.483 +lclavicle 1.75303e-014 4.77083e-015 +lhumerus -36.3218 1.41737 89.9127 +lradius 50.462 +lwrist 25.0388 +lhand -22.9093 18.8873 +lfingers 7.12502 +lthumb 3.53067 48.8378 +rfemur -21.0424 7.29563 25.5982 +rtibia 37.8235 +rfoot -13.6851 -12.8163 +rtoes 4.57827 +lfemur 9.96988 0.426035 -20.1324 +ltibia 50.7457 +lfoot 11.6506 3.69306 +ltoes -22.795 +223 +root 9.86544 17.186 8.67259 -5.06284 4.63777 -1.86826 +lowerback 5.51741 -2.73429 0.458588 +upperback 1.4816 -3.56906 2.56068 +thorax -1.42748 -1.78504 2.61053 +lowerneck -10.4482 4.36803 0.0812146 +upperneck 4.71539 6.04558 -2.97268 +head 3.48749 2.86548 -0.612526 +rclavicle -2.13507e-014 2.22639e-014 +rhumerus -50.0115 -25.8466 -63.4839 +rradius 11.6648 +rwrist 12.158 +rhand -17.8581 14.9722 +rfingers 7.12502 +rthumb 8.40727 -14.8404 +lclavicle -2.13507e-014 2.22639e-014 +lhumerus -36.06 1.96169 89.8326 +lradius 48.049 +lwrist 24.7282 +lhand -22.0652 20.1378 +lfingers 7.12502 +lthumb 4.34576 50.0732 +rfemur -20.5561 7.33172 26.2072 +rtibia 37.742 +rfoot -14.2439 -13.0073 +rtoes 3.96682 +lfemur 7.84591 0.485352 -19.4372 +ltibia 54.0809 +lfoot 14.3717 5.331 +ltoes -19.0076 +224 +root 9.85754 17.2027 8.83393 -5.08564 4.69537 -1.78823 +lowerback 5.71365 -2.73642 0.296633 +upperback 1.49616 -3.57873 2.49332 +thorax -1.51577 -1.78902 2.64277 +lowerneck -10.4835 4.23325 0.209718 +upperneck 4.66586 5.84875 -3.00277 +head 3.47982 2.76956 -0.657289 +rclavicle -5.14107e-014 2.38542e-014 +rhumerus -48.8678 -25.5389 -64.8316 +rradius 12.0853 +rwrist 10.8669 +rhand -18.1649 15.308 +rfingers 7.12502 +rthumb 8.11114 -14.5163 +lclavicle -5.14107e-014 2.38542e-014 +lhumerus -35.895 2.62235 89.5967 +lradius 45.6955 +lwrist 24.5213 +lhand -21.8539 20.3111 +lfingers 7.12502 +lthumb 4.54987 50.2423 +rfemur -19.7812 7.1834 26.3107 +rtibia 37.5762 +rfoot -14.6131 -12.9996 +rtoes 3.42551 +lfemur 5.96296 0.481092 -19.4639 +ltibia 57.1392 +lfoot 16.4822 7.55736 +ltoes -16.9863 +225 +root 9.85933 17.2256 8.99532 -5.08741 4.74792 -1.73697 +lowerback 5.84201 -2.77687 0.31635 +upperback 1.52297 -3.63143 2.3856 +thorax -1.56566 -1.81492 2.53075 +lowerneck -10.6695 4.14468 0.543693 +upperneck 4.72488 5.70511 -3.23529 +head 3.55581 2.69195 -0.797387 +rclavicle -3.34207e-014 7.95139e-015 +rhumerus -47.5669 -24.9868 -66.3912 +rradius 12.5633 +rwrist 9.57472 +rhand -18.4883 15.1604 +rfingers 7.12502 +rthumb 7.7991 -14.6757 +lclavicle -3.34207e-014 7.95139e-015 +lhumerus -35.6858 3.31728 89.305 +lradius 43.3664 +lwrist 24.4242 +lhand -21.7562 20.3189 +lfingers 7.12502 +lthumb 4.64414 50.248 +rfemur -19.0938 6.86167 26.361 +rtibia 37.4403 +rfoot -14.9865 -12.6811 +rtoes 4.5129 +lfemur 4.09315 0.623042 -19.512 +ltibia 59.8979 +lfoot 17.803 9.45588 +ltoes -19.0971 +226 +root 9.85923 17.2476 9.15472 -4.99704 4.6538 -1.87823 +lowerback 5.83682 -2.69411 0.592372 +upperback 1.55663 -3.50612 2.3411 +thorax -1.55264 -1.75272 2.32107 +lowerneck -10.7562 3.99448 0.276761 +upperneck 4.65385 5.51644 -2.94116 +head 3.52313 2.60637 -0.664954 +rclavicle -5.51627e-015 1.59028e-015 +rhumerus -46.209 -24.2003 -68.1568 +rradius 13.2402 +rwrist 7.84364 +rhand -18.845 14.9796 +rfingers 7.12502 +rthumb 7.45481 -14.869 +lclavicle -5.51627e-015 1.59028e-015 +lhumerus -35.3992 3.95276 89.1435 +lradius 41.0376 +lwrist 24.1857 +lhand -21.3398 20.4447 +lfingers 7.12502 +lthumb 5.04626 50.3646 +rfemur -18.5833 6.62877 26.608 +rtibia 37.3234 +rfoot -15.5996 -12.206 +rtoes 6.38638 +lfemur 2.14921 0.978866 -19.2695 +ltibia 62.4197 +lfoot 17.7528 11.4921 +ltoes -18.8023 +227 +root 9.85615 17.2658 9.31441 -4.84158 4.48484 -1.87848 +lowerback 5.72159 -2.4911 0.771239 +upperback 1.59088 -3.23058 2.21814 +thorax -1.47995 -1.61546 2.06894 +lowerneck -10.8096 3.7414 -0.169868 +upperneck 4.53005 5.19613 -2.40473 +head 3.45097 2.46402 -0.431487 +rclavicle -2.34939e-014 5.00937e-014 +rhumerus -44.8796 -23.5806 -69.8249 +rradius 13.7784 +rwrist 6.00045 +rhand -19.3399 15.3988 +rfingers 7.12502 +rthumb 6.977 -14.4663 +lclavicle -2.34939e-014 5.00937e-014 +lhumerus -35.0278 4.54064 88.8703 +lradius 38.5205 +lwrist 23.5306 +lhand -20.7749 20.5776 +lfingers 7.12502 +lthumb 5.59167 50.4838 +rfemur -18.0624 6.48617 26.7223 +rtibia 37.1183 +rfoot -16.1539 -11.8129 +rtoes 6.58374 +lfemur 0.234087 1.43617 -19.1951 +ltibia 64.6927 +lfoot 16.5516 13.6862 +ltoes -15.698 +228 +root 9.85684 17.2743 9.47115 -4.93064 4.18319 -1.96509 +lowerback 5.92226 -2.30764 1.03059 +upperback 1.59445 -2.96804 2.10728 +thorax -1.61479 -1.48396 1.80179 +lowerneck -10.7131 3.52254 -0.161686 +upperneck 4.44344 4.89073 -2.28704 +head 3.39483 2.32003 -0.416618 +rclavicle 2.79044e-014 -3.93594e-014 +rhumerus -43.6729 -23.0112 -71.2501 +rradius 14.0897 +rwrist 4.56857 +rhand -19.9038 16.1215 +rfingers 7.12502 +rthumb 6.43268 -13.7608 +lclavicle 2.79044e-014 -3.93594e-014 +lhumerus -34.7355 5.41749 88.3476 +lradius 35.8375 +lwrist 22.5879 +lhand -20.4052 20.4041 +lfingers 7.12502 +lthumb 5.94858 50.3005 +rfemur -17.2206 6.4143 26.9952 +rtibia 36.8696 +rfoot -16.5443 -11.5736 +rtoes 6.10065 +lfemur -1.32395 2.04599 -19.0979 +ltibia 66.6578 +lfoot 15.2501 15.1289 +ltoes -15.946 +229 +root 9.85794 17.2835 9.62576 -5.29577 3.69068 -2.68294 +lowerback 6.3443 -2.19142 1.81317 +upperback 1.69504 -2.75132 2.24374 +thorax -1.78092 -1.37692 1.50555 +lowerneck -10.5239 3.43274 -0.0329039 +upperneck 4.32319 4.75698 -2.40083 +head 3.32222 2.25429 -0.489358 +rclavicle -8.49804e-015 -3.57812e-015 +rhumerus -42.4162 -22.3785 -72.5326 +rradius 14.5222 +rwrist 3.53718 +rhand -20.5608 16.8832 +rfingers 7.12502 +rthumb 5.79836 -13.0175 +lclavicle -8.49804e-015 -3.57812e-015 +lhumerus -34.4522 6.77127 87.7248 +lradius 33.2998 +lwrist 21.5637 +lhand -19.8403 20.1654 +lfingers 7.12502 +lthumb 6.49399 50.0459 +rfemur -16.1214 6.44587 28.0225 +rtibia 36.6277 +rfoot -16.7473 -11.4547 +rtoes 6.04436 +lfemur -2.57717 2.74777 -18.253 +ltibia 68.3481 +lfoot 13.8524 15.9822 +ltoes -17.1924 +230 +root 9.86324 17.3098 9.79894 -5.61433 3.42864 -2.78359 +lowerback 6.42754 -2.10142 1.97216 +upperback 1.93581 -2.62571 2.22324 +thorax -1.58871 -1.31369 1.38305 +lowerneck -10.3538 3.2985 -0.0525779 +upperneck 4.02389 4.57742 -2.48992 +head 3.18539 2.16616 -0.531402 +rclavicle 2.94201e-014 1.98785e-015 +rhumerus -41.0466 -21.7811 -73.7667 +rradius 15.201 +rwrist 2.64973 +rhand -21.2138 17.3072 +rfingers 7.12502 +rthumb 5.16794 -12.6098 +lclavicle 2.94201e-014 1.98785e-015 +lhumerus -34.0802 8.41533 87.0504 +lradius 30.842 +lwrist 20.2308 +lhand -18.9292 20.6183 +lfingers 7.12502 +lthumb 7.37351 50.4698 +rfemur -14.951 6.22602 28.2947 +rtibia 36.4049 +rfoot -17.0552 -11.1826 +rtoes 5.38642 +lfemur -3.59424 2.99658 -18.2149 +ltibia 69.6288 +lfoot 11.5483 17.4714 +ltoes -14.3466 +231 +root 9.87629 17.3364 9.97629 -5.89285 3.43013 -2.16325 +lowerback 6.48466 -2.04675 1.51038 +upperback 2.13517 -2.59096 1.96107 +thorax -1.40752 -1.29565 1.36578 +lowerneck -10.0913 3.15206 -0.182009 +upperneck 3.66714 4.37905 -2.36802 +head 3.00227 2.07695 -0.487902 +rclavicle 4.72114e-016 3.18055e-015 +rhumerus -39.6598 -20.6888 -75.226 +rradius 15.9837 +rwrist 1.53867 +rhand -21.3521 16.372 +rfingers 7.12502 +rthumb 5.03436 -13.5482 +lclavicle 4.72114e-016 3.18055e-015 +lhumerus -33.9151 10.1796 86.26 +lradius 28.4761 +lwrist 18.6189 +lhand -18.5823 21.0906 +lfingers 7.12502 +lthumb 7.70835 50.9301 +rfemur -13.7274 5.75231 27.6766 +rtibia 36.1922 +rfoot -17.5743 -10.7271 +rtoes 5.75643 +lfemur -4.43638 2.93826 -19.1361 +ltibia 70.5421 +lfoot 8.98491 18.844 +ltoes -11.7978 +232 +root 9.88577 17.3529 10.1341 -6.01614 3.20763 -1.91809 +lowerback 6.5733 -1.9746 1.45987 +upperback 2.22076 -2.50147 1.74912 +thorax -1.37716 -1.25041 1.17071 +lowerneck -9.93147 3.12858 -0.303779 +upperneck 3.66527 4.33713 -1.98687 +head 2.95653 2.07053 -0.348235 +rclavicle -1.19892e-014 -1.19271e-014 +rhumerus -38.1282 -19.2158 -76.9369 +rradius 16.3947 +rwrist 0.14577 +rhand -21.5746 15.9334 +rfingers 7.12502 +rthumb 4.81954 -13.9918 +lclavicle -1.19892e-014 -1.19271e-014 +lhumerus -34.0863 11.8923 85.3038 +lradius 26.6008 +lwrist 17.2983 +lhand -19.2262 20.5406 +lfingers 7.12502 +lthumb 7.0868 50.4019 +rfemur -12.7935 5.56706 27.5013 +rtibia 35.9814 +rfoot -17.8822 -10.4443 +rtoes 5.42072 +lfemur -5.62561 3.12573 -19.5607 +ltibia 71.3214 +lfoot 6.95945 19.2991 +ltoes -12.0293 +233 +root 9.8852 17.3697 10.291 -6.0066 2.7065 -1.86147 +lowerback 6.52646 -1.79623 1.50351 +upperback 2.26098 -2.26649 1.59354 +thorax -1.3199 -1.13252 0.965828 +lowerneck -9.83671 3.04133 -0.263167 +upperneck 3.77479 4.20781 -1.84009 +head 2.97205 2.0123 -0.315753 +rclavicle 9.41742e-015 0 +rhumerus -36.6716 -17.8889 -78.5167 +rradius 16.6839 +rwrist -1.2513 +rhand -21.9626 16.7242 +rfingers 7.12502 +rthumb 4.44486 -13.2091 +lclavicle 9.41742e-015 0 +lhumerus -34.3777 13.5289 84.2503 +lradius 24.9796 +lwrist 16.2112 +lhand -19.8084 20.3808 +lfingers 7.12502 +lthumb 6.5248 50.2603 +rfemur -11.9854 5.81226 27.6044 +rtibia 35.6997 +rfoot -18.1336 -10.3358 +rtoes 3.19289 +lfemur -7.06728 3.47605 -19.6335 +ltibia 72.0101 +lfoot 4.69798 19.4695 +ltoes -9.91312 +234 +root 9.8828 17.3884 10.4495 -6.04811 2.19566 -1.72996 +lowerback 6.67418 -1.59182 1.34312 +upperback 2.22572 -2.00159 1.52559 +thorax -1.43665 -1.00068 0.970968 +lowerneck -9.7681 2.87461 -0.383385 +upperneck 3.83827 3.99641 -1.76483 +head 2.97427 1.90816 -0.283038 +rclavicle 6.92019e-015 -9.14409e-015 +rhumerus -35.5494 -16.6186 -79.7072 +rradius 17.4303 +rwrist -2.09701 +rhand -21.8609 16.5094 +rfingers 7.12502 +rthumb 4.54311 -13.4219 +lclavicle 6.92019e-015 -9.14409e-015 +lhumerus -34.8863 15.4915 83.0593 +lradius 23.368 +lwrist 14.6562 +lhand -19.2495 21.474 +lfingers 7.12502 +lthumb 7.06434 51.3362 +rfemur -11.0593 6.18899 27.6193 +rtibia 35.2134 +rfoot -18.2974 -10.2423 +rtoes 1.63632 +lfemur -8.40543 3.7257 -19.7888 +ltibia 72.5607 +lfoot 2.96064 19.2336 +ltoes -7.62534 +235 +root 9.88549 17.4056 10.604 -6.10542 1.69102 -1.42969 +lowerback 6.87271 -1.42531 1.0232 +upperback 2.21051 -1.79907 1.39751 +thorax -1.55828 -0.899838 1.00853 +lowerneck -9.90843 2.86996 -0.543723 +upperneck 4.11203 3.99662 -1.45326 +head 3.08354 1.91441 -0.149515 +rclavicle 3.08054e-014 -1.31198e-014 +rhumerus -34.3523 -15.185 -80.908 +rradius 18.2262 +rwrist -2.57467 +rhand -21.8667 15.7446 +rfingers 7.12502 +rthumb 4.53744 -14.1868 +lclavicle 3.08054e-014 -1.31198e-014 +lhumerus -35.5541 17.3932 81.7944 +lradius 21.9044 +lwrist 13.3571 +lhand -19.3315 21.8087 +lfingers 7.12502 +lthumb 6.98514 51.6734 +rfemur -10.0564 6.4145 27.4327 +rtibia 34.4853 +rfoot -18.2501 -10.1221 +rtoes 0.1649 +lfemur -9.69327 3.84786 -20.2273 +ltibia 72.9653 +lfoot 2.21272 18.3858 +ltoes -10.217 +236 +root 9.88979 17.4216 10.7638 -6.03146 1.06911 -1.75819 +lowerback 6.77887 -1.28768 1.40425 +upperback 2.19955 -1.59257 1.40291 +thorax -1.52948 -0.79654 0.781684 +lowerneck -9.79833 2.98737 -0.377849 +upperneck 4.26841 4.13353 -1.44385 +head 3.12079 1.98485 -0.167848 +rclavicle 2.41648e-015 -4.77083e-015 +rhumerus -33.0432 -13.5188 -82.1898 +rradius 18.8169 +rwrist -3.47385 +rhand -22.1585 15.3561 +rfingers 7.12502 +rthumb 4.25572 -14.5811 +lclavicle 2.41648e-015 -4.77083e-015 +lhumerus -36.0823 18.8972 80.6965 +lradius 20.3122 +lwrist 12.6561 +lhand -20.9123 21.0184 +lfingers 7.12502 +lthumb 5.45905 50.9281 +rfemur -9.17893 6.61474 27.9279 +rtibia 33.7003 +rfoot -18.354 -9.90625 +rtoes 0.325527 +lfemur -11.1762 4.00777 -19.8962 +ltibia 73.2759 +lfoot 1.35958 17.1376 +ltoes -13.4907 +237 +root 9.8914 17.4413 10.9242 -5.82437 0.379266 -3.09072 +lowerback 6.65007 -1.14973 2.86414 +upperback 2.05166 -1.30715 1.7179 +thorax -1.63496 -0.655361 0.264711 +lowerneck -9.10666 2.94925 -0.516845 +upperneck 4.05811 4.09089 -1.45964 +head 2.91327 1.96661 -0.165054 +rclavicle -5.24295e-015 9.14409e-015 +rhumerus -31.9934 -11.9422 -83.1877 +rradius 19.5267 +rwrist -4.45462 +rhand -22.3239 14.904 +rfingers 7.12502 +rthumb 4.09597 -15.0363 +lclavicle -5.24295e-015 9.14409e-015 +lhumerus -36.8283 20.5707 79.4174 +lradius 18.8393 +lwrist 11.3005 +lhand -21.9628 20.3511 +lfingers 7.12502 +lthumb 4.44468 50.2845 +rfemur -8.54347 6.93802 29.5115 +rtibia 33.0861 +rfoot -18.6586 -9.64965 +rtoes 2.77678 +lfemur -12.8442 4.1966 -18.3096 +ltibia 73.4559 +lfoot -0.119332 15.9228 +ltoes -11.9752 +238 +root 9.89634 17.4581 11.0798 -5.72508 -0.118691 -3.32003 +lowerback 6.6384 -1.02272 3.22817 +upperback 2.02141 -1.11405 1.71496 +thorax -1.66294 -0.559716 0.0426081 +lowerneck -8.70021 2.87011 -0.912373 +upperneck 3.79022 4.00569 -1.2098 +head 2.72942 1.93195 -0.0305252 +rclavicle 1.084e-014 -7.35503e-015 +rhumerus -30.6897 -10.3419 -84.1498 +rradius 20.0544 +rwrist -5.20276 +rhand -22.316 14.9701 +rfingers 7.12502 +rthumb 4.1036 -14.9701 +lclavicle 1.084e-014 -7.35503e-015 +lhumerus -37.6951 22.4171 77.9393 +lradius 17.8658 +lwrist 9.66325 +lhand -22.0488 20.8318 +lfingers 7.12502 +lthumb 4.36165 50.7669 +rfemur -7.84165 7.0262 29.829 +rtibia 32.6195 +rfoot -18.9824 -9.31289 +rtoes 4.34373 +lfemur -14.2576 4.16087 -18.0819 +ltibia 73.3064 +lfoot -1.38022 15.0328 +ltoes -10.1159 +239 +root 9.90549 17.4669 11.2364 -5.72023 -0.459303 -2.38833 +lowerback 6.55454 -0.93094 2.33367 +upperback 2.20097 -1.06501 1.40035 +thorax -1.42098 -0.531912 0.212106 +lowerneck -9.28146 2.92111 -0.744609 +upperneck 3.95985 4.07554 -1.38388 +head 2.90544 1.95798 -0.0999886 +rclavicle -2.05618e-014 2.0276e-014 +rhumerus -29.0141 -8.1994 -85.3373 +rradius 20.5886 +rwrist -6.56062 +rhand -22.5369 14.8256 +rfingers 7.12502 +rthumb 3.89027 -15.1187 +lclavicle -2.05618e-014 2.0276e-014 +lhumerus -38.348 24.0805 76.6719 +lradius 17.1416 +lwrist 8.69191 +lhand -22.1201 22.1192 +lfingers 7.12502 +lthumb 4.29277 52.0557 +rfemur -7.06059 6.90779 28.8161 +rtibia 32.2347 +rfoot -19.3386 -8.79946 +rtoes 4.26396 +lfemur -15.4334 4.03307 -19.2728 +ltibia 72.8736 +lfoot -1.88466 14.3381 +ltoes -12.3263 +240 +root 9.90946 17.4665 11.397 -5.69271 -1.02503 -2.36125 +lowerback 6.55002 -0.768727 2.31778 +upperback 2.24238 -0.852267 1.36943 +thorax -1.37317 -0.425231 0.172316 +lowerneck -9.66525 2.87001 -0.541384 +upperneck 4.30297 4.0124 -1.6661 +head 3.10838 1.91312 -0.220476 +rclavicle -2.95071e-015 1.94809e-014 +rhumerus -27.7808 -6.12961 -86.2835 +rradius 21.4729 +rwrist -8.17027 +rhand -22.9717 14.1584 +rfingers 7.12502 +rthumb 3.47044 -15.7931 +lclavicle -2.95071e-015 1.94809e-014 +lhumerus -39.3662 25.4083 75.438 +lradius 16.6394 +lwrist 7.92398 +lhand -22.1483 22.7359 +lfingers 7.12502 +lthumb 4.26555 52.673 +rfemur -6.32079 6.93534 28.8833 +rtibia 32.0359 +rfoot -19.7895 -8.50724 +rtoes 3.13848 +lfemur -16.6407 4.09181 -19.3003 +ltibia 72.373 +lfoot -2.61362 13.5827 +ltoes -12.9664 +241 +root 9.90934 17.4572 11.5481 -5.66151 -1.64023 -2.92502 +lowerback 6.76857 -0.601284 2.91276 +upperback 2.13772 -0.578051 1.46088 +thorax -1.6027 -0.290793 -0.08503 +lowerneck -9.43545 2.77091 -0.482358 +upperneck 4.31998 3.87511 -1.72921 +head 3.07242 1.84482 -0.262507 +rclavicle 5.49143e-015 -1.49089e-014 +rhumerus -26.7756 -4.78331 -86.873 +rradius 22.1798 +rwrist -8.83377 +rhand -22.7669 14.3478 +rfingers 7.12502 +rthumb 3.66821 -15.6004 +lclavicle 5.49143e-015 -1.49089e-014 +lhumerus -40.6736 26.4333 74.0876 +lradius 16.2765 +lwrist 7.24216 +lhand -22.2117 22.2819 +lfingers 7.12502 +lthumb 4.20432 52.2202 +rfemur -5.71736 6.92764 29.6716 +rtibia 31.9254 +rfoot -19.8574 -8.74106 +rtoes 0.439348 +lfemur -17.915 4.06663 -18.5871 +ltibia 71.7669 +lfoot -3.64681 12.7509 +ltoes -11.038 +242 +root 9.9184 17.4485 11.6933 -5.61047 -1.98618 -2.8414 +lowerback 6.8888 -0.543076 2.9917 +upperback 2.14024 -0.494485 1.26285 +thorax -1.66727 -0.249539 -0.3388 +lowerneck -9.42674 2.87018 -0.201962 +upperneck 4.17516 3.97484 -1.80172 +head 3.03013 1.89795 -0.330445 +rclavicle 1.55301e-016 1.35174e-014 +rhumerus -25.56 -3.69476 -87.4601 +rradius 22.8881 +rwrist -8.91408 +rhand -22.3034 14.9281 +rfingers 7.12502 +rthumb 4.11581 -15.0119 +lclavicle 1.55301e-016 1.35174e-014 +lhumerus -41.561 26.9953 73.0215 +lradius 15.9404 +lwrist 7.23128 +lhand -22.6777 22.1337 +lfingers 7.12502 +lthumb 3.75439 52.0803 +rfemur -5.15421 6.72518 29.6248 +rtibia 31.7109 +rfoot -19.735 -8.78192 +rtoes -1.89154 +lfemur -19.1566 3.79055 -18.7251 +ltibia 70.8821 +lfoot -4.22392 12.0506 +ltoes -11.7946 +243 +root 9.93415 17.451 11.8586 -5.58526 -2.24979 -2.29008 +lowerback 6.85261 -0.487009 2.64425 +upperback 2.11828 -0.449874 0.997727 +thorax -1.66842 -0.227055 -0.420847 +lowerneck -9.48931 2.98584 -0.0429701 +upperneck 4.32999 4.12295 -1.94224 +head 3.10447 1.96675 -0.393237 +rclavicle -3.10601e-018 -3.57812e-015 +rhumerus -24.6622 -2.16907 -87.9157 +rradius 23.9384 +rwrist -9.40119 +rhand -22.3547 15.4506 +rfingers 7.12502 +rthumb 4.06621 -14.4903 +lclavicle -3.10601e-018 -3.57812e-015 +lhumerus -42.5466 27.4754 72.0948 +lradius 15.7196 +lwrist 7.1695 +lhand -23.0155 22.679 +lfingers 7.12502 +lthumb 3.4281 52.6311 +rfemur -4.33282 6.5291 28.946 +rtibia 31.4465 +rfoot -20.5053 -8.17752 +rtoes -0.856867 +lfemur -20.1129 3.43694 -19.4382 +ltibia 69.659 +lfoot -4.8299 11.6772 +ltoes -13.7982 +244 +root 9.94778 17.4644 12.0301 -5.56506 -2.54459 -1.88938 +lowerback 6.89228 -0.375171 2.36765 +upperback 2.01915 -0.318779 0.88507 +thorax -1.78853 -0.163215 -0.391882 +lowerneck -9.56046 2.9143 -0.0186546 +upperneck 4.73353 4.05304 -2.2066 +head 3.26494 1.91709 -0.483867 +rclavicle -9.50439e-015 -5.96354e-016 +rhumerus -23.9314 -0.378186 -88.1549 +rradius 25.0202 +rwrist -10.2878 +rhand -22.4805 15.9427 +rfingers 7.12502 +rthumb 3.94477 -14.0006 +lclavicle -9.50439e-015 -5.96354e-016 +lhumerus -43.7527 28.089 71.1731 +lradius 15.5173 +lwrist 6.63585 +lhand -23.1292 22.5425 +lfingers 7.12502 +lthumb 3.31834 52.4964 +rfemur -3.54297 6.41164 28.4184 +rtibia 31.2441 +rfoot -21.7847 -7.39598 +rtoes 2.20671 +lfemur -20.9417 3.05395 -19.9238 +ltibia 68.1784 +lfoot -5.70675 11.5618 +ltoes -13.6097 +245 +root 9.96307 17.4732 12.1846 -5.53752 -2.85284 -1.75066 +lowerback 7.01995 -0.28385 2.38629 +upperback 2.06326 -0.195174 0.783637 +thorax -1.81138 -0.101484 -0.516681 +lowerneck -9.74827 2.82907 0.125749 +upperneck 4.74493 3.94466 -2.51352 +head 3.316 1.85167 -0.613419 +rclavicle -6.78042e-015 -1.11319e-014 +rhumerus -22.8176 1.34759 -88.4176 +rradius 26.0764 +rwrist -11.224 +rhand -22.3647 15.7866 +rfingers 7.12502 +rthumb 4.05657 -14.1545 +lclavicle -6.78042e-015 -1.11319e-014 +lhumerus -44.507 28.3263 70.6675 +lradius 15.4343 +lwrist 6.517 +lhand -23.0351 22.5164 +lfingers 7.12502 +lthumb 3.40917 52.4689 +rfemur -2.86156 6.24407 28.1861 +rtibia 30.9675 +rfoot -22.7452 -6.73776 +rtoes 4.50407 +lfemur -21.8625 2.67013 -20.0645 +ltibia 66.5366 +lfoot -6.451 11.422 +ltoes -13.7766 +246 +root 9.97673 17.4718 12.3468 -5.50061 -3.08252 -1.55744 +lowerback 7.05982 -0.248613 2.33746 +upperback 2.11211 -0.154921 0.63079 +thorax -1.78243 -0.0806314 -0.650025 +lowerneck -9.82692 2.81487 0.170133 +upperneck 4.49993 3.91697 -2.55789 +head 3.24805 1.83891 -0.637533 +rclavicle 2.23943e-015 4.47266e-015 +rhumerus -21.8468 2.55562 -88.6209 +rradius 27.2822 +rwrist -11.6598 +rhand -22.2282 15.2603 +rfingers 7.12502 +rthumb 4.18842 -14.6783 +lclavicle 2.23943e-015 4.47266e-015 +lhumerus -45.2556 28.1791 70.3523 +lradius 15.588 +lwrist 6.90469 +lhand -22.6858 23.0403 +lfingers 7.12502 +lthumb 3.74653 52.9871 +rfemur -2.01753 5.94134 27.8919 +rtibia 30.4103 +rfoot -23.6629 -6.28023 +rtoes 4.83943 +lfemur -22.6928 2.26881 -20.2461 +ltibia 64.7628 +lfoot -7.13773 11.4668 +ltoes -14.7034 +247 +root 9.98686 17.476 12.5183 -5.46611 -3.25379 -1.32524 +lowerback 7.01026 -0.235227 2.17035 +upperback 2.12275 -0.15318 0.506666 +thorax -1.74392 -0.079081 -0.68432 +lowerneck -9.92878 2.81059 0.170898 +upperneck 4.46582 3.9066 -2.50103 +head 3.25416 1.83565 -0.618467 +rclavicle 6.8736e-015 1.05356e-014 +rhumerus -21.0939 3.42577 -88.757 +rradius 28.603 +rwrist -11.8793 +rhand -22.0495 14.8498 +rfingers 7.12502 +rthumb 4.36095 -15.0853 +lclavicle 6.8736e-015 1.05356e-014 +lhumerus -46.1576 28.0308 69.9871 +lradius 15.7665 +lwrist 7.32461 +lhand -22.4938 22.7831 +lfingers 7.12502 +lthumb 3.93192 52.7266 +rfemur -1.02714 5.57822 27.5297 +rtibia 29.628 +rfoot -22.7864 -6.19365 +rtoes -0.38033 +lfemur -23.3162 1.81203 -20.4395 +ltibia 62.8921 +lfoot -7.84185 11.7521 +ltoes -13.8948 +248 +root 9.99374 17.4908 12.6767 -5.40251 -3.59175 -1.88548 +lowerback 7.04785 -0.236671 2.74498 +upperback 2.22057 -0.114251 0.601041 +thorax -1.66312 -0.0584464 -0.912883 +lowerneck -10.0139 2.87177 0.496544 +upperneck 4.25197 3.96891 -2.90156 +head 3.2171 1.85745 -0.803108 +rclavicle -1.45672e-014 -7.15625e-015 +rhumerus -20.081 4.88209 -88.9321 +rradius 29.8497 +rwrist -12.5913 +rhand -22.0996 14.8032 +rfingers 7.12502 +rthumb 4.31256 -15.1329 +lclavicle -1.45672e-014 -7.15625e-015 +lhumerus -46.904 28.2511 69.4641 +lradius 15.8468 +lwrist 7.41608 +lhand -22.4792 22.2096 +lfingers 7.12502 +lthumb 3.946 52.1528 +rfemur -0.0229695 5.5895 28.1066 +rtibia 28.7341 +rfoot -22.1177 -5.93104 +rtoes -1.97431 +lfemur -24.0421 1.52302 -19.6223 +ltibia 61.014 +lfoot -8.7144 11.8442 +ltoes -12.2581 +249 +root 9.99955 17.4975 12.8227 -5.16224 -3.98988 -2.89988 +lowerback 7.22477 -0.262861 3.7562 +upperback 2.18127 -0.0650779 0.823188 +thorax -1.7994 -0.0370062 -1.25492 +lowerneck -9.95617 2.92896 0.676277 +upperneck 3.87331 4.02902 -3.16769 +head 3.08888 1.88418 -0.920376 +rclavicle 5.48832e-015 1.98785e-015 +rhumerus -19.1571 6.46429 -89.0585 +rradius 30.9663 +rwrist -13.166 +rhand -22.5661 15.4195 +rfingers 7.12502 +rthumb 3.86207 -14.5253 +lclavicle 5.48832e-015 1.98785e-015 +lhumerus -47.5988 28.2498 69.1638 +lradius 15.9759 +lwrist 7.8719 +lhand -22.472 22.0938 +lfingers 7.12502 +lthumb 3.95302 52.0368 +rfemur 0.793903 5.94112 29.269 +rtibia 27.7339 +rfoot -21.5004 -5.82114 +rtoes -2.77094 +lfemur -25.1001 1.44963 -18.2253 +ltibia 59.0138 +lfoot -9.16288 11.887 +ltoes -12.5456 +250 +root 10.0111 17.4928 12.9617 -4.84801 -4.24603 -3.3138 +lowerback 7.48784 -0.298584 4.1345 +upperback 1.97527 -0.0623764 0.938087 +thorax -2.15802 -0.0452402 -1.34805 +lowerneck -9.89758 2.93634 0.490969 +upperneck 3.70865 4.04641 -3.0034 +head 3.01148 1.89856 -0.834288 +rclavicle 1.60736e-014 -1.2275e-014 +rhumerus -18.4255 7.42158 -89.0705 +rradius 32.0632 +rwrist -13.3063 +rhand -22.7556 16.1473 +rfingers 7.12502 +rthumb 3.67915 -13.8007 +lclavicle 1.60736e-014 -1.2275e-014 +lhumerus -48.326 27.8291 69.2818 +lradius 16.195 +lwrist 8.74124 +lhand -22.5026 22.3337 +lfingers 7.12502 +lthumb 3.92344 52.2773 +rfemur 1.49142 5.97077 29.6793 +rtibia 26.6328 +rfoot -20.9764 -5.60719 +rtoes -3.83235 +lfemur -26.1035 1.15229 -17.5633 +ltibia 56.731 +lfoot -9.06544 12.1649 +ltoes -13.466 +251 +root 10.0268 17.5012 13.1218 -4.79286 -4.43086 -3.15545 +lowerback 7.57207 -0.225318 4.04868 +upperback 1.97116 0.0316233 0.886044 +thorax -2.20416 0.000939415 -1.36235 +lowerneck -9.73069 2.86478 0.332753 +upperneck 3.361 3.96105 -3.0236 +head 2.85543 1.8584 -0.821419 +rclavicle 1.95772e-014 -2.57426e-014 +rhumerus -17.5992 8.19114 -88.8776 +rradius 33.3265 +rwrist -13.8695 +rhand -22.6848 16.0876 +rfingers 7.12502 +rthumb 3.74749 -13.8592 +lclavicle 1.95772e-014 -2.57426e-014 +lhumerus -48.977 27.7729 69.1451 +lradius 16.3353 +lwrist 8.67583 +lhand -21.9524 22.9663 +lfingers 7.12502 +lthumb 4.45476 52.8995 +rfemur 2.52443 5.56474 29.3344 +rtibia 25.6281 +rfoot -20.7508 -4.95411 +rtoes -3.81587 +lfemur -26.4055 0.498457 -17.5668 +ltibia 54.0837 +lfoot -9.23752 12.6881 +ltoes -12.6488 +252 +root 10.0448 17.5196 13.3021 -4.88867 -4.51503 -2.80706 +lowerback 7.43272 -0.13324 3.85837 +upperback 2.16425 0.123582 0.761475 +thorax -1.92257 0.0545833 -1.39249 +lowerneck -9.68326 2.77469 0.272151 +upperneck 2.88529 3.84236 -3.1717 +head 2.68488 1.79916 -0.867683 +rclavicle -1.22066e-014 4.32357e-015 +rhumerus -16.6224 9.15586 -88.5385 +rradius 34.6108 +rwrist -14.7248 +rhand -22.7296 15.6063 +rfingers 7.12502 +rthumb 3.70421 -14.3413 +lclavicle -1.22066e-014 4.32357e-015 +lhumerus -49.4837 28.0591 68.7974 +lradius 16.3934 +lwrist 8.14344 +lhand -21.0931 22.7561 +lfingers 7.12502 +lthumb 5.28448 52.6702 +rfemur 3.77307 5.09717 28.7439 +rtibia 24.716 +rfoot -20.7259 -4.27501 +rtoes -2.81499 +lfemur -26.3146 -0.181113 -17.7826 +ltibia 51.1433 +lfoot -9.58928 13.1371 +ltoes -11.9459 +253 +root 10.06 17.5357 13.4698 -4.71603 -4.596 -2.2918 +lowerback 7.22535 -0.119963 3.32417 +upperback 2.24952 0.0884342 0.662766 +thorax -1.72279 0.0417561 -1.19127 +lowerneck -9.94081 2.81961 0.0570932 +upperneck 2.62787 3.91633 -3.06827 +head 2.63868 1.83753 -0.790505 +rclavicle 4.22728e-015 2.48481e-015 +rhumerus -15.5205 10.4169 -88.2131 +rradius 35.7096 +rwrist -15.7111 +rhand -22.9355 15.7823 +rfingers 7.12502 +rthumb 3.50535 -14.1686 +lclavicle 4.22728e-015 2.48481e-015 +lhumerus -49.9795 28.4285 68.5465 +lradius 16.4294 +lwrist 7.93992 +lhand -21.2914 21.3511 +lfingers 7.12502 +lthumb 5.09302 51.2698 +rfemur 4.72091 4.96913 28.0284 +rtibia 23.6203 +rfoot -20.5308 -3.92066 +rtoes -2.40912 +lfemur -26.5761 -0.794974 -18.1193 +ltibia 48.1073 +lfoot -9.86144 13.3717 +ltoes -10.9546 +254 +root 10.0718 17.5566 13.6294 -4.3819 -4.81866 -2.20567 +lowerback 7.07358 -0.0888605 3.16896 +upperback 2.2162 0.113823 0.685456 +thorax -1.67238 0.0547397 -1.08281 +lowerneck -10.1996 2.88134 -0.0069558 +upperneck 2.54646 4.0092 -3.12539 +head 2.66097 1.87932 -0.789813 +rclavicle 3.70236e-015 -1.22253e-014 +rhumerus -14.5853 11.6764 -87.8799 +rradius 36.7576 +rwrist -16.784 +rhand -23.6094 16.8454 +rfingers 7.12502 +rthumb 2.85456 -13.1152 +lclavicle 3.70236e-015 -1.22253e-014 +lhumerus -50.4737 28.618 68.4174 +lradius 16.6388 +lwrist 7.86349 +lhand -21.4785 20.7983 +lfingers 7.12502 +lthumb 4.91229 50.7214 +rfemur 5.57324 4.93084 27.8226 +rtibia 22.4447 +rfoot -20.2697 -3.73443 +rtoes -4.00121 +lfemur -27.0424 -1.4956 -17.8533 +ltibia 45.1284 +lfoot -10.1848 13.5604 +ltoes -9.34074 +255 +root 10.0855 17.5735 13.7935 -4.09114 -5.00678 -2.88708 +lowerback 7.03268 -0.0695791 3.93585 +upperback 2.1287 0.195628 0.801618 +thorax -1.73302 0.0931556 -1.3999 +lowerneck -10.306 2.85798 0.463925 +upperneck 2.52128 3.94661 -3.63109 +head 2.69823 1.8347 -1.03868 +rclavicle -5.3765e-015 1.02374e-014 +rhumerus -13.8946 12.1604 -87.6436 +rradius 37.7644 +rwrist -16.9732 +rhand -23.9156 17.6285 +rfingers 7.12502 +rthumb 2.55891 -12.3358 +lclavicle -5.3765e-015 1.02374e-014 +lhumerus -50.9318 28.2175 68.4861 +lradius 16.9895 +lwrist 8.31801 +lhand -20.9261 20.9371 +lfingers 7.12502 +lthumb 5.44567 50.8471 +rfemur 6.52888 4.73627 28.438 +rtibia 21.272 +rfoot -20.022 -3.42064 +rtoes -4.56644 +lfemur -27.3782 -2.18513 -16.7577 +ltibia 42.2819 +lfoot -10.4002 13.7212 +ltoes -10.9693 +256 +root 10.0992 17.5786 13.9531 -3.94628 -5.28087 -3.0766 +lowerback 7.11982 0.00727905 4.20067 +upperback 2.1053 0.320881 0.777471 +thorax -1.79682 0.153867 -1.58413 +lowerneck -10.3443 2.8569 0.859933 +upperneck 2.20414 3.90466 -4.01196 +head 2.61864 1.80832 -1.23508 +rclavicle -3.52843e-015 -1.65488e-014 +rhumerus -13.0758 12.2264 -87.4266 +rradius 38.7056 +rwrist -16.6668 +rhand -23.6154 17.7894 +rfingers 7.12502 +rthumb 2.84877 -12.1713 +lclavicle -3.52843e-015 -1.65488e-014 +lhumerus -51.2467 27.8694 68.5721 +lradius 17.1925 +lwrist 9.04565 +lhand -20.5523 20.7745 +lfingers 7.12502 +lthumb 5.80663 50.675 +rfemur 7.48049 4.94429 28.5775 +rtibia 20.0108 +rfoot -19.5743 -3.03912 +rtoes -1.95961 +lfemur -27.4965 -2.63527 -16.2771 +ltibia 39.5344 +lfoot -10.4746 14.0563 +ltoes -14.1584 +257 +root 10.1113 17.5844 14.1138 -3.84915 -5.62684 -2.76506 +lowerback 7.16388 0.131829 3.86128 +upperback 2.14704 0.461465 0.696868 +thorax -1.77264 0.225258 -1.48902 +lowerneck -10.5763 2.89749 0.694153 +upperneck 1.96324 3.96287 -3.84975 +head 2.57228 1.84156 -1.14761 +rclavicle 1.56854e-015 -7.15625e-015 +rhumerus -12.2673 12.7264 -87.0734 +rradius 39.8131 +rwrist -16.9084 +rhand -23.954 18.1471 +rfingers 7.12502 +rthumb 2.52174 -11.8177 +lclavicle 1.56854e-015 -7.15625e-015 +lhumerus -51.5515 28.3631 68.1553 +lradius 17.031 +lwrist 8.76348 +lhand -20.1682 21.0982 +lfingers 7.12502 +lthumb 6.17747 50.9882 +rfemur 8.42399 5.25171 28.1651 +rtibia 18.6739 +rfoot -18.9655 -2.72443 +rtoes -0.065244 +lfemur -27.6161 -3.19401 -16.2731 +ltibia 36.919 +lfoot -10.952 14.6446 +ltoes -15.7743 +258 +root 10.1269 17.5824 14.293 -3.78346 -5.71454 -2.60598 +lowerback 7.00984 0.15805 3.74396 +upperback 2.23156 0.477104 0.639104 +thorax -1.5996 0.237233 -1.48268 +lowerneck -10.8238 2.86654 0.396626 +upperneck 1.84495 3.94101 -3.54566 +head 2.56077 1.83726 -0.99535 +rclavicle 4.74598e-015 -1.0138e-014 +rhumerus -11.5098 13.4205 -86.6982 +rradius 40.8932 +rwrist -17.3565 +rhand -24.4754 18.5114 +rfingers 7.12502 +rthumb 2.01821 -11.4588 +lclavicle 4.74598e-015 -1.0138e-014 +lhumerus -51.9002 28.9454 67.5824 +lradius 16.7803 +lwrist 8.02631 +lhand -19.2182 22.2305 +lfingers 7.12502 +lthumb 7.09451 52.0916 +rfemur 9.56151 4.92863 27.7752 +rtibia 17.4038 +rfoot -18.5199 -2.25202 +rtoes -0.258322 +lfemur -27.6573 -4.14271 -16.0538 +ltibia 34.4653 +lfoot -11.5975 15.0373 +ltoes -16.6664 +259 +root 10.1407 17.5736 14.4709 -3.72544 -5.84064 -2.83703 +lowerback 6.90971 0.175446 3.99353 +upperback 2.35479 0.509431 0.686058 +thorax -1.41277 0.258325 -1.57549 +lowerneck -10.9136 2.75618 0.351163 +upperneck 1.41496 3.78824 -3.5957 +head 2.42899 1.76367 -1.01242 +rclavicle -2.64011e-016 3.1408e-014 +rhumerus -10.597 13.8034 -86.3457 +rradius 41.7814 +rwrist -17.5975 +rhand -24.4589 18.6191 +rfingers 7.12502 +rthumb 2.03419 -11.3509 +lclavicle -2.64011e-016 3.1408e-014 +lhumerus -52.0541 29.0778 67.4866 +lradius 16.9157 +lwrist 8.08286 +lhand -18.2854 23.2167 +lfingers 7.12502 +lthumb 7.99492 53.0455 +rfemur 10.8189 4.63322 27.8524 +rtibia 16.2169 +rfoot -18.1732 -1.90358 +rtoes -0.928353 +lfemur -27.5957 -4.98915 -15.3885 +ltibia 32.084 +lfoot -11.4177 15.1806 +ltoes -18.7727 +260 +root 10.1539 17.5633 14.6388 -3.53997 -6.28188 -3.45322 +lowerback 6.94947 0.303208 4.59276 +upperback 2.3505 0.724782 0.875659 +thorax -1.42073 0.365856 -1.73303 +lowerneck -10.7385 2.66278 0.474223 +upperneck 0.869072 3.64562 -3.98508 +head 2.22402 1.68984 -1.1706 +rclavicle -3.24267e-015 1.70955e-014 +rhumerus -9.84433 13.9905 -85.9456 +rradius 42.7678 +rwrist -17.551 +rhand -24.5788 17.9447 +rfingers 7.12502 +rthumb 1.91837 -12.0264 +lclavicle -3.24267e-015 1.70955e-014 +lhumerus -52.1925 29.0238 67.5532 +lradius 17.0449 +lwrist 8.49544 +lhand -18.6407 22.7597 +lfingers 7.12502 +lthumb 7.65197 52.6013 +rfemur 11.8935 4.81144 28.4446 +rtibia 15.0985 +rfoot -17.7255 -1.74598 +rtoes -1.49242 +lfemur -27.6486 -5.60197 -14.214 +ltibia 29.8588 +lfoot -11.4969 15.5551 +ltoes -17.9561 +261 +root 10.1708 17.5546 14.811 -3.57045 -6.72603 -3.38602 +lowerback 7.02092 0.432334 4.48634 +upperback 2.41498 0.891288 0.904928 +thorax -1.38559 0.450124 -1.65671 +lowerneck -10.4284 2.66757 0.685969 +upperneck 0.26731 3.6217 -4.4963 +head 1.98608 1.67552 -1.3777 +rclavicle 1.14674e-014 -1.04362e-015 +rhumerus -9.05698 14.3959 -85.5503 +rradius 43.6457 +rwrist -17.4499 +rhand -24.5559 17.0737 +rfingers 7.12502 +rthumb 1.9405 -12.8972 +lclavicle 1.14674e-014 -1.04362e-015 +lhumerus -52.3377 29.1282 67.5938 +lradius 17.0112 +lwrist 8.70567 +lhand -20.0524 21.4182 +lfingers 7.12502 +lthumb 6.28927 51.3049 +rfemur 13.0754 4.96394 28.2475 +rtibia 13.9576 +rfoot -17.3237 -1.60037 +rtoes -2.29529 +lfemur -27.5062 -6.19179 -13.8406 +ltibia 27.9211 +lfoot -12.7703 16.0423 +ltoes -13.323 +262 +root 10.1857 17.5445 14.9905 -3.76258 -6.94553 -2.94903 +lowerback 7.03229 0.450333 3.92978 +upperback 2.6095 0.870366 0.818946 +thorax -1.20067 0.444435 -1.43064 +lowerneck -10.7101 2.71209 0.788337 +upperneck 0.121991 3.66818 -4.62902 +head 1.99645 1.69348 -1.43412 +rclavicle -6.26793e-015 0 +rhumerus -8.248 14.9686 -85.2699 +rradius 44.4791 +rwrist -17.8748 +rhand -24.1452 17.223 +rfingers 7.12502 +rthumb 2.33712 -12.7439 +lclavicle -6.26793e-015 0 +lhumerus -52.3566 29.599 67.4 +lradius 16.8454 +lwrist 8.53239 +lhand -20.603 21.0686 +lfingers 7.12502 +lthumb 5.75764 50.9704 +rfemur 14.389 4.76698 27.5929 +rtibia 12.8407 +rfoot -17.0393 -1.37537 +rtoes -2.90628 +lfemur -27.2713 -6.61064 -14.0585 +ltibia 26.3005 +lfoot -13.3989 16.5338 +ltoes -13.2157 +263 +root 10.2038 17.5315 15.1724 -3.66217 -7.16925 -3.16282 +lowerback 6.98181 0.498141 4.213 +upperback 2.61347 0.949861 0.824205 +thorax -1.159 0.485932 -1.58921 +lowerneck -11.0169 2.69048 0.899386 +upperneck 0.184101 3.63047 -4.67928 +head 2.07599 1.66859 -1.46968 +rclavicle -7.95139e-016 1.30204e-014 +rhumerus -7.76671 15.1716 -85.0531 +rradius 45.323 +rwrist -18.2475 +rhand -24.288 17.6127 +rfingers 7.12502 +rthumb 2.19925 -12.3557 +lclavicle -7.95139e-016 1.30204e-014 +lhumerus -52.3991 29.8522 67.0512 +lradius 16.5815 +lwrist 8.19521 +lhand -19.7484 21.8198 +lfingers 7.12502 +lthumb 6.58271 51.6974 +rfemur 15.43 4.54921 27.6294 +rtibia 11.8646 +rfoot -16.6621 -0.904616 +rtoes -2.50745 +lfemur -27.3134 -6.57418 -13.7359 +ltibia 24.9933 +lfoot -12.9232 17.0077 +ltoes -16.2986 +264 +root 10.2216 17.5154 15.3442 -3.60473 -7.43228 -3.47384 +lowerback 7.1287 0.577709 4.62908 +upperback 2.56593 1.09313 0.834315 +thorax -1.27242 0.555732 -1.82543 +lowerneck -10.6629 2.65682 1.08932 +upperneck -0.412374 3.54376 -4.87991 +head 1.82205 1.63332 -1.5755 +rclavicle 3.39487e-015 -3.11595e-014 +rhumerus -7.29607 15.0654 -84.9421 +rradius 45.8777 +rwrist -18.1325 +rhand -24.5901 18.0091 +rfingers 7.12502 +rthumb 1.90749 -11.9621 +lclavicle 3.39487e-015 -3.11595e-014 +lhumerus -52.5904 29.9865 66.7068 +lradius 16.6068 +lwrist 7.84818 +lhand -18.6453 22.7099 +lfingers 7.12502 +lthumb 7.64753 52.5517 +rfemur 16.4881 4.51277 27.8804 +rtibia 10.7814 +rfoot -15.9518 -0.898161 +rtoes -4.90633 +lfemur -27.4057 -6.16455 -13.4302 +ltibia 24.1461 +lfoot -12.4249 17.0131 +ltoes -18.8182 +265 +root 10.2383 17.5009 15.5223 -3.69683 -7.61232 -3.714 +lowerback 7.2998 0.568293 4.83803 +upperback 2.60334 1.10434 0.882512 +thorax -1.3243 0.561065 -1.89595 +lowerneck -10.493 2.59757 1.06996 +upperneck -0.864047 3.44647 -4.82573 +head 1.63781 1.59476 -1.56039 +rclavicle -1.78068e-014 1.46107e-014 +rhumerus -6.82154 15.1402 -84.9031 +rradius 46.4577 +rwrist -18.0374 +rhand -24.3835 18.3608 +rfingers 7.12502 +rthumb 2.10701 -11.6086 +lclavicle -1.78068e-014 1.46107e-014 +lhumerus -52.7578 30.0314 66.6924 +lradius 16.8153 +lwrist 7.90032 +lhand -18.3703 22.79 +lfingers 7.12502 +lthumb 7.91294 52.6219 +rfemur 17.6793 4.58309 28.1345 +rtibia 9.68868 +rfoot -15.148 -1.55615 +rtoes -10.5435 +lfemur -27.3549 -5.89382 -13.2233 +ltibia 23.6883 +lfoot -12.2593 16.6368 +ltoes -20.0634 +266 +root 10.2665 17.4895 15.7237 -3.67312 -7.74076 -3.60401 +lowerback 7.16682 0.593559 4.83333 +upperback 2.59524 1.12941 0.85869 +thorax -1.2568 0.575065 -1.91776 +lowerneck -10.6181 2.50641 1.01327 +upperneck -0.909518 3.33054 -4.85033 +head 1.64081 1.5352 -1.5632 +rclavicle -1.26228e-014 -3.8266e-015 +rhumerus -6.5155 15.3478 -84.6826 +rradius 47.1961 +rwrist -18.0584 +rhand -24.4668 18.0879 +rfingers 7.12502 +rthumb 2.02651 -11.8822 +lclavicle -1.26228e-014 -3.8266e-015 +lhumerus -52.7266 29.6636 67.2083 +lradius 16.9717 +lwrist 8.38367 +lhand -18.8928 22.6367 +lfingers 7.12502 +lthumb 7.40861 52.487 +rfemur 18.6596 4.69648 27.8676 +rtibia 9.07093 +rfoot -14.8233 -1.79939 +rtoes -12.9636 +lfemur -27.1468 -5.77452 -13.502 +ltibia 23.366 +lfoot -12.7112 16.3712 +ltoes -19.4393 +267 +root 10.2972 17.4729 15.9327 -3.91718 -7.8051 -2.90572 +lowerback 7.03875 0.673651 4.32242 +upperback 2.72195 1.18646 0.641335 +thorax -1.05809 0.608646 -1.85667 +lowerneck -10.5021 2.51203 1.137 +upperneck -1.2571 3.31434 -5.07316 +head 1.51483 1.528 -1.65877 +rclavicle -2.20589e-014 -9.54166e-015 +rhumerus -6.10223 15.4587 -84.4029 +rradius 47.655 +rwrist -18.1107 +rhand -24.8444 18.2535 +rfingers 7.12502 +rthumb 1.66181 -11.7197 +lclavicle -2.20589e-014 -9.54166e-015 +lhumerus -52.4679 29.3518 67.6482 +lradius 17.0911 +lwrist 8.67468 +lhand -19.0167 22.999 +lfingers 7.12502 +lthumb 7.28907 52.8534 +rfemur 19.703 4.79542 26.9317 +rtibia 8.97838 +rfoot -14.8457 -1.62424 +rtoes -12.1016 +lfemur -26.5853 -5.58817 -14.5415 +ltibia 23.1447 +lfoot -13.4671 16.1069 +ltoes -19.0297 +268 +root 10.3158 17.4523 16.1299 -4.14314 -7.95911 -2.94095 +lowerback 7.06564 0.742009 4.45166 +upperback 2.86731 1.28128 0.568297 +thorax -0.911704 0.662168 -2.0102 +lowerneck -10.4452 2.58619 1.36548 +upperneck -1.58136 3.37622 -5.23657 +head 1.41097 1.55997 -1.74968 +rclavicle -1.7667e-014 -1.2921e-014 +rhumerus -5.65793 15.1338 -84.4016 +rradius 47.8718 +rwrist -17.8038 +rhand -24.7839 19.2045 +rfingers 7.12502 +rthumb 1.7203 -10.7683 +lclavicle -1.7667e-014 -1.2921e-014 +lhumerus -52.1687 29.4199 67.5196 +lradius 17.0204 +lwrist 8.31545 +lhand -19.1321 22.3099 +lfingers 7.12502 +lthumb 7.17768 52.1682 +rfemur 20.5027 4.87832 26.8887 +rtibia 9.39543 +rfoot -14.8384 -1.39988 +rtoes -11.5369 +lfemur -26.161 -5.31714 -14.6826 +ltibia 23.082 +lfoot -13.0502 15.9315 +ltoes -19.9141 +269 +root 10.3343 17.4349 16.3233 -3.98942 -8.22483 -3.21359 +lowerback 6.9159 0.842212 4.80401 +upperback 2.81407 1.43033 0.554622 +thorax -0.863337 0.739048 -2.22999 +lowerneck -10.4212 2.57649 1.47287 +upperneck -1.76719 3.34301 -5.24284 +head 1.34781 1.54583 -1.77242 +rclavicle -2.53426e-014 2.57022e-015 +rhumerus -5.54188 14.6673 -84.5304 +rradius 48.4284 +rwrist -17.392 +rhand -24.6909 19.1266 +rfingers 7.12502 +rthumb 1.8101 -10.8454 +lclavicle -2.53426e-014 2.57022e-015 +lhumerus -52.0039 29.7511 67.0089 +lradius 16.6444 +lwrist 7.4144 +lhand -19.5442 21.5614 +lfingers 7.12502 +lthumb 6.77984 51.4329 +rfemur 20.8673 5.09172 27.077 +rtibia 9.90428 +rfoot -14.6885 -1.09835 +rtoes -11.557 +lfemur -26.1388 -4.86314 -14.5867 +ltibia 23.3372 +lfoot -11.8594 15.9323 +ltoes -20.7916 +270 +root 10.3542 17.4197 16.5188 -3.84489 -8.30883 -3.06356 +lowerback 6.62525 0.878515 4.60063 +upperback 2.78937 1.44995 0.523175 +thorax -0.731124 0.750441 -2.1439 +lowerneck -10.3214 2.48024 1.34928 +upperneck -2.08519 3.21229 -5.06523 +head 1.21485 1.49055 -1.69931 +rclavicle -3.06841e-014 1.02654e-015 +rhumerus -5.46402 15.0319 -84.3807 +rradius 49.2048 +rwrist -17.9207 +rhand -25.0877 18.1551 +rfingers 7.12502 +rthumb 1.42686 -11.8199 +lclavicle -3.06841e-014 1.02654e-015 +lhumerus -51.7023 29.9577 66.9425 +lradius 16.2758 +lwrist 6.89991 +lhand -19.5382 22.0514 +lfingers 7.12502 +lthumb 6.78566 51.9227 +rfemur 21.2694 5.16766 26.8103 +rtibia 10.2063 +rfoot -14.415 -1.02568 +rtoes -13.5756 +lfemur -26.1279 -4.14978 -15.1579 +ltibia 23.9912 +lfoot -10.9807 15.5225 +ltoes -20.8767 +271 +root 10.3695 17.4034 16.7129 -3.80778 -8.23966 -3.35847 +lowerback 6.53788 0.843667 4.74635 +upperback 2.78213 1.40954 0.670113 +thorax -0.692777 0.73113 -2.06952 +lowerneck -10.5203 2.44844 1.24768 +upperneck -1.98609 3.18289 -4.93342 +head 1.27486 1.47501 -1.63874 +rclavicle -1.791e-014 2.75814e-015 +rhumerus -5.39102 15.5504 -84.1044 +rradius 49.7447 +rwrist -18.5557 +rhand -25.5019 17.7454 +rfingers 7.12502 +rthumb 1.02683 -12.2319 +lclavicle -1.791e-014 2.75814e-015 +lhumerus -51.417 29.9171 67.2566 +lradius 16.2312 +lwrist 6.73252 +lhand -19.2067 22.4769 +lfingers 7.12502 +lthumb 7.10564 52.3376 +rfemur 21.822 5.47784 27.2494 +rtibia 10.424 +rfoot -14.0564 -1.51471 +rtoes -15.9096 +lfemur -26.0842 -3.28525 -15.3492 +ltibia 24.9397 +lfoot -9.80379 14.707 +ltoes -20.7547 +272 +root 10.3906 17.3987 16.9177 -3.82906 -8.20565 -3.43304 +lowerback 6.42357 0.905127 4.88303 +upperback 2.72159 1.49509 0.686748 +thorax -0.682261 0.774034 -2.13275 +lowerneck -10.4948 2.39246 1.20101 +upperneck -1.88622 3.11746 -4.89652 +head 1.29878 1.44247 -1.6217 +rclavicle -1.03189e-014 8.18744e-015 +rhumerus -5.63709 15.2508 -84.0449 +rradius 50.1708 +rwrist -18.2985 +rhand -25.5376 17.6385 +rfingers 7.12502 +rthumb 0.992314 -12.339 +lclavicle -1.03189e-014 8.18744e-015 +lhumerus -51.3499 29.8354 67.3601 +lradius 16.4019 +lwrist 6.45036 +lhand -19.3378 22.2754 +lfingers 7.12502 +lthumb 6.97907 52.1403 +rfemur 22.5182 5.84994 27.3903 +rtibia 10.3916 +rfoot -13.4653 -1.73708 +rtoes -16.2972 +lfemur -26.0516 -2.59916 -15.748 +ltibia 26.0293 +lfoot -8.11243 14.3669 +ltoes -20.7768 +273 +root 10.4182 17.4002 17.1296 -3.8161 -8.1532 -3.11602 +lowerback 6.17126 0.94785 4.64562 +upperback 2.62252 1.52623 0.593622 +thorax -0.6466 0.787993 -2.09354 +lowerneck -10.0554 2.28891 1.22299 +upperneck -2.16527 2.9672 -4.95195 +head 1.12908 1.37594 -1.65256 +rclavicle -1.93279e-014 4.06266e-015 +rhumerus -6.06449 14.973 -84.114 +rradius 50.6333 +rwrist -17.9971 +rhand -25.3621 17.7841 +rfingers 7.12502 +rthumb 1.16185 -12.1924 +lclavicle -1.93279e-014 4.06266e-015 +lhumerus -51.28 30.0073 67.2388 +lradius 16.446 +lwrist 6.1484 +lhand -19.6979 21.9698 +lfingers 7.12502 +lthumb 6.6315 51.846 +rfemur 23.2529 6.15513 27.0293 +rtibia 10.2406 +rfoot -12.7272 -1.94714 +rtoes -17.3661 +lfemur -26.1381 -2.46287 -16.3767 +ltibia 27.0955 +lfoot -6.80453 14.9433 +ltoes -18.9813 +274 +root 10.4502 17.3931 17.3568 -3.82162 -7.97337 -2.76551 +lowerback 5.89272 0.881524 4.29979 +upperback 2.46673 1.40843 0.52772 +thorax -0.668544 0.724808 -1.95673 +lowerneck -9.80111 2.29125 1.40431 +upperneck -2.13923 2.95468 -5.13438 +head 1.10147 1.36828 -1.74563 +rclavicle 1.70023e-014 5.8393e-015 +rhumerus -6.56425 15.1348 -84.2089 +rradius 50.9284 +rwrist -18.0658 +rhand -25.0295 18.4105 +rfingers 7.12502 +rthumb 1.48306 -11.5641 +lclavicle 1.70023e-014 5.8393e-015 +lhumerus -51.1689 30.2517 67.0727 +lradius 16.3003 +lwrist 6.03102 +lhand -19.2297 22.6379 +lfingers 7.12502 +lthumb 7.08342 52.4993 +rfemur 23.8191 6.2307 26.5431 +rtibia 10.6152 +rfoot -12.2113 -2.02839 +rtoes -18.919 +lfemur -26.1499 -2.92848 -16.8764 +ltibia 28.015 +lfoot -6.32676 15.5988 +ltoes -14.0043 +275 +root 10.4839 17.3922 17.5892 -3.95807 -7.73094 -2.03386 +lowerback 5.55139 0.864017 3.6909 +upperback 2.42301 1.33611 0.293916 +thorax -0.538342 0.688371 -1.84566 +lowerneck -9.83645 2.29613 1.50951 +upperneck -2.00447 2.95594 -5.16836 +head 1.15427 1.36546 -1.77514 +rclavicle -1.52117e-014 -4.64659e-015 +rhumerus -7.11041 15.0325 -84.3476 +rradius 51.213 +rwrist -18.0055 +rhand -24.89 18.874 +rfingers 7.12502 +rthumb 1.61778 -11.0997 +lclavicle -1.52117e-014 -4.64659e-015 +lhumerus -50.7408 30.1328 67.2373 +lradius 16.1732 +lwrist 6.17966 +lhand -19.4312 22.8276 +lfingers 7.12502 +lthumb 6.88893 52.6955 +rfemur 23.974 6.48769 25.7274 +rtibia 11.8511 +rfoot -11.8661 -2.15031 +rtoes -19.8731 +lfemur -26.0219 -3.23005 -17.8944 +ltibia 29.0153 +lfoot -5.58222 15.3567 +ltoes -10.1639 +276 +root 10.5083 17.3913 17.7954 -4.10368 -7.38314 -1.45983 +lowerback 5.36441 0.852244 3.14159 +upperback 2.46892 1.28358 0.124942 +thorax -0.399586 0.662367 -1.70447 +lowerneck -10.0595 2.19738 1.17585 +upperneck -1.89726 2.85748 -4.71432 +head 1.20623 1.32262 -1.57221 +rclavicle 1.30701e-014 -1.08089e-014 +rhumerus -7.6047 14.7524 -84.4221 +rradius 51.5562 +rwrist -17.975 +rhand -25.2752 18.9299 +rfingers 7.12502 +rthumb 1.24575 -11.0462 +lclavicle 1.30701e-014 -1.08089e-014 +lhumerus -49.9752 29.7171 67.9127 +lradius 16.0824 +lwrist 6.5785 +lhand -20.3701 21.7065 +lfingers 7.12502 +lthumb 5.98248 51.602 +rfemur 23.8898 6.93489 25.3223 +rtibia 13.6014 +rfoot -11.5011 -2.65887 +rtoes -21.1483 +lfemur -26.0493 -3.24631 -18.7986 +ltibia 30.1917 +lfoot -4.66036 14.4539 +ltoes -10.2669 +277 +root 10.5202 17.3546 17.9874 -4.17108 -6.90962 -1.66049 +lowerback 5.32497 0.792406 3.15921 +upperback 2.47302 1.20462 0.2623 +thorax -0.380244 0.622695 -1.56822 +lowerneck -10.1366 2.02463 0.629571 +upperneck -1.88977 2.67961 -4.15977 +head 1.19332 1.24672 -1.30585 +rclavicle -1.23138e-014 -7.7526e-015 +rhumerus -8.01404 14.4551 -84.4367 +rradius 51.6407 +rwrist -17.8897 +rhand -25.6198 18.7152 +rfingers 7.12502 +rthumb 0.912918 -11.2626 +lclavicle -1.23138e-014 -7.7526e-015 +lhumerus -49.2622 29.4209 68.5659 +lradius 15.9671 +lwrist 6.81093 +lhand -20.3413 21.1376 +lfingers 7.12502 +lthumb 6.01033 51.0323 +rfemur 23.635 6.88003 25.6827 +rtibia 15.9394 +rfoot -11.2475 -2.89025 +rtoes -22.8574 +lfemur -26.2649 -3.20833 -18.8372 +ltibia 31.5215 +lfoot -4.06352 13.1654 +ltoes -10.0651 +278 +root 10.5296 17.3362 18.1788 -4.10761 -6.55825 -2.16222 +lowerback 5.2234 0.803656 3.59526 +upperback 2.44909 1.23787 0.402668 +thorax -0.339515 0.642185 -1.66834 +lowerneck -10.0857 1.82522 0.340848 +upperneck -2.04144 2.43711 -3.89448 +head 1.11892 1.13515 -1.18167 +rclavicle -3.10648e-014 1.41634e-015 +rhumerus -8.47281 13.9141 -84.5737 +rradius 51.5971 +rwrist -17.8134 +rhand -25.6941 18.6183 +rfingers 7.12502 +rthumb 0.841235 -11.3598 +lclavicle -3.10648e-014 1.41634e-015 +lhumerus -48.6219 29.5367 68.6357 +lradius 15.9353 +lwrist 6.17658 +lhand -19.6386 21.4728 +lfingers 7.12502 +lthumb 6.68867 51.3472 +rfemur 22.8875 6.55783 26.1769 +rtibia 18.6819 +rfoot -10.7961 -2.89565 +rtoes -25.3991 +lfemur -26.5028 -2.83826 -18.5937 +ltibia 32.867 +lfoot -3.30017 11.7846 +ltoes -7.05591 +279 +root 10.551 17.3303 18.3756 -4.15053 -6.2037 -2.03788 +lowerback 5.07267 0.823359 3.5961 +upperback 2.46746 1.25667 0.298751 +thorax -0.233189 0.654379 -1.77348 +lowerneck -10.1288 1.68416 0.171084 +upperneck -2.0679 2.26553 -3.71517 +head 1.10785 1.05402 -1.10234 +rclavicle 1.67818e-014 1.75924e-014 +rhumerus -9.04015 13.3928 -84.7587 +rradius 51.5896 +rwrist -18.0542 +rhand -25.6583 18.9168 +rfingers 7.12502 +rthumb 0.875769 -11.0612 +lclavicle 1.67818e-014 1.75924e-014 +lhumerus -47.8228 29.3721 68.9613 +lradius 16.0474 +lwrist 5.82996 +lhand -19.7437 21.6662 +lfingers 7.12502 +lthumb 6.58725 51.5438 +rfemur 21.8958 6.03686 25.7611 +rtibia 21.7293 +rfoot -10.2586 -2.65196 +rtoes -27.8453 +lfemur -26.5149 -2.57908 -19.0881 +ltibia 34.0973 +lfoot -3.04027 11.1078 +ltoes -3.95778 +280 +root 10.577 17.3201 18.5674 -4.3339 -5.7349 -1.58504 +lowerback 5.10081 0.761613 3.16597 +upperback 2.47434 1.15577 0.205313 +thorax -0.255204 0.600906 -1.62402 +lowerneck -10.0618 1.67633 0.174478 +upperneck -2.0838 2.25732 -3.95447 +head 1.09558 1.04612 -1.17951 +rclavicle 1.39755e-014 -9.86469e-015 +rhumerus -9.69353 13.1122 -84.8412 +rradius 51.5967 +rwrist -17.9566 +rhand -25.7196 18.9453 +rfingers 7.12502 +rthumb 0.816546 -11.0329 +lclavicle 1.39755e-014 -9.86469e-015 +lhumerus -46.9353 29.0535 69.6905 +lradius 16.075 +lwrist 6.06533 +lhand -20.9667 21.1375 +lfingers 7.12502 +lthumb 5.40649 51.0486 +rfemur 20.9439 5.25562 24.8108 +rtibia 24.8578 +rfoot -9.25836 -1.92155 +rtoes -28.9046 +lfemur -26.2258 -2.62107 -19.9121 +ltibia 34.9979 +lfoot -3.43802 10.9232 +ltoes -3.01672 +281 +root 10.5944 17.3211 18.7456 -4.42454 -5.48289 -1.39595 +lowerback 5.31742 0.778292 2.89836 +upperback 2.36629 1.17551 0.199857 +thorax -0.491806 0.604272 -1.48573 +lowerneck -10.2133 1.46442 -0.118903 +upperneck -1.79829 2.01541 -3.67194 +head 1.19936 0.927119 -1.04894 +rclavicle -1.34599e-014 -1.07095e-014 +rhumerus -10.5268 12.8642 -84.9633 +rradius 51.5451 +rwrist -17.8128 +rhand -25.8934 18.9829 +rfingers 7.12502 +rthumb 0.648718 -10.9958 +lclavicle -1.34599e-014 -1.07095e-014 +lhumerus -46.1524 28.8875 70.211 +lradius 16.1629 +lwrist 6.1445 +lhand -21.3239 20.7904 +lfingers 7.12502 +lthumb 5.06156 50.71 +rfemur 19.783 4.92936 24.3053 +rtibia 27.9376 +rfoot -7.43242 -1.38019 +rtoes -29.1799 +lfemur -25.9007 -2.51079 -20.3545 +ltibia 35.6866 +lfoot -3.92646 10.5895 +ltoes -2.41382 +282 +root 10.6145 17.3365 18.9323 -4.46921 -5.43087 -1.16244 +lowerback 5.37992 0.878419 2.70236 +upperback 2.27711 1.30218 0.114616 +thorax -0.615068 0.664273 -1.47261 +lowerneck -10.4325 1.30608 0.00675012 +upperneck -1.4413 1.80798 -3.80973 +head 1.35359 0.813118 -1.12321 +rclavicle 3.59365e-015 -1.09083e-014 +rhumerus -11.5489 12.3612 -85.1565 +rradius 51.5447 +rwrist -17.6162 +rhand -25.6223 19.6918 +rfingers 7.12502 +rthumb 0.910563 -10.286 +lclavicle 3.59365e-015 -1.09083e-014 +lhumerus -45.2767 28.2385 71.0287 +lradius 16.5173 +lwrist 6.84576 +lhand -20.6068 21.4025 +lfingers 7.12502 +lthumb 5.75396 51.3044 +rfemur 18.5913 4.96937 23.8261 +rtibia 30.8454 +rfoot -5.05658 -1.22642 +rtoes -29.9048 +lfemur -25.4578 -2.28973 -20.8399 +ltibia 36.2434 +lfoot -4.55361 10.0708 +ltoes -2.64602 +283 +root 10.6458 17.362 19.1257 -4.44029 -5.43312 -0.991838 +lowerback 5.3435 0.915015 2.70439 +upperback 2.13574 1.35156 0.0418384 +thorax -0.736058 0.686269 -1.55227 +lowerneck -10.0518 1.2352 -0.395153 +upperneck -1.68964 1.73933 -3.42553 +head 1.19388 0.795921 -0.935511 +rclavicle 3.33663e-015 3.57812e-015 +rhumerus -12.5384 12.0323 -85.4289 +rradius 51.3544 +rwrist -17.3457 +rhand -25.3831 20.3827 +rfingers 7.12502 +rthumb 1.14152 -9.59404 +lclavicle 3.33663e-015 3.57812e-015 +lhumerus -44.5388 27.2176 72.1122 +lradius 17.0035 +lwrist 8.01503 +lhand -20.1694 21.9569 +lfingers 7.12502 +lthumb 6.17632 51.8469 +rfemur 17.336 5.03879 23.3422 +rtibia 33.644 +rfoot -2.30331 -1.08434 +rtoes -30.7486 +lfemur -25.0313 -2.14567 -21.271 +ltibia 36.6884 +lfoot -5.37101 9.63359 +ltoes -3.04841 +284 +root 10.6836 17.3971 19.3268 -4.47567 -5.46618 -0.646143 +lowerback 5.42405 0.888638 2.51725 +upperback 1.89105 1.31225 -0.0382283 +thorax -1.03689 0.659906 -1.53201 +lowerneck -9.72267 1.29623 -0.545005 +upperneck -1.55662 1.83548 -3.38986 +head 1.17864 0.846378 -0.895801 +rclavicle 4.55186e-015 -7.95139e-016 +rhumerus -13.3239 12.1644 -85.8501 +rradius 50.6779 +rwrist -17.467 +rhand -25.5452 20.471 +rfingers 7.12502 +rthumb 0.985032 -9.50645 +lclavicle 4.55186e-015 -7.95139e-016 +lhumerus -44.1852 26.2227 73.0431 +lradius 17.6356 +lwrist 9.02239 +lhand -19.9109 22 +lfingers 7.12502 +lthumb 6.42584 51.8825 +rfemur 16.1202 5.17319 22.621 +rtibia 36.349 +rfoot 0.735435 -0.747772 +rtoes -31.9857 +lfemur -24.4372 -2.10045 -21.9169 +ltibia 37.046 +lfoot -6.20577 9.55629 +ltoes -1.79937 +285 +root 10.7193 17.4138 19.5249 -4.57015 -5.53698 -0.190332 +lowerback 5.3273 0.913039 2.23502 +upperback 1.88178 1.32599 -0.167412 +thorax -0.995537 0.667008 -1.50547 +lowerneck -10.0006 1.34062 -0.393708 +upperneck -1.21497 1.89718 -3.59137 +head 1.3439 0.864695 -0.982298 +rclavicle 5.63896e-015 -5.46658e-015 +rhumerus -13.8788 12.4976 -86.168 +rradius 50.0791 +rwrist -18.0027 +rhand -25.9475 20.5018 +rfingers 7.12502 +rthumb 0.596469 -9.47714 +lclavicle 5.63896e-015 -5.46658e-015 +lhumerus -43.3965 25.3034 74.112 +lradius 18.399 +lwrist 10.0883 +lhand -19.6419 22.3909 +lfingers 7.12502 +lthumb 6.6855 52.2654 +rfemur 14.9085 5.28488 21.8 +rtibia 39.0941 +rfoot 3.77909 -0.319275 +rtoes -34.7773 +lfemur -23.6544 -2.2237 -22.65 +ltibia 37.2794 +lfoot -7.17047 9.70717 +ltoes -0.659576 +286 +root 10.7477 17.4206 19.7062 -4.55603 -5.72879 -0.0430946 +lowerback 5.04849 1.0152 2.32082 +upperback 2.03816 1.45608 -0.28377 +thorax -0.668656 0.738167 -1.67234 +lowerneck -10.0631 1.25429 -0.638625 +upperneck -1.49706 1.7955 -3.28421 +head 1.25363 0.824906 -0.847126 +rclavicle -9.25281e-015 -4.02539e-015 +rhumerus -14.3107 12.6666 -86.4063 +rradius 49.6501 +rwrist -18.4653 +rhand -26.1497 20.7173 +rfingers 7.12502 +rthumb 0.401206 -9.26203 +lclavicle -9.25281e-015 -4.02539e-015 +lhumerus -42.1886 24.2329 75.3125 +lradius 19.2221 +lwrist 11.4706 +lhand -19.8123 22.7799 +lfingers 7.12502 +lthumb 6.521 52.6595 +rfemur 13.446 5.57914 21.4606 +rtibia 42.1001 +rfoot 6.47817 -0.126846 +rtoes -37.0885 +lfemur -22.9533 -2.23563 -22.9856 +ltibia 37.273 +lfoot -8.04823 9.80719 +ltoes 0.457696 +287 +root 10.7682 17.452 19.8808 -4.58908 -5.98783 0.275787 +lowerback 4.92517 1.10851 2.05083 +upperback 2.14949 1.56317 -0.3548 +thorax -0.486244 0.793841 -1.59501 +lowerneck -10.0966 1.32262 -0.600887 +upperneck -1.61125 1.88188 -3.44421 +head 1.22668 0.865705 -0.900357 +rclavicle -1.09844e-014 3.52843e-015 +rhumerus -14.4832 12.5594 -86.5693 +rradius 48.815 +rwrist -18.0294 +rhand -25.6729 20.7375 +rfingers 7.12502 +rthumb 0.861633 -9.24055 +lclavicle -1.09844e-014 3.52843e-015 +lhumerus -41.2029 23.1492 76.4714 +lradius 20.2664 +lwrist 12.9 +lhand -20.0554 22.9932 +lfingers 7.12502 +lthumb 6.28636 52.8799 +rfemur 11.7552 6.24467 21.0655 +rtibia 45.3279 +rfoot 8.97363 -0.460269 +rtoes -36.7108 +lfemur -22.1531 -1.85807 -23.5295 +ltibia 36.9961 +lfoot -8.51066 9.87048 +ltoes 1.09668 +288 +root 10.7829 17.4878 20.0382 -4.67136 -6.14569 0.765247 +lowerback 5.06518 1.14538 1.43917 +upperback 2.24265 1.58576 -0.384162 +thorax -0.484094 0.802336 -1.28553 +lowerneck -10.2905 1.44733 -0.698629 +upperneck -1.47931 2.06772 -3.51648 +head 1.30571 0.953151 -0.898063 +rclavicle 4.43228e-015 -5.1684e-015 +rhumerus -14.5068 12.6443 -86.6696 +rradius 47.7962 +rwrist -17.6111 +rhand -25.3528 20.9507 +rfingers 7.12502 +rthumb 1.17086 -9.02584 +lclavicle 4.43228e-015 -5.1684e-015 +lhumerus -40.3087 22.2107 77.605 +lradius 21.4242 +lwrist 13.9884 +lhand -20.0451 22.9761 +lfingers 7.12502 +lthumb 6.29627 52.8625 +rfemur 9.76127 6.89229 20.5175 +rtibia 48.5754 +rfoot 11.5859 -1.41621 +rtoes -35.4477 +lfemur -21.2653 -1.53864 -24.1905 +ltibia 36.4465 +lfoot -8.81477 9.84731 +ltoes 0.917356 +289 +root 10.8009 17.5238 20.188 -4.6569 -6.23394 1.24641 +lowerback 5.42705 1.13089 0.877678 +upperback 2.09683 1.54245 -0.467465 +thorax -0.849659 0.774714 -1.06466 +lowerneck -10.4684 1.43292 -0.793226 +upperneck -1.18885 2.0695 -3.38414 +head 1.42784 0.951033 -0.839205 +rclavicle -9.405e-015 -1.26228e-014 +rhumerus -15.0792 12.8205 -87.0536 +rradius 47.0479 +rwrist -17.3788 +rhand -25.4734 21.2128 +rfingers 7.12502 +rthumb 1.05433 -8.76438 +lclavicle -9.405e-015 -1.26228e-014 +lhumerus -39.6846 20.8895 78.6619 +lradius 22.2348 +lwrist 15.2513 +lhand -20.5219 21.8985 +lfingers 7.12502 +lthumb 5.83591 51.7981 +rfemur 7.39793 7.10948 19.8836 +rtibia 51.7074 +rfoot 14.232 -2.25003 +rtoes -37.1475 +lfemur -20.5032 -1.48196 -24.8042 +ltibia 35.8889 +lfoot -9.06977 9.86954 +ltoes 0.401033 +290 +root 10.8258 17.5797 20.3644 -4.66381 -6.3379 1.79482 +lowerback 5.63601 1.12903 0.420443 +upperback 1.87783 1.51425 -0.627487 +thorax -1.19925 0.75722 -0.978881 +lowerneck -10.0494 1.61892 -0.503135 +upperneck -1.26927 2.28247 -3.80518 +head 1.34334 1.0523 -1.01485 +rclavicle -1.83161e-014 2.98177e-016 +rhumerus -15.8161 12.7553 -87.5057 +rradius 46.2606 +rwrist -16.6561 +rhand -25.4369 20.8063 +rfingers 7.12502 +rthumb 1.0896 -9.17064 +lclavicle -1.83161e-014 2.98177e-016 +lhumerus -39.4109 19.5479 79.5215 +lradius 23.1457 +lwrist 16.4629 +lhand -21.4475 20.5307 +lfingers 7.12502 +lthumb 4.9423 50.453 +rfemur 4.89755 7.12751 19.1578 +rtibia 54.5615 +rfoot 16.539 -2.47487 +rtoes -40.3159 +lfemur -19.4817 -1.39622 -25.5827 +ltibia 35.2185 +lfoot -9.3175 10.0003 +ltoes -0.555673 +291 +root 10.846 17.5617 20.5431 -4.94086 -6.29014 2.28892 +lowerback 5.65359 1.10754 0.0873054 +upperback 1.9819 1.46542 -0.778358 +thorax -1.10754 0.733226 -0.942807 +lowerneck -9.68189 1.77317 -0.165575 +upperneck -1.57808 2.44578 -4.45627 +head 1.20104 1.12795 -1.27475 +rclavicle 3.75827e-015 3.08116e-015 +rhumerus -16.1364 12.8793 -87.7351 +rradius 45.1251 +rwrist -16.2456 +rhand -24.9621 20.7893 +rfingers 7.12502 +rthumb 1.54816 -9.18481 +lclavicle 3.75827e-015 3.08116e-015 +lhumerus -38.8986 18.6565 80.2169 +lradius 24.3355 +lwrist 17.2529 +lhand -21.8751 19.9123 +lfingers 7.12502 +lthumb 4.52942 49.8438 +rfemur 4.38569 7.21928 18.4977 +rtibia 57.1788 +rfoot 15.9408 -4.70862 +rtoes -36.955 +lfemur -18.3481 -1.29677 -26.3621 +ltibia 34.8662 +lfoot -9.83104 9.99836 +ltoes -1.11335 +292 +root 10.8598 17.5723 20.7141 -5.25762 -6.17019 2.70518 +lowerback 5.65495 1.03324 -0.398092 +upperback 2.21776 1.34133 -0.815226 +thorax -0.878378 0.670536 -0.697639 +lowerneck -9.6503 1.7366 -0.649145 +upperneck -1.89196 2.42723 -3.94617 +head 1.0755 1.13633 -1.03072 +rclavicle -1.49337e-014 -4.77083e-015 +rhumerus -16.2906 13.2429 -87.8802 +rradius 43.7651 +rwrist -16.1196 +rhand -24.3239 21.5231 +rfingers 7.12502 +rthumb 2.16455 -8.44566 +lclavicle -1.49337e-014 -4.77083e-015 +lhumerus -38.0482 17.7524 81.044 +lradius 25.3374 +lwrist 18.2831 +lhand -21.9903 19.5338 +lfingers 7.12502 +lthumb 4.41813 49.4677 +rfemur 3.34701 6.81141 17.8952 +rtibia 59.505 +rfoot 15.6727 -6.17771 +rtoes -36.1008 +lfemur -17.3816 -1.29501 -27.0125 +ltibia 34.9956 +lfoot -10.6386 9.94788 +ltoes -1.00782 +293 +root 10.8656 17.5994 20.8686 -5.49652 -6.41534 2.16479 +lowerback 5.96436 0.98995 -0.0674646 +upperback 2.40393 1.30387 -0.541492 +thorax -0.858555 0.652237 -0.603621 +lowerneck -9.99589 1.81778 -0.461978 +upperneck -1.66238 2.5369 -4.3799 +head 1.22334 1.17326 -1.19411 +rclavicle 3.68994e-015 1.17283e-014 +rhumerus -16.4193 13.3102 -88.1136 +rradius 42.4758 +rwrist -15.6282 +rhand -23.9002 21.1626 +rfingers 7.12502 +rthumb 2.57378 -8.80164 +lclavicle 3.68994e-015 1.17283e-014 +lhumerus -37.2532 16.9197 81.8203 +lradius 26.3476 +lwrist 19.1477 +lhand -22.1997 19.2263 +lfingers 7.12502 +lthumb 4.21595 49.1643 +rfemur 1.90017 6.54298 18.6718 +rtibia 61.7227 +rfoot 15.9309 -7.30964 +rtoes -37.971 +lfemur -16.6266 -1.22486 -26.4379 +ltibia 35.2297 +lfoot -11.3708 9.90649 +ltoes -0.202853 +294 +root 10.8658 17.6282 21.0099 -5.97213 -7.33656 -0.390451 +lowerback 7.15771 1.03858 2.32764 +upperback 2.53646 1.54168 0.260598 +thorax -1.33941 0.773867 -1.16326 +lowerneck -10.0781 2.04156 0.217171 +upperneck -1.44494 2.78901 -5.36028 +head 1.34951 1.27046 -1.61599 +rclavicle -3.83282e-015 -1.78906e-014 +rhumerus -16.7604 12.9343 -88.4044 +rradius 41.1253 +rwrist -15.1098 +rhand -23.1237 20.5787 +rfingers 7.12502 +rthumb 3.3236 -9.37512 +lclavicle -3.83282e-015 -1.78906e-014 +lhumerus -36.7849 16.0496 82.4215 +lradius 27.6577 +lwrist 19.5469 +lhand -21.9167 19.9948 +lfingers 7.12502 +lthumb 4.48924 49.9272 +rfemur 0.782019 7.21271 22.1642 +rtibia 63.6596 +rfoot 15.7794 -10.1678 +rtoes -36.71 +lfemur -15.463 -0.757642 -23.4882 +ltibia 35.2948 +lfoot -11.9707 9.87227 +ltoes 0.268592 +295 +root 10.886 17.6548 21.1539 -5.48153 -6.74232 0.406379 +lowerback 6.66667 0.915841 1.52482 +upperback 2.43704 1.31275 0.0531461 +thorax -1.19193 0.658999 -0.8998 +lowerneck -9.76243 2.14477 -0.225247 +upperneck -1.82787 2.94298 -4.82814 +head 1.15285 1.37163 -1.36254 +rclavicle -1.26353e-014 8.74653e-015 +rhumerus -17.0213 12.2355 -88.5672 +rradius 40.6439 +rwrist -13.9062 +rhand -24.9678 18.6169 +rfingers 7.12502 +rthumb 1.54266 -11.3573 +lclavicle -1.26353e-014 8.74653e-015 +lhumerus -36.1586 14.8841 83.1895 +lradius 29.0665 +lwrist 20.3707 +lhand -21.5532 21.1668 +lfingers 7.12502 +lthumb 4.84022 51.0916 +rfemur -1.58622 6.67281 21.0296 +rtibia 65.6774 +rfoot 14.0318 -12.465 +rtoes -33.42 +lfemur -15.3391 -1.13678 -24.5806 +ltibia 34.9223 +lfoot -12.3863 9.78801 +ltoes 0.271166 +296 +root 10.9083 17.6742 21.3133 -5.39046 -6.20023 1.51047 +lowerback 6.19889 0.82005 0.522806 +upperback 2.63585 1.11415 -0.292604 +thorax -0.745906 0.560167 -0.668292 +lowerneck -9.94749 2.08269 -0.371872 +upperneck -2.01638 2.86675 -4.55273 +head 1.11299 1.3408 -1.2515 +rclavicle 1.12997e-014 5.96354e-015 +rhumerus -17.048 11.3867 -88.589 +rradius 38.6225 +rwrist -13.0673 +rhand -21.927 20.1645 +rfingers 7.12502 +rthumb 4.47922 -9.76814 +lclavicle 1.12997e-014 5.96354e-015 +lhumerus -35.2625 13.85 83.8541 +lradius 30.357 +lwrist 21.3049 +lhand -21.8707 21.2661 +lfingers 7.12502 +lthumb 4.53362 51.1976 +rfemur -3.34433 6.00377 19.5687 +rtibia 67.5074 +rfoot 12.2681 -13.6113 +rtoes -32.7013 +lfemur -14.5435 -1.34577 -26.0498 +ltibia 34.2959 +lfoot -12.7201 9.6922 +ltoes 0.0739399 +297 +root 10.9217 17.6938 21.4603 -5.49106 -5.9206 2.36235 +lowerback 6.5261 0.735758 -0.453338 +upperback 2.53277 0.941122 -0.44752 +thorax -1.04934 0.468604 -0.273921 +lowerneck -9.95442 2.0167 -0.0899329 +upperneck -1.85841 2.76239 -5.01503 +head 1.1789 1.27502 -1.45232 +rclavicle 1.4971e-014 -3.37934e-015 +rhumerus -17.5908 11.3759 -88.7584 +rradius 37.2733 +rwrist -12.5061 +rhand -21.9223 20.0621 +rfingers 7.12502 +rthumb 4.48377 -9.87044 +lclavicle 1.4971e-014 -3.37934e-015 +lhumerus -34.955 13.2641 84.2073 +lradius 31.583 +lwrist 21.3594 +lhand -22.3797 20.4441 +lfingers 7.12502 +lthumb 4.04209 50.3855 +rfemur -5.18126 5.84582 18.5468 +rtibia 69.2366 +rfoot 10.2978 -15.3364 +rtoes -29.7856 +lfemur -13.3662 -1.35127 -27.1636 +ltibia 33.2147 +lfoot -12.5542 9.59454 +ltoes 0.271089 +298 +root 10.9388 17.7118 21.6149 -5.34183 -5.60573 2.37788 +lowerback 6.64185 0.586005 -0.528404 +upperback 2.30894 0.737064 -0.338741 +thorax -1.34643 0.366683 -0.108006 +lowerneck -9.4572 2.085 -0.155093 +upperneck -1.93649 2.85205 -5.21992 +head 1.07342 1.3245 -1.50572 +rclavicle 5.34234e-015 3.18055e-015 +rhumerus -18.3421 10.9573 -88.8662 +rradius 35.9255 +rwrist -11.7615 +rhand -21.7377 19.8231 +rfingers 7.12502 +rthumb 4.66207 -10.1056 +lclavicle 5.34234e-015 3.18055e-015 +lhumerus -34.8355 12.6229 84.6495 +lradius 32.7393 +lwrist 21.3453 +lhand -22.5072 20.0288 +lfingers 7.12502 +lthumb 3.91898 49.9725 +rfemur -7.00679 5.75269 18.4725 +rtibia 70.5415 +rfoot 8.24063 -17.2341 +rtoes -25.8584 +lfemur -12.4249 -1.42377 -27.3547 +ltibia 32.2148 +lfoot -12.4926 9.34321 +ltoes 0.931022 +299 +root 10.9719 17.7236 21.7928 -5.22632 -4.90507 2.39185 +lowerback 6.17563 0.315343 -0.303691 +upperback 2.40254 0.394457 -0.357819 +thorax -0.988822 0.19612 -0.224162 +lowerneck -9.37493 2.13057 -0.0171144 +upperneck -1.9323 2.90129 -5.47716 +head 1.07081 1.34475 -1.61105 +rclavicle 1.56543e-015 6.55989e-015 +rhumerus -18.8883 10.3424 -88.9074 +rradius 34.8458 +rwrist -11.1294 +rhand -21.5514 19.4891 +rfingers 7.12502 +rthumb 4.84198 -10.4356 +lclavicle 1.56543e-015 6.55989e-015 +lhumerus -34.2167 11.5377 85.2113 +lradius 33.8156 +lwrist 21.9646 +lhand -21.8559 20.9538 +lfingers 7.12502 +lthumb 4.54789 50.885 +rfemur -8.12579 4.98715 18.2284 +rtibia 71.4772 +rfoot 5.90349 -18.4821 +rtoes -23.1027 +lfemur -11.3887 -1.74429 -27.6708 +ltibia 31.3437 +lfoot -12.7626 9.03786 +ltoes 0.567122 +300 +root 10.9988 17.7471 21.9622 -5.23143 -4.21078 2.5812 +lowerback 6.23167 0.0292796 -0.50811 +upperback 2.25788 0.00142483 -0.330838 +thorax -1.16918 -0.000555337 -0.0546844 +lowerneck -9.50436 2.16312 0.193015 +upperneck -1.35623 2.95985 -5.82476 +head 1.29393 1.35268 -1.75779 +rclavicle 8.64713e-015 -2.78299e-015 +rhumerus -19.9507 10.0651 -89.0053 +rradius 33.9117 +rwrist -10.954 +rhand -21.6437 19.4031 +rfingers 7.12502 +rthumb 4.7528 -10.5236 +lclavicle 8.64713e-015 -2.78299e-015 +lhumerus -33.9634 10.4732 85.6065 +lradius 35.0808 +lwrist 22.8128 +lhand -20.9656 22.7366 +lfingers 7.12502 +lthumb 5.40754 52.6476 +rfemur -9.2252 4.39457 17.8185 +rtibia 72.2059 +rfoot 3.25403 -19.439 +rtoes -18.2203 +lfemur -10.3672 -2.07458 -28.1458 +ltibia 30.6879 +lfoot -13.0821 8.79065 +ltoes 0.405348 +301 +root 11.0032 17.7698 22.1076 -5.22153 -3.81459 2.82532 +lowerback 6.71931 -0.0674876 -1.04386 +upperback 1.92702 -0.166184 -0.219479 +thorax -1.778 -0.0818686 0.37387 +lowerneck -8.84159 2.28723 -0.289291 +upperneck -1.31382 3.15993 -5.52223 +head 1.17985 1.46942 -1.57102 +rclavicle -1.20886e-014 0 +rhumerus -21.1787 9.66401 -89.0318 +rradius 32.9542 +rwrist -10.8703 +rhand -22.2246 19.2749 +rfingers 7.12502 +rthumb 4.19184 -10.6636 +lclavicle -1.20886e-014 0 +lhumerus -33.9119 9.45403 86.0542 +lradius 36.4749 +lwrist 23.9063 +lhand -20.7722 24.2867 +lfingers 7.12502 +lthumb 5.59426 54.1928 +rfemur -10.7912 4.32647 17.615 +rtibia 72.8085 +rfoot 1.3696 -20.2671 +rtoes -13.3308 +lfemur -9.5722 -2.10005 -28.5303 +ltibia 30.1471 +lfoot -13.1305 8.67596 +ltoes -0.347796 +302 +root 10.9977 17.7594 22.2538 -5.41272 -3.63854 3.08716 +lowerback 6.89474 0.0479318 -1.51713 +upperback 2.06969 -0.045166 -0.170063 +thorax -1.72963 -0.0219319 0.680649 +lowerneck -8.47812 2.21809 -0.580756 +upperneck -1.53564 3.07689 -5.48669 +head 1.03633 1.4401 -1.51464 +rclavicle 3.10601e-015 1.63003e-014 +rhumerus -21.7064 8.88685 -88.7945 +rradius 32.0852 +rwrist -10.5207 +rhand -22.6205 18.2221 +rfingers 7.12502 +rthumb 3.80958 -11.7236 +lclavicle 3.10601e-015 1.63003e-014 +lhumerus -33.1381 8.04287 86.8048 +lradius 37.4539 +lwrist 24.7517 +lhand -21.0663 24.2469 +lfingers 7.12502 +lthumb 5.31029 54.1604 +rfemur -12.1624 4.40269 17.5585 +rtibia 73.289 +rfoot 0.320004 -20.9337 +rtoes -12.4246 +lfemur -8.67229 -1.88971 -28.888 +ltibia 29.7822 +lfoot -13.2396 8.68165 +ltoes -1.8933 +303 +root 11.0011 17.7632 22.4228 -5.59834 -3.37741 2.92918 +lowerback 6.63901 0.0551369 -1.41649 +upperback 2.41998 -0.0200567 -0.113073 +thorax -1.22771 -0.0147147 0.68043 +lowerneck -8.85644 1.91433 -0.567367 +upperneck -1.452 2.68124 -5.33651 +head 1.11528 1.23803 -1.48125 +rclavicle -1.23868e-014 -3.18055e-015 +rhumerus -22.1081 7.92329 -88.6353 +rradius 31.2384 +rwrist -10.2605 +rhand -22.3679 17.5835 +rfingers 7.12502 +rthumb 4.05347 -12.3577 +lclavicle -1.23868e-014 -3.18055e-015 +lhumerus -32.2112 6.50721 87.4405 +lradius 38.2446 +lwrist 25.2894 +lhand -21.7048 22.6324 +lfingers 7.12502 +lthumb 4.69383 52.5604 +rfemur -13.1444 4.31826 17.9091 +rtibia 73.4029 +rfoot -0.117654 -21.2111 +rtoes -15.7595 +lfemur -7.76479 -1.87216 -28.8302 +ltibia 29.7288 +lfoot -13.8006 8.57651 +ltoes -3.56579 +304 +root 11.0062 17.7853 22.5803 -5.50696 -3.04151 2.30439 +lowerback 6.29395 -0.0418062 -0.917456 +upperback 2.66325 -0.109286 0.0992014 +thorax -0.784859 -0.0614474 0.624189 +lowerneck -8.74927 1.94038 -0.186565 +upperneck -1.74424 2.66796 -5.68289 +head 1.01777 1.23172 -1.65989 +rclavicle 1.61513e-016 9.54166e-015 +rhumerus -22.5521 7.26211 -88.5285 +rradius 30.202 +rwrist -10.7013 +rhand -22.1947 18.203 +rfingers 7.12502 +rthumb 4.22072 -11.735 +lclavicle 1.61513e-016 9.54166e-015 +lhumerus -31.3042 5.35119 87.8971 +lradius 39.3787 +lwrist 25.9037 +lhand -22.3467 21.7142 +lfingers 7.12502 +lthumb 4.07394 51.655 +rfemur -14.409 4.32706 18.7452 +rtibia 73.2736 +rfoot -0.565898 -21.311 +rtoes -17.9428 +lfemur -7.41968 -2.06416 -28.2348 +ltibia 30.0709 +lfoot -14.5064 8.36457 +ltoes -4.3965 +305 +root 11.0083 17.78 22.7218 -5.38095 -2.65325 1.95705 +lowerback 6.2728 -0.156908 -0.833669 +upperback 2.67871 -0.254377 0.320968 +thorax -0.753987 -0.134653 0.814703 +lowerneck -8.33241 2.02654 -0.214267 +upperneck -2.03723 2.76287 -5.67174 +head 0.854534 1.29225 -1.65016 +rclavicle 6.90777e-015 2.38542e-015 +rhumerus -23.1716 7.21822 -88.5001 +rradius 28.9577 +rwrist -11.5856 +rhand -22.7059 18.9443 +rfingers 7.12502 +rthumb 3.72713 -11.0028 +lclavicle 6.90777e-015 2.38542e-015 +lhumerus -30.7008 4.72268 88.1877 +lradius 40.8254 +lwrist 25.8423 +lhand -22.4612 21.9441 +lfingers 7.12502 +lthumb 3.9634 51.887 +rfemur -15.7794 4.35622 19.2694 +rtibia 73.0333 +rfoot -1.11044 -21.3325 +rtoes -18.9282 +lfemur -7.23972 -2.18773 -27.9299 +ltibia 30.4208 +lfoot -14.9572 8.08956 +ltoes -4.22633 +306 +root 11.0192 17.7427 22.8629 -5.1674 -2.02762 2.03239 +lowerback 6.35351 -0.341214 -0.981119 +upperback 2.49836 -0.508856 0.328376 +thorax -0.977583 -0.260501 0.923845 +lowerneck -8.51192 1.93964 -0.0932313 +upperneck -1.63165 2.66048 -5.71003 +head 1.01508 1.2287 -1.68642 +rclavicle -4.00054e-015 1.59028e-015 +rhumerus -23.9816 7.25286 -88.6727 +rradius 27.5699 +rwrist -12.3138 +rhand -23.4631 19.2233 +rfingers 7.12502 +rthumb 2.99592 -10.7354 +lclavicle -4.00054e-015 1.59028e-015 +lhumerus -30.4271 3.97129 88.3312 +lradius 42.1859 +lwrist 25.5926 +lhand -22.3194 22.2467 +lfingers 7.12502 +lthumb 4.10034 52.187 +rfemur -17.2157 4.05137 19.164 +rtibia 72.716 +rfoot -1.78568 -21.1288 +rtoes -20.7767 +lfemur -7.00665 -2.37878 -28.1594 +ltibia 30.5126 +lfoot -15.202 7.84896 +ltoes -4.74141 +307 +root 11.0344 17.7352 23.0193 -5.11623 -1.33108 2.32561 +lowerback 6.48079 -0.472321 -1.2061 +upperback 2.44029 -0.699446 0.242035 +thorax -1.10177 -0.355084 0.976566 +lowerneck -8.94987 1.8101 -0.186432 +upperneck -1.10295 2.53046 -5.62598 +head 1.25355 1.14788 -1.64679 +rclavicle 3.80176e-015 -3.18055e-015 +rhumerus -24.7417 5.69876 -88.403 +rradius 26.4914 +rwrist -11.621 +rhand -23.4851 18.98 +rfingers 7.12502 +rthumb 2.97459 -10.979 +lclavicle 3.80176e-015 -3.18055e-015 +lhumerus -30.0299 2.85327 88.6153 +lradius 43.3512 +lwrist 25.6848 +lhand -22.0098 21.949 +lfingers 7.12502 +lthumb 4.39932 51.8833 +rfemur -18.3643 3.73662 18.6998 +rtibia 72.1184 +rfoot -2.8839 -20.663 +rtoes -20.8357 +lfemur -6.42703 -2.66103 -28.6643 +ltibia 30.5042 +lfoot -15.5968 7.78729 +ltoes -5.71229 +308 +root 11.046 17.7581 23.2001 -5.36414 -0.822342 2.66305 +lowerback 6.5305 -0.550649 -1.63456 +upperback 2.5784 -0.829477 0.251246 +thorax -0.977232 -0.423684 1.23545 +lowerneck -9.22356 1.6933 -0.374904 +upperneck -0.7813 2.41342 -5.5127 +head 1.39631 1.08119 -1.58174 +rclavicle 6.31141e-015 3.97569e-016 +rhumerus -25.5561 2.93181 -87.5816 +rradius 25.9267 +rwrist -9.89591 +rhand -22.5278 18.4675 +rfingers 7.12502 +rthumb 3.89915 -11.4766 +lclavicle 6.31141e-015 3.97569e-016 +lhumerus -29.6379 2.16237 88.9524 +lradius 44.5988 +lwrist 25.8256 +lhand -22.0499 18.5356 +lfingers 7.12502 +lthumb 4.36059 48.4707 +rfemur -18.8684 3.72216 18.2707 +rtibia 71.1262 +rfoot -4.18923 -19.9468 +rtoes -21.3617 +lfemur -5.24858 -2.79104 -29.1863 +ltibia 30.2421 +lfoot -16.2172 7.69768 +ltoes -5.86841 +309 +root 11.0566 17.7593 23.3603 -5.24662 -0.493655 2.2856 +lowerback 6.18561 -0.661902 -1.40886 +upperback 2.76539 -0.955003 0.476658 +thorax -0.589226 -0.490813 1.34252 +lowerneck -9.44928 1.66204 -0.397622 +upperneck -0.743004 2.38102 -5.5192 +head 1.44731 1.06067 -1.58074 +rclavicle -4.02539e-015 -7.95139e-016 +rhumerus -25.9756 1.28376 -86.9288 +rradius 25.1062 +rwrist -9.13722 +rhand -21.5281 18.1038 +rfingers 7.12502 +rthumb 4.8644 -11.8204 +lclavicle -4.02539e-015 -7.95139e-016 +lhumerus -28.9187 1.79655 89.1886 +lradius 45.9687 +lwrist 26.3222 +lhand -22.3167 20.2572 +lfingers 7.12502 +lthumb 4.103 50.1975 +rfemur -19.7378 3.91331 18.7261 +rtibia 69.8772 +rfoot -4.9771 -19.3691 +rtoes -23.7273 +lfemur -4.41459 -2.89011 -28.8358 +ltibia 29.5245 +lfoot -16.5469 7.40313 +ltoes -4.91896 +310 +root 11.0761 17.7547 23.5306 -5.15465 -0.0193748 2.46803 +lowerback 5.78131 -0.75965 -1.53421 +upperback 2.93517 -1.08547 0.449521 +thorax -0.183769 -0.561624 1.3848 +lowerneck -9.62013 1.48903 -0.84232 +upperneck -0.71441 2.19191 -5.0368 +head 1.4644 0.974579 -1.35536 +rclavicle -3.77691e-015 -3.97569e-015 +rhumerus -26.5033 0.481459 -86.5842 +rradius 24.0939 +rwrist -9.08418 +rhand -21.2945 17.7373 +rfingers 7.12502 +rthumb 5.08999 -12.1816 +lclavicle -3.77691e-015 -3.97569e-015 +lhumerus -28.2208 1.14573 89.318 +lradius 47.3879 +lwrist 26.7244 +lhand -22.0729 21.5838 +lfingers 7.12502 +lthumb 4.33834 51.5193 +rfemur -20.5482 3.85781 18.3767 +rtibia 68.4453 +rfoot -5.25483 -18.6992 +rtoes -24.59 +lfemur -3.46645 -3.09186 -29.1785 +ltibia 28.6998 +lfoot -16.6749 7.14879 +ltoes -4.43787 +311 +root 11.0957 17.757 23.736 -5.58167 0.602993 3.71002 +lowerback 5.69054 -0.793729 -2.67523 +upperback 3.17259 -1.18452 0.0963482 +thorax 0.132387 -0.626883 1.66318 +lowerneck -9.68237 1.24919 -1.4188 +upperneck -0.634263 1.92505 -4.39453 +head 1.47584 0.854299 -1.06185 +rclavicle -1.06847e-015 4.37326e-015 +rhumerus -27.4086 -1.16635 -86.0179 +rradius 23.2117 +rwrist -8.33673 +rhand -21.4211 17.4025 +rfingers 7.12502 +rthumb 4.96777 -12.5193 +lclavicle -1.06847e-015 4.37326e-015 +lhumerus -27.8497 0.132874 89.4576 +lradius 48.7345 +lwrist 27.0439 +lhand -22.0938 21.612 +lfingers 7.12502 +lthumb 4.31822 51.548 +rfemur -20.6396 3.68711 16.698 +rtibia 66.9542 +rfoot -6.56866 -17.5516 +rtoes -22.2906 +lfemur -1.85051 -3.13296 -30.78 +ltibia 28.178 +lfoot -17.0903 7.02864 +ltoes -5.21453 +312 +root 11.0914 17.7647 23.9127 -5.76166 0.719468 3.51803 +lowerback 6.15704 -0.757019 -2.7332 +upperback 2.96704 -1.15417 0.251765 +thorax -0.335112 -0.60467 1.86453 +lowerneck -9.63309 1.25388 -1.45189 +upperneck -0.255876 1.94599 -4.23997 +head 1.58793 0.861317 -1.00679 +rclavicle -1.37658e-014 1.19271e-015 +rhumerus -28.7815 -3.3443 -85.1193 +rradius 22.5262 +rwrist -6.29455 +rhand -21.5397 16.735 +rfingers 7.12502 +rthumb 4.85326 -13.1894 +lclavicle -1.37658e-014 1.19271e-015 +lhumerus -28.023 -0.720748 89.6228 +lradius 50.1297 +lwrist 27.6491 +lhand -22.442 21.0577 +lfingers 7.12502 +lthumb 3.98191 51.0002 +rfemur -21.1123 4.43034 16.9126 +rtibia 65.3066 +rfoot -8.45368 -16.8628 +rtoes -18.4148 +lfemur -0.733968 -3.00976 -30.5941 +ltibia 27.6753 +lfoot -16.9942 6.97812 +ltoes -6.74162 +313 +root 11.0832 17.7566 24.0663 -5.778 0.539303 2.52479 +lowerback 6.88702 -0.69854 -2.04846 +upperback 2.50039 -1.05248 0.649454 +thorax -1.23202 -0.534685 1.90035 +lowerneck -8.89275 1.41785 -1.41725 +upperneck -0.119166 2.14334 -4.17166 +head 1.50365 0.967693 -0.985377 +rclavicle -2.00773e-014 1.07344e-014 +rhumerus -30.5232 -4.56168 -84.3907 +rradius 22.3552 +rwrist -4.03721 +rhand -21.3142 14.0002 +rfingers 7.12502 +rthumb 5.07097 -15.9192 +lclavicle -2.00773e-014 1.07344e-014 +lhumerus -28.5887 -1.31973 89.8056 +lradius 51.4836 +lwrist 27.8373 +lhand -22.9127 19.8876 +lfingers 7.12502 +lthumb 3.52743 49.8382 +rfemur -21.8492 5.41504 18.1448 +rtibia 63.5606 +rfoot -9.68171 -16.594 +rtoes -16.1518 +lfemur 0.19758 -2.86536 -29.4481 +ltibia 26.7933 +lfoot -16.4416 6.91201 +ltoes -6.99353 +314 +root 11.0948 17.7357 24.216 -5.59285 1.13413 2.86305 +lowerback 6.81422 -0.817649 -2.45296 +upperback 2.52378 -1.23608 0.600001 +thorax -1.15059 -0.628872 2.08892 +lowerneck -8.75986 1.43698 -1.38727 +upperneck -0.326003 2.1542 -4.19945 +head 1.41419 0.978411 -0.999262 +rclavicle -1.99282e-014 -7.95139e-016 +rhumerus -31.2837 -5.13362 -84.0793 +rradius 21.0592 +rwrist -5.09044 +rhand -21.8283 16.6073 +rfingers 7.12502 +rthumb 4.57456 -13.3233 +lclavicle -1.99282e-014 -7.95139e-016 +lhumerus -28.212 -2.01193 89.9957 +lradius 52.5071 +lwrist 27.5358 +lhand -24.0355 17.5527 +lfingers 7.12502 +lthumb 2.44308 47.5185 +rfemur -22.5699 5.16844 17.6065 +rtibia 61.5929 +rfoot -10.2991 -15.9519 +rtoes -16.1026 +lfemur 0.716325 -3.10964 -29.8987 +ltibia 26.4878 +lfoot -16.8884 6.45222 +ltoes -3.42154 +315 +root 11.1338 17.7148 24.3616 -5.33806 2.65018 5.07895 +lowerback 6.5708 -1.13286 -4.32349 +upperback 2.78482 -1.7682 -0.107411 +thorax -0.67889 -0.913128 2.43712 +lowerneck -9.21272 1.35626 -1.27436 +upperneck -0.549794 2.04052 -4.28431 +head 1.42267 0.918983 -1.04822 +rclavicle -1.18525e-014 8.74653e-015 +rhumerus -31.4898 -6.87082 -83.3338 +rradius 19.747 +rwrist -4.26085 +rhand -21.9185 17.6319 +rfingers 7.12502 +rthumb 4.48749 -12.3005 +lclavicle -1.18525e-014 8.74653e-015 +lhumerus -27.2727 -2.65635 90.0168 +lradius 53.6563 +lwrist 27.8217 +lhand -24.288 16.8647 +lfingers 7.12502 +lthumb 2.19922 46.8331 +rfemur -23.1029 3.58099 14.6027 +rtibia 59.539 +rfoot -10.8391 -14.7058 +rtoes -17.1874 +lfemur 1.35925 -3.93183 -32.6424 +ltibia 26.2333 +lfoot -17.4302 6.02387 +ltoes -1.13464 +316 +root 11.0934 17.7272 24.5576 -5.54263 1.79947 3.93013 +lowerback 6.4874 -0.767054 -3.9321 +upperback 2.92143 -1.24578 0.39794 +thorax -0.52771 -0.657761 2.70102 +lowerneck -9.69917 1.13065 -1.64578 +upperneck -0.23242 1.78949 -3.62448 +head 1.59323 0.79768 -0.784706 +rclavicle 1.59276e-014 -9.54166e-015 +rhumerus -32.468 -8.44519 -82.4472 +rradius 18.8749 +rwrist -3.25008 +rhand -22.0264 17.3407 +rfingers 7.12502 +rthumb 4.38325 -12.5939 +lclavicle 1.59276e-014 -9.54166e-015 +lhumerus -26.9341 -3.11653 90.0035 +lradius 55.1665 +lwrist 28.3502 +lhand -23.2568 18.8015 +lfingers 7.12502 +lthumb 3.19513 48.7573 +rfemur -23.253 5.52745 16.3365 +rtibia 56.702 +rfoot -10.9684 -15.203 +rtoes -18.1289 +lfemur 1.8935 -3.29879 -31.1279 +ltibia 26.5398 +lfoot -18.1726 6.11158 +ltoes -2.20413 +317 +root 11.1144 17.728 24.6889 -5.03132 2.64567 4.08921 +lowerback 6.67794 -0.916737 -3.98832 +upperback 2.74154 -1.46018 0.339155 +thorax -0.802929 -0.756076 2.69268 +lowerneck -10.375 1.1376 -1.32474 +upperneck 0.144069 1.79715 -3.69568 +head 1.84311 0.786278 -0.860524 +rclavicle 2.44257e-014 -5.56597e-015 +rhumerus -33.3312 -9.89864 -81.6053 +rradius 18.1307 +rwrist -2.50784 +rhand -22.264 17.2398 +rfingers 7.12502 +rthumb 4.15384 -12.6995 +lclavicle 2.44257e-014 -5.56597e-015 +lhumerus -26.5116 -3.60271 90.0603 +lradius 56.5815 +lwrist 28.1247 +lhand -23.3229 19.6741 +lfingers 7.12502 +lthumb 3.13129 49.6309 +rfemur -23.8267 5.02259 15.852 +rtibia 53.7309 +rfoot -10.9107 -14.6623 +rtoes -19.7334 +lfemur 1.83076 -3.661 -31.3873 +ltibia 26.7496 +lfoot -18.3208 5.97282 +ltoes -4.15477 +318 +root 11.0718 17.7426 24.8268 -4.98463 1.97163 1.36397 +lowerback 6.80421 -0.718258 -1.76801 +upperback 2.89228 -1.04968 1.11798 +thorax -0.778684 -0.542769 2.21973 +lowerneck -10.9044 1.14259 -0.879618 +upperneck 0.0776132 1.76473 -3.85619 +head 1.92439 0.762508 -0.98926 +rclavicle -3.77691e-015 9.54166e-015 +rhumerus -33.8497 -11.7636 -80.8564 +rradius 17.2114 +rwrist -1.38503 +rhand -22.305 17.3043 +rfingers 7.12502 +rthumb 4.11422 -12.6357 +lclavicle -3.77691e-015 9.54166e-015 +lhumerus -25.8597 -4.31941 89.9062 +lradius 57.7225 +lwrist 27.8179 +lhand -24.2625 18.5287 +lfingers 7.12502 +lthumb 2.22388 48.4968 +rfemur -24.1837 6.87788 19.1709 +rtibia 50.2962 +rfoot -9.91521 -15.7108 +rtoes -20.8996 +lfemur 1.82182 -3.49798 -28.156 +ltibia 27.1673 +lfoot -18.6206 6.0359 +ltoes -5.13222 +319 +root 11.0708 17.7377 24.9725 -4.82166 2.3847 0.883343 +lowerback 6.64703 -0.849986 -1.19522 +upperback 3.06784 -1.18795 1.13556 +thorax -0.515876 -0.611529 1.92056 +lowerneck -11.1177 1.20928 -0.605546 +upperneck -0.141762 1.81886 -3.97702 +head 1.89664 0.788159 -1.07212 +rclavicle -7.03201e-015 -1.55052e-014 +rhumerus -34.4666 -13.9852 -79.8957 +rradius 16.2346 +rwrist 0.565758 +rhand -22.108 17.2023 +rfingers 7.12502 +rthumb 4.30451 -12.734 +lclavicle -7.03201e-015 -1.55052e-014 +lhumerus -25.277 -4.87837 89.6409 +lradius 58.8114 +lwrist 27.9204 +lhand -24.5903 17.2912 +lfingers 7.12502 +lthumb 1.90727 47.2625 +rfemur -24.3894 7.02308 19.5586 +rtibia 47.0585 +rfoot -9.40944 -15.784 +rtoes -20.383 +lfemur 2.13876 -3.67908 -27.5971 +ltibia 27.2588 +lfoot -18.9577 5.65458 +ltoes -4.79999 +320 +root 11.1032 17.7337 25.1261 -4.28852 3.7329 2.00567 +lowerback 5.53602 -1.271 -1.9862 +upperback 3.55677 -1.77672 0.757701 +thorax 0.642171 -0.928918 1.97684 +lowerneck -11.3409 1.2131 -1.05892 +upperneck -0.751709 1.84872 -3.46919 +head 1.72067 0.824933 -0.827946 +rclavicle 1.20265e-014 -8.34896e-015 +rhumerus -34.546 -16.2428 -78.848 +rradius 15.3313 +rwrist 2.87915 +rhand -21.9029 17.1569 +rfingers 7.12502 +rthumb 4.50253 -12.7752 +lclavicle 1.20265e-014 -8.34896e-015 +lhumerus -24.0853 -4.98397 89.4738 +lradius 59.8715 +lwrist 27.9694 +lhand -24.4643 16.3968 +lfingers 7.12502 +lthumb 2.02897 46.3669 +rfemur -24.623 5.70829 17.9031 +rtibia 43.8234 +rfoot -9.37782 -15.1634 +rtoes -19.0674 +lfemur 2.39968 -4.01771 -28.9018 +ltibia 27.1457 +lfoot -19.1037 5.05843 +ltoes -5.17129 +321 +root 11.0805 17.7388 25.3052 -4.26439 3.66506 1.21597 +lowerback 6.32507 -1.24744 -1.59306 +upperback 2.76794 -1.73658 1.1173 +thorax -0.610994 -0.885461 2.15821 +lowerneck -10.3905 1.17443 -1.48577 +upperneck -0.436658 1.82519 -3.03759 +head 1.64316 0.828329 -0.622143 +rclavicle -1.5704e-014 1.82882e-014 +rhumerus -37.059 -16.6142 -77.6566 +rradius 14.9616 +rwrist 3.50582 +rhand -21.7637 17.1721 +rfingers 7.12502 +rthumb 4.63694 -12.7572 +lclavicle -1.5704e-014 1.82882e-014 +lhumerus -25.3759 -5.11102 89.647 +lradius 61.1527 +lwrist 28.0685 +lhand -24.4334 15.8221 +lfingers 7.12502 +lthumb 2.0588 45.7919 +rfemur -24.5664 6.50117 18.8425 +rtibia 40.5981 +rfoot -9.30474 -15.6047 +rtoes -19.7877 +lfemur 3.19295 -3.68352 -27.849 +ltibia 26.4955 +lfoot -18.9998 4.68091 +ltoes -4.87458 +322 +root 11.0725 17.7431 25.4833 -4.22567 3.74367 0.789636 +lowerback 6.3606 -1.108 -1.27128 +upperback 2.83276 -1.53152 1.21329 +thorax -0.580221 -0.781794 2.06294 +lowerneck -11.1355 1.01302 -1.20219 +upperneck -0.127059 1.6072 -3.13673 +head 1.88155 0.7058 -0.710245 +rclavicle 1.54058e-014 -1.51076e-014 +rhumerus -38.1152 -18.1447 -76.6005 +rradius 14.3693 +rwrist 4.49306 +rhand -21.6564 16.8884 +rfingers 7.12502 +rthumb 4.74059 -13.0386 +lclavicle 1.54058e-014 -1.51076e-014 +lhumerus -25.0436 -5.85691 89.7012 +lradius 62.1953 +lwrist 28.2754 +lhand -24.4268 15.6174 +lfingers 7.12502 +lthumb 2.06512 45.5872 +rfemur -24.4884 6.96859 19.3078 +rtibia 37.4268 +rfoot -9.75748 -15.8969 +rtoes -21.6561 +lfemur 4.12237 -3.55629 -27.2716 +ltibia 25.632 +lfoot -18.9684 4.30915 +ltoes -3.81197 +323 +root 11.0671 17.7537 25.6628 -4.27282 3.82241 0.554414 +lowerback 5.61282 -1.17193 -1.34901 +upperback 3.31168 -1.61572 1.51849 +thorax 0.343332 -0.840673 2.40011 +lowerneck -11.1981 1.14346 -0.964692 +upperneck -0.566147 1.76146 -3.91289 +head 1.76345 0.767516 -0.990918 +rclavicle 4.96962e-016 1.19271e-014 +rhumerus -38.7903 -20.5079 -74.5872 +rradius 13.637 +rwrist 7.50299 +rhand -21.0612 16.1601 +rfingers 7.12502 +rthumb 5.31521 -13.7533 +lclavicle 4.96962e-016 1.19271e-014 +lhumerus -24.3558 -5.57897 89.8701 +lradius 63.2016 +lwrist 28.1656 +lhand -23.9844 15.8732 +lfingers 7.12502 +lthumb 2.49243 45.8384 +rfemur -24.2638 7.48936 19.5562 +rtibia 34.1422 +rfoot -10.0302 -16.4635 +rtoes -21.8981 +lfemur 5.15581 -3.26445 -26.9139 +ltibia 24.9232 +lfoot -19.1732 4.14946 +ltoes -3.32813 +324 +root 11.0836 17.7707 25.8325 -4.2314 4.33729 0.575306 +lowerback 6.48529 -1.35163 -1.18765 +upperback 2.60434 -1.84693 1.4886 +thorax -0.863532 -0.935687 2.32766 +lowerneck -10.3274 1.07084 -1.53575 +upperneck -0.551112 1.69034 -3.10831 +head 1.59365 0.761826 -0.642347 +rclavicle 2.41026e-015 -3.18055e-015 +rhumerus -41.3849 -21.6147 -72.7148 +rradius 13.4317 +rwrist 9.16184 +rhand -20.297 15.4035 +rfingers 7.12502 +rthumb 6.05306 -14.49 +lclavicle 2.41026e-015 -3.18055e-015 +lhumerus -25.4757 -5.81788 89.933 +lradius 64.1687 +lwrist 28.4883 +lhand -24.2208 15.8572 +lfingers 7.12502 +lthumb 2.26414 45.825 +rfemur -24.234 7.31307 19.416 +rtibia 31.3009 +rfoot -10.4759 -16.7583 +rtoes -19.9702 +lfemur 6.34469 -3.14379 -26.9044 +ltibia 23.801 +lfoot -19.0599 3.95052 +ltoes -3.84527 +325 +root 11.0986 17.7905 25.9995 -3.80073 5.30435 0.795597 +lowerback 6.62228 -1.54266 -1.14005 +upperback 2.2511 -2.09944 1.31347 +thorax -1.29939 -1.05346 2.14946 +lowerneck -10.568 0.922479 -1.60415 +upperneck -0.302737 1.50575 -2.76628 +head 1.7119 0.672741 -0.529975 +rclavicle 2.98177e-016 1.19271e-015 +rhumerus -42.77 -21.5011 -72.3872 +rradius 13.2676 +rwrist 8.41 +rhand -20.2836 15.3546 +rfingers 7.12502 +rthumb 6.06599 -14.5385 +lclavicle 2.98177e-016 1.19271e-015 +lhumerus -25.6557 -6.6181 89.9349 +lradius 64.8476 +lwrist 28.8522 +lhand -24.8347 15.5052 +lfingers 7.12502 +lthumb 1.67118 45.4784 +rfemur -24.7079 6.57427 18.9516 +rtibia 28.845 +rfoot -11.3807 -16.648 +rtoes -16.0993 +lfemur 7.12093 -3.3256 -27.0432 +ltibia 22.4883 +lfoot -18.553 3.46677 +ltoes -5.73274 +326 +root 11.1042 17.7968 26.1758 -3.35443 5.49965 1.7548 +lowerback 6.77757 -1.48959 -2.25101 +upperback 1.9097 -2.1072 1.16036 +thorax -1.70158 -1.04923 2.62838 +lowerneck -10.8991 1.00633 -1.32873 +upperneck 0.0262409 1.61229 -3.08657 +head 1.8878 0.709221 -0.672929 +rclavicle 4.35835e-014 -1.51076e-014 +rhumerus -44.2481 -21.6653 -71.4999 +rradius 12.7672 +rwrist 9.15396 +rhand -21.5259 16.6798 +rfingers 7.12502 +rthumb 4.86655 -13.2443 +lclavicle 4.35835e-014 -1.51076e-014 +lhumerus -25.915 -6.72027 90.021 +lradius 65.5629 +lwrist 28.3788 +lhand -24.4312 15.4866 +lfingers 7.12502 +lthumb 2.06091 45.4564 +rfemur -25.2418 6.22175 17.8954 +rtibia 26.7094 +rfoot -11.9021 -16.3615 +rtoes -19.2848 +lfemur 7.98352 -3.22901 -28.0694 +ltibia 21.1305 +lfoot -17.9926 3.43771 +ltoes -6.42286 +327 +root 11.1044 17.7973 26.3575 -3.36641 5.73307 1.77622 +lowerback 7.0286 -1.51063 -2.39317 +upperback 1.80097 -2.14899 1.2179 +thorax -1.94304 -1.06462 2.78201 +lowerneck -11.2843 0.933539 -1.29276 +upperneck 0.370964 1.53313 -3.13229 +head 2.07266 0.659437 -0.697147 +rclavicle 1.27471e-014 -5.1684e-015 +rhumerus -46.3684 -24.1381 -68.6503 +rradius 11.555 +rwrist 14.1853 +rhand -23.9813 19.2526 +rfingers 7.12502 +rthumb 2.49543 -10.7126 +lclavicle 1.27471e-014 -5.1684e-015 +lhumerus -26.069 -6.82242 90.0298 +lradius 66.2178 +lwrist 28.0626 +lhand -23.8506 15.4359 +lfingers 7.12502 +lthumb 2.62169 45.3996 +rfemur -25.236 5.70772 18.0861 +rtibia 24.8348 +rfoot -12.316 -16.346 +rtoes -21.4137 +lfemur 9.25314 -3.11512 -28.0279 +ltibia 19.9229 +lfoot -17.5645 3.16197 +ltoes -5.5289 +328 +root 11.1022 17.7934 26.5478 -3.48684 5.83992 1.16713 +lowerback 7.05154 -1.45737 -1.76519 +upperback 1.69271 -2.0288 1.4101 +thorax -2.09063 -1.00325 2.62077 +lowerneck -11.1068 0.761172 -1.64594 +upperneck 0.552793 1.3441 -2.93551 +head 2.09366 0.568574 -0.583455 +rclavicle 3.74461e-014 1.07344e-014 +rhumerus -48.3517 -25.6932 -66.4151 +rradius 11.4989 +rwrist 15.27 +rhand -22.2718 17.494 +rfingers 7.12502 +rthumb 4.14632 -12.4454 +lclavicle 3.74461e-014 1.07344e-014 +lhumerus -26.4899 -7.20062 90.3226 +lradius 66.8909 +lwrist 28.6522 +lhand -23.9557 15.6731 +lfingers 7.12502 +lthumb 2.52014 45.6379 +rfemur -24.9797 5.17791 19.1114 +rtibia 22.9535 +rfoot -12.4718 -16.1564 +rtoes -21.1603 +lfemur 10.3909 -3.06952 -27.2898 +ltibia 19.188 +lfoot -17.4531 2.79235 +ltoes -4.45336 +329 +root 11.0969 17.7781 26.7368 -3.58903 5.81424 1.06798 +lowerback 7.40737 -1.37935 -1.74562 +upperback 1.33573 -1.92422 1.5189 +thorax -2.66019 -0.939288 2.73248 +lowerneck -10.5511 0.705612 -1.99728 +upperneck 0.662528 1.29443 -2.74166 +head 2.02377 0.550917 -0.464845 +rclavicle -2.56432e-014 2.50469e-014 +rhumerus -50.1482 -25.2139 -65.6765 +rradius 11.7704 +rwrist 14.365 +rhand -21.1956 16.423 +rfingers 7.12502 +rthumb 5.18547 -13.4936 +lclavicle -2.56432e-014 2.50469e-014 +lhumerus -27.4586 -7.22242 90.6818 +lradius 67.618 +lwrist 29.1171 +lhand -25.1604 15.0804 +lfingers 7.12502 +lthumb 1.35663 45.0558 +rfemur -24.9125 4.31718 19.7889 +rtibia 21.8185 +rfoot -12.4101 -15.2554 +rtoes -20.7984 +lfemur 11.6121 -3.01147 -27.1175 +ltibia 18.2087 +lfoot -17.1403 2.52836 +ltoes -3.97923 +330 +root 11.0783 17.755 26.9216 -4.24371 5.35907 0.0311115 +lowerback 9.08417 -1.21809 -0.884777 +upperback 0.53135 -1.62355 1.83355 +thorax -4.4642 -0.768109 2.61236 +lowerneck -9.49431 0.774388 -1.71865 +upperneck 0.841805 1.33454 -2.95181 +head 1.89657 0.571913 -0.58024 +rclavicle 2.46866e-014 -1.23246e-014 +rhumerus -53.1337 -24.7541 -64.2926 +rradius 12.2982 +rwrist 14.4773 +rhand -21.1125 14.9557 +rfingers 7.12502 +rthumb 5.26572 -14.9589 +lclavicle 2.46866e-014 -1.23246e-014 +lhumerus -29.3718 -7.1762 90.9522 +lradius 68.2667 +lwrist 28.8548 +lhand -26.5029 13.2129 +lfingers 7.12502 +lthumb 0.0600363 43.1926 +rfemur -24.4643 4.20736 21.5539 +rtibia 21.1238 +rfoot -12.4959 -14.1324 +rtoes -20.6065 +lfemur 13.1811 -2.77049 -25.9178 +ltibia 17.4898 +lfoot -16.8942 2.63177 +ltoes -5.31173 +331 +root 11.1121 17.7359 27.0872 -3.14446 6.79857 2.3044 +lowerback 6.81334 -1.52696 -2.65401 +upperback 1.54853 -2.18902 1.09092 +thorax -2.07623 -1.07828 2.79857 +lowerneck -10.8358 0.72563 -1.46953 +upperneck -0.0377506 1.25915 -3.23573 +head 1.85224 0.530534 -0.713581 +rclavicle 9.74045e-015 -9.93923e-015 +rhumerus -52.444 -26.9483 -63.5669 +rradius 12.4822 +rwrist 15.3284 +rhand -20.7985 12.2593 +rfingers 7.12502 +rthumb 5.56886 -17.6475 +lclavicle 9.74045e-015 -9.93923e-015 +lhumerus -27.1249 -7.43969 90.7423 +lradius 68.1468 +lwrist 28.9457 +lhand -26.6881 12.6684 +lfingers 7.12502 +lthumb -0.118823 42.6481 +rfemur -25.5426 1.30757 19.3544 +rtibia 20.868 +rfoot -12.6513 -11.7996 +rtoes -20.4863 +lfemur 13.1588 -3.45787 -28.4056 +ltibia 16.9537 +lfoot -16.2789 2.25622 +ltoes -7.33177 +332 +root 11.1182 17.713 27.2633 -2.80226 7.47054 2.76234 +lowerback 5.04528 -1.7425 -3.07215 +upperback 2.76074 -2.44396 0.995305 +thorax 0.187542 -1.26347 2.85884 +lowerneck -12.2211 0.585002 -1.54508 +upperneck -0.647017 1.10508 -3.38386 +head 1.89833 0.447076 -0.753868 +rclavicle -1.03865e-014 -1.55052e-014 +rhumerus -50.3507 -27.2289 -65.1372 +rradius 12.9089 +rwrist 12.5647 +rhand -18.5723 7.50909 +rfingers 7.12502 +rthumb 7.718 -22.3301 +lclavicle -1.03865e-014 -1.55052e-014 +lhumerus -24.9396 -7.5551 90.5654 +lradius 67.9588 +lwrist 29.3203 +lhand -26.4705 13.3934 +lfingers 7.12502 +lthumb 0.0912953 43.3731 +rfemur -26.0039 0.332366 19.0597 +rtibia 20.8393 +rfoot -12.9276 -10.934 +rtoes -20.3349 +lfemur 13.5699 -3.79138 -28.8113 +ltibia 16.7617 +lfoot -16.0015 1.95375 +ltoes -8.58017 +333 +root 11.1022 17.7053 27.4502 -2.99904 7.64074 1.97641 +lowerback 5.32728 -1.8153 -2.44528 +upperback 2.6323 -2.51883 1.28389 +thorax -0.111438 -1.28985 2.82147 +lowerneck -12.1774 0.572079 -1.65141 +upperneck -0.682184 1.09729 -3.29364 +head 1.8768 0.446886 -0.706952 +rclavicle 1.89342e-014 4.37326e-015 +rhumerus -53.0722 -29.7268 -60.6702 +rradius 10.4383 +rwrist 19.9014 +rhand -22.7926 14.7361 +rfingers 7.12502 +rthumb 3.64338 -15.2125 +lclavicle 1.89342e-014 4.37326e-015 +lhumerus -25.47 -7.42817 90.7401 +lradius 68.1551 +lwrist 29.2749 +lhand -26.6974 13.2318 +lfingers 7.12502 +lthumb -0.127838 43.2115 +rfemur -25.8672 1.1244 19.8906 +rtibia 20.8506 +rfoot -13.5308 -10.9755 +rtoes -18.7844 +lfemur 14.3093 -3.96672 -27.8342 +ltibia 16.7779 +lfoot -15.8001 1.92067 +ltoes -10.7385 +334 +root 11.0895 17.6826 27.648 -3.15069 7.38321 1.64702 +lowerback 5.63692 -1.72029 -2.223 +upperback 2.36106 -2.38656 1.42468 +thorax -0.575033 -1.21235 2.85302 +lowerneck -11.9015 0.61029 -1.42431 +upperneck -0.518909 1.12853 -3.71563 +head 1.88854 0.449644 -0.880141 +rclavicle 2.32081e-014 -7.95139e-015 +rhumerus -54.2429 -29.5586 -60.0051 +rradius 11.1417 +rwrist 17.7107 +rhand -19.9323 10.2945 +rfingers 7.12502 +rthumb 6.40513 -19.5887 +lclavicle 2.32081e-014 -7.95139e-015 +lhumerus -26.4183 -7.10965 90.974 +lradius 68.4218 +lwrist 28.9847 +lhand -27.0596 12.3116 +lfingers 7.12502 +lthumb -0.477692 42.2908 +rfemur -25.3612 1.72989 20.3862 +rtibia 20.313 +rfoot -13.3931 -10.6724 +rtoes -16.3307 +lfemur 14.6298 -3.9612 -27.4421 +ltibia 17.7733 +lfoot -16.0599 2.05552 +ltoes -12.6188 +335 +root 11.0619 17.6633 27.8516 -3.63031 6.5353 0.63367 +lowerback 6.26359 -1.46722 -1.47918 +upperback 2.07987 -2.00987 1.73865 +thorax -1.25266 -1.00969 2.7636 +lowerneck -11.4967 0.532862 -1.54466 +upperneck -0.270737 1.03424 -3.56355 +head 1.89443 0.406501 -0.815953 +rclavicle -2.61153e-014 1.11319e-014 +rhumerus -57.1374 -31.1695 -56.2033 +rradius 10.5778 +rwrist 21.243 +rhand -20.8588 12.9143 +rfingers 7.12502 +rthumb 5.51073 -16.994 +lclavicle -2.61153e-014 1.11319e-014 +lhumerus -27.5316 -6.83661 91.0858 +lradius 68.5153 +lwrist 28.7341 +lhand -27.0082 11.9604 +lfingers 7.12502 +lthumb -0.428033 41.9397 +rfemur -24.5937 4.28382 21.4447 +rtibia 20.0004 +rfoot -12.5191 -12.0324 +rtoes -15.6414 +lfemur 15.2406 -3.37042 -26.1873 +ltibia 18.6731 +lfoot -16.3524 1.98965 +ltoes -13.4843 +336 +root 11.0553 17.6436 28.0333 -3.49253 6.83262 0.315157 +lowerback 6.37684 -1.57867 -1.12483 +upperback 1.77665 -2.13258 1.8357 +thorax -1.63019 -1.06363 2.68346 +lowerneck -11.2823 0.504082 -1.52876 +upperneck -0.132911 0.997207 -3.69361 +head 1.90272 0.383805 -0.862521 +rclavicle 2.15681e-014 -5.56597e-015 +rhumerus -59.358 -32.3857 -53.1865 +rradius 10.4854 +rwrist 23.6936 +rhand -20.906 13.268 +rfingers 7.12502 +rthumb 5.46511 -16.6415 +lclavicle 2.15681e-014 -5.56597e-015 +lhumerus -28.2644 -6.60878 91.1893 +lradius 68.4008 +lwrist 28.4961 +lhand -26.866 12.0491 +lfingers 7.12502 +lthumb -0.290657 42.0286 +rfemur -24.5804 4.60799 21.8171 +rtibia 20.3564 +rfoot -11.1799 -11.7271 +rtoes -11.9969 +lfemur 15.3403 -3.13634 -25.5373 +ltibia 19.4927 +lfoot -16.2776 1.25896 +ltoes -14.7236 +337 +root 11.0506 17.6159 28.2424 -3.79935 6.49636 0.999306 +lowerback 6.61127 -1.39872 -1.87141 +upperback 1.74547 -1.94638 1.70335 +thorax -1.78197 -0.967076 2.96145 +lowerneck -11.1731 0.564591 -1.30456 +upperneck 0.029252 1.06721 -4.13227 +head 1.94485 0.404273 -1.03926 +rclavicle -1.99282e-014 1.35174e-014 +rhumerus -59.54 -31.1151 -54.2659 +rradius 11.1166 +rwrist 21.1806 +rhand -19.9253 11.4934 +rfingers 7.12502 +rthumb 6.41196 -18.3896 +lclavicle -1.99282e-014 1.35174e-014 +lhumerus -29.0562 -6.3497 91.3392 +lradius 68.3622 +lwrist 28.256 +lhand -27.5278 11.385 +lfingers 7.12502 +lthumb -0.929832 41.3627 +rfemur -24.1177 5.41722 21.2411 +rtibia 21.2402 +rfoot -10.6095 -12.3587 +rtoes -16.647 +lfemur 16.0309 -2.82208 -26.2402 +ltibia 20.525 +lfoot -16.4645 1.08787 +ltoes -14.9772 +338 +root 11.042 17.5824 28.4487 -3.94168 6.35918 1.49448 +lowerback 6.4867 -1.37453 -2.50464 +upperback 1.84741 -1.95647 1.60321 +thorax -1.58851 -0.97565 3.20913 +lowerneck -11.1377 0.779696 -0.636964 +upperneck -0.0899942 1.28182 -4.72453 +head 1.91789 0.498145 -1.33558 +rclavicle 8.02593e-015 1.59028e-015 +rhumerus -58.5258 -28.9551 -57.3594 +rradius 12.0561 +rwrist 16.8317 +rhand -18.8285 9.27879 +rfingers 7.12502 +rthumb 7.47068 -20.5693 +lclavicle 8.02593e-015 1.59028e-015 +lhumerus -29.5509 -5.86913 91.3021 +lradius 68.2035 +lwrist 27.8998 +lhand -26.034 15.0387 +lfingers 7.12502 +lthumb 0.512874 45.0179 +rfemur -24.0034 6.15371 20.8604 +rtibia 22.5903 +rfoot -10.1779 -12.8345 +rtoes -16.3784 +lfemur 16.5684 -2.81502 -26.7499 +ltibia 21.2571 +lfoot -16.3838 1.02219 +ltoes -15.06 +339 +root 11.0309 17.5393 28.6469 -3.86806 6.62328 1.31223 +lowerback 5.86029 -1.54377 -2.41192 +upperback 2.11462 -2.16345 1.66606 +thorax -0.950553 -1.09392 3.20896 +lowerneck -11.3629 0.738935 -1.26223 +upperneck -0.377137 1.27544 -3.93848 +head 1.84511 0.519357 -0.972317 +rclavicle -2.23384e-014 -1.19271e-014 +rhumerus -58.3508 -29.5579 -57.231 +rradius 12.282 +rwrist 16.8472 +rhand -19.1312 7.01217 +rfingers 7.12502 +rthumb 7.17852 -22.8461 +lclavicle -2.23384e-014 -1.19271e-014 +lhumerus -29.4622 -5.43553 91.2024 +lradius 67.6945 +lwrist 27.5 +lhand -25.4464 15.1459 +lfingers 7.12502 +lthumb 1.08045 45.1229 +rfemur -24.3475 6.14578 21.2495 +rtibia 24.187 +rfoot -9.03842 -13.4801 +rtoes -12.0986 +lfemur 16.7955 -2.92231 -26.3711 +ltibia 21.9789 +lfoot -15.891 0.801329 +ltoes -16.7935 +340 +root 11.0319 17.5355 28.846 -3.82536 6.91015 0.658582 +lowerback 5.54231 -1.67473 -1.56211 +upperback 2.1026 -2.28557 1.82086 +thorax -0.805189 -1.1544 2.88684 +lowerneck -11.7778 0.599935 -1.15464 +upperneck -0.0907726 1.11297 -4.33811 +head 2.01903 0.416307 -1.13011 +rclavicle 7.23079e-015 -1.19271e-014 +rhumerus -60.6629 -32.4987 -52.3126 +rradius 11.5251 +rwrist 20.5359 +rhand -18.6605 8.39896 +rfingers 7.12502 +rthumb 7.63281 -21.4433 +lclavicle 7.23079e-015 -1.19271e-014 +lhumerus -29.7755 -5.33531 91.2672 +lradius 67.104 +lwrist 27.4279 +lhand -26.0111 14.0486 +lfingers 7.12502 +lthumb 0.53507 44.0277 +rfemur -24.5181 6.4393 21.9824 +rtibia 25.5166 +rfoot -7.52209 -15.0231 +rtoes -11.2914 +lfemur 16.8074 -2.96243 -25.4977 +ltibia 23.1411 +lfoot -15.3543 0.732768 +ltoes -20.8531 +341 +root 11.0359 17.5068 29.051 -4.01745 6.83579 0.112677 +lowerback 5.78481 -1.59455 -0.699558 +upperback 1.79665 -2.12702 1.9459 +thorax -1.29197 -1.06507 2.53672 +lowerneck -11.5009 0.460492 -1.43835 +upperneck 0.234851 0.975308 -4.41599 +head 2.07353 0.341221 -1.11418 +rclavicle 2.0773e-014 -1.74931e-014 +rhumerus -63.3308 -33.4654 -48.681 +rradius 10.8036 +rwrist 23.8476 +rhand -20.8023 12.9051 +rfingers 7.12502 +rthumb 5.56519 -17.0019 +lclavicle 2.0773e-014 -1.74931e-014 +lhumerus -30.8303 -5.16592 91.5838 +lradius 66.6221 +lwrist 27.188 +lhand -26.3312 13.7278 +lfingers 7.12502 +lthumb 0.225814 43.7075 +rfemur -24.3433 6.59562 22.6918 +rtibia 26.5286 +rfoot -6.09207 -15.7664 +rtoes -12.2351 +lfemur 16.9647 -2.79207 -24.8322 +ltibia 24.6066 +lfoot -14.9779 0.774576 +ltoes -24.8881 +342 +root 11.0323 17.4953 29.2606 -4.41668 7.13935 -0.642809 +lowerback 6.08656 -1.74843 0.1647 +upperback 1.59999 -2.27025 2.15737 +thorax -1.68055 -1.133 2.29471 +lowerneck -11.2052 0.454015 -1.6437 +upperneck 0.552324 0.997883 -4.39699 +head 2.1242 0.348976 -1.07201 +rclavicle 8.15017e-015 -1.27222e-014 +rhumerus -65.0106 -33.9481 -46.1462 +rradius 10.2501 +rwrist 25.2991 +rhand -20.8065 15.2084 +rfingers 7.12502 +rthumb 5.56121 -14.6987 +lclavicle 8.15017e-015 -1.27222e-014 +lhumerus -31.8576 -4.44121 91.7253 +lradius 66.0609 +lwrist 26.3853 +lhand -25.9912 13.1433 +lfingers 7.12502 +lthumb 0.554262 43.1223 +rfemur -23.7441 6.44938 23.6914 +rtibia 27.4619 +rfoot -5.11738 -15.758 +rtoes -5.59183 +lfemur 17.3467 -3.11875 -23.8576 +ltibia 25.8334 +lfoot -14.2605 0.0108513 +ltoes -24.2027 +343 +root 11.0237 17.502 29.4538 -4.48244 6.81263 -1.59521 +lowerback 5.7506 -1.88034 0.989992 +upperback 1.78225 -2.40255 2.42913 +thorax -1.32314 -1.20217 2.10433 +lowerneck -11.5801 0.738567 -1.03767 +upperneck 0.599575 1.32881 -4.89607 +head 2.22766 0.494526 -1.32385 +rclavicle -7.23079e-015 -1.27222e-014 +rhumerus -63.7887 -34.3173 -47.1111 +rradius 9.93192 +rwrist 23.4686 +rhand -19.5534 13.502 +rfingers 7.12502 +rthumb 6.77091 -16.3697 +lclavicle -7.23079e-015 -1.27222e-014 +lhumerus -32.0358 -3.35783 91.4085 +lradius 65.228 +lwrist 25.6386 +lhand -25.7351 12.7292 +lfingers 7.12502 +lthumb 0.801561 42.7075 +rfemur -23.2433 6.73071 25.0009 +rtibia 27.7761 +rfoot -4.35066 -15.1615 +rtoes -10.693 +lfemur 16.9276 -2.85303 -22.5749 +ltibia 27.7778 +lfoot -13.6748 -0.618019 +ltoes -24.1466 \ No newline at end of file diff --git a/pyrobolearn/datasets/parsers/3d/data/CMU/download-link.txt b/pyrobolearn/datasets/parsers/3d/data/CMU/download-link.txt new file mode 100644 index 0000000..3733e52 --- /dev/null +++ b/pyrobolearn/datasets/parsers/3d/data/CMU/download-link.txt @@ -0,0 +1,3 @@ +# CMU Dataset + +* webpage (link to download the dataset): mocap.cs.cmu.edu/search.php diff --git a/pyrobolearn/datasets/parsers/3d/data/CMU/subject2.txt b/pyrobolearn/datasets/parsers/3d/data/CMU/subject2.txt new file mode 100644 index 0000000..3cf8c36 --- /dev/null +++ b/pyrobolearn/datasets/parsers/3d/data/CMU/subject2.txt @@ -0,0 +1,15 @@ + + Subject #2 (various expressions and human behaviors) + +02_01 02_01.tvd 02_01.c3d 02_01.amc 02_01.avi walk +02_02 02_02.tvd 02_02.c3d 02_02.amc 02_02.mpg 02_02.avi walk +02_03 02_03.tvd 02_03.c3d 02_03.amc 02_03.mpg 02_03.avi run/jog +02_04 02_04.tvd 02_04.c3d 02_04.amc 02_04.mpg 02_04.avi jump, balance +02_05 02_05.tvd 02_05.c3d 02_05.amc 02_05.mpg 02_05.avi punch/strike +02_06 02_06.tvd 02_06.c3d 02_06.amc 02_06.mpg 02_06.avi bend over, scoop up, rise, lift arm +02_07 02_07.tvd 02_07.c3d 02_07.amc 02_07.mpg 02_07.avi swordplay +02_08 02_08.tvd 02_08.c3d 02_08.amc 02_08.mpg 02_08.avi swordplay +02_09 02_09.tvd 02_09.c3d 02_09.amc 02_09.mpg 02_09.avi swordplay +02_10 02_10.tvd 02_10.c3d 02_10.amc 02_10.mpg 02_10.avi wash self + + diff --git a/pyrobolearn/datasets/parsers/3d/data/UTD/Skeleton_joint_order.txt b/pyrobolearn/datasets/parsers/3d/data/UTD/Skeleton_joint_order.txt new file mode 100644 index 0000000..074d121 --- /dev/null +++ b/pyrobolearn/datasets/parsers/3d/data/UTD/Skeleton_joint_order.txt @@ -0,0 +1,24 @@ +The skeleton joint order in UTD-MAD dataset: + +1. head; +2. shoulder_center; +3. spine; +4. hip_center; +5. left_shoulder; +6. left_elbow; +7. left_wrist; +8. left_hand; +9. right_shoulder; +10. right_elbow; +11. right_wrist; +12. right_hand; +13. left_hip; +14. left_knee; +15. left_ankle; +16. left_foot; +17. right_hip; +18. right_knee; +19. right_ankle; +20. right_foot; + +Each skeleton data is a 20 x 3 x num_frame matrix. Each row of a skeleton frame corresponds to three spatial coordinates of a joint. \ No newline at end of file diff --git a/pyrobolearn/datasets/parsers/3d/data/UTD/download-link.txt b/pyrobolearn/datasets/parsers/3d/data/UTD/download-link.txt new file mode 100644 index 0000000..624a110 --- /dev/null +++ b/pyrobolearn/datasets/parsers/3d/data/UTD/download-link.txt @@ -0,0 +1,3 @@ +# UTD-MHAD Dataset + +* webpage (link to download the dataset): http://www.utdallas.edu/~kehtar/UTD-MHAD.html diff --git a/pyrobolearn/datasets/parsers/3d/figures/JHMDB-comparison-datasets.png b/pyrobolearn/datasets/parsers/3d/figures/JHMDB-comparison-datasets.png new file mode 100644 index 0000000..e2a0f97 Binary files /dev/null and b/pyrobolearn/datasets/parsers/3d/figures/JHMDB-comparison-datasets.png differ diff --git a/pyrobolearn/datasets/parsers/3d/figures/MPIICooking-comparison-datasets.png b/pyrobolearn/datasets/parsers/3d/figures/MPIICooking-comparison-datasets.png new file mode 100644 index 0000000..8301016 Binary files /dev/null and b/pyrobolearn/datasets/parsers/3d/figures/MPIICooking-comparison-datasets.png differ diff --git a/pyrobolearn/datasets/parsers/3d/mocap_parser.py b/pyrobolearn/datasets/parsers/3d/mocap_parser.py new file mode 100644 index 0000000..9ec4976 --- /dev/null +++ b/pyrobolearn/datasets/parsers/3d/mocap_parser.py @@ -0,0 +1,230 @@ +import numpy as np +from scipy.interpolate import CubicSpline +import matplotlib.pyplot as plt + +class MocapParser(object): + + def __init__(self, filename): + """ + Parser for motion capture. By default, if the data is described in Cartesian space, the x-axis should + be pointing in front of the human, the y-axis on his/her left, and z-axis upward. + :param filename: + """ + self.filename = filename + self.num_samples = 0 + self.joint_names = [] + self.link_names = [] + self.marker_names = [] + + self.data = self.loadFile(filename) + + + def loadFile(self, filename): + raise NotImplementedError("loadFile is not implemented.") + + def interpolate(self, data, method='cubic', axis=-1) + """ + Interpolate the Mocap data such that it is between 0 and 1, along the given axis. + + :param data: mocap data + :param method: 'linear', 'cubic', 'hermite' interpolation + :param axis: The axis on which to interpolate. The length should be equal to the number of samples in the + mocap data + :return: Interpolator - function that given the time [0,1] will give the corresponding data + """ + self.num_samples = data.shape[axis] + x = np.linspace(0., 1., self.num_samples) + interpolator = CubicSpline(x, self.data, axis=axis) + return interpolator + + def getMarkerName(self, marker_idx=None): + if marker_idx is None: + return self.getMarkerNames() + else: + return self.marker_names[marker_idx] + + def getMarkerNames(self): + return self.marker_names + + def getJointName(self, joint_idx=None): + if joint_idx is None: + return self.getJointNames() + else: + return self.joint_names[joint_idx] + + def getJointNames(self): + return self.joint_names + + def getLinkName(self, link_idx=None): + if link_idx is None: + return self.getLinkNames() + else: + return self.link_names[link_idx] + + def getLinkNames(self): + return self.link_names + + def getMarkerPosition(self, marker_idx=None): + if marker_idx is None: + return self.getMarkerPositions() + else: + pass + + def getMarkerPositions(self): + pass + + def getJointPosition(self, joint_idx=None): + if joint_idx is None: + return self.getJointPositions() + else: + pass + + def getJointPositions(self): + pass + + def getJointVelocity(self, joint_idx=None): + if joint_idx is None: + return self.getJointVelocities() + else: + pass + + def getJointVelocities(self): + pass + + def getLinkPosition(self, link_idx=None): + if link_idx is None: + return self.getLinkPositions() + else: + pass + + def getLinkPositions(self): + pass + + def getLinkVelocity(self, link_idx=None): + if link_idx is None: + return self.getLinkVelocities() + else: + pass + + def getLinkVelocities(self): + pass + + def getLinkOrientation(self, link_idx=None): + if link_idx is None: + return self.getLinkOrientations() + else: + pass + + def getLinkOrientations(self): + pass + + def getLinkAngularVelocity(self, link_idx=None): + if link_idx is None: + return self.getLinkAngularVelocities() + else: + pass + + def getLinkAngularVelocities(self): + pass + + + ## Plotting ## + def plot3d(self, ax=None): + pass + + def plotJointProfile(self, ax=None, joint_idx=None, pos=True, vel=True, acc=True): + pass + + def plotLinkProfile(self, ax=None, link_idx=None, pos=True, vel=True, acc=True, wrt='world'): + pass + + def plotMarkerProfile(self, ax=None, link_idx=None, pos=True, vel=True, acc=True, wrt='world'): + pass + + def animate3d(self, ax=None, title=None): + pass + + + + +from amcparser.skeleton import Skeleton +from amcparser.motion import SkelMotion + +class CMUMocapParser(MocapParser): + + def __init__(self, skeleton_filename, motion_filename, skeleton_scale=1.0): + super(CMUMocapParser, self).__init__(motion_filename) + self.joint_names = ['head', 'upperneck', 'lowerneck', 'upperback', 'thorax', 'lowerback', 'root', # Spine + 'rclavicle', 'rhumerus', 'rradius', 'rwrist', 'rhand', 'rthumb', 'rfingers', # Right arm + 'lclavicle', 'lhumerus', 'lradius', 'lwrist', 'lhand', 'lthumb', 'lfingers', # Left arm + 'rhipjoint', 'rfemur', 'rtibia', 'rfoot', 'rtoes', # Right leg + 'lhipjoint', 'lfemur', 'ltibia', 'lfoot', 'ltoes'] # Left leg + self.link_names = self.joint_names + self.marker_names = self.joint_names + self.base_name = 'root' + + # Load skeleton + self.skeleton = Skeleton(skeleton_filename, scale=skeleton_scale) + + def loadFile(self, filename, framerate=120.): + self.skeleton_motion = SkelMotion(self.skeleton, filename, (1./framerate)) + # compute trajectories + #self.data = self.skeleton_motion.traverse(bone, start, end) + self.data = self.skeleton_motion.traverse(None, 0, -1) + # make sure that given axis + + def animate3d(self, ax=None, title=None): + if ax is None: + fig = plt.figure() + ax = fig.gca(projection='3d') + + # Rescaling such that the skeleton it is in the right proportion and at the middle + xmin, xmax = X[..., 2].min(), X[..., 2].max() + ymin, ymax = X[..., 0].min(), X[..., 0].max() + zmin, zmax = X[..., 1].min(), X[..., 1].max() + x_len, y_len, z_len = (xmax - xmin), (ymax - ymin), (zmax - zmin) + max_len = max([x_len, y_len, z_len]) + xmin, xmax = xmin + (x_len - max_len) / 2., xmin + (x_len + max_len) / 2. + ymin, ymax = ymin + (y_len - max_len) / 2., ymin + (y_len + max_len) / 2. + zmin, zmax = zmin + (z_len - max_len) / 2., zmin + (z_len + max_len) / 2. + + # Plot trajectories + x, y, z = skel.bones['rhand'].xyz_data.T + T = len(x) + + def init(): + ax.set_title('movement') + ax.set_xlabel('x') + ax.set_xlim(xmin, xmax) + ax.set_ylabel('y') + ax.set_ylim(ymin, ymax) + ax.set_zlabel('z') + ax.set_zlim(zmin, zmax) + # ax.scatter(x[0], y[0], z[0], marker='o') + return fig, + + def animate(i): + # ax.view_init(elev=10., azim=i) + ax.scatter(x[i], y[i], z[i], marker='o') + return fig, + + def animate_skeleton(i): + ax.clear() + init() + # ax.scatter(X[:,2,i], X[:,0,i], X[:,1,i], marker='o', c='b') + for d in [X_TO, X_RA, X_LA, X_RL, X_LL]: + ax.plot(d[:, i, 2], d[:, i, 0], d[:, i, 1], marker='o', c='b') + return [fig] # fig, + + # Animate + # anim = animation.FuncAnimation(fig, animate, init_func=init, + # frames=T, interval=20, blit=True) + anim = animation.FuncAnimation(fig, animate_skeleton, init_func=init, + frames=T, interval=20, blit=False) + + plt.show() + + +# Test +if __name__ == "__main__": + pass \ No newline at end of file diff --git a/pyrobolearn/datasets/parsers/3d/utd-mhad.ipynb b/pyrobolearn/datasets/parsers/3d/utd-mhad.ipynb new file mode 100644 index 0000000..b0ebacb --- /dev/null +++ b/pyrobolearn/datasets/parsers/3d/utd-mhad.ipynb @@ -0,0 +1,967 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### [UTD-MHAD: \"UTD-MHAD: A Multimodal Dataset for Human Action Recognition utilizing a Depth Camera and a Wearable Inertial Sensor\", 2015](http://www.utdallas.edu/~kehtar/UTD-MHAD.html)\n", + "\n", + "* nb of subjects: 8\n", + "* 27 different actions: (1) right arm swipe to the left, (2) right arm swipe to the right, (3) right hand wave, (4) two hand front clap, (5) right arm throw, (6) cross arms in the chest, (7) basketball shoot, (8) right hand draw x, (9) right hand draw circle (clockwise), (10) right hand draw circle (counter clockwise), (11) draw triangle, (12) bowling (right hand), (13) front boxing, (14) baseball swing from right, (15) tennis right hand forehand swing, (16) arm curl (two arms), (17) tennis serve, (18) two hand push, (19) right hand knock on door, (20) right hand catch an object, (21) right hand pick up and throw, (22) jogging in place, (23) walking in place, (24) sit to stand, (25) stand to sit, (26) forward lunge (left foot forward), (27) squat (two arms stretch out).\n", + "* labeled and segmented data: 861 data sequences, 3D skeleton joint positions" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import scipy.io as sio\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "import matplotlib.animation as animation\n", + "import glob\n", + "import re\n", + "\n", + "from IPython.display import HTML\n", + "\n", + "#%matplotlib inline\n", + "%matplotlib notebook" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "PATH = 'data/UTD/*.mat'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Nb of demos: 861\n", + "Min T: 41\n", + "Max T: 125\n" + ] + } + ], + "source": [ + "# Definition of some variables\n", + "id_to_jnt = ['head', 'shoulder_center', 'spine', 'hip_center', 'left_shoulder', 'left_elbow', 'left_wrist',\n", + " 'left_hand', 'right_shoulder', 'right_elbow', 'right_wrist', 'right_hand', 'left_hip', 'left_knee',\n", + " 'left_ankle', 'left_foot', 'right_hip', 'right_knee', 'right_ankle', 'right_foot']\n", + "jnt_to_id = {name: idx for idx,name in enumerate(id_to_jnt)}\n", + "id_to_action = ['Swipe left', 'Swipe right', 'Wave', 'Clap', 'Throw', 'Arm cross', 'Basketball shoot', \n", + " 'Draw X', 'Draw circle (clockwise)', 'Draw circle (counter clockwise)',\n", + " 'Draw triangle', 'Bowling', 'Boxing', 'Baseball swing', 'Tennis swing',\n", + " 'Arm curl', 'Tennis serve', 'Push', 'Knock', 'Catch', 'Pickup and throw',\n", + " 'Jog', 'Walk', 'Sit to stand', 'Stand to sit', 'Lunge', 'Squat']\n", + "action_to_id = {name: idx for idx,name in enumerate(id_to_action)}\n", + "Nj = len(id_to_jnt) # 20\n", + "\n", + "# Load all the data\n", + "files = glob.glob(PATH)\n", + "data = [sio.loadmat(f)['d_skel'] for f in files] # list of shape Njx3xT\n", + "N = len(data)\n", + "print(\"Nb of demos: %d\" % len(data))\n", + "Ts = np.array([d.shape[2] for d in data])\n", + "print(\"Min T: %d\" % np.min(Ts))\n", + "print(\"Max T: %d\" % np.max(Ts))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≄ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width);\n", + " canvas.attr('height', height);\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('