{"id":37080045,"url":"https://github.com/dfki-ric/movement_primitives","last_synced_at":"2026-01-14T09:42:49.229Z","repository":{"id":43010956,"uuid":"429049411","full_name":"dfki-ric/movement_primitives","owner":"dfki-ric","description":"Dynamical movement primitives (DMPs), probabilistic movement primitives (ProMPs), and spatially coupled bimanual DMPs for imitation learning.","archived":false,"fork":false,"pushed_at":"2025-06-18T20:25:54.000Z","size":16056,"stargazers_count":267,"open_issues_count":8,"forks_count":54,"subscribers_count":10,"default_branch":"main","last_synced_at":"2026-01-13T15:54:42.259Z","etag":null,"topics":["python","robotics"],"latest_commit_sha":null,"homepage":"https://dfki-ric.github.io/movement_primitives","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dfki-ric.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"citation.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-11-17T13:06:49.000Z","updated_at":"2026-01-12T20:19:56.000Z","dependencies_parsed_at":"2023-11-30T13:46:11.254Z","dependency_job_id":"de0cb808-3697-40d6-937a-55a691934771","html_url":"https://github.com/dfki-ric/movement_primitives","commit_stats":{"total_commits":577,"total_committers":7,"mean_commits":82.42857142857143,"dds":"0.13691507798960134","last_synced_commit":"be115a9623e4b9f87e472f66708a9f70417fc157"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/dfki-ric/movement_primitives","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfki-ric%2Fmovement_primitives","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfki-ric%2Fmovement_primitives/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfki-ric%2Fmovement_primitives/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfki-ric%2Fmovement_primitives/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dfki-ric","download_url":"https://codeload.github.com/dfki-ric/movement_primitives/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfki-ric%2Fmovement_primitives/sbom","scorecard":{"id":339048,"data":{"date":"2025-08-11","repo":{"name":"github.com/dfki-ric/movement_primitives","commit":"702a1e77e0c0df618bf54abd78fb855bc19b7f7a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.7,"checks":[{"name":"Maintained","score":9,"reason":"11 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 9","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":4,"reason":"Found 6/13 approved changesets -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/python-package.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-package.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/dfki-ric/movement_primitives/python-package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-package.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/dfki-ric/movement_primitives/python-package.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-package.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/dfki-ric/movement_primitives/python-package.yml/main?enable=pin","Warn: containerImage not pinned by hash: docker/Dockerfile:1: pin your Docker image by updating continuumio/miniconda3:latest to continuumio/miniconda3:latest@sha256:4a2425c3ca891633e5a27280120f3fb6d5960a0f509b7594632cdd5bb8cbaea8","Warn: pipCommand not pinned by hash: docker/Dockerfile:6","Warn: pipCommand not pinned by hash: .github/workflows/python-package.yml:21","Warn: pipCommand not pinned by hash: .github/workflows/python-package.yml:22","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   3 pipCommand dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":0,"reason":"13 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2018-34 / GHSA-2fc2-6r4j-p65h","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2018-33 / GHSA-cw6w-4rcx-xphc","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2017-1 / GHSA-frgw-fgh6-9g52","Warn: Project is vulnerable to: PYSEC-2021-142 / GHSA-8q59-q68h-6hv4","Warn: Project is vulnerable to: PYSEC-2018-49 / GHSA-rprw-h62v-c2w7","Warn: Project is vulnerable to: PYSEC-2019-156 / GHSA-xp76-357g-9wqq","Warn: Project is vulnerable to: PYSEC-2023-102","Warn: Project is vulnerable to: PYSEC-2023-114","Warn: Project is vulnerable to: PYSEC-2017-74"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 23 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T05:22:05.657Z","repository_id":43010956,"created_at":"2025-08-18T05:22:05.658Z","updated_at":"2025-08-18T05:22:05.658Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28416120,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T08:38:59.149Z","status":"ssl_error","status_checked_at":"2026-01-14T08:38:43.588Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["python","robotics"],"created_at":"2026-01-14T09:42:48.472Z","updated_at":"2026-01-14T09:42:49.216Z","avatar_url":"https://github.com/dfki-ric.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"![CI](https://github.com/dfki-ric/movement_primitives/actions/workflows/python-package.yml/badge.svg)\n[![codecov](https://codecov.io/gh/dfki-ric/movement_primitives/branch/main/graph/badge.svg?token=EFHUC81DBL)](https://codecov.io/gh/dfki-ric/movement_primitives)\n[![Paper DOI](https://joss.theoj.org/papers/10.21105/joss.06695/status.svg)](https://doi.org/10.21105/joss.06695)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.6491361.svg)](https://doi.org/10.5281/zenodo.6491361)\n\n# Movement Primitives\n\n\u003e Dynamical movement primitives (DMPs), probabilistic movement primitives\n\u003e (ProMPs), and spatially coupled bimanual DMPs for imitation learning.\n\nMovement primitives are a common representation of movements in robotics for\nimitation learning, reinforcement learning, and black-box optimization of\nbehaviors. There are many types and variations. The Python library\nmovement_primitives focuses on imitation learning, generalization, and\nadaptation of movement primitives in Cartesian space. It implements dynamical\nmovement primitives, probabilistic movement primitives, as well as Cartesian\nand dual Cartesian movement primitives with coupling terms to constrain\nrelative movements in bimanual manipulation. They are implemented in Cython to\nspeed up online execution and batch processing in an offline setting. In\naddition, the library provides tools for data analysis and movement evaluation.\nIt can be installed directly from\n[PyPI](https://pypi.org/project/movement-primitives/).\n\n\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/summary.png\" width=\"100%\" /\u003e\n\n## Content\n\n* [Statement of Need](#statement-of-need)\n* [Features](#features)\n* [API Documentation](#api-documentation)\n* [Install Library](#install-library)\n* [Examples](#examples)\n* [Build API Documentation](#build-api-documentation)\n* [Test](#test)\n* [Contributing](#contributing)\n* [Non-public Extensions](#non-public-extensions)\n* [Related Publications](#related-publications)\n* [Citation](#citation)\n* [Funding](#funding)\n\n## Statement of Need\n\nMovement primitives are a common group of policy representations in robotics.\nThey are able to represent complex movement patterns, allow temporal and\nspatial modification, offer stability guarantees, and are suitable for\nimitation learning without complicated hyperparameter tuning, which are\nadvantages over general function approximators like neural networks. Movement\nprimitives are white-box models for movement generation and allow to control\nseveral aspects of the movement. There are types of dynamical movement\nprimitives that allow to directly control the goal in state space, the final\nvelocity, or the relative pose of two robotic end-effectors. Probabilistic\nmovement primitives capture distributions of movements adequately and allow\nconditioning in state space and blending of multiple movements. The main\ndisadvantage of movement primitives in comparison to general function\napproximators is that they are limited in their capacity to represent behavior\nthat takes into account complex sensor data during execution. Nevertheless,\nvarious types of movement primitives have proven to be a reliable and effective\ntool in robot learning. A reliable tool deserves a similarly reliable open\nsource implementation. However, there are only a few actively maintained,\ndocumented, and easy to use implementations. One of these is the library\n*movement_primitives*. It combines several types of dynamical movement\nprimitives and probabilistic movement primitives in a single library with\na focus on Cartesian and bimanual movements.\n\n## Features\n\n* Dynamical Movement Primitives (DMPs) for\n    * positions (with fast Runge-Kutta integration)\n    * Cartesian position and orientation (with fast Cython implementation)\n    * Dual Cartesian position and orientation (with fast Cython implementation)\n* Coupling terms for synchronization of position and/or orientation of dual Cartesian DMPs\n* Propagation of DMP weight distribution to state space distribution\n* Probabilistic Movement Primitives (ProMPs)\n\n\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/dual_cart_dmp_rh5_with_panel.gif\" height=\"200px\" /\u003e\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/dmp_ur5_minimum_jerk.gif\" height=\"200px\" /\u003e\n\nLeft: Example of dual Cartesian DMP with [RH5 Manus](https://robotik.dfki-bremen.de/en/research/robot-systems/rh5-manus/).\nRight: Example of joint space DMP with UR5.\n\n## API Documentation\n\nThe API documentation is available\n[here](https://dfki-ric.github.io/movement_primitives/).\n\n## Install Library\n\nThis library requires Python 3.6 or later and pip is recommended for the\ninstallation. In the following instructions, we assume that the command\n`python` refers to Python 3. If you use the system's Python version, you\nmight have to add the flag `--user` to any installation command.\n\n### PyPI (Recommended)\n\nI recommend to install the library via pip from the Python package index\n(PyPI):\n\n```bash\npython -m pip install movement_primitives[all]\n```\n\nIf you don't want to have all dependencies installed, just omit `[all]`.\n\nThis will install the latest release. If you want to install the latest\ndevelopment version, you have to install from git.\n\n### Git + Editable Mode\n\nEditable mode means that you don't have to install the library after editing\nthe source code. Changes will be directly available in the installed library\nsince pip creates a symlink.\n\nYou can clone the git repository and install it in editable mode with pip:\n\n```bash\ngit clone https://github.com/dfki-ric/movement_primitives.git\npython -m pip install -e .[all]\n```\n\nIf you don't want to have all dependencies installed, just omit `[all]`.\n\n### Git\n\nAlternatively, you can install the library and its dependencies without pip\nfrom the git repository:\n\n```bash\ngit clone https://github.com/dfki-ric/movement_primitives.git\npython setup.py install\n```\n\n### Build Cython Extension\n\nYou could also just build the Cython extension with\n\n```bash\npython setup.py build_ext --inplace\n```\n\n### Dependencies\n\nAn alternative way to install dependencies is the requirements.txt file in the\nmain folder of the git repository:\n\n```bash\npython -m pip install -r requirements.txt\n```\n\n## Examples\n\nYou will find a lot of examples in the subfolder\n[`examples/`](https://github.com/dfki-ric/movement_primitives/tree/main/examples).\nHere are just some highlights to showcase the library.\n\n### Potential Field of 2D DMP\n\n\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/dmp_potential_field.png\" width=\"800px\" /\u003e\n\nA Dynamical Movement Primitive defines a potential field that superimposes\nseveral components: transformation system (goal-directed movement), forcing\nterm (learned shape), and coupling terms (e.g., obstacle avoidance).\n\n[Script](https://github.com/dfki-ric/movement_primitives/blob/main/examples/plot_dmp_potential_field.py)\n\n### DMP with Final Velocity\n\n\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/dmp_with_final_velocity.png\" width=\"800px\" /\u003e\n\nNot all DMPs allow a final velocity \u003e 0. In this case we analyze the effect\nof changing final velocities in an appropriate variation of the DMP\nformulation that allows to set the final velocity.\n\n[Script](https://github.com/dfki-ric/movement_primitives/blob/main/examples/plot_dmp_with_final_velocity.py)\n\n### ProMPs\n\n\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/promp_lasa.png\" width=\"800px\" /\u003e\n\nThe LASA Handwriting dataset learned with ProMPs. The dataset consists of\n2D handwriting motions. The first and third column of the plot represent\ndemonstrations and the second and fourth column show the imitated ProMPs\nwith 1-sigma interval.\n\n[Script](https://github.com/dfki-ric/movement_primitives/blob/main/examples/plot_promp_lasa.py)\n\n### Conditional ProMPs\n\n\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/conditional_promps.png\" width=\"800px\" /\u003e\n\nProbabilistic Movement Primitives (ProMPs) define distributions over\ntrajectories that can be conditioned on viapoints. In this example, we\nplot the resulting posterior distribution after conditioning on varying\nstart positions.\n\n[Script](https://github.com/dfki-ric/movement_primitives/blob/main/examples/plot_conditional_promp.py)\n\n### Cartesian DMPs\n\n\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/cart_dmp_ur5.png\" width=\"100%\" /\u003e\n\nA trajectory is created manually, imitated with a Cartesian DMP, converted\nto a joint trajectory by inverse kinematics, and executed with a UR5.\n\n[Script](https://github.com/dfki-ric/movement_primitives/blob/main/examples/vis_cartesian_dmp.py)\n\n### Contextual ProMPs\n\n\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/contextual_promps_kuka_panel_width_open3d.png\" width=\"60%\" /\u003e\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/contextual_promps_kuka_panel_width_open3d2.png\" width=\"40%\" /\u003e\n\nWe use a dataset of [Mronga and Kirchner (2021)](https://doi.org/10.1016/j.robot.2021.103779),\nin which a dual-arm robot rotates panels of varying widths. 10 demonstrations\nwere recorded for 3 different panel widths through kinesthetic teaching.\nThe panel width is the context over which we generalize with contextual ProMPs.\nWe learn a joint distribution of contexts and ProMP weights, and then condition\nthe distribution on the contexts to obtain a ProMP adapted to the context. Each\ncolor in the above visualizations corresponds to a ProMP for a different\ncontext.\n\n[Script](https://github.com/dfki-ric/movement_primitives/blob/main/examples/external_dependencies/vis_contextual_promp_distribution.py)\n\n**Dependencies that are not publicly available:**\n\n* Dataset: panel rotation dataset of\n  [Mronga and Kirchner (2021)](https://doi.org/10.1016/j.robot.2021.103779)\n* MoCap library\n* URDF of dual arm Kuka system from\n  [DFKI RIC's HRC lab](https://robotik.dfki-bremen.de/en/research/research-facilities-labs/hrc-lab):\n  ```bash\n  git clone git@git.hb.dfki.de:models-robots/kuka_lbr.git\n  ```\n\n### Dual Cartesian DMP\n\n\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/dual_cart_dmps_rh5_open3d.png\" width=\"50%\" /\u003e\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/dual_cart_dmps_rh5_pybullet.png\" width=\"50%\" /\u003e\n\nThis library implements specific dual Cartesian DMPs to control dual-arm\nrobotic systems like humanoid robots.\n\nScripts: [Open3D](https://github.com/dfki-ric/movement_primitives/blob/main/examples/external_dependencies/vis_solar_panel.py), [PyBullet](https://github.com/dfki-ric/movement_primitives/blob/main/examples/external_dependencies/sim_solar_panel.py)\n\n**Dependencies that are not publicly available:**\n\n* MoCap library\n* URDF of [DFKI RIC's RH5 robot](https://www.youtube.com/watch?v=jjGQNstmLvY):\n  ```bash\n  git clone git@git.hb.dfki.de:models-robots/rh5_models/pybullet-only-arms-urdf.git --recursive\n  ```\n* URDF of solar panel:\n  ```bash\n  git clone git@git.hb.dfki.de:models-objects/solar_panels.git\n  ```\n\n### Coupled Dual Cartesian DMP\n\n\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/coupled_dual_cart_dmps_gripper_open3d.png\" width=\"60%\" /\u003e\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/coupled_dual_cart_dmps_rh5_pybullet.png\" width=\"40%\" /\u003e\n\nWe can introduce a coupling term in a dual Cartesian DMP to constrain the\nrelative position, orientation, or pose of two end-effectors of a dual-arm\nrobot.\n\nScripts: [Open3D](https://github.com/dfki-ric/movement_primitives/blob/main/examples/external_dependencies/vis_cartesian_dual_dmp.py), [PyBullet](https://github.com/dfki-ric/movement_primitives/blob/main/examples/external_dependencies/sim_cartesian_dual_dmp.py)\n\n**Dependencies that are not publicly available:**\n\n* URDF of DFKI RIC's gripper:\n  ```bash\n  git clone git@git.hb.dfki.de:motto/abstract-urdf-gripper.git --recursive\n  ```\n* URDF of [DFKI RIC's RH5 robot](https://www.youtube.com/watch?v=jjGQNstmLvY):\n  ```bash\n  git clone git@git.hb.dfki.de:models-robots/rh5_models/pybullet-only-arms-urdf.git --recursive\n  ```\n\n### Propagation of DMP Distribution to State Space\n\n\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/dmp_state_space_distribution_kuka_peginhole_matplotlib.png\" width=\"60%\" /\u003e\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/dmp_state_space_distribution_kuka_peginhole_open3d.png\" width=\"40%\" /\u003e\n\nIf we have a distribution over DMP parameters, we can propagate them to state\nspace through an unscented transform.\nOn the left we see the original demonstration of a dual-arm movement in state\nspace (two 3D positions and two quaternions) and the distribution of several\nDMP weight vectors projected to the state space.\nOn the right side we see several dual-arm trajectories sampled from the\ndistribution in state space.\n\n[Script](https://github.com/dfki-ric/movement_primitives/blob/main/examples/external_dependencies/vis_dmp_to_state_variance.py)\n\n**Dependencies that are not publicly available:**\n\n* Dataset: panel rotation dataset of\n  [Mronga and Kirchner (2021)](https://doi.org/10.1016/j.robot.2021.103779)\n* MoCap library\n* URDF of dual arm\n  [Kuka system](https://robotik.dfki-bremen.de/en/research/robot-systems/imrk/)\n  from\n  [DFKI RIC's HRC lab](https://robotik.dfki-bremen.de/en/research/research-facilities-labs/hrc-lab):\n  ```bash\n  git clone git@git.hb.dfki.de:models-robots/kuka_lbr.git\n  ```\n\n## Build API Documentation\n\nYou can build an API documentation with sphinx.\nYou can install all dependencies with\n\n```bash\npython -m pip install movement_primitives[doc]\n```\n\n... and build the documentation from the folder `doc/` with\n\n```bash\nmake html\n```\n\nIt will be located at `doc/build/html/index.html`.\n\n## Test\n\nTo run the tests some python libraries are required:\n\n```bash\npython -m pip install -e .[test]\n```\n\nThe tests are located in the folder `test/` and can be executed with:\n`python -m pytest`\n\nThis command searches for all files with `test` and executes the functions\nwith `test_*`. You will find a test coverage report at `htmlcov/index.html`.\n\n## Contributing\n\nYou can report bugs in the [issue tracker](https://github.com/dfki-ric/movement_primitives/issues).\nIf you have questions about the software, please use the [discussions\nsection](https://github.com/dfki-ric/movement_primitives/discussions).\nTo add new features, documentation, or fix bugs you can open a pull request\non [GitHub](https://github.com/dfki-ric/movement_primitives). Directly pushing\nto the main branch is not allowed.\n\nThe recommended workflow to add a new feature, add documentation, or fix a bug\nis the following:\n\n* Push your changes to a branch (e.g., feature/x, doc/y, or fix/z) of your fork\n  of the repository.\n* Open a pull request to the main branch of the main repository.\n\nThis is a checklist for new features:\n\n- are there unit tests?\n- does it have docstrings?\n- is it included in the API documentation?\n- run flake8 and pylint\n- should it be part of the readme?\n- should it be included in any example script?\n\n## Non-public Extensions\n\nScripts from the subfolder `examples/external_dependencies/` require access to\ngit repositories (URDF files or optional dependencies) and datasets that are\nnot publicly available. They are available on request (email\nalexander.fabisch@dfki.de).\n\nNote that the library does not have any non-public dependencies! They are only\nrequired to run all examples.\n\n### MoCap Library\n\n```bash\n# untested: pip install git+https://git.hb.dfki.de/dfki-interaction/mocap.git\ngit clone git@git.hb.dfki.de:dfki-interaction/mocap.git\ncd mocap\npython -m pip install -e .\ncd ..\n```\n\n### Get URDFs\n\n```bash\n# RH5\ngit clone git@git.hb.dfki.de:models-robots/rh5_models/pybullet-only-arms-urdf.git --recursive\n# RH5v2\ngit clone git@git.hb.dfki.de:models-robots/rh5v2_models/pybullet-urdf.git --recursive\n# Kuka\ngit clone git@git.hb.dfki.de:models-robots/kuka_lbr.git\n# Solar panel\ngit clone git@git.hb.dfki.de:models-objects/solar_panels.git\n# RH5 Gripper\ngit clone git@git.hb.dfki.de:motto/abstract-urdf-gripper.git --recursive\n```\n\n### Data\n\nI assume that your data is located in the folder `data/` in most scripts.\nYou should put a symlink there to point to your actual data folder.\n\n## Related Publications\n\nThis library implements several types of dynamical movement primitives and\nprobabilistic movement primitives. These are described in detail in the\nfollowing papers.\n\n[1] Ijspeert, A. J., Nakanishi, J., Hoffmann, H., Pastor, P., Schaal, S. (2013).\n    Dynamical Movement Primitives: Learning Attractor Models for Motor\n    Behaviors, Neural Computation 25 (2), 328-373. DOI: 10.1162/NECO_a_00393,\n    https://homes.cs.washington.edu/~todorov/courses/amath579/reading/DynamicPrimitives.pdf\n\n[2] Pastor, P., Hoffmann, H., Asfour, T., Schaal, S. (2009).\n    Learning and Generalization of Motor Skills by Learning from Demonstration.\n    In 2009 IEEE International Conference on Robotics and Automation,\n    (pp. 763-768). DOI: 10.1109/ROBOT.2009.5152385,\n    https://h2t.iar.kit.edu/pdf/Pastor2009.pdf\n\n[3] Muelling, K., Kober, J., Kroemer, O., Peters, J. (2013).\n    Learning to Select and Generalize Striking Movements in Robot Table Tennis.\n    International Journal of Robotics Research 32 (3), 263-279.\n    https://www.ias.informatik.tu-darmstadt.de/uploads/Publications/Muelling_IJRR_2013.pdf\n\n[4] Ude, A., Nemec, B., Petric, T., Morimoto, J. (2014).\n    Orientation in Cartesian space dynamic movement primitives.\n    In IEEE International Conference on Robotics and Automation (ICRA)\n    (pp. 2997-3004). DOI: 10.1109/ICRA.2014.6907291,\n    https://acat-project.eu/modules/BibtexModule/uploads/PDF/udenemecpetric2014.pdf\n\n[5] Gams, A., Nemec, B., Zlajpah, L., Wächter, M., Asfour, T., Ude, A. (2013).\n    Modulation of Motor Primitives using Force Feedback: Interaction with\n    the Environment and Bimanual Tasks (2013), In 2013 IEEE/RSJ International\n    Conference on Intelligent Robots and Systems (pp. 5629-5635). DOI:\n    10.1109/IROS.2013.6697172,\n    https://h2t.anthropomatik.kit.edu/pdf/Gams2013.pdf\n\n[6] Vidakovic, J., Jerbic, B., Sekoranja, B., Svaco, M., Suligoj, F. (2019).\n    Task Dependent Trajectory Learning from Multiple Demonstrations Using\n    Movement Primitives (2019),\n    In International Conference on Robotics in Alpe-Adria Danube Region (RAAD)\n    (pp. 275-282). DOI: 10.1007/978-3-030-19648-6_32,\n    https://link.springer.com/chapter/10.1007/978-3-030-19648-6_32\n\n[7] Paraschos, A., Daniel, C., Peters, J., Neumann, G. (2013).\n    Probabilistic movement primitives, In C.J. Burges and L. Bottou and M.\n    Welling and Z. Ghahramani and K.Q. Weinberger (Eds.), Advances in Neural\n    Information Processing Systems, 26,\n    https://papers.nips.cc/paper/2013/file/e53a0a2978c28872a4505bdb51db06dc-Paper.pdf\n\n[8] Maeda, G. J., Neumann, G., Ewerton, M., Lioutikov, R., Kroemer, O.,\n    Peters, J. (2017). Probabilistic movement primitives for coordination of\n    multiple human–robot collaborative tasks. Autonomous Robots, 41, 593-612.\n    DOI: 10.1007/s10514-016-9556-2,\n    https://link.springer.com/article/10.1007/s10514-016-9556-2\n\n[9] Paraschos, A., Daniel, C., Peters, J., Neumann, G. (2018).\n    Using probabilistic movement primitives in robotics. Autonomous Robots, 42,\n    529-551. DOI: 10.1007/s10514-017-9648-7,\n    https://www.ias.informatik.tu-darmstadt.de/uploads/Team/AlexandrosParaschos/promps_auro.pdf\n\n[10] Lazaric, A., Ghavamzadeh, M. (2010).\n     Bayesian Multi-Task Reinforcement Learning. In Proceedings of the 27th\n     International Conference on International Conference on Machine Learning\n     (ICML'10) (pp. 599-606). https://hal.inria.fr/inria-00475214/document\n\n## Citation\n\nIf you use `movement_primitives` for a scientific publication, I would\nappreciate citation of the following paper:\n\nFabisch, A., (2024). movement_primitives: Imitation Learning of Cartesian\nMotion with Movement Primitives. Journal of Open Source Software, 9(97), 6695,\n[![Paper DOI](https://joss.theoj.org/papers/10.21105/joss.06695/status.svg)](https://doi.org/10.21105/joss.06695)\n\nBibtex entry:\n\n```bibtex\n@article{Fabisch2024,\n  doi = {10.21105/joss.06695},\n  url = {https://doi.org/10.21105/joss.06695},\n  year = {2024},\n  publisher = {The Open Journal},\n  volume = {9},\n  number = {97},\n  pages = {6695},\n  author = {Alexander Fabisch},\n  title = {movement_primitives: Imitation Learning of Cartesian Motion with Movement Primitives},\n  journal = {Journal of Open Source Software}\n}\n```\n\n## Funding\n\nThis library has been developed initially at the\n[Robotics Innovation Center](https://robotik.dfki-bremen.de/en/startpage.html)\nof the German Research Center for Artificial Intelligence (DFKI GmbH) in\nBremen. At this phase the work was supported through a grant of the German\nFederal Ministry of Economic Affairs and Energy (BMWi, FKZ 50 RA 1701).\n\n\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/DFKI_Logo.jpg\" height=\"150px\" /\u003e\u003cimg src=\"https://raw.githubusercontent.com/dfki-ric/movement_primitives/main/doc/source/_static/241-logo-bmwi-jpg.jpg\" height=\"150px\" /\u003e\n\n```{toctree}\n:hidden:\napi\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdfki-ric%2Fmovement_primitives","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdfki-ric%2Fmovement_primitives","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdfki-ric%2Fmovement_primitives/lists"}