virtualmodelcontrol 0.5.0__tar.gz → 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/CHANGELOG.md +148 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/PKG-INFO +7 -4
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/README.md +3 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_static/custom.css +14 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/conventions.md +8 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/library.md +10 -4
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/passivity.md +7 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/vmc.md +4 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/development/contributing.md +6 -3
- virtualmodelcontrol-1.0.0/docs/development/support.md +48 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/docs_setup.py +1 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/examples/finger.md +1 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/examples/hand.md +2 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/examples/hanging-arm.md +1 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/examples/soft-arm.md +3 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/index.md +4 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/installation.md +2 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/build-a-robot.md +23 -19
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/configurations.md +4 -3
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/contact.md +6 -3
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/coordinates-and-components.md +9 -8
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/crawl.md +99 -10
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/energy.md +6 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/estimation.md +23 -12
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/extend.md +126 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/first-controller.md +7 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/fit.md +1 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/force.md +7 -5
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/kinematics.md +3 -2
- virtualmodelcontrol-1.0.0/docs/tutorials/mpc.md +350 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/optimize.md +98 -14
- virtualmodelcontrol-1.0.0/docs/tutorials/outside.md +203 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/parameters.md +3 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/real-time.md +18 -8
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/run-logs.md +4 -5
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/stiffness.md +3 -3
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/swaps.md +17 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/tuning.md +9 -6
- virtualmodelcontrol-1.0.0/docs/tutorials/underactuated.md +439 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/pyproject.toml +4 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/_version.py +2 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/force.py +2 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/position.py +3 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/seeking.py +1 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/stiffness.py +2 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/compiler.py +12 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/config/files.py +2 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/__init__.py +2 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/controller.py +13 -5
- virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/control/state.py +75 -0
- virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/control/underactuated.py +278 -0
- virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/core/backends.py +274 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/space.py +23 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/dynamics.py +79 -21
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/contact.py +2 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/kalman.py +29 -4
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/measurement.py +24 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/stiffness.py +2 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/hardware/profile.py +2 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/math.py +19 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/__init__.py +4 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/actuation.py +98 -0
- virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/models/equations.py +30 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/function.py +5 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/kinematics.py +14 -3
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/__init__.py +9 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/builder.py +46 -5
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/collocation.py +58 -26
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/equilibrium.py +30 -5
- virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/optimization/mpc.py +180 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/nlp.py +7 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/problem.py +50 -15
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/result.py +15 -7
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/search.py +1 -1
- virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/optimization/shooting.py +264 -0
- virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/optimization/solver.py +140 -0
- virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/optimization/tank.py +57 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/trajectory.py +4 -2
- virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/optimization/virtual.py +56 -0
- virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/robots/__init__.py +5 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/robots/adapt.py +3 -3
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/robots/bimanual.py +1 -1
- virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/robots/planar.py +217 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/robots/turtle.py +2 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/model_plant.py +3 -2
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/system.py +4 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/testing.py +54 -3
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/viz/draw.py +1 -1
- virtualmodelcontrol-1.0.0/tests/backend_helpers.py +71 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/config/test_config.py +6 -4
- virtualmodelcontrol-1.0.0/tests/control/test_state_layout.py +48 -0
- virtualmodelcontrol-1.0.0/tests/control/test_underactuated.py +341 -0
- virtualmodelcontrol-1.0.0/tests/control/test_underactuated_golden.py +130 -0
- virtualmodelcontrol-1.0.0/tests/core/test_backends.py +166 -0
- virtualmodelcontrol-1.0.0/tests/core/test_backends_torch.py +78 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/core/test_space.py +16 -0
- virtualmodelcontrol-1.0.0/tests/data/underactuated.npz +0 -0
- virtualmodelcontrol-1.0.0/tests/estimation/test_unmeasured.py +159 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/lab_optimization.py +1 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_phase_spring.py +1 -1
- virtualmodelcontrol-1.0.0/tests/models/test_equations.py +274 -0
- virtualmodelcontrol-1.0.0/tests/models/test_underactuated.py +80 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_collocation.py +1 -18
- virtualmodelcontrol-1.0.0/tests/optimization/test_mpc.py +316 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_periodic.py +5 -2
- virtualmodelcontrol-1.0.0/tests/optimization/test_plant.py +252 -0
- virtualmodelcontrol-1.0.0/tests/optimization/test_shooting.py +339 -0
- virtualmodelcontrol-1.0.0/tests/optimization/test_solvers.py +123 -0
- virtualmodelcontrol-1.0.0/tests/optimization/test_tank.py +117 -0
- virtualmodelcontrol-1.0.0/tests/optimization/test_virtual.py +416 -0
- virtualmodelcontrol-1.0.0/tests/robots/test_planar.py +94 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_wallclock.py +1 -1
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_docs.py +6 -4
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_readme.py +1 -1
- virtualmodelcontrol-1.0.0/tests/underactuated_lab.py +50 -0
- virtualmodelcontrol-0.5.0/src/virtualmodelcontrol/optimization/solver.py +0 -80
- virtualmodelcontrol-0.5.0/src/virtualmodelcontrol/robots/__init__.py +0 -5
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/.gitignore +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/CITATION.cff +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/LICENSE +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/benchmarks/tick.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_ext/video.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_static/create-lab.png +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_static/favicon.svg +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_static/logo-light.svg +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_static/logo.svg +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_static/readme-hero.svg +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_templates/autosummary/module.rst +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_templates/partials/toc.html +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/api/index.md +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/efficiency.md +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/finger.md +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/pcc.md +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/conf.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/development/changelog.md +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/development/roadmap.md +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/examples/turtle.md +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/examples/two-arms.md +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/_draw.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/bimanual.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/control_loop.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/energy_flow.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/finger.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/four_steps.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/hand.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/helyx.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/library_map.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/mechanism.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/params.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/pcc.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/turtle.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/ur5.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/scripts/readme_figure.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/troubleshooting.md +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/introduction.md +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/reach.yaml +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/run-settings.yaml +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/limits.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/scalar.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/config/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/config/controllers.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/config/coordinates.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/config/experiment.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/config/spec.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/blending.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/output.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/projection.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/schedule.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/tank.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/params.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/registry.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/signals.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/symbolic.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/units.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/balance.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/compliance.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/imu.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/inversion.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/momentum.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/sensors.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/velocity.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/hardware/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/efficiency.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/params.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/plateaus.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/steps.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/stiffness.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/transmission.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/base.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/constrained.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/dissipation.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/gated.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/inertance.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/locomotion.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/sources.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/storage.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/base.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/frames.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/geometry.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/joints.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/ops.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/references.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/mechanism.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/assembly.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/continuum/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/continuum/pcc.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/efficiency.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/joint_space.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/kinematic.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/rigid/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/rigid/couplings.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/rigid/poe.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/rigid/spline.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/asktell.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/horizon.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/terms.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/variables.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/py.typed +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/robots/helyx.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/robots/ur5.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/balance.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/plant.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/replay.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/rollout.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/run.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/runlog.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/viz/__init__.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/viz/animation.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/viz/style.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_fingertip.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_force.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_grasp.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_holding.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_loop.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_position.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_scalar.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_seeking.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_stiffness_tracking.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_virtual_state.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/conftest.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_blending.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_honesty.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_inputs.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_output.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_projection.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_schedule.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_tank.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_vmc_golden.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/core/test_params.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/core/test_registry.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/core/test_signals.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/core/test_symbolic.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/adaptation.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/compliance.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/components.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/configs/finger.yaml +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/configs/hand.yaml +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/configs/soft-arm.yaml +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/configs/turtle.yaml +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/configs/two-arms.yaml +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/configs/ur5-hand.yaml +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/derivatives.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/dynamics.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/efficiency.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/estimation.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/finger.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/fingertip.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/hand.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/heuristics.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/imu.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/kalman.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/mocap.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/optimization.json +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/optimization.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/pcc.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/transmission.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/turtle.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/vmc.npz +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_compliance_golden.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_contact.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_imu.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_inversion.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_kalman.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_kalman_golden.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_kalman_unscented.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_mocap_golden.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_momentum.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_sensors.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_velocity.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/hardware/test_profile.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/hardware/test_templates.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/helpers.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/identification/test_efficiency_fit.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/identification/test_fit_params.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/identification/test_friction.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/identification/test_steps.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/identification/test_stiffness_fit.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/identification/test_transmission.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_components.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_components_golden.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_contact.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_coordinates.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_distances.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_frames.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_friction.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_gated.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_mechanism.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_more_components.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_pair_contact.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_virtual_model.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_actuation.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_assembly.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_contact_map.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_efficiency.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_floating.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_floating_base.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_function.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_kinematics.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_pcc.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_poe.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_rail.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_asktell.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_equilibrium.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_horizon.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_lab.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_problem.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_search.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_structure.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_swap.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_terms.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_variables.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_adapt.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_bimanual.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_crawler.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_hand.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_helyx.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_parametric.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_turtle.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_ur5.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_balance.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_record.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_replay.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_rollout.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_run.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_runlog.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/small_plan.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/soft_arm_plan.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_benchmark.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_compiler.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_dynamics.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_import.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_math.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_testing.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/viz/test_animate.py +0 -0
- {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/viz/test_viz.py +0 -0
|
@@ -4,7 +4,134 @@ All notable changes to this project are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions follow
|
|
5
5
|
[Semantic Versioning](https://semver.org/) (0.x: the API may change between minor versions).
|
|
6
6
|
|
|
7
|
-
## [
|
|
7
|
+
## [1.0.0] - 2026-10-07
|
|
8
|
+
|
|
9
|
+
The first stable release. It also carries the work meant for 0.6.0 (planning with virtual states,
|
|
10
|
+
unmeasured coordinates, custom dynamics, the planner on a larger plant, MPC and underactuation) and
|
|
11
|
+
for 0.7.0 (models as numpy and PyTorch code), which were never released on their own, and it adds
|
|
12
|
+
the checking: the whole suite on the oldest and the newest supported Python and numpy, on Linux,
|
|
13
|
+
macOS and Windows, every page of the documentation run from a clean checkout, and a review of the
|
|
14
|
+
public API (what `__all__` lists in each module is the API) and of every page of the docs at desktop
|
|
15
|
+
and phone width. The rules for what changes between versions are on the page "Support policy".
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- `optimization.Shooting(q0, horizon, nodes, v0=, steps=, initial=, transition=, scales=,
|
|
20
|
+
integrator=, substeps=)`: multiple shooting, a second transcription next to `Collocation`
|
|
21
|
+
with the same terms. The unknowns are q and v at the nodes; over each interval the closed
|
|
22
|
+
loop is simulated as `vmc.sim.rollout` does (the command held over each of `substeps` control
|
|
23
|
+
steps, the robot advanced by the linearly implicit step or by `"rk4"`), and constraints join
|
|
24
|
+
the end of an interval to the next node. A plan is the closed loop of a simulation at that
|
|
25
|
+
control step (a test reproduces `rollout` to rounding error), and agrees with `Collocation` as
|
|
26
|
+
the control step shrinks (first order). The start is the pair of Params `shooting.q0` and
|
|
27
|
+
`shooting.v0`, which a problem can declare as parameters. `steps` names live Params that take
|
|
28
|
+
one value in every interval, between their bounds: trajectories of stiffness and references,
|
|
29
|
+
returned in `Result.steps` (`apply(target, interval=k)` sets the values of interval k). The
|
|
30
|
+
model does not carry the force that balances the robot at q0 under `initial`, as `Collocation`
|
|
31
|
+
does.
|
|
32
|
+
- `optimization.TankBudget(level, refill=True)`: the planned changes of the Params that step stay
|
|
33
|
+
within the energy of a `vmc.control.Tank`. The plan keeps the tank's level from the exact jump
|
|
34
|
+
of the controller's energy at each change, and from the energy the controller's dampers take
|
|
35
|
+
back, and keeps it at least zero; a test runs the plan through a real `Tank` and finds its level
|
|
36
|
+
to rounding error. The tank's capacity is not planned.
|
|
37
|
+
- `optimization.MPC(problem, shift=1, rti=False)`: the plan as a receding-horizon controller. The
|
|
38
|
+
program is built once, with the measured state, the controller's Params now, the tank's level
|
|
39
|
+
and the references as parameters of each solve. `step(controller, q, v, references, latency=)`
|
|
40
|
+
solves from the measured state, starting from the previous plan moved up by `shift` intervals,
|
|
41
|
+
and applies the plan's Params through `controller.set` (so a `Tank` bounds them), returning
|
|
42
|
+
the energy jump as the adaptation laws do. A plan that took `latency` seconds (the measured
|
|
43
|
+
solve time by default) is applied as of that time. With `rti`, one SQP iteration per step.
|
|
44
|
+
`start` and `poll` plan in a thread and apply the plan once it is ready, as of the time since
|
|
45
|
+
the start (CasADi lets other threads run during a solve; the solver is created with the `MPC`,
|
|
46
|
+
as it is not safe to create one in a second thread). `Problem.warm_up()` builds the program and
|
|
47
|
+
the solver now, and `Problem.solve` attaches the iteration callback only when it is given a
|
|
48
|
+
`progress`.
|
|
49
|
+
- Planning with virtual states: `Collocation`, `Shooting` and `Equilibrium` accept controllers
|
|
50
|
+
with virtual states (a flywheel, a mass the robot is tied to). The states are unknowns of the
|
|
51
|
+
plan at every node, with the controller's own dynamics: collocated with the same scheme as the
|
|
52
|
+
robot (`Collocation`), or advanced as `VMCController.step` and `vmc.sim.rollout` advance them
|
|
53
|
+
(`Shooting`, which then reproduces `rollout` to rounding error, the states included). They
|
|
54
|
+
start from the state the controller is compiled with, or from `z0` (positions, then
|
|
55
|
+
velocities); a periodic motion repeats them; `Equilibrium` rests them. `Result.z` holds them,
|
|
56
|
+
`warm_start` takes them, `TankBudget` reads the energy at them, and the controller in place
|
|
57
|
+
(`initial`) may have states too, as a system (it starts with the plan) or as a running
|
|
58
|
+
controller (its state is where it is now). `MPC` plans a running controller from
|
|
59
|
+
`controller.z` when the `Shooting` has a `z0`, which is then a parameter of the program
|
|
60
|
+
(`shooting.z0`). The docstring of `Shooting` now says what the code does: the controller is
|
|
61
|
+
called at every one of an interval's `substeps` control steps.
|
|
62
|
+
- Sensors of combinations of the coordinates: `Measurement(..., matrix=)` takes an (m, n) matrix
|
|
63
|
+
and reads `matrix @ q` and `matrix @ v` (instead of `observed`, a selection of coordinates).
|
|
64
|
+
`KalmanFilter.encoder` of a robot with fewer motors than coordinates (`Underactuated`) no longer
|
|
65
|
+
reads the motors as if they gave `q`, with the passive coordinates frozen: it returns the
|
|
66
|
+
measurement of the motors themselves, with the Jacobian of the motor angles at the estimate as
|
|
67
|
+
the matrix, so the passive coordinates are left to the model (`Rq` and `Rv` are then the
|
|
68
|
+
covariances of the motors' readings). A robot with a motor on every coordinate keeps its encoder
|
|
69
|
+
as it was. The underactuated tutorial runs the naive controller on such an estimate, and shows
|
|
70
|
+
what it takes: a process noise that admits the model's error (with the default one the gate
|
|
71
|
+
throws out every reading after the first swing and the filter breaks) and a controller that
|
|
72
|
+
does not outrun the filter.
|
|
73
|
+
- Equations of motion from a function: `models.Equations(residual, energy=None)`, given to
|
|
74
|
+
`FunctionModel(..., equations=)`, for a black-box, learned or external model whose dynamics
|
|
75
|
+
are not built from parts. The residual `r(q, v, a, tau, f, p) = M(q) a + h(q, v) - tau - f` is
|
|
76
|
+
written with CasADi operations and affine in `a`; `tau` is the generalized force of the motors
|
|
77
|
+
and `f` that of the robot's own components, which still add springs, dampers and contact (the
|
|
78
|
+
masses and the weight are in the equations, so there is no `Inertance` or `Gravity`).
|
|
79
|
+
Everything that runs on a robot runs on it: the simulator, `rollout`, the planners, the
|
|
80
|
+
Kalman filter, the momentum observer. With an `energy(q, v, p)` returning (T, V) it has the
|
|
81
|
+
robot's energy and power; without one `Dynamics.energy` and `power` are `None` and what needs
|
|
82
|
+
them (`ModelPlant.energy`, the `Passivation` stage) raises a `ValueError` that says so
|
|
83
|
+
(`dynamics.needs_energy`). `testing.check_model` checks such a robot's mass matrix
|
|
84
|
+
(symmetric, positive) and, with an energy, that a simulation never gains any. A test builds
|
|
85
|
+
the same two-link arm from parts and from textbook equations and finds the same dynamics,
|
|
86
|
+
energy, simulation, Kalman prediction and plan.
|
|
87
|
+
- Plan a controller on some coordinates of a larger robot: `Problem(system, plant=robot)` takes
|
|
88
|
+
the dynamics from `plant` (every term and `q0` in its coordinates) while the controller stays
|
|
89
|
+
written for its own robot, and reads the plant's motors as `VMCController` does in a
|
|
90
|
+
simulation, through its transmission. The law, the energy of a `TankBudget` and the dampers'
|
|
91
|
+
power of a shooting all go through it. A shooting of the turtle's flywheel controller on
|
|
92
|
+
`turtle.crawler()` equals the simulation step for step, the flywheel's states included (a
|
|
93
|
+
test), and the tutorial "Crawl with a flywheel" plans a stride with it. `Shooting(running=)`
|
|
94
|
+
says whether a controller started from `z0` is already running (`z0` alone still means so)
|
|
95
|
+
or starts with the plan, as one reset there does. `Space.on_manifold(q)` gives the equations
|
|
96
|
+
that a configuration obeys (the unit norm of a quaternion; none for a flat space), and
|
|
97
|
+
`Shooting` and `Equilibrium` constrain their nodes with them: before, a plan of a floating body
|
|
98
|
+
could drift off unit quaternions and plan another body's motion.
|
|
99
|
+
- The models as numpy and PyTorch code: `core.backends.source`, `translate` and `export` write
|
|
100
|
+
a CasADi function as straight-line Python, one statement per operation of its expression
|
|
101
|
+
graph, for numpy (the text imports numpy only, so it runs without CasADi) or PyTorch
|
|
102
|
+
(differentiable, on any dtype and device). Arguments and results have CasADi's shapes, with any
|
|
103
|
+
leading batch dimensions. `Kinematics.functions(at, backend="numpy")`, `Dynamics.export` and
|
|
104
|
+
`Compiled.export` give a model's functions that way, each with its `source`. numpy gives
|
|
105
|
+
CasADi's numbers to rounding error and PyTorch to 1e-12 on the kinematics with their Jacobians
|
|
106
|
+
and Hessians, including the derivatives by autograd; a model with a poorly conditioned mass
|
|
107
|
+
matrix (the soft arm's dynamics) differs by a few parts in 1e11, as PyTorch's `sin` and `cos`
|
|
108
|
+
differ in the last place. The extra `virtualmodelcontrol[torch]` and the tutorial "Use a model
|
|
109
|
+
outside CasADi".
|
|
110
|
+
- `ForceTracking`, `StiffnessTracking`, `PositionRegulation`, `HoldingGoals`, `ContactForce` and
|
|
111
|
+
`TaskStiffness` refuse a `StateController` (also inside a `Tank`) with a `ValueError` that says
|
|
112
|
+
so, instead of failing on the shapes of its inputs: they read a controller in the layout of the
|
|
113
|
+
motors. A robot with fewer motors than coordinates uses the plain frozen controller (it reads the
|
|
114
|
+
motors), or `control.underactuated.DirectionalForce` for a force.
|
|
115
|
+
- Solver presets: `Problem(system, solver=...)` takes `"ipopt"` (the default), `"ipopt-exact"`
|
|
116
|
+
(exact Hessians: 40 iterations instead of 165 on the tutorial's shooting), `"sqp"` (CasADi's
|
|
117
|
+
`sqpmethod` with `qrqp`, the Hessian's negative eigenvalues clipped; other QP solvers by the
|
|
118
|
+
`qpsol` option), `"rti"` and `"fatrop"` (as a general problem, without stages).
|
|
119
|
+
`optimization.PRESETS` lists them and `optimization.solver.available(name)` tells whether the
|
|
120
|
+
CasADi build has the plugin. `Result.status` words FATROP's endings as IPOPT's.
|
|
121
|
+
- Docs: tutorial "Model predictive control".
|
|
122
|
+
- Docs: the page "Support policy": which versions of Python and numpy are supported, what
|
|
123
|
+
semantic versioning means here (a deprecation lasts at least one minor version), what the public
|
|
124
|
+
API is, the schema of the run logs, where to report an issue, and the safety checks before the
|
|
125
|
+
first run on a robot (also in "Real time and the robot").
|
|
126
|
+
|
|
127
|
+
### Changed
|
|
128
|
+
|
|
129
|
+
- `__all__` in `math`, `testing`, `compiler`, `dynamics` and `system`: what they list is the public
|
|
130
|
+
API, as in every other module; `from virtualmodelcontrol.x import *` gives only that.
|
|
131
|
+
- The configuration and hardware profile files are read and written as UTF-8 on every platform,
|
|
132
|
+
so that a file written on Linux reads on Windows.
|
|
133
|
+
- The docs use American spelling, the figure legends are 18 pt (readable on a phone), and wide
|
|
134
|
+
tables wrap their code on a narrow screen.
|
|
8
135
|
|
|
9
136
|
## [0.5.0] - 2026-10-06
|
|
10
137
|
|
|
@@ -13,6 +140,26 @@ tank, tuning and the calibrations), which was never released on its own.
|
|
|
13
140
|
|
|
14
141
|
### Added
|
|
15
142
|
|
|
143
|
+
- Underactuated Virtual Model Control, for robots with fewer motors than coordinates.
|
|
144
|
+
`models.Underactuated(B)` is the actuation with an input matrix B (`Underactuated.joints` for
|
|
145
|
+
motors on some joints): motor angles Bᵀq, torques B u, the allocation B⁺ τ, the projector E and
|
|
146
|
+
the `defect` E τ it cannot realize. Its motors give the frozen configuration (the motors' part
|
|
147
|
+
of q, the rest at `q_rest`), so a `VMCController` on it is the frozen controller.
|
|
148
|
+
`control.StateController` reads (q, v) from the measurement (`meas["q"]`, `meas["v"]`, or its
|
|
149
|
+
`read`) instead of the motors, which is the naive controller and also how a controller acts
|
|
150
|
+
through an estimate of unmeasured coordinates. `control.underactuated` has `controller(compiled,
|
|
151
|
+
base="naive"|"frozen", correction=None|"passive"|"tank", gravity=)`, the `Passivation` output
|
|
152
|
+
stage (the passive and the tank correction: the motors never inject more power than the
|
|
153
|
+
robot's own dampers take, or more than the tank holds), `Frozen` (the frozen configuration,
|
|
154
|
+
also balancing the robot's gravity), `DirectionalForce` (a force along a direction by one
|
|
155
|
+
scalar of the stiffness, closed form, positive definite), `projector`, `defect` and `feasible`
|
|
156
|
+
(the wrenches the motors realize in full). An output stage with a `reset` is reset with its
|
|
157
|
+
controller. They agree with the lab's own code on its three robots (every flag, the frozen
|
|
158
|
+
point, the force law, and the closed loops).
|
|
159
|
+
- `robots.planar`: `arm("three-link")` with one passive joint, `arm("five-link")` with three, and
|
|
160
|
+
`continuum()`, a three-section continuum arm driven by two tendons; `add_dynamics` and
|
|
161
|
+
`add_continuum_dynamics` give them gravity and their springs and dampers.
|
|
162
|
+
- Docs: tutorial "Robots with fewer motors than joints".
|
|
16
163
|
- `vmc.optimization`: plan the motion of a controller on a robot and optimize its Params.
|
|
17
164
|
`Problem(system)` is built once and solved many times. `free` chooses the Params to optimize
|
|
18
165
|
and `parameter` the ones set at every solve (references, say), by name or glob; bounds and
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: virtualmodelcontrol
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.0
|
|
4
4
|
Summary: Virtual Model Control: robots and controllers as mechanisms of springs, dampers and inertances, compiled with CasADi.
|
|
5
5
|
Project-URL: Repository, https://github.com/vigno0405/VirtualModelControl
|
|
6
6
|
Project-URL: Documentation, https://vigno0405.github.io/VirtualModelControl/
|
|
@@ -8,7 +8,7 @@ Author: Lorenzo Vignoli
|
|
|
8
8
|
License-Expression: MIT
|
|
9
9
|
License-File: LICENSE
|
|
10
10
|
Keywords: casadi,control,passivity,robotics,soft robots,virtual model control
|
|
11
|
-
Classifier: Development Status ::
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
12
|
Classifier: Intended Audience :: Science/Research
|
|
13
13
|
Classifier: Operating System :: OS Independent
|
|
14
14
|
Classifier: Operating System :: POSIX :: Linux
|
|
@@ -36,6 +36,8 @@ Provides-Extra: docs
|
|
|
36
36
|
Requires-Dist: myst-nb>=1.1; extra == 'docs'
|
|
37
37
|
Requires-Dist: sphinx-immaterial>=0.13; extra == 'docs'
|
|
38
38
|
Requires-Dist: sphinx>=7.2; extra == 'docs'
|
|
39
|
+
Provides-Extra: torch
|
|
40
|
+
Requires-Dist: torch>=2.0; extra == 'torch'
|
|
39
41
|
Description-Content-Type: text/markdown
|
|
40
42
|
|
|
41
43
|
<a href="https://www.epfl.ch/labs/create/"><img align="right" height="72" src="https://raw.githubusercontent.com/vigno0405/VirtualModelControl/main/docs/_static/create-lab.png" alt="CREATE Lab, EPFL"></a>
|
|
@@ -72,8 +74,8 @@ Virtual environments, conda, ROS 2 and pinned versions are covered in [Installat
|
|
|
72
74
|
|
|
73
75
|
## Requirements
|
|
74
76
|
|
|
75
|
-
Python 3.10 or newer, tested with 3.10 to 3.14 on Ubuntu 22.04 and 24.04
|
|
76
|
-
ROS and LaTeX are not needed.
|
|
77
|
+
Python 3.10 or newer, tested with 3.10 to 3.14 on Ubuntu 22.04 and 24.04, and with the oldest
|
|
78
|
+
versions of the packages below. Nothing to compile; ROS and LaTeX are not needed.
|
|
77
79
|
|
|
78
80
|
## Dependencies
|
|
79
81
|
|
|
@@ -87,6 +89,7 @@ pip installs them with the library:
|
|
|
87
89
|
| [matplotlib](https://matplotlib.org) | 3.8 or newer | figures and animations |
|
|
88
90
|
| [imageio-ffmpeg](https://github.com/imageio/imageio-ffmpeg) | 0.5 or newer | MP4 videos of the animations |
|
|
89
91
|
| [PyYAML](https://pyyaml.org) | 6 or newer | robot and hardware files |
|
|
92
|
+
| [PyTorch](https://pytorch.org) (optional, `pip install virtualmodelcontrol[torch]`) | 2.0 or newer | models as PyTorch code |
|
|
90
93
|
|
|
91
94
|
## The example in the figure
|
|
92
95
|
|
|
@@ -32,8 +32,8 @@ Virtual environments, conda, ROS 2 and pinned versions are covered in [Installat
|
|
|
32
32
|
|
|
33
33
|
## Requirements
|
|
34
34
|
|
|
35
|
-
Python 3.10 or newer, tested with 3.10 to 3.14 on Ubuntu 22.04 and 24.04
|
|
36
|
-
ROS and LaTeX are not needed.
|
|
35
|
+
Python 3.10 or newer, tested with 3.10 to 3.14 on Ubuntu 22.04 and 24.04, and with the oldest
|
|
36
|
+
versions of the packages below. Nothing to compile; ROS and LaTeX are not needed.
|
|
37
37
|
|
|
38
38
|
## Dependencies
|
|
39
39
|
|
|
@@ -47,6 +47,7 @@ pip installs them with the library:
|
|
|
47
47
|
| [matplotlib](https://matplotlib.org) | 3.8 or newer | figures and animations |
|
|
48
48
|
| [imageio-ffmpeg](https://github.com/imageio/imageio-ffmpeg) | 0.5 or newer | MP4 videos of the animations |
|
|
49
49
|
| [PyYAML](https://pyyaml.org) | 6 or newer | robot and hardware files |
|
|
50
|
+
| [PyTorch](https://pytorch.org) (optional, `pip install virtualmodelcontrol[torch]`) | 2.0 or newer | models as PyTorch code |
|
|
50
51
|
|
|
51
52
|
## The example in the figure
|
|
52
53
|
|
|
@@ -155,6 +155,20 @@ ul.contains-task-list {
|
|
|
155
155
|
min-width: 14em;
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
+
/* On a phone a table has tighter cells and its code wraps, so a three-column table fits the
|
|
159
|
+
screen; a wider one still scrolls sideways inside itself. */
|
|
160
|
+
@media screen and (max-width: 44.9375em) {
|
|
161
|
+
.md-typeset table.docutils.data:not(.plain) td,
|
|
162
|
+
.md-typeset table.docutils.data:not(.plain) th {
|
|
163
|
+
min-width: 0;
|
|
164
|
+
padding: 0.6em 0.5em;
|
|
165
|
+
}
|
|
166
|
+
.md-typeset table.docutils td code {
|
|
167
|
+
white-space: normal;
|
|
168
|
+
overflow-wrap: anywhere;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
158
172
|
/* Display equations: a wide one scrolls sideways inside itself on a phone, not the page. */
|
|
159
173
|
.md-typeset mjx-container[display="true"] {
|
|
160
174
|
overflow-x: auto;
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
- Motor angles are `θ`, a generalized force is `τ`, actuator commands are `u`.
|
|
21
21
|
- A spring's deflection is `y = x − x_ref`, so it pulls `x` towards `x_ref`. Storage gives
|
|
22
22
|
`f = −∂V/∂y`, a damper `f = −D ẏ`, and every force reaches the robot as `τ = Jᵀ f`.
|
|
23
|
-
- Arrays in, arrays out: inputs accept anything array-like; outputs are numpy arrays
|
|
23
|
+
- Arrays in, arrays out: inputs accept anything array-like; outputs are numpy arrays (torch
|
|
24
|
+
tensors from a model exported with `backend="torch"`).
|
|
24
25
|
|
|
25
26
|
## Continuum robots
|
|
26
27
|
|
|
@@ -60,7 +61,12 @@ site
|
|
|
60
61
|
parameter `s`.
|
|
61
62
|
|
|
62
63
|
plant
|
|
63
|
-
What the controller drives: a simulator such as `ModelPlant`, or the real robot.
|
|
64
|
+
What the controller drives: a simulator such as `ModelPlant`, or the real robot. A planner's
|
|
65
|
+
plant is the robot that moves, when the controller is written for other coordinates.
|
|
66
|
+
|
|
67
|
+
tank
|
|
68
|
+
An energy budget for changing a running controller: a change is applied as far as the tank
|
|
69
|
+
pays for the energy it gives the controller, and what the controller's dampers take refills it.
|
|
64
70
|
|
|
65
71
|
output stage
|
|
66
72
|
An optional correction of the motor commands for real hardware: friction compensation,
|
|
@@ -30,19 +30,22 @@ change, including that nothing in the library imports ROS.
|
|
|
30
30
|
|
|
31
31
|
| You want to | Use |
|
|
32
32
|
|---|---|
|
|
33
|
-
| start from an existing robot | `virtualmodelcontrol.robots`: `helyx`, `bimanual`, `adapt`, `turtle`, `ur5` |
|
|
33
|
+
| start from an existing robot | `virtualmodelcontrol.robots`: `helyx`, `bimanual`, `adapt`, `turtle`, `ur5`, `planar` |
|
|
34
34
|
| describe a new robot | `vmc.models`: `PCC`, `SerialChain`, `JointSpace`, `LinearCoupling`, `Assembly`, `TendonTransmission` |
|
|
35
35
|
| place virtual elements | `vmc.Mechanism`, coordinates and components such as `vmc.LinearSpring` |
|
|
36
36
|
| compile and run a controller | `vmc.VirtualMechanismSystem`, `vmc.compile`, `vmc.VMCController` |
|
|
37
37
|
| correct commands for real hardware | `vmc.control.output`: friction compensation, pretension, limits |
|
|
38
38
|
| get positions, Jacobians, Hessians | `vmc.Kinematics` |
|
|
39
|
-
| get the robot's equations of motion | `vmc.compile_dynamics` |
|
|
39
|
+
| get the robot's equations of motion | `vmc.compile_dynamics` (from the components, or from a function with `vmc.models.Equations`) |
|
|
40
40
|
| simulate a closed loop | `vmc.sim`: `ModelPlant`, `run`, `SimClock` |
|
|
41
|
+
| estimate the state, forces and stiffness | `vmc.estimation`: `KalmanFilter`, `ContactForce`, `TaskStiffness` |
|
|
42
|
+
| change a running controller's Params to track a goal | `vmc.adaptation`: `ForceTracking`, `StiffnessTracking`, `DitherSeeking` |
|
|
41
43
|
| fit stiffness, damping and efficiencies to data | `vmc.identification` |
|
|
42
|
-
| plan a motion and optimize a controller's Params | `vmc.optimization`: `Problem`, `Collocation`, `Effort`, `Cost`, `Bound` |
|
|
44
|
+
| plan a motion and optimize a controller's Params | `vmc.optimization`: `Problem`, `Collocation`, `Shooting`, `MPC`, `Effort`, `Cost`, `Bound` |
|
|
43
45
|
| record, save, replay and compare runs | `vmc.sim`: `RunLog`, `replay`, `compare` |
|
|
44
46
|
| describe an experiment in a file | `vmc.config`: `load`, `Experiment` |
|
|
45
47
|
| draw and animate | `vmc.viz` |
|
|
48
|
+
| run a model without CasADi | `backend="numpy"` or `"torch"`, `Dynamics.export`, `Compiled.export` |
|
|
46
49
|
| parameters, units, scopes | `vmc.Param`, `vmc.ParamSet` |
|
|
47
50
|
|
|
48
51
|
## One symbolic source
|
|
@@ -60,4 +63,7 @@ $$
|
|
|
60
63
|
|
|
61
64
|
with $M$ the mass matrix, $h$ the velocity and gravity terms, $B$ the actuation map, $f_k$ the
|
|
62
65
|
forces of the robot's own components and $J_k$ the Jacobian of each one's coordinate with
|
|
63
|
-
respect to the velocity.
|
|
66
|
+
respect to the velocity. A model whose dynamics are not made of such components (a black box)
|
|
67
|
+
gives the residual itself, as a function. The numpy and PyTorch versions of a model are not
|
|
68
|
+
written again: they are generated from the same graph ([Use a model outside
|
|
69
|
+
CasADi](../tutorials/outside.md)).
|
|
@@ -33,7 +33,7 @@ $$
|
|
|
33
33
|
\dot E_c = -P + D + S .
|
|
34
34
|
$$
|
|
35
35
|
|
|
36
|
-
The compiled controller computes each term (`
|
|
36
|
+
The compiled controller computes each term (`compiled.energy`, `compiled.power`), so the balance can be
|
|
37
37
|
checked on any run.
|
|
38
38
|
|
|
39
39
|
## Passive controllers
|
|
@@ -73,7 +73,8 @@ weight.
|
|
|
73
73
|
loop goes unstable even though every element is passive. [Tuning](../tutorials/tuning.md)
|
|
74
74
|
shows the limit on damping.
|
|
75
75
|
- **Changing parameters while running.** Raising a stiffness raises the energy stored in that
|
|
76
|
-
spring at once; `controller.set` returns that jump ([Parameters](../tutorials/parameters.md))
|
|
76
|
+
spring at once; `controller.set` returns that jump ([Parameters](../tutorials/parameters.md)),
|
|
77
|
+
and a `Tank` pays for it ([Energy and passivity](../tutorials/energy.md)).
|
|
77
78
|
Swapping elements through a smooth blend (`vmc.control.SwapController`) keeps the torques
|
|
78
79
|
continuous.
|
|
79
80
|
- **Sources.** A force source can supply any energy; only gravity compensation is tame.
|
|
@@ -81,5 +82,9 @@ weight.
|
|
|
81
82
|
$\eta P$, and the balance holds with $\eta E_c$. Different efficiencies on motors that one
|
|
82
83
|
element couples make its forces non-conservative, as the [finger example](../examples/finger.md)
|
|
83
84
|
explains.
|
|
85
|
+
- **Joints that no motor drives.** Torques that the motors alone can give, $B^+\tau$, are not
|
|
86
|
+
the gradient of a potential, so the controller may not be passive any more. [Robots with
|
|
87
|
+
fewer motors than joints](../tutorials/underactuated.md) shows the controllers that keep it
|
|
88
|
+
passive.
|
|
84
89
|
- **Output stages.** Friction compensation, pretension and torque limits change the torques the
|
|
85
90
|
motors receive, so the robot's input is no longer the controller's port.
|
|
@@ -68,7 +68,10 @@ $$
|
|
|
68
68
|
|
|
69
69
|
with $B$ the robot's actuation map. For a tendon arm $B = (\partial\theta/\partial q)^\top$,
|
|
70
70
|
with $\theta$ the motor angles. With one motor per joint $B$ is the identity. The controller
|
|
71
|
-
never divides $u$ by an [efficiency](efficiency.md).
|
|
71
|
+
never divides $u$ by an [efficiency](efficiency.md). A robot with fewer motors than joints has
|
|
72
|
+
no $u$ that solves it for every $\tau$: the motors give the least-squares
|
|
73
|
+
$u = B^+\tau$, and what they cannot give is the part that
|
|
74
|
+
[the underactuated tutorial](../tutorials/underactuated.md) calls the defect.
|
|
72
75
|
|
|
73
76
|
## Virtual states
|
|
74
77
|
|
|
@@ -25,17 +25,19 @@ cd VirtualModelControl
|
|
|
25
25
|
.venv/bin/sphinx-build -W -b html docs docs/_build/html
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
The site then opens from `docs/_build/html/index.html`.
|
|
28
|
+
The site then opens from `docs/_build/html/index.html`. The tests of the PyTorch code skip
|
|
29
|
+
themselves without PyTorch: install it with `pip install -e ".[torch]"` to run them.
|
|
29
30
|
|
|
30
31
|
## Code
|
|
31
32
|
|
|
32
33
|
- SI units inside the library; degrees only in the hardware profiles.
|
|
33
34
|
- No numbers in model code: every geometric or physical number is a `Param`, with its default
|
|
34
35
|
in the robot's template, and templates take their geometry as arguments.
|
|
35
|
-
- Models are written once, with CasADi operations; no second copy in numpy or sympy.
|
|
36
|
+
- Models are written once, with CasADi operations; no second copy in numpy or sympy. The numpy
|
|
37
|
+
and PyTorch code of a model is generated from its graph (`core.backends`).
|
|
36
38
|
- Docstrings are short (one to three lines, numpydoc, units on physical quantities); theory goes
|
|
37
39
|
in the documentation.
|
|
38
|
-
- New
|
|
40
|
+
- New behavior is opt-in: projects pin a version, and a finished experiment must run the same
|
|
39
41
|
after an update.
|
|
40
42
|
- Every change adds a line to `CHANGELOG.md` under "Unreleased".
|
|
41
43
|
|
|
@@ -80,4 +82,5 @@ Versions follow semantic versioning and come from git tags. To release:
|
|
|
80
82
|
```
|
|
81
83
|
|
|
82
84
|
The release workflow builds the package, publishes it to PyPI and creates the GitHub release.
|
|
85
|
+
Check that the checks of the pushed commit have passed before you tag it.
|
|
83
86
|
The documentation is rebuilt and published whenever a push to `main` changes it or the code.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Support policy
|
|
2
|
+
|
|
3
|
+
What you can rely on from version 1.0.0 on.
|
|
4
|
+
|
|
5
|
+
## Versions of Python and of the packages
|
|
6
|
+
|
|
7
|
+
The library runs on Python 3.10 to 3.14, with numpy 1.26 or any 2.x. Every push runs the tests
|
|
8
|
+
on Ubuntu 22.04 and 24.04 with Python 3.10, 3.12 and 3.14. We have also run them from a fresh
|
|
9
|
+
clone on 3.11 and 3.13, and with the oldest versions the library allows: numpy 1.26, SciPy
|
|
10
|
+
1.11, CasADi 3.6 and matplotlib 3.8. PyTorch, which only the models exported as PyTorch code
|
|
11
|
+
need, is tried with its newest release.
|
|
12
|
+
|
|
13
|
+
A Python version is dropped, in a minor release and with a line in the
|
|
14
|
+
[changelog](changelog.md), once it has reached the end of its life. The same goes for the
|
|
15
|
+
oldest numpy, SciPy, CasADi and matplotlib that the library asks for.
|
|
16
|
+
|
|
17
|
+
The tests also run on macOS and Windows, on request: they are not part of every push.
|
|
18
|
+
|
|
19
|
+
## Versions of the library
|
|
20
|
+
|
|
21
|
+
Versions follow [semantic versioning](https://semver.org). A minor or patch release does not
|
|
22
|
+
break the public API, and a name that is going away warns with a `DeprecationWarning` for at
|
|
23
|
+
least one minor release before a major release removes it.
|
|
24
|
+
|
|
25
|
+
The public API is what the [reference](../api/index.md) lists: the names in the `__all__` of a
|
|
26
|
+
module. Names that start with an underscore, and modules the reference does not list, are
|
|
27
|
+
internal and may change at any time.
|
|
28
|
+
|
|
29
|
+
A fix can change numbers. When it does, the changelog says so, with what changed and from
|
|
30
|
+
which version, as it did for the arc formula of the soft arm's kinematics. An experiment that
|
|
31
|
+
must run the same way always has to pin the version ([Installation](../installation.md)).
|
|
32
|
+
|
|
33
|
+
Run logs carry the library's version and a version of their layout. A log of an older layout
|
|
34
|
+
is read by newer versions, and a log of a newer layout is refused with a message that says to
|
|
35
|
+
update. The changelog lists a change to the layout of the configuration files.
|
|
36
|
+
|
|
37
|
+
## Safety
|
|
38
|
+
|
|
39
|
+
The library gives no guarantee of safety on a real robot. Nothing limits a torque unless you add
|
|
40
|
+
the output stage that does, and a controller that is passive in theory can still go unstable
|
|
41
|
+
with the delay and the sampling of your loop. Read "Before the first run" in [Real-time
|
|
42
|
+
runs](../tutorials/real-time.md) before the first run on a robot.
|
|
43
|
+
|
|
44
|
+
## Problems
|
|
45
|
+
|
|
46
|
+
Report a bug, or a page that does not work as written, on the
|
|
47
|
+
[issue tracker](https://github.com/vigno0405/VirtualModelControl/issues), with the output of
|
|
48
|
+
`pip show virtualmodelcontrol` and of `python -c "import casadi, numpy; print(casadi.__version__, numpy.__version__)"`.
|
|
@@ -7,4 +7,5 @@ from virtualmodelcontrol import viz
|
|
|
7
7
|
|
|
8
8
|
viz.use_style(usetex=False) # Computer Modern without needing LaTeX on the build machine
|
|
9
9
|
plt.rcParams["figure.figsize"] = (6.4, 4.4) # [in]: 18 pt text stays readable on a phone
|
|
10
|
+
plt.rcParams["legend.fontsize"] = 18 # and so do the legends, which the lab style makes smaller
|
|
10
11
|
get_ipython().run_line_magic("config", "InlineBackend.figure_formats = ['svg']")
|
|
@@ -50,7 +50,7 @@ params.table(adapt.finger(), {
|
|
|
50
50
|
"m_mcp.mass": "mass of the proximal phalanx",
|
|
51
51
|
"m_pip.mass": "mass of the middle phalanx",
|
|
52
52
|
"m_dip.mass": "mass of the distal phalanx",
|
|
53
|
-
"dip_cog.position": "
|
|
53
|
+
"dip_cog.position": "center of gravity of the distal phalanx (also `mcp_cog`, `pip_cog`)",
|
|
54
54
|
"gravity": "gravity in the finger's frame, as mounted",
|
|
55
55
|
})
|
|
56
56
|
```
|
|
@@ -77,7 +77,7 @@ The simulation leaves them out, for the reason given in the [finger example](fin
|
|
|
77
77
|
|
|
78
78
|
A ball sits in front of the palm, in the robot mechanism. The simulator feels it, while the
|
|
79
79
|
controller, compiled from its own components only, does not know it is there (see
|
|
80
|
-
[contact](../tutorials/contact.md)). Springs pull three fingertips to the ball's
|
|
80
|
+
[contact](../tutorials/contact.md)). Springs pull three fingertips to the ball's center.
|
|
81
81
|
|
|
82
82
|
The template's thumb tip, (0, 0, 0.0175) in its last joint frame like the fingers', is the point
|
|
83
83
|
the hand's controllers attach to. It lies beside the thumb's last phalanx, which runs along
|
|
@@ -172,7 +172,7 @@ simulate. Its joint angles are only measured, and only the hand's torques are se
|
|
|
172
172
|
```{code-cell} python
|
|
173
173
|
from virtualmodelcontrol.robots import ur5
|
|
174
174
|
|
|
175
|
-
robot = ur5.with_hand() # the hand
|
|
175
|
+
robot = ur5.with_hand() # the hand centered on the flange, not turned
|
|
176
176
|
ctrl = vmc.Mechanism("ctrl")
|
|
177
177
|
ctrl.add("gravity", vmc.GravityCompensation(robot))
|
|
178
178
|
system = vmc.VirtualMechanismSystem(robot, ctrl)
|
|
@@ -193,7 +193,7 @@ shows it little. On a real arm, add a run that keeps the motors moving.
|
|
|
193
193
|
|
|
194
194
|
A tanh spring pulls the tip towards a target with at most 2 N, and a damper slows the tip
|
|
195
195
|
down. An obstacle of radius 2 cm sits beside the arm's path, and the arm must keep 2 cm clear
|
|
196
|
-
of it. Two Gaussian fields push the arm away from the obstacle's
|
|
196
|
+
of it. Two Gaussian fields push the arm away from the obstacle's center. They are attached at
|
|
197
197
|
$s = 0.6$ and at the tip, the ends of the part that has to get past the obstacle.
|
|
198
198
|
|
|
199
199
|
```{code-cell} python
|
|
@@ -52,6 +52,7 @@ from schematics import params
|
|
|
52
52
|
|
|
53
53
|
arm = helyx.add_dynamics(helyx.arm("145-145-145"))
|
|
54
54
|
glue("eta", 100 * helyx.EFFICIENCY, display=False)
|
|
55
|
+
glue("pretension", helyx.PRETENSION_WEIGHTS, display=False)
|
|
55
56
|
params.table(arm, {
|
|
56
57
|
"seg1.L0": "rest length of segment 1 (also `seg2.L0`, `seg3.L0`)",
|
|
57
58
|
"seg1.d": "distance of the tendons from the backbone",
|
|
@@ -74,8 +75,8 @@ matters for the forces the real arm exerts on its surroundings. The
|
|
|
74
75
|
[efficiency page](../concepts/efficiency.md) explains when to use it.
|
|
75
76
|
|
|
76
77
|
The nine motors and their bus are in `helyx.hardware("145-145-145")`. On the real arm,
|
|
77
|
-
`helyx.output_stage()` adds a small pretension to every motor command
|
|
78
|
-
motor angle). The simulations below leave it out.
|
|
78
|
+
`helyx.output_stage()` adds a small pretension to every motor command
|
|
79
|
+
({glue:text}`pretension:.3f` N·m per radian of motor angle). The simulations below leave it out.
|
|
79
80
|
|
|
80
81
|
## Reach past an obstacle
|
|
81
82
|
|
|
@@ -109,6 +109,7 @@ tutorials/configurations
|
|
|
109
109
|
tutorials/kinematics
|
|
110
110
|
tutorials/build-a-robot
|
|
111
111
|
tutorials/extend
|
|
112
|
+
tutorials/outside
|
|
112
113
|
```
|
|
113
114
|
|
|
114
115
|
```{toctree}
|
|
@@ -131,6 +132,7 @@ tutorials/contact
|
|
|
131
132
|
tutorials/force
|
|
132
133
|
tutorials/stiffness
|
|
133
134
|
tutorials/energy
|
|
135
|
+
tutorials/underactuated
|
|
134
136
|
```
|
|
135
137
|
|
|
136
138
|
```{toctree}
|
|
@@ -138,6 +140,7 @@ tutorials/energy
|
|
|
138
140
|
:caption: Plan
|
|
139
141
|
|
|
140
142
|
tutorials/optimize
|
|
143
|
+
tutorials/mpc
|
|
141
144
|
tutorials/crawl
|
|
142
145
|
```
|
|
143
146
|
|
|
@@ -173,5 +176,6 @@ concepts/conventions
|
|
|
173
176
|
api/index
|
|
174
177
|
development/changelog
|
|
175
178
|
Roadmap <development/roadmap>
|
|
179
|
+
development/support
|
|
176
180
|
development/contributing
|
|
177
181
|
```
|
|
@@ -120,10 +120,10 @@ pip install -e .
|
|
|
120
120
|
An experiment should always run the same code. Pin the version, and move the pin on purpose:
|
|
121
121
|
|
|
122
122
|
```bash
|
|
123
|
-
pip install "virtualmodelcontrol==
|
|
123
|
+
pip install "virtualmodelcontrol==1.0.0"
|
|
124
124
|
```
|
|
125
125
|
|
|
126
|
-
In a `requirements.txt` file, write `virtualmodelcontrol==
|
|
126
|
+
In a `requirements.txt` file, write `virtualmodelcontrol==1.0.0`. In a conda `environment.yml`,
|
|
127
127
|
list it under `pip:`. `pip show virtualmodelcontrol` tells you which version you have, and the
|
|
128
128
|
[changelog](development/changelog.md) what changed between versions.
|
|
129
129
|
|