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.
Files changed (365) hide show
  1. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/CHANGELOG.md +148 -1
  2. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/PKG-INFO +7 -4
  3. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/README.md +3 -2
  4. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_static/custom.css +14 -0
  5. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/conventions.md +8 -2
  6. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/library.md +10 -4
  7. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/passivity.md +7 -2
  8. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/vmc.md +4 -1
  9. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/development/contributing.md +6 -3
  10. virtualmodelcontrol-1.0.0/docs/development/support.md +48 -0
  11. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/docs_setup.py +1 -0
  12. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/examples/finger.md +1 -1
  13. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/examples/hand.md +2 -2
  14. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/examples/hanging-arm.md +1 -1
  15. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/examples/soft-arm.md +3 -2
  16. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/index.md +4 -0
  17. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/installation.md +2 -2
  18. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/build-a-robot.md +23 -19
  19. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/configurations.md +4 -3
  20. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/contact.md +6 -3
  21. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/coordinates-and-components.md +9 -8
  22. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/crawl.md +99 -10
  23. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/energy.md +6 -1
  24. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/estimation.md +23 -12
  25. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/extend.md +126 -2
  26. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/first-controller.md +7 -0
  27. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/fit.md +1 -2
  28. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/force.md +7 -5
  29. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/kinematics.md +3 -2
  30. virtualmodelcontrol-1.0.0/docs/tutorials/mpc.md +350 -0
  31. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/optimize.md +98 -14
  32. virtualmodelcontrol-1.0.0/docs/tutorials/outside.md +203 -0
  33. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/parameters.md +3 -1
  34. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/real-time.md +18 -8
  35. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/run-logs.md +4 -5
  36. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/stiffness.md +3 -3
  37. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/swaps.md +17 -1
  38. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/tuning.md +9 -6
  39. virtualmodelcontrol-1.0.0/docs/tutorials/underactuated.md +439 -0
  40. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/pyproject.toml +4 -1
  41. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/_version.py +2 -2
  42. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/force.py +2 -0
  43. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/position.py +3 -0
  44. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/seeking.py +1 -1
  45. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/stiffness.py +2 -0
  46. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/compiler.py +12 -0
  47. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/config/files.py +2 -2
  48. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/__init__.py +2 -0
  49. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/controller.py +13 -5
  50. virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/control/state.py +75 -0
  51. virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/control/underactuated.py +278 -0
  52. virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/core/backends.py +274 -0
  53. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/space.py +23 -0
  54. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/dynamics.py +79 -21
  55. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/contact.py +2 -0
  56. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/kalman.py +29 -4
  57. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/measurement.py +24 -2
  58. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/stiffness.py +2 -0
  59. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/hardware/profile.py +2 -2
  60. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/math.py +19 -0
  61. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/__init__.py +4 -1
  62. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/actuation.py +98 -0
  63. virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/models/equations.py +30 -0
  64. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/function.py +5 -1
  65. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/kinematics.py +14 -3
  66. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/__init__.py +9 -1
  67. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/builder.py +46 -5
  68. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/collocation.py +58 -26
  69. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/equilibrium.py +30 -5
  70. virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/optimization/mpc.py +180 -0
  71. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/nlp.py +7 -2
  72. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/problem.py +50 -15
  73. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/result.py +15 -7
  74. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/search.py +1 -1
  75. virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/optimization/shooting.py +264 -0
  76. virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/optimization/solver.py +140 -0
  77. virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/optimization/tank.py +57 -0
  78. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/trajectory.py +4 -2
  79. virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/optimization/virtual.py +56 -0
  80. virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/robots/__init__.py +5 -0
  81. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/robots/adapt.py +3 -3
  82. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/robots/bimanual.py +1 -1
  83. virtualmodelcontrol-1.0.0/src/virtualmodelcontrol/robots/planar.py +217 -0
  84. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/robots/turtle.py +2 -2
  85. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/model_plant.py +3 -2
  86. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/system.py +4 -0
  87. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/testing.py +54 -3
  88. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/viz/draw.py +1 -1
  89. virtualmodelcontrol-1.0.0/tests/backend_helpers.py +71 -0
  90. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/config/test_config.py +6 -4
  91. virtualmodelcontrol-1.0.0/tests/control/test_state_layout.py +48 -0
  92. virtualmodelcontrol-1.0.0/tests/control/test_underactuated.py +341 -0
  93. virtualmodelcontrol-1.0.0/tests/control/test_underactuated_golden.py +130 -0
  94. virtualmodelcontrol-1.0.0/tests/core/test_backends.py +166 -0
  95. virtualmodelcontrol-1.0.0/tests/core/test_backends_torch.py +78 -0
  96. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/core/test_space.py +16 -0
  97. virtualmodelcontrol-1.0.0/tests/data/underactuated.npz +0 -0
  98. virtualmodelcontrol-1.0.0/tests/estimation/test_unmeasured.py +159 -0
  99. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/lab_optimization.py +1 -1
  100. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_phase_spring.py +1 -1
  101. virtualmodelcontrol-1.0.0/tests/models/test_equations.py +274 -0
  102. virtualmodelcontrol-1.0.0/tests/models/test_underactuated.py +80 -0
  103. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_collocation.py +1 -18
  104. virtualmodelcontrol-1.0.0/tests/optimization/test_mpc.py +316 -0
  105. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_periodic.py +5 -2
  106. virtualmodelcontrol-1.0.0/tests/optimization/test_plant.py +252 -0
  107. virtualmodelcontrol-1.0.0/tests/optimization/test_shooting.py +339 -0
  108. virtualmodelcontrol-1.0.0/tests/optimization/test_solvers.py +123 -0
  109. virtualmodelcontrol-1.0.0/tests/optimization/test_tank.py +117 -0
  110. virtualmodelcontrol-1.0.0/tests/optimization/test_virtual.py +416 -0
  111. virtualmodelcontrol-1.0.0/tests/robots/test_planar.py +94 -0
  112. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_wallclock.py +1 -1
  113. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_docs.py +6 -4
  114. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_readme.py +1 -1
  115. virtualmodelcontrol-1.0.0/tests/underactuated_lab.py +50 -0
  116. virtualmodelcontrol-0.5.0/src/virtualmodelcontrol/optimization/solver.py +0 -80
  117. virtualmodelcontrol-0.5.0/src/virtualmodelcontrol/robots/__init__.py +0 -5
  118. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/.gitignore +0 -0
  119. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/CITATION.cff +0 -0
  120. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/LICENSE +0 -0
  121. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/benchmarks/tick.py +0 -0
  122. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_ext/video.py +0 -0
  123. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_static/create-lab.png +0 -0
  124. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_static/favicon.svg +0 -0
  125. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_static/logo-light.svg +0 -0
  126. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_static/logo.svg +0 -0
  127. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_static/readme-hero.svg +0 -0
  128. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_templates/autosummary/module.rst +0 -0
  129. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/_templates/partials/toc.html +0 -0
  130. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/api/index.md +0 -0
  131. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/efficiency.md +0 -0
  132. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/finger.md +0 -0
  133. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/concepts/pcc.md +0 -0
  134. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/conf.py +0 -0
  135. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/development/changelog.md +0 -0
  136. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/development/roadmap.md +0 -0
  137. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/examples/turtle.md +0 -0
  138. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/examples/two-arms.md +0 -0
  139. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/__init__.py +0 -0
  140. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/_draw.py +0 -0
  141. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/bimanual.py +0 -0
  142. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/control_loop.py +0 -0
  143. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/energy_flow.py +0 -0
  144. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/finger.py +0 -0
  145. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/four_steps.py +0 -0
  146. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/hand.py +0 -0
  147. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/helyx.py +0 -0
  148. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/library_map.py +0 -0
  149. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/mechanism.py +0 -0
  150. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/params.py +0 -0
  151. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/pcc.py +0 -0
  152. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/turtle.py +0 -0
  153. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/schematics/ur5.py +0 -0
  154. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/scripts/readme_figure.py +0 -0
  155. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/troubleshooting.md +0 -0
  156. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/introduction.md +0 -0
  157. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/reach.yaml +0 -0
  158. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/docs/tutorials/run-settings.yaml +0 -0
  159. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/__init__.py +0 -0
  160. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/__init__.py +0 -0
  161. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/limits.py +0 -0
  162. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/adaptation/scalar.py +0 -0
  163. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/config/__init__.py +0 -0
  164. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/config/controllers.py +0 -0
  165. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/config/coordinates.py +0 -0
  166. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/config/experiment.py +0 -0
  167. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/config/spec.py +0 -0
  168. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/blending.py +0 -0
  169. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/output.py +0 -0
  170. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/projection.py +0 -0
  171. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/schedule.py +0 -0
  172. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/control/tank.py +0 -0
  173. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/__init__.py +0 -0
  174. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/params.py +0 -0
  175. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/registry.py +0 -0
  176. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/signals.py +0 -0
  177. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/symbolic.py +0 -0
  178. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/core/units.py +0 -0
  179. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/__init__.py +0 -0
  180. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/balance.py +0 -0
  181. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/compliance.py +0 -0
  182. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/imu.py +0 -0
  183. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/inversion.py +0 -0
  184. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/momentum.py +0 -0
  185. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/sensors.py +0 -0
  186. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/estimation/velocity.py +0 -0
  187. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/hardware/__init__.py +0 -0
  188. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/__init__.py +0 -0
  189. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/efficiency.py +0 -0
  190. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/params.py +0 -0
  191. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/plateaus.py +0 -0
  192. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/steps.py +0 -0
  193. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/stiffness.py +0 -0
  194. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/identification/transmission.py +0 -0
  195. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/__init__.py +0 -0
  196. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/__init__.py +0 -0
  197. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/base.py +0 -0
  198. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/constrained.py +0 -0
  199. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/dissipation.py +0 -0
  200. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/gated.py +0 -0
  201. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/inertance.py +0 -0
  202. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/locomotion.py +0 -0
  203. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/sources.py +0 -0
  204. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/components/storage.py +0 -0
  205. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/__init__.py +0 -0
  206. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/base.py +0 -0
  207. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/frames.py +0 -0
  208. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/geometry.py +0 -0
  209. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/joints.py +0 -0
  210. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/ops.py +0 -0
  211. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/coordinates/references.py +0 -0
  212. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/mechanisms/mechanism.py +0 -0
  213. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/assembly.py +0 -0
  214. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/continuum/__init__.py +0 -0
  215. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/continuum/pcc.py +0 -0
  216. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/efficiency.py +0 -0
  217. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/joint_space.py +0 -0
  218. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/kinematic.py +0 -0
  219. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/rigid/__init__.py +0 -0
  220. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/rigid/couplings.py +0 -0
  221. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/rigid/poe.py +0 -0
  222. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/models/rigid/spline.py +0 -0
  223. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/asktell.py +0 -0
  224. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/horizon.py +0 -0
  225. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/terms.py +0 -0
  226. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/optimization/variables.py +0 -0
  227. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/py.typed +0 -0
  228. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/robots/helyx.py +0 -0
  229. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/robots/ur5.py +0 -0
  230. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/__init__.py +0 -0
  231. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/balance.py +0 -0
  232. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/plant.py +0 -0
  233. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/replay.py +0 -0
  234. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/rollout.py +0 -0
  235. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/run.py +0 -0
  236. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/sim/runlog.py +0 -0
  237. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/viz/__init__.py +0 -0
  238. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/viz/animation.py +0 -0
  239. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/src/virtualmodelcontrol/viz/style.py +0 -0
  240. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_fingertip.py +0 -0
  241. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_force.py +0 -0
  242. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_grasp.py +0 -0
  243. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_holding.py +0 -0
  244. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_loop.py +0 -0
  245. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_position.py +0 -0
  246. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_scalar.py +0 -0
  247. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_seeking.py +0 -0
  248. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_stiffness_tracking.py +0 -0
  249. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/adaptation/test_virtual_state.py +0 -0
  250. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/conftest.py +0 -0
  251. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_blending.py +0 -0
  252. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_honesty.py +0 -0
  253. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_inputs.py +0 -0
  254. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_output.py +0 -0
  255. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_projection.py +0 -0
  256. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_schedule.py +0 -0
  257. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_tank.py +0 -0
  258. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/control/test_vmc_golden.py +0 -0
  259. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/core/test_params.py +0 -0
  260. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/core/test_registry.py +0 -0
  261. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/core/test_signals.py +0 -0
  262. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/core/test_symbolic.py +0 -0
  263. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/adaptation.npz +0 -0
  264. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/compliance.npz +0 -0
  265. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/components.npz +0 -0
  266. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/configs/finger.yaml +0 -0
  267. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/configs/hand.yaml +0 -0
  268. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/configs/soft-arm.yaml +0 -0
  269. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/configs/turtle.yaml +0 -0
  270. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/configs/two-arms.yaml +0 -0
  271. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/configs/ur5-hand.yaml +0 -0
  272. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/derivatives.npz +0 -0
  273. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/dynamics.npz +0 -0
  274. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/efficiency.npz +0 -0
  275. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/estimation.npz +0 -0
  276. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/finger.npz +0 -0
  277. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/fingertip.npz +0 -0
  278. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/hand.npz +0 -0
  279. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/heuristics.npz +0 -0
  280. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/imu.npz +0 -0
  281. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/kalman.npz +0 -0
  282. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/mocap.npz +0 -0
  283. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/optimization.json +0 -0
  284. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/optimization.npz +0 -0
  285. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/pcc.npz +0 -0
  286. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/transmission.npz +0 -0
  287. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/turtle.npz +0 -0
  288. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/data/vmc.npz +0 -0
  289. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_compliance_golden.py +0 -0
  290. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_contact.py +0 -0
  291. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_imu.py +0 -0
  292. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_inversion.py +0 -0
  293. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_kalman.py +0 -0
  294. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_kalman_golden.py +0 -0
  295. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_kalman_unscented.py +0 -0
  296. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_mocap_golden.py +0 -0
  297. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_momentum.py +0 -0
  298. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_sensors.py +0 -0
  299. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/estimation/test_velocity.py +0 -0
  300. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/hardware/test_profile.py +0 -0
  301. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/hardware/test_templates.py +0 -0
  302. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/helpers.py +0 -0
  303. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/identification/test_efficiency_fit.py +0 -0
  304. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/identification/test_fit_params.py +0 -0
  305. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/identification/test_friction.py +0 -0
  306. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/identification/test_steps.py +0 -0
  307. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/identification/test_stiffness_fit.py +0 -0
  308. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/identification/test_transmission.py +0 -0
  309. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_components.py +0 -0
  310. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_components_golden.py +0 -0
  311. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_contact.py +0 -0
  312. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_coordinates.py +0 -0
  313. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_distances.py +0 -0
  314. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_frames.py +0 -0
  315. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_friction.py +0 -0
  316. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_gated.py +0 -0
  317. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_mechanism.py +0 -0
  318. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_more_components.py +0 -0
  319. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_pair_contact.py +0 -0
  320. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/mechanisms/test_virtual_model.py +0 -0
  321. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_actuation.py +0 -0
  322. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_assembly.py +0 -0
  323. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_contact_map.py +0 -0
  324. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_efficiency.py +0 -0
  325. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_floating.py +0 -0
  326. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_floating_base.py +0 -0
  327. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_function.py +0 -0
  328. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_kinematics.py +0 -0
  329. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_pcc.py +0 -0
  330. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_poe.py +0 -0
  331. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/models/test_rail.py +0 -0
  332. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_asktell.py +0 -0
  333. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_equilibrium.py +0 -0
  334. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_horizon.py +0 -0
  335. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_lab.py +0 -0
  336. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_problem.py +0 -0
  337. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_search.py +0 -0
  338. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_structure.py +0 -0
  339. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_swap.py +0 -0
  340. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_terms.py +0 -0
  341. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/optimization/test_variables.py +0 -0
  342. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_adapt.py +0 -0
  343. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_bimanual.py +0 -0
  344. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_crawler.py +0 -0
  345. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_hand.py +0 -0
  346. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_helyx.py +0 -0
  347. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_parametric.py +0 -0
  348. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_turtle.py +0 -0
  349. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/robots/test_ur5.py +0 -0
  350. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_balance.py +0 -0
  351. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_record.py +0 -0
  352. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_replay.py +0 -0
  353. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_rollout.py +0 -0
  354. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_run.py +0 -0
  355. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/sim/test_runlog.py +0 -0
  356. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/small_plan.py +0 -0
  357. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/soft_arm_plan.py +0 -0
  358. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_benchmark.py +0 -0
  359. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_compiler.py +0 -0
  360. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_dynamics.py +0 -0
  361. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_import.py +0 -0
  362. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_math.py +0 -0
  363. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/test_testing.py +0 -0
  364. {virtualmodelcontrol-0.5.0 → virtualmodelcontrol-1.0.0}/tests/viz/test_animate.py +0 -0
  365. {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
- ## [Unreleased]
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.5.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 :: 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
 
@@ -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==0.1.0"
123
+ pip install "virtualmodelcontrol==1.0.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.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