virtualmodelcontrol 0.5.0__tar.gz → 1.1.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.
Files changed (370) hide show
  1. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/CHANGELOG.md +183 -1
  2. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/PKG-INFO +7 -4
  3. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/README.md +3 -2
  4. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/_static/custom.css +14 -0
  5. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/concepts/conventions.md +8 -2
  6. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/concepts/library.md +10 -4
  7. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/concepts/passivity.md +7 -2
  8. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/concepts/vmc.md +4 -1
  9. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/development/contributing.md +6 -3
  10. virtualmodelcontrol-1.1.0/docs/development/support.md +48 -0
  11. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/docs_setup.py +1 -0
  12. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/examples/finger.md +1 -1
  13. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/examples/hand.md +2 -2
  14. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/examples/hanging-arm.md +1 -1
  15. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/examples/soft-arm.md +3 -2
  16. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/index.md +5 -0
  17. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/installation.md +2 -2
  18. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/build-a-robot.md +25 -19
  19. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/configurations.md +4 -3
  20. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/contact.md +6 -3
  21. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/coordinates-and-components.md +9 -8
  22. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/crawl.md +99 -10
  23. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/energy.md +6 -1
  24. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/estimation.md +23 -12
  25. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/extend.md +126 -2
  26. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/first-controller.md +7 -0
  27. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/fit.md +1 -2
  28. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/force.md +7 -5
  29. virtualmodelcontrol-1.1.0/docs/tutorials/friction.md +285 -0
  30. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/kinematics.md +3 -2
  31. virtualmodelcontrol-1.1.0/docs/tutorials/mpc.md +350 -0
  32. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/optimize.md +98 -14
  33. virtualmodelcontrol-1.1.0/docs/tutorials/outside.md +203 -0
  34. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/parameters.md +3 -1
  35. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/real-time.md +18 -8
  36. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/run-logs.md +4 -5
  37. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/stiffness.md +3 -3
  38. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/swaps.md +17 -1
  39. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/tuning.md +9 -6
  40. virtualmodelcontrol-1.1.0/docs/tutorials/underactuated.md +439 -0
  41. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/pyproject.toml +4 -1
  42. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/__init__.py +2 -1
  43. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/_version.py +2 -2
  44. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/adaptation/force.py +2 -0
  45. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/adaptation/position.py +3 -0
  46. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/adaptation/seeking.py +1 -1
  47. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/adaptation/stiffness.py +2 -0
  48. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/compiler.py +12 -0
  49. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/config/files.py +2 -2
  50. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/control/__init__.py +10 -1
  51. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/control/controller.py +13 -5
  52. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/control/output.py +35 -0
  53. virtualmodelcontrol-1.1.0/src/virtualmodelcontrol/control/state.py +75 -0
  54. virtualmodelcontrol-1.1.0/src/virtualmodelcontrol/control/underactuated.py +278 -0
  55. virtualmodelcontrol-1.1.0/src/virtualmodelcontrol/core/backends.py +274 -0
  56. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/core/space.py +23 -0
  57. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/dynamics.py +79 -21
  58. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/estimation/contact.py +2 -0
  59. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/estimation/kalman.py +29 -4
  60. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/estimation/measurement.py +24 -2
  61. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/estimation/stiffness.py +2 -0
  62. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/hardware/profile.py +2 -2
  63. virtualmodelcontrol-1.1.0/src/virtualmodelcontrol/identification/efficiency.py +95 -0
  64. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/math.py +19 -0
  65. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/__init__.py +6 -1
  66. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/actuation.py +98 -0
  67. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/efficiency.py +29 -9
  68. virtualmodelcontrol-1.1.0/src/virtualmodelcontrol/models/equations.py +30 -0
  69. virtualmodelcontrol-1.1.0/src/virtualmodelcontrol/models/friction.py +79 -0
  70. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/function.py +5 -1
  71. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/kinematics.py +14 -3
  72. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/optimization/__init__.py +9 -1
  73. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/optimization/builder.py +53 -5
  74. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/optimization/collocation.py +58 -26
  75. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/optimization/equilibrium.py +30 -5
  76. virtualmodelcontrol-1.1.0/src/virtualmodelcontrol/optimization/mpc.py +180 -0
  77. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/optimization/nlp.py +7 -2
  78. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/optimization/problem.py +64 -16
  79. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/optimization/result.py +15 -7
  80. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/optimization/search.py +1 -1
  81. virtualmodelcontrol-1.1.0/src/virtualmodelcontrol/optimization/shooting.py +264 -0
  82. virtualmodelcontrol-1.1.0/src/virtualmodelcontrol/optimization/solver.py +140 -0
  83. virtualmodelcontrol-1.1.0/src/virtualmodelcontrol/optimization/tank.py +57 -0
  84. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/optimization/trajectory.py +4 -2
  85. virtualmodelcontrol-1.1.0/src/virtualmodelcontrol/optimization/virtual.py +56 -0
  86. virtualmodelcontrol-1.1.0/src/virtualmodelcontrol/robots/__init__.py +5 -0
  87. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/robots/adapt.py +17 -4
  88. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/robots/bimanual.py +1 -1
  89. virtualmodelcontrol-1.1.0/src/virtualmodelcontrol/robots/planar.py +217 -0
  90. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/robots/turtle.py +2 -2
  91. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/sim/model_plant.py +3 -2
  92. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/sim/rollout.py +6 -1
  93. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/system.py +4 -0
  94. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/testing.py +54 -3
  95. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/viz/draw.py +1 -1
  96. virtualmodelcontrol-1.1.0/tests/backend_helpers.py +71 -0
  97. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/config/test_config.py +6 -4
  98. virtualmodelcontrol-1.1.0/tests/control/test_state_layout.py +48 -0
  99. virtualmodelcontrol-1.1.0/tests/control/test_underactuated.py +341 -0
  100. virtualmodelcontrol-1.1.0/tests/control/test_underactuated_golden.py +130 -0
  101. virtualmodelcontrol-1.1.0/tests/core/test_backends.py +166 -0
  102. virtualmodelcontrol-1.1.0/tests/core/test_backends_torch.py +78 -0
  103. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/core/test_space.py +16 -0
  104. virtualmodelcontrol-1.1.0/tests/data/underactuated.npz +0 -0
  105. virtualmodelcontrol-1.1.0/tests/estimation/test_unmeasured.py +159 -0
  106. virtualmodelcontrol-1.1.0/tests/identification/test_fit_friction.py +125 -0
  107. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/lab_optimization.py +1 -1
  108. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/mechanisms/test_phase_spring.py +1 -1
  109. virtualmodelcontrol-1.1.0/tests/models/test_equations.py +274 -0
  110. virtualmodelcontrol-1.1.0/tests/models/test_static_friction.py +325 -0
  111. virtualmodelcontrol-1.1.0/tests/models/test_underactuated.py +80 -0
  112. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/optimization/test_collocation.py +1 -18
  113. virtualmodelcontrol-1.1.0/tests/optimization/test_mpc.py +316 -0
  114. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/optimization/test_periodic.py +5 -2
  115. virtualmodelcontrol-1.1.0/tests/optimization/test_plant.py +252 -0
  116. virtualmodelcontrol-1.1.0/tests/optimization/test_shooting.py +339 -0
  117. virtualmodelcontrol-1.1.0/tests/optimization/test_solvers.py +123 -0
  118. virtualmodelcontrol-1.1.0/tests/optimization/test_tank.py +117 -0
  119. virtualmodelcontrol-1.1.0/tests/optimization/test_virtual.py +416 -0
  120. virtualmodelcontrol-1.1.0/tests/robots/test_planar.py +94 -0
  121. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/sim/test_wallclock.py +1 -1
  122. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/test_docs.py +6 -4
  123. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/test_readme.py +1 -1
  124. virtualmodelcontrol-1.1.0/tests/underactuated_lab.py +50 -0
  125. virtualmodelcontrol-0.5.0/src/virtualmodelcontrol/identification/efficiency.py +0 -45
  126. virtualmodelcontrol-0.5.0/src/virtualmodelcontrol/optimization/solver.py +0 -80
  127. virtualmodelcontrol-0.5.0/src/virtualmodelcontrol/robots/__init__.py +0 -5
  128. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/.gitignore +0 -0
  129. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/CITATION.cff +0 -0
  130. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/LICENSE +0 -0
  131. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/benchmarks/tick.py +0 -0
  132. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/_ext/video.py +0 -0
  133. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/_static/create-lab.png +0 -0
  134. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/_static/favicon.svg +0 -0
  135. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/_static/logo-light.svg +0 -0
  136. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/_static/logo.svg +0 -0
  137. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/_static/readme-hero.svg +0 -0
  138. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/_templates/autosummary/module.rst +0 -0
  139. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/_templates/partials/toc.html +0 -0
  140. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/api/index.md +0 -0
  141. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/concepts/efficiency.md +0 -0
  142. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/concepts/finger.md +0 -0
  143. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/concepts/pcc.md +0 -0
  144. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/conf.py +0 -0
  145. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/development/changelog.md +0 -0
  146. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/development/roadmap.md +0 -0
  147. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/examples/turtle.md +0 -0
  148. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/examples/two-arms.md +0 -0
  149. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/__init__.py +0 -0
  150. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/_draw.py +0 -0
  151. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/bimanual.py +0 -0
  152. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/control_loop.py +0 -0
  153. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/energy_flow.py +0 -0
  154. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/finger.py +0 -0
  155. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/four_steps.py +0 -0
  156. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/hand.py +0 -0
  157. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/helyx.py +0 -0
  158. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/library_map.py +0 -0
  159. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/mechanism.py +0 -0
  160. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/params.py +0 -0
  161. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/pcc.py +0 -0
  162. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/turtle.py +0 -0
  163. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/schematics/ur5.py +0 -0
  164. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/scripts/readme_figure.py +0 -0
  165. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/troubleshooting.md +0 -0
  166. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/introduction.md +0 -0
  167. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/reach.yaml +0 -0
  168. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/docs/tutorials/run-settings.yaml +0 -0
  169. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/adaptation/__init__.py +0 -0
  170. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/adaptation/limits.py +0 -0
  171. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/adaptation/scalar.py +0 -0
  172. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/config/__init__.py +0 -0
  173. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/config/controllers.py +0 -0
  174. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/config/coordinates.py +0 -0
  175. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/config/experiment.py +0 -0
  176. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/config/spec.py +0 -0
  177. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/control/blending.py +0 -0
  178. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/control/projection.py +0 -0
  179. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/control/schedule.py +0 -0
  180. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/control/tank.py +0 -0
  181. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/core/__init__.py +0 -0
  182. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/core/params.py +0 -0
  183. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/core/registry.py +0 -0
  184. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/core/signals.py +0 -0
  185. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/core/symbolic.py +0 -0
  186. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/core/units.py +0 -0
  187. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/estimation/__init__.py +0 -0
  188. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/estimation/balance.py +0 -0
  189. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/estimation/compliance.py +0 -0
  190. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/estimation/imu.py +0 -0
  191. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/estimation/inversion.py +0 -0
  192. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/estimation/momentum.py +0 -0
  193. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/estimation/sensors.py +0 -0
  194. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/estimation/velocity.py +0 -0
  195. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/hardware/__init__.py +0 -0
  196. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/identification/__init__.py +0 -0
  197. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/identification/params.py +0 -0
  198. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/identification/plateaus.py +0 -0
  199. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/identification/steps.py +0 -0
  200. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/identification/stiffness.py +0 -0
  201. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/identification/transmission.py +0 -0
  202. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/__init__.py +0 -0
  203. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/components/__init__.py +0 -0
  204. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/components/base.py +0 -0
  205. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/components/constrained.py +0 -0
  206. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/components/dissipation.py +0 -0
  207. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/components/gated.py +0 -0
  208. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/components/inertance.py +0 -0
  209. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/components/locomotion.py +0 -0
  210. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/components/sources.py +0 -0
  211. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/components/storage.py +0 -0
  212. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/coordinates/__init__.py +0 -0
  213. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/coordinates/base.py +0 -0
  214. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/coordinates/frames.py +0 -0
  215. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/coordinates/geometry.py +0 -0
  216. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/coordinates/joints.py +0 -0
  217. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/coordinates/ops.py +0 -0
  218. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/coordinates/references.py +0 -0
  219. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/mechanisms/mechanism.py +0 -0
  220. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/assembly.py +0 -0
  221. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/continuum/__init__.py +0 -0
  222. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/continuum/pcc.py +0 -0
  223. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/joint_space.py +0 -0
  224. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/kinematic.py +0 -0
  225. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/rigid/__init__.py +0 -0
  226. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/rigid/couplings.py +0 -0
  227. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/rigid/poe.py +0 -0
  228. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/models/rigid/spline.py +0 -0
  229. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/optimization/asktell.py +0 -0
  230. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/optimization/horizon.py +0 -0
  231. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/optimization/terms.py +0 -0
  232. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/optimization/variables.py +0 -0
  233. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/py.typed +0 -0
  234. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/robots/helyx.py +0 -0
  235. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/robots/ur5.py +0 -0
  236. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/sim/__init__.py +0 -0
  237. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/sim/balance.py +0 -0
  238. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/sim/plant.py +0 -0
  239. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/sim/replay.py +0 -0
  240. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/sim/run.py +0 -0
  241. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/sim/runlog.py +0 -0
  242. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/viz/__init__.py +0 -0
  243. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/viz/animation.py +0 -0
  244. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/src/virtualmodelcontrol/viz/style.py +0 -0
  245. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/adaptation/test_fingertip.py +0 -0
  246. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/adaptation/test_force.py +0 -0
  247. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/adaptation/test_grasp.py +0 -0
  248. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/adaptation/test_holding.py +0 -0
  249. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/adaptation/test_loop.py +0 -0
  250. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/adaptation/test_position.py +0 -0
  251. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/adaptation/test_scalar.py +0 -0
  252. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/adaptation/test_seeking.py +0 -0
  253. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/adaptation/test_stiffness_tracking.py +0 -0
  254. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/adaptation/test_virtual_state.py +0 -0
  255. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/conftest.py +0 -0
  256. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/control/test_blending.py +0 -0
  257. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/control/test_honesty.py +0 -0
  258. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/control/test_inputs.py +0 -0
  259. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/control/test_output.py +0 -0
  260. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/control/test_projection.py +0 -0
  261. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/control/test_schedule.py +0 -0
  262. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/control/test_tank.py +0 -0
  263. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/control/test_vmc_golden.py +0 -0
  264. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/core/test_params.py +0 -0
  265. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/core/test_registry.py +0 -0
  266. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/core/test_signals.py +0 -0
  267. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/core/test_symbolic.py +0 -0
  268. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/adaptation.npz +0 -0
  269. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/compliance.npz +0 -0
  270. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/components.npz +0 -0
  271. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/configs/finger.yaml +0 -0
  272. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/configs/hand.yaml +0 -0
  273. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/configs/soft-arm.yaml +0 -0
  274. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/configs/turtle.yaml +0 -0
  275. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/configs/two-arms.yaml +0 -0
  276. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/configs/ur5-hand.yaml +0 -0
  277. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/derivatives.npz +0 -0
  278. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/dynamics.npz +0 -0
  279. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/efficiency.npz +0 -0
  280. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/estimation.npz +0 -0
  281. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/finger.npz +0 -0
  282. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/fingertip.npz +0 -0
  283. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/hand.npz +0 -0
  284. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/heuristics.npz +0 -0
  285. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/imu.npz +0 -0
  286. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/kalman.npz +0 -0
  287. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/mocap.npz +0 -0
  288. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/optimization.json +0 -0
  289. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/optimization.npz +0 -0
  290. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/pcc.npz +0 -0
  291. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/transmission.npz +0 -0
  292. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/turtle.npz +0 -0
  293. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/data/vmc.npz +0 -0
  294. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/estimation/test_compliance_golden.py +0 -0
  295. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/estimation/test_contact.py +0 -0
  296. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/estimation/test_imu.py +0 -0
  297. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/estimation/test_inversion.py +0 -0
  298. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/estimation/test_kalman.py +0 -0
  299. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/estimation/test_kalman_golden.py +0 -0
  300. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/estimation/test_kalman_unscented.py +0 -0
  301. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/estimation/test_mocap_golden.py +0 -0
  302. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/estimation/test_momentum.py +0 -0
  303. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/estimation/test_sensors.py +0 -0
  304. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/estimation/test_velocity.py +0 -0
  305. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/hardware/test_profile.py +0 -0
  306. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/hardware/test_templates.py +0 -0
  307. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/helpers.py +0 -0
  308. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/identification/test_efficiency_fit.py +0 -0
  309. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/identification/test_fit_params.py +0 -0
  310. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/identification/test_friction.py +0 -0
  311. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/identification/test_steps.py +0 -0
  312. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/identification/test_stiffness_fit.py +0 -0
  313. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/identification/test_transmission.py +0 -0
  314. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/mechanisms/test_components.py +0 -0
  315. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/mechanisms/test_components_golden.py +0 -0
  316. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/mechanisms/test_contact.py +0 -0
  317. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/mechanisms/test_coordinates.py +0 -0
  318. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/mechanisms/test_distances.py +0 -0
  319. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/mechanisms/test_frames.py +0 -0
  320. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/mechanisms/test_friction.py +0 -0
  321. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/mechanisms/test_gated.py +0 -0
  322. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/mechanisms/test_mechanism.py +0 -0
  323. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/mechanisms/test_more_components.py +0 -0
  324. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/mechanisms/test_pair_contact.py +0 -0
  325. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/mechanisms/test_virtual_model.py +0 -0
  326. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/models/test_actuation.py +0 -0
  327. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/models/test_assembly.py +0 -0
  328. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/models/test_contact_map.py +0 -0
  329. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/models/test_efficiency.py +0 -0
  330. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/models/test_floating.py +0 -0
  331. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/models/test_floating_base.py +0 -0
  332. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/models/test_function.py +0 -0
  333. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/models/test_kinematics.py +0 -0
  334. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/models/test_pcc.py +0 -0
  335. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/models/test_poe.py +0 -0
  336. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/models/test_rail.py +0 -0
  337. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/optimization/test_asktell.py +0 -0
  338. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/optimization/test_equilibrium.py +0 -0
  339. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/optimization/test_horizon.py +0 -0
  340. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/optimization/test_lab.py +0 -0
  341. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/optimization/test_problem.py +0 -0
  342. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/optimization/test_search.py +0 -0
  343. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/optimization/test_structure.py +0 -0
  344. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/optimization/test_swap.py +0 -0
  345. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/optimization/test_terms.py +0 -0
  346. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/optimization/test_variables.py +0 -0
  347. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/robots/test_adapt.py +0 -0
  348. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/robots/test_bimanual.py +0 -0
  349. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/robots/test_crawler.py +0 -0
  350. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/robots/test_hand.py +0 -0
  351. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/robots/test_helyx.py +0 -0
  352. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/robots/test_parametric.py +0 -0
  353. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/robots/test_turtle.py +0 -0
  354. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/robots/test_ur5.py +0 -0
  355. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/sim/test_balance.py +0 -0
  356. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/sim/test_record.py +0 -0
  357. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/sim/test_replay.py +0 -0
  358. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/sim/test_rollout.py +0 -0
  359. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/sim/test_run.py +0 -0
  360. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/sim/test_runlog.py +0 -0
  361. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/small_plan.py +0 -0
  362. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/soft_arm_plan.py +0 -0
  363. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/test_benchmark.py +0 -0
  364. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/test_compiler.py +0 -0
  365. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/test_dynamics.py +0 -0
  366. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/test_import.py +0 -0
  367. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/test_math.py +0 -0
  368. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/test_testing.py +0 -0
  369. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/viz/test_animate.py +0 -0
  370. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.1.0}/tests/viz/test_viz.py +0 -0
@@ -4,7 +4,169 @@ 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
- ## [Unreleased]
7
+ ## [1.1.0] - 2026-10-09
8
+
9
+ Static friction of the motors: a model of it, a compensation for it, its identification and a
10
+ tutorial, all off unless asked for. Nothing that worked before changes.
11
+
12
+ ### Added
13
+
14
+ - Static friction of the motors, off by default. `StaticFriction(breakaway, kinetic, width)`
15
+ [N·m] is the torque that friction takes from a motor as a smooth function of the torque applied
16
+ to it: all of it below the breakaway torque F (the motor is stuck), the kinetic torque Fc with
17
+ the sign of the command past it (Fc = 0: static friction gone once it moves; Fc = F: it stays),
18
+ smooth (C^∞) over `width`, so solvers differentiate it. It depends on the torque only, not on
19
+ the speed. `Efficiency(c1, ..., friction=StaticFriction(...))` takes it before the polynomial, so
20
+ every transmission carries it (`Direct`, `Underactuated`, `TendonTransmission`, stacked ones, and
21
+ configuration files), and the simulator, `compile_dynamics`, `Collocation`, `Shooting`, `MPC`, the
22
+ Kalman filter and the force law all have it. Its Params are `friction.breakaway`,
23
+ `friction.kinetic` and `friction.width`; with F = Fc = 0, the default, nothing changes. Not passive
24
+ by construction: when a command brakes the motion it can create up to F |θ̇| of power, which the
25
+ tutorial states and measures.
26
+ - `control.StaticFrictionCompensation(kinetic, width, fraction)` (and `.of(friction, fraction)`), an
27
+ output stage that adds the kinetic friction torque in the direction of the command, smooth in the
28
+ command. Against a `StaticFriction(F, Fc)` it delivers the command once the motor moves and
29
+ narrows the dead band from F to F − Fc. Nothing turns it on but you: no template or controller
30
+ has it by default. It has a `symbolic` form, so `Problem(system, output=[...])` and
31
+ `sim.rollout(..., output=[...])` apply it in a plan as `VMCController(output=)` does in a run
32
+ (`Problem` now raises for an output stage that has no `symbolic` form).
33
+ - Identification of the friction: its Params are the robot's, so `identification.fit_params` fits
34
+ them, with the stiffness and damping, to a run in which the command rises slowly from rest;
35
+ `fit_efficiency(commanded, delivered, friction=True, width=)` fits the efficiency and the friction
36
+ to static torques (per motor or `shared`), by a grid and a refinement over the breakaway and the
37
+ kinetic torque.
38
+ - `robots.adapt.finger_friction()` and `hand_friction()`: the lab's friction values of the finger
39
+ (0.20 N·m) and the hand (0.10 N·m) as a `StaticFriction`, to ask for.
40
+ - Docs: the tutorial "Static friction of the motors".
41
+
42
+ ## [1.0.0] - 2026-10-07
43
+
44
+ The first stable release. It also carries the work meant for 0.6.0 (planning with virtual states,
45
+ unmeasured coordinates, custom dynamics, the planner on a larger plant, MPC and underactuation) and
46
+ for 0.7.0 (models as numpy and PyTorch code), which were never released on their own, and it adds
47
+ the checking: the whole suite on the oldest and the newest supported Python and numpy, on Linux,
48
+ macOS and Windows, every page of the documentation run from a clean checkout, and a review of the
49
+ public API (what `__all__` lists in each module is the API) and of every page of the docs at desktop
50
+ and phone width. The rules for what changes between versions are on the page "Support policy".
51
+
52
+ ### Added
53
+
54
+ - `optimization.Shooting(q0, horizon, nodes, v0=, steps=, initial=, transition=, scales=,
55
+ integrator=, substeps=)`: multiple shooting, a second transcription next to `Collocation`
56
+ with the same terms. The unknowns are q and v at the nodes; over each interval the closed
57
+ loop is simulated as `vmc.sim.rollout` does (the command held over each of `substeps` control
58
+ steps, the robot advanced by the linearly implicit step or by `"rk4"`), and constraints join
59
+ the end of an interval to the next node. A plan is the closed loop of a simulation at that
60
+ control step (a test reproduces `rollout` to rounding error), and agrees with `Collocation` as
61
+ the control step shrinks (first order). The start is the pair of Params `shooting.q0` and
62
+ `shooting.v0`, which a problem can declare as parameters. `steps` names live Params that take
63
+ one value in every interval, between their bounds: trajectories of stiffness and references,
64
+ returned in `Result.steps` (`apply(target, interval=k)` sets the values of interval k). The
65
+ model does not carry the force that balances the robot at q0 under `initial`, as `Collocation`
66
+ does.
67
+ - `optimization.TankBudget(level, refill=True)`: the planned changes of the Params that step stay
68
+ within the energy of a `vmc.control.Tank`. The plan keeps the tank's level from the exact jump
69
+ of the controller's energy at each change, and from the energy the controller's dampers take
70
+ back, and keeps it at least zero; a test runs the plan through a real `Tank` and finds its level
71
+ to rounding error. The tank's capacity is not planned.
72
+ - `optimization.MPC(problem, shift=1, rti=False)`: the plan as a receding-horizon controller. The
73
+ program is built once, with the measured state, the controller's Params now, the tank's level
74
+ and the references as parameters of each solve. `step(controller, q, v, references, latency=)`
75
+ solves from the measured state, starting from the previous plan moved up by `shift` intervals,
76
+ and applies the plan's Params through `controller.set` (so a `Tank` bounds them), returning
77
+ the energy jump as the adaptation laws do. A plan that took `latency` seconds (the measured
78
+ solve time by default) is applied as of that time. With `rti`, one SQP iteration per step.
79
+ `start` and `poll` plan in a thread and apply the plan once it is ready, as of the time since
80
+ the start (CasADi lets other threads run during a solve; the solver is created with the `MPC`,
81
+ as it is not safe to create one in a second thread). `Problem.warm_up()` builds the program and
82
+ the solver now, and `Problem.solve` attaches the iteration callback only when it is given a
83
+ `progress`.
84
+ - Planning with virtual states: `Collocation`, `Shooting` and `Equilibrium` accept controllers
85
+ with virtual states (a flywheel, a mass the robot is tied to). The states are unknowns of the
86
+ plan at every node, with the controller's own dynamics: collocated with the same scheme as the
87
+ robot (`Collocation`), or advanced as `VMCController.step` and `vmc.sim.rollout` advance them
88
+ (`Shooting`, which then reproduces `rollout` to rounding error, the states included). They
89
+ start from the state the controller is compiled with, or from `z0` (positions, then
90
+ velocities); a periodic motion repeats them; `Equilibrium` rests them. `Result.z` holds them,
91
+ `warm_start` takes them, `TankBudget` reads the energy at them, and the controller in place
92
+ (`initial`) may have states too, as a system (it starts with the plan) or as a running
93
+ controller (its state is where it is now). `MPC` plans a running controller from
94
+ `controller.z` when the `Shooting` has a `z0`, which is then a parameter of the program
95
+ (`shooting.z0`). The docstring of `Shooting` now says what the code does: the controller is
96
+ called at every one of an interval's `substeps` control steps.
97
+ - Sensors of combinations of the coordinates: `Measurement(..., matrix=)` takes an (m, n) matrix
98
+ and reads `matrix @ q` and `matrix @ v` (instead of `observed`, a selection of coordinates).
99
+ `KalmanFilter.encoder` of a robot with fewer motors than coordinates (`Underactuated`) no longer
100
+ reads the motors as if they gave `q`, with the passive coordinates frozen: it returns the
101
+ measurement of the motors themselves, with the Jacobian of the motor angles at the estimate as
102
+ the matrix, so the passive coordinates are left to the model (`Rq` and `Rv` are then the
103
+ covariances of the motors' readings). A robot with a motor on every coordinate keeps its encoder
104
+ as it was. The underactuated tutorial runs the naive controller on such an estimate, and shows
105
+ what it takes: a process noise that admits the model's error (with the default one the gate
106
+ throws out every reading after the first swing and the filter breaks) and a controller that
107
+ does not outrun the filter.
108
+ - Equations of motion from a function: `models.Equations(residual, energy=None)`, given to
109
+ `FunctionModel(..., equations=)`, for a black-box, learned or external model whose dynamics
110
+ are not built from parts. The residual `r(q, v, a, tau, f, p) = M(q) a + h(q, v) - tau - f` is
111
+ written with CasADi operations and affine in `a`; `tau` is the generalized force of the motors
112
+ and `f` that of the robot's own components, which still add springs, dampers and contact (the
113
+ masses and the weight are in the equations, so there is no `Inertance` or `Gravity`).
114
+ Everything that runs on a robot runs on it: the simulator, `rollout`, the planners, the
115
+ Kalman filter, the momentum observer. With an `energy(q, v, p)` returning (T, V) it has the
116
+ robot's energy and power; without one `Dynamics.energy` and `power` are `None` and what needs
117
+ them (`ModelPlant.energy`, the `Passivation` stage) raises a `ValueError` that says so
118
+ (`dynamics.needs_energy`). `testing.check_model` checks such a robot's mass matrix
119
+ (symmetric, positive) and, with an energy, that a simulation never gains any. A test builds
120
+ the same two-link arm from parts and from textbook equations and finds the same dynamics,
121
+ energy, simulation, Kalman prediction and plan.
122
+ - Plan a controller on some coordinates of a larger robot: `Problem(system, plant=robot)` takes
123
+ the dynamics from `plant` (every term and `q0` in its coordinates) while the controller stays
124
+ written for its own robot, and reads the plant's motors as `VMCController` does in a
125
+ simulation, through its transmission. The law, the energy of a `TankBudget` and the dampers'
126
+ power of a shooting all go through it. A shooting of the turtle's flywheel controller on
127
+ `turtle.crawler()` equals the simulation step for step, the flywheel's states included (a
128
+ test), and the tutorial "Crawl with a flywheel" plans a stride with it. `Shooting(running=)`
129
+ says whether a controller started from `z0` is already running (`z0` alone still means so)
130
+ or starts with the plan, as one reset there does. `Space.on_manifold(q)` gives the equations
131
+ that a configuration obeys (the unit norm of a quaternion; none for a flat space), and
132
+ `Shooting` and `Equilibrium` constrain their nodes with them: before, a plan of a floating body
133
+ could drift off unit quaternions and plan another body's motion.
134
+ - The models as numpy and PyTorch code: `core.backends.source`, `translate` and `export` write
135
+ a CasADi function as straight-line Python, one statement per operation of its expression
136
+ graph, for numpy (the text imports numpy only, so it runs without CasADi) or PyTorch
137
+ (differentiable, on any dtype and device). Arguments and results have CasADi's shapes, with any
138
+ leading batch dimensions. `Kinematics.functions(at, backend="numpy")`, `Dynamics.export` and
139
+ `Compiled.export` give a model's functions that way, each with its `source`. numpy gives
140
+ CasADi's numbers to rounding error and PyTorch to 1e-12 on the kinematics with their Jacobians
141
+ and Hessians, including the derivatives by autograd; a model with a poorly conditioned mass
142
+ matrix (the soft arm's dynamics) differs by a few parts in 1e11, as PyTorch's `sin` and `cos`
143
+ differ in the last place. The extra `virtualmodelcontrol[torch]` and the tutorial "Use a model
144
+ outside CasADi".
145
+ - `ForceTracking`, `StiffnessTracking`, `PositionRegulation`, `HoldingGoals`, `ContactForce` and
146
+ `TaskStiffness` refuse a `StateController` (also inside a `Tank`) with a `ValueError` that says
147
+ so, instead of failing on the shapes of its inputs: they read a controller in the layout of the
148
+ motors. A robot with fewer motors than coordinates uses the plain frozen controller (it reads the
149
+ motors), or `control.underactuated.DirectionalForce` for a force.
150
+ - Solver presets: `Problem(system, solver=...)` takes `"ipopt"` (the default), `"ipopt-exact"`
151
+ (exact Hessians: 40 iterations instead of 165 on the tutorial's shooting), `"sqp"` (CasADi's
152
+ `sqpmethod` with `qrqp`, the Hessian's negative eigenvalues clipped; other QP solvers by the
153
+ `qpsol` option), `"rti"` and `"fatrop"` (as a general problem, without stages).
154
+ `optimization.PRESETS` lists them and `optimization.solver.available(name)` tells whether the
155
+ CasADi build has the plugin. `Result.status` words FATROP's endings as IPOPT's.
156
+ - Docs: tutorial "Model predictive control".
157
+ - Docs: the page "Support policy": which versions of Python and numpy are supported, what
158
+ semantic versioning means here (a deprecation lasts at least one minor version), what the public
159
+ API is, the schema of the run logs, where to report an issue, and the safety checks before the
160
+ first run on a robot (also in "Real time and the robot").
161
+
162
+ ### Changed
163
+
164
+ - `__all__` in `math`, `testing`, `compiler`, `dynamics` and `system`: what they list is the public
165
+ API, as in every other module; `from virtualmodelcontrol.x import *` gives only that.
166
+ - The configuration and hardware profile files are read and written as UTF-8 on every platform,
167
+ so that a file written on Linux reads on Windows.
168
+ - The docs use American spelling, the figure legends are 18 pt (readable on a phone), and wide
169
+ tables wrap their code on a narrow screen.
8
170
 
9
171
  ## [0.5.0] - 2026-10-06
10
172
 
@@ -13,6 +175,26 @@ tank, tuning and the calibrations), which was never released on its own.
13
175
 
14
176
  ### Added
15
177
 
178
+ - Underactuated Virtual Model Control, for robots with fewer motors than coordinates.
179
+ `models.Underactuated(B)` is the actuation with an input matrix B (`Underactuated.joints` for
180
+ motors on some joints): motor angles Bᵀq, torques B u, the allocation B⁺ τ, the projector E and
181
+ the `defect` E τ it cannot realize. Its motors give the frozen configuration (the motors' part
182
+ of q, the rest at `q_rest`), so a `VMCController` on it is the frozen controller.
183
+ `control.StateController` reads (q, v) from the measurement (`meas["q"]`, `meas["v"]`, or its
184
+ `read`) instead of the motors, which is the naive controller and also how a controller acts
185
+ through an estimate of unmeasured coordinates. `control.underactuated` has `controller(compiled,
186
+ base="naive"|"frozen", correction=None|"passive"|"tank", gravity=)`, the `Passivation` output
187
+ stage (the passive and the tank correction: the motors never inject more power than the
188
+ robot's own dampers take, or more than the tank holds), `Frozen` (the frozen configuration,
189
+ also balancing the robot's gravity), `DirectionalForce` (a force along a direction by one
190
+ scalar of the stiffness, closed form, positive definite), `projector`, `defect` and `feasible`
191
+ (the wrenches the motors realize in full). An output stage with a `reset` is reset with its
192
+ controller. They agree with the lab's own code on its three robots (every flag, the frozen
193
+ point, the force law, and the closed loops).
194
+ - `robots.planar`: `arm("three-link")` with one passive joint, `arm("five-link")` with three, and
195
+ `continuum()`, a three-section continuum arm driven by two tendons; `add_dynamics` and
196
+ `add_continuum_dynamics` give them gravity and their springs and dampers.
197
+ - Docs: tutorial "Robots with fewer motors than joints".
16
198
  - `vmc.optimization`: plan the motion of a controller on a robot and optimize its Params.
17
199
  `Problem(system)` is built once and solved many times. `free` chooses the Params to optimize
18
200
  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.5.0
3
+ Version: 1.1.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 :: 3 - Alpha
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. Nothing to compile;
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. Nothing to compile;
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 (`law.energy`, `law.power`), so the balance can be
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 behaviour is opt-in: projects pin a version, and a finished experiment must run the same
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": "centre of gravity of the distal phalanx (also `mcp_cog`, `pip_cog`)",
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 centre.
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 centred on the flange, not turned
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 centre. They are attached at
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 (0.010 N·m per radian of
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
 
@@ -108,7 +108,9 @@ tutorials/parameters
108
108
  tutorials/configurations
109
109
  tutorials/kinematics
110
110
  tutorials/build-a-robot
111
+ tutorials/friction
111
112
  tutorials/extend
113
+ tutorials/outside
112
114
  ```
113
115
 
114
116
  ```{toctree}
@@ -131,6 +133,7 @@ tutorials/contact
131
133
  tutorials/force
132
134
  tutorials/stiffness
133
135
  tutorials/energy
136
+ tutorials/underactuated
134
137
  ```
135
138
 
136
139
  ```{toctree}
@@ -138,6 +141,7 @@ tutorials/energy
138
141
  :caption: Plan
139
142
 
140
143
  tutorials/optimize
144
+ tutorials/mpc
141
145
  tutorials/crawl
142
146
  ```
143
147
 
@@ -173,5 +177,6 @@ concepts/conventions
173
177
  api/index
174
178
  development/changelog
175
179
  Roadmap <development/roadmap>
180
+ development/support
176
181
  development/contributing
177
182
  ```
@@ -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==0.1.0"
123
+ pip install "virtualmodelcontrol==1.1.0"
124
124
  ```
125
125
 
126
- In a `requirements.txt` file, write `virtualmodelcontrol==0.1.0`. In a conda `environment.yml`,
126
+ In a `requirements.txt` file, write `virtualmodelcontrol==1.1.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