virtualmodelcontrol 1.2.1__tar.gz → 1.3.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 (387) hide show
  1. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/CHANGELOG.md +108 -4
  2. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/CITATION.cff +2 -2
  3. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/PKG-INFO +1 -1
  4. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/api/index.md +7 -2
  5. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/concepts/conventions.md +31 -7
  6. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/concepts/efficiency.md +11 -8
  7. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/concepts/finger.md +8 -8
  8. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/concepts/library.md +16 -9
  9. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/concepts/passivity.md +8 -8
  10. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/concepts/pcc.md +19 -16
  11. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/concepts/vmc.md +7 -7
  12. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/conf.py +2 -2
  13. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/development/contributing.md +5 -1
  14. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/development/support.md +5 -3
  15. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/examples/finger.md +6 -3
  16. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/examples/hand.md +14 -7
  17. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/examples/hanging-arm.md +7 -3
  18. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/examples/soft-arm.md +12 -1
  19. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/examples/two-arms.md +14 -11
  20. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/index.md +11 -4
  21. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/installation.md +24 -5
  22. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/_draw.py +1 -1
  23. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/finger.py +2 -2
  24. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/four_steps.py +1 -1
  25. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/turtle.py +1 -1
  26. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/troubleshooting.md +2 -2
  27. virtualmodelcontrol-1.3.0/docs/tutorials/build-a-robot.md +166 -0
  28. virtualmodelcontrol-1.3.0/docs/tutorials/components.md +181 -0
  29. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/configurations.md +10 -4
  30. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/contact.md +56 -40
  31. virtualmodelcontrol-1.3.0/docs/tutorials/coordinates-and-components.md +11 -0
  32. virtualmodelcontrol-1.3.0/docs/tutorials/coordinates.md +162 -0
  33. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/crawl.md +60 -32
  34. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/energy.md +37 -18
  35. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/estimation.md +63 -29
  36. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/extend.md +62 -19
  37. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/first-controller.md +21 -6
  38. virtualmodelcontrol-1.3.0/docs/tutorials/fit.md +141 -0
  39. virtualmodelcontrol-1.3.0/docs/tutorials/force-estimates.md +295 -0
  40. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/force.md +34 -241
  41. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/friction.md +28 -18
  42. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/introduction.md +4 -4
  43. virtualmodelcontrol-1.3.0/docs/tutorials/joints.md +246 -0
  44. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/kinematics.md +27 -11
  45. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/mpc.md +44 -21
  46. virtualmodelcontrol-1.3.0/docs/tutorials/optimize-obstacles.md +237 -0
  47. virtualmodelcontrol-1.3.0/docs/tutorials/optimize-periodic.md +306 -0
  48. virtualmodelcontrol-1.3.0/docs/tutorials/optimize.md +385 -0
  49. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/outside.md +15 -8
  50. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/parameters.md +12 -6
  51. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/real-time.md +15 -4
  52. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/run-logs.md +15 -10
  53. virtualmodelcontrol-1.3.0/docs/tutorials/soft-and-assemblies.md +144 -0
  54. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/stiffness.md +27 -17
  55. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/swaps.md +12 -8
  56. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/tuning.md +59 -17
  57. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/underactuated.md +205 -37
  58. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/__init__.py +2 -0
  59. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/_version.py +2 -2
  60. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/adaptation/seeking.py +2 -2
  61. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/control/__init__.py +2 -0
  62. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/control/blending.py +2 -0
  63. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/control/controller.py +13 -5
  64. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/control/output.py +62 -0
  65. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/control/schedule.py +2 -0
  66. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/control/state.py +3 -3
  67. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/control/tank.py +2 -0
  68. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/control/underactuated.py +23 -10
  69. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/core/params.py +44 -14
  70. virtualmodelcontrol-1.3.0/src/virtualmodelcontrol/core/registry.py +89 -0
  71. virtualmodelcontrol-1.3.0/src/virtualmodelcontrol/identification/identifiability.py +29 -0
  72. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/identification/params.py +30 -5
  73. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/identification/stiffness.py +19 -1
  74. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/__init__.py +2 -0
  75. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/components/gated.py +5 -1
  76. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/coordinates/__init__.py +2 -1
  77. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/coordinates/geometry.py +3 -3
  78. virtualmodelcontrol-1.3.0/src/virtualmodelcontrol/mechanisms/coordinates/joints.py +99 -0
  79. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/mechanism.py +16 -3
  80. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/assembly.py +5 -3
  81. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/asktell.py +33 -10
  82. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/builder.py +26 -9
  83. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/horizon.py +33 -1
  84. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/mpc.py +53 -22
  85. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/problem.py +37 -5
  86. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/solver.py +1 -1
  87. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/terms.py +3 -1
  88. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/robots/adapt.py +2 -2
  89. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/robots/helyx.py +43 -5
  90. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/robots/planar.py +20 -3
  91. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/sim/rollout.py +7 -7
  92. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/viz/style.py +2 -2
  93. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/control/test_blending.py +10 -0
  94. virtualmodelcontrol-1.3.0/tests/control/test_inputs.py +76 -0
  95. virtualmodelcontrol-1.3.0/tests/control/test_output.py +131 -0
  96. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/control/test_schedule.py +14 -0
  97. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/control/test_state_layout.py +3 -1
  98. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/control/test_tank.py +10 -0
  99. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/control/test_underactuated.py +53 -0
  100. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/core/test_params.py +29 -0
  101. virtualmodelcontrol-1.3.0/tests/core/test_registry.py +82 -0
  102. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/identification/test_fit_params.py +85 -7
  103. virtualmodelcontrol-1.3.0/tests/identification/test_stiffness_fit.py +68 -0
  104. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/mechanisms/test_coordinates.py +7 -0
  105. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/mechanisms/test_gated.py +10 -0
  106. virtualmodelcontrol-1.3.0/tests/mechanisms/test_mechanism.py +79 -0
  107. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_actuation.py +11 -1
  108. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_assembly.py +57 -1
  109. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_pcc.py +17 -1
  110. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_poe.py +16 -1
  111. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_asktell.py +37 -0
  112. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_equilibrium.py +3 -3
  113. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_horizon.py +36 -0
  114. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_mpc.py +81 -0
  115. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_plant.py +70 -0
  116. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_problem.py +20 -1
  117. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_solvers.py +2 -1
  118. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_structure.py +2 -1
  119. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/robots/test_helyx.py +3 -1
  120. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/robots/test_planar.py +13 -0
  121. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/test_python_versions.py +3 -12
  122. virtualmodelcontrol-1.2.1/docs/tutorials/build-a-robot.md +0 -470
  123. virtualmodelcontrol-1.2.1/docs/tutorials/coordinates-and-components.md +0 -292
  124. virtualmodelcontrol-1.2.1/docs/tutorials/fit.md +0 -92
  125. virtualmodelcontrol-1.2.1/docs/tutorials/optimize.md +0 -823
  126. virtualmodelcontrol-1.2.1/src/virtualmodelcontrol/core/registry.py +0 -54
  127. virtualmodelcontrol-1.2.1/src/virtualmodelcontrol/mechanisms/coordinates/joints.py +0 -51
  128. virtualmodelcontrol-1.2.1/tests/control/test_inputs.py +0 -32
  129. virtualmodelcontrol-1.2.1/tests/control/test_output.py +0 -63
  130. virtualmodelcontrol-1.2.1/tests/core/test_registry.py +0 -43
  131. virtualmodelcontrol-1.2.1/tests/identification/test_stiffness_fit.py +0 -27
  132. virtualmodelcontrol-1.2.1/tests/mechanisms/test_mechanism.py +0 -39
  133. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/.gitignore +0 -0
  134. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/LICENSE +0 -0
  135. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/README.md +0 -0
  136. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/benchmarks/tick.py +0 -0
  137. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/_ext/video.py +0 -0
  138. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/_static/create-lab.png +0 -0
  139. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/_static/custom.css +0 -0
  140. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/_static/favicon.svg +0 -0
  141. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/_static/logo-light.svg +0 -0
  142. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/_static/logo.svg +0 -0
  143. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/_static/readme-hero.svg +0 -0
  144. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/_templates/autosummary/module.rst +0 -0
  145. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/_templates/partials/toc.html +0 -0
  146. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/development/changelog.md +0 -0
  147. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/development/roadmap.md +0 -0
  148. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/docs_setup.py +0 -0
  149. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/examples/turtle.md +0 -0
  150. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/__init__.py +0 -0
  151. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/bimanual.py +0 -0
  152. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/control_loop.py +0 -0
  153. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/energy_flow.py +0 -0
  154. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/hand.py +0 -0
  155. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/helyx.py +0 -0
  156. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/library_map.py +0 -0
  157. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/mechanism.py +0 -0
  158. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/params.py +0 -0
  159. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/pcc.py +0 -0
  160. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/schematics/ur5.py +0 -0
  161. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/scripts/readme_figure.py +0 -0
  162. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/reach.yaml +0 -0
  163. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/docs/tutorials/run-settings.yaml +0 -0
  164. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/pyproject.toml +0 -0
  165. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/adaptation/__init__.py +0 -0
  166. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/adaptation/force.py +0 -0
  167. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/adaptation/limits.py +0 -0
  168. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/adaptation/position.py +0 -0
  169. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/adaptation/scalar.py +0 -0
  170. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/adaptation/stiffness.py +0 -0
  171. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/compiler.py +0 -0
  172. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/config/__init__.py +0 -0
  173. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/config/controllers.py +0 -0
  174. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/config/coordinates.py +0 -0
  175. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/config/experiment.py +0 -0
  176. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/config/files.py +0 -0
  177. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/config/spec.py +0 -0
  178. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/control/projection.py +0 -0
  179. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/core/__init__.py +0 -0
  180. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/core/backends.py +0 -0
  181. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/core/signals.py +0 -0
  182. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/core/space.py +0 -0
  183. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/core/symbolic.py +0 -0
  184. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/core/units.py +0 -0
  185. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/dynamics.py +0 -0
  186. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/estimation/__init__.py +0 -0
  187. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/estimation/balance.py +0 -0
  188. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/estimation/compliance.py +0 -0
  189. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/estimation/contact.py +0 -0
  190. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/estimation/imu.py +0 -0
  191. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/estimation/inversion.py +0 -0
  192. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/estimation/kalman.py +0 -0
  193. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/estimation/measurement.py +0 -0
  194. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/estimation/momentum.py +0 -0
  195. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/estimation/sensors.py +0 -0
  196. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/estimation/stiffness.py +0 -0
  197. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/estimation/velocity.py +0 -0
  198. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/hardware/__init__.py +0 -0
  199. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/hardware/profile.py +0 -0
  200. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/identification/__init__.py +0 -0
  201. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/identification/efficiency.py +0 -0
  202. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/identification/plateaus.py +0 -0
  203. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/identification/steps.py +0 -0
  204. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/identification/transmission.py +0 -0
  205. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/math.py +0 -0
  206. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/components/__init__.py +0 -0
  207. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/components/base.py +0 -0
  208. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/components/constrained.py +0 -0
  209. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/components/dissipation.py +0 -0
  210. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/components/inertance.py +0 -0
  211. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/components/locomotion.py +0 -0
  212. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/components/sources.py +0 -0
  213. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/components/storage.py +0 -0
  214. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/coordinates/base.py +0 -0
  215. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/coordinates/frames.py +0 -0
  216. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/coordinates/ops.py +0 -0
  217. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/mechanisms/coordinates/references.py +0 -0
  218. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/__init__.py +0 -0
  219. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/actuation.py +0 -0
  220. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/continuum/__init__.py +0 -0
  221. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/continuum/pcc.py +0 -0
  222. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/efficiency.py +0 -0
  223. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/equations.py +0 -0
  224. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/friction.py +0 -0
  225. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/function.py +0 -0
  226. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/joint_space.py +0 -0
  227. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/kinematic.py +0 -0
  228. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/kinematics.py +0 -0
  229. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/rigid/__init__.py +0 -0
  230. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/rigid/couplings.py +0 -0
  231. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/rigid/poe.py +0 -0
  232. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/models/rigid/spline.py +0 -0
  233. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/__init__.py +0 -0
  234. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/collocation.py +0 -0
  235. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/equilibrium.py +0 -0
  236. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/nlp.py +0 -0
  237. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/result.py +0 -0
  238. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/search.py +0 -0
  239. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/shooting.py +0 -0
  240. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/tank.py +0 -0
  241. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/trajectory.py +0 -0
  242. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/variables.py +0 -0
  243. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/optimization/virtual.py +0 -0
  244. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/py.typed +0 -0
  245. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/robots/__init__.py +0 -0
  246. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/robots/bimanual.py +0 -0
  247. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/robots/turtle.py +0 -0
  248. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/robots/ur5.py +0 -0
  249. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/sim/__init__.py +0 -0
  250. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/sim/balance.py +0 -0
  251. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/sim/model_plant.py +0 -0
  252. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/sim/plant.py +0 -0
  253. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/sim/replay.py +0 -0
  254. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/sim/run.py +0 -0
  255. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/sim/runlog.py +0 -0
  256. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/system.py +0 -0
  257. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/testing.py +0 -0
  258. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/viz/__init__.py +0 -0
  259. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/viz/animation.py +0 -0
  260. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/src/virtualmodelcontrol/viz/draw.py +0 -0
  261. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/adaptation/test_fingertip.py +0 -0
  262. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/adaptation/test_force.py +0 -0
  263. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/adaptation/test_grasp.py +0 -0
  264. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/adaptation/test_holding.py +0 -0
  265. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/adaptation/test_loop.py +0 -0
  266. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/adaptation/test_position.py +0 -0
  267. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/adaptation/test_scalar.py +0 -0
  268. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/adaptation/test_seeking.py +0 -0
  269. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/adaptation/test_stiffness_tracking.py +0 -0
  270. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/adaptation/test_virtual_state.py +0 -0
  271. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/backend_helpers.py +0 -0
  272. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/config/test_config.py +0 -0
  273. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/conftest.py +0 -0
  274. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/control/test_honesty.py +0 -0
  275. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/control/test_projection.py +0 -0
  276. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/control/test_underactuated_golden.py +0 -0
  277. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/control/test_vmc_golden.py +0 -0
  278. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/core/test_backends.py +0 -0
  279. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/core/test_backends_torch.py +0 -0
  280. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/core/test_signals.py +0 -0
  281. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/core/test_space.py +0 -0
  282. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/core/test_symbolic.py +0 -0
  283. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/adaptation.npz +0 -0
  284. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/compliance.npz +0 -0
  285. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/components.npz +0 -0
  286. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/configs/finger.yaml +0 -0
  287. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/configs/hand.yaml +0 -0
  288. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/configs/soft-arm.yaml +0 -0
  289. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/configs/turtle.yaml +0 -0
  290. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/configs/two-arms.yaml +0 -0
  291. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/configs/ur5-hand.yaml +0 -0
  292. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/derivatives.npz +0 -0
  293. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/dynamics.npz +0 -0
  294. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/efficiency.npz +0 -0
  295. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/estimation.npz +0 -0
  296. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/finger.npz +0 -0
  297. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/fingertip.npz +0 -0
  298. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/hand.npz +0 -0
  299. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/heuristics.npz +0 -0
  300. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/imu.npz +0 -0
  301. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/kalman.npz +0 -0
  302. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/mocap.npz +0 -0
  303. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/optimization.json +0 -0
  304. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/optimization.npz +0 -0
  305. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/pcc.npz +0 -0
  306. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/transmission.npz +0 -0
  307. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/turtle.npz +0 -0
  308. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/underactuated.npz +0 -0
  309. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/data/vmc.npz +0 -0
  310. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/estimation/test_compliance_golden.py +0 -0
  311. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/estimation/test_contact.py +0 -0
  312. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/estimation/test_imu.py +0 -0
  313. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/estimation/test_inversion.py +0 -0
  314. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/estimation/test_kalman.py +0 -0
  315. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/estimation/test_kalman_golden.py +0 -0
  316. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/estimation/test_kalman_unscented.py +0 -0
  317. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/estimation/test_mocap_golden.py +0 -0
  318. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/estimation/test_momentum.py +0 -0
  319. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/estimation/test_sensors.py +0 -0
  320. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/estimation/test_unmeasured.py +0 -0
  321. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/estimation/test_velocity.py +0 -0
  322. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/hardware/test_profile.py +0 -0
  323. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/hardware/test_templates.py +0 -0
  324. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/helpers.py +0 -0
  325. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/identification/test_efficiency_fit.py +0 -0
  326. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/identification/test_fit_friction.py +0 -0
  327. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/identification/test_friction.py +0 -0
  328. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/identification/test_steps.py +0 -0
  329. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/identification/test_transmission.py +0 -0
  330. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/lab_optimization.py +0 -0
  331. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/mechanisms/test_components.py +0 -0
  332. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/mechanisms/test_components_golden.py +0 -0
  333. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/mechanisms/test_contact.py +0 -0
  334. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/mechanisms/test_distances.py +0 -0
  335. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/mechanisms/test_frames.py +0 -0
  336. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/mechanisms/test_friction.py +0 -0
  337. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/mechanisms/test_more_components.py +0 -0
  338. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/mechanisms/test_pair_contact.py +0 -0
  339. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/mechanisms/test_phase_spring.py +0 -0
  340. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/mechanisms/test_virtual_model.py +0 -0
  341. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_contact_map.py +0 -0
  342. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_efficiency.py +0 -0
  343. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_equations.py +0 -0
  344. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_floating.py +0 -0
  345. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_floating_base.py +0 -0
  346. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_function.py +0 -0
  347. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_kinematics.py +0 -0
  348. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_rail.py +0 -0
  349. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_static_friction.py +0 -0
  350. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/models/test_underactuated.py +0 -0
  351. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_collocation.py +0 -0
  352. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_lab.py +0 -0
  353. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_periodic.py +0 -0
  354. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_search.py +0 -0
  355. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_shooting.py +0 -0
  356. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_swap.py +0 -0
  357. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_tank.py +0 -0
  358. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_terms.py +0 -0
  359. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_variables.py +0 -0
  360. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/optimization/test_virtual.py +0 -0
  361. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/robots/test_adapt.py +0 -0
  362. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/robots/test_bimanual.py +0 -0
  363. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/robots/test_crawler.py +0 -0
  364. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/robots/test_hand.py +0 -0
  365. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/robots/test_parametric.py +0 -0
  366. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/robots/test_turtle.py +0 -0
  367. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/robots/test_ur5.py +0 -0
  368. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/sim/test_balance.py +0 -0
  369. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/sim/test_record.py +0 -0
  370. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/sim/test_replay.py +0 -0
  371. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/sim/test_rollout.py +0 -0
  372. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/sim/test_run.py +0 -0
  373. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/sim/test_runlog.py +0 -0
  374. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/sim/test_wallclock.py +0 -0
  375. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/small_plan.py +0 -0
  376. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/soft_arm_plan.py +0 -0
  377. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/test_benchmark.py +0 -0
  378. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/test_compiler.py +0 -0
  379. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/test_docs.py +0 -0
  380. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/test_dynamics.py +0 -0
  381. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/test_import.py +0 -0
  382. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/test_math.py +0 -0
  383. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/test_readme.py +0 -0
  384. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/test_testing.py +0 -0
  385. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/underactuated_lab.py +0 -0
  386. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/viz/test_animate.py +0 -0
  387. {virtualmodelcontrol-1.2.1 → virtualmodelcontrol-1.3.0}/tests/viz/test_viz.py +0 -0
@@ -4,6 +4,103 @@ 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
+ ## [1.3.0] - 2026-10-30
8
+
9
+ A minor release. A plan of a robot with fewer motors than coordinates now reads the motors, as the controller that
10
+ runs does (see Changed), and the result of a review of the whole library: the fixes below, most of them for
11
+ cases that gave a wrong or a silent answer, and the tension floor for tendons that only pull. Nothing else changes
12
+ for a robot with a motor on every coordinate.
13
+
14
+ ### Added
15
+
16
+ - `control.TensionFloor`: an output stage for tendons that only pull. It lifts the torques of each
17
+ group of tendons (a segment's three) together until the lowest is at a floor, so no tendon is
18
+ told to push. Equal torques on evenly spaced tendons only squeeze the segment, so the bend
19
+ that the command makes is the same. Its corner is rounded, and `symbolic` is the same map for
20
+ a plan (`Problem(output=)`).
21
+ - `Mechanism.motor` and the `MotorAngle` coordinate: entries of the robot's motor angles, as its
22
+ actuation gives them. A `LimitSpring` on it is a limit on how far a motor may turn.
23
+ - `helyx.tension_stage`, `helyx.unwind_limit` and their numbers `TENSION_FLOOR`,
24
+ `UNWIND_LIMIT` and `UNWIND_STIFFNESS`: the tension floor, and a limit on how far a motor may
25
+ unwind (pulling is free). Both are optional, and `helyx.output_stage` is unchanged.
26
+ - `control.underactuated.Frozen(at=)` and `controller(gravity=<motor angles>)`: the rest of the
27
+ passive joints balanced once at a pose. The frozen torque stays the gradient of a potential,
28
+ which `gravity=True` (the balance found again at every reading, as before) does not: its torque
29
+ has a curl of a few percent in the test. `Frozen.rest` can be set as the `q_rest` of the
30
+ actuation.
31
+ - A `Param` can be shared by several sections or joints (`PCC([0.2, 0.2], radius)`, one axis for two
32
+ joints): it keeps one value, `ParamSet.by_name()` lists every name it has, and `select` finds
33
+ it by any of them (under its own name).
34
+ - `MovingHorizon.encoder` of a robot with fewer motors than coordinates measures the motors, as the
35
+ Kalman filter's does (it pinned the passive joint at its rest angle: an error of 0.37 rad in the
36
+ test, 0.001 now). `MovingHorizon.P` is defined from `reset` on.
37
+ - A term of a plan can use a site of a `plant` that is another robot.
38
+
39
+ ### Changed
40
+
41
+ - A plan of a robot with fewer motors than coordinates now reads the motors, as `VMCController`
42
+ does (the frozen controller of `control.underactuated`). It used to read the whole state, so
43
+ that `Problem(system)` and the simulation of `VMCController(compile(system))` were different
44
+ controllers (a gap of 0.36 rad in the test). `Problem(reads="state")` plans the whole-state
45
+ controller (`StateController`, `"naive"`), and `reads="motors"` asks for the default outright.
46
+ For a robot with a motor on every coordinate nothing changes.
47
+ - `MPC` applies a plan only if its solve converged (a real-time iteration is applied as it is):
48
+ a failed solve used to jump the controller's Params. `MPC.applied` says whether the last plan
49
+ was, and the next solve after a failed one starts from the measured state. `rti=True` is undone
50
+ by a later `MPC` of the same problem without it, `reset` drops a plan that is being made, and
51
+ `start` waits until the last plan was polled.
52
+ - `Result.params` and `Result.steps` are held inside the Params' bounds (the solver relaxes a
53
+ bound by about 1e-8).
54
+ - `fit_params` and `fit_stiffness_damping` refuse an even `smoothing` (it shifted the derivative by
55
+ half a sample: a damping of 1.5 came out as 1.88), and a run whose `train` mask is off everywhere.
56
+ `fit_stiffness_damping` returns NaN, with a warning that names it, for a stiffness or damping
57
+ that the runs do not determine (it returned 0). `fit_params` takes one name as a string, and
58
+ a run with nothing to train is skipped when another has samples (an error when none has).
59
+ - `VMCController.set` refuses a value whose size is not the Param's (a scalar was broadcast into a
60
+ matrix), and `live_params()` returns copies. `balance()` and `elements()` use the Params as
61
+ `set` left them.
62
+ - `register` replaces a class defined again (a script or a notebook cell run twice) and still
63
+ refuses another object under a taken name. A plugin that fails to import no longer keeps the
64
+ others from loading: its error is raised by `get` of a name that is missing (and said in the
65
+ `KeyError`), and is a warning in `names`.
66
+ - `robot.joint` counts from the end (`slice(0, -1)`) and takes numpy integers; an index out of
67
+ range is a `ValueError` that says how many coordinates there are.
68
+ - `TensionFloor` needs a positive `width` (zero gave NaN).
69
+ - In `ask` and `tell`, a cost that is not finite (an episode that failed) counts as the worst cost
70
+ so far (`inf` until one is known) and is never the best; `Bayes` used to fail for good after one.
71
+ - `planar.arm(rest=)` takes one angle per passive joint as well as one per joint.
72
+ - The messages that named `Collocation` and `Equilibrium` name `Shooting` too.
73
+
74
+ ### Fixed
75
+
76
+ - `Tank`, `SwapController` and `ScheduledController` can be copied and pickled.
77
+ - `Gated` forwards what the wrapped component reads.
78
+ - The docstring of `rollout` says that its `z` rows are the state the law used, one step behind
79
+ `run`'s.
80
+
81
+ ## [1.2.2] - 2026-10-11
82
+
83
+ A patch: a fit says when its data do not determine a Param, and gives the same values on every machine; two
84
+ error messages say what to do instead. Nothing else changes.
85
+
86
+ ### Fixed
87
+
88
+ - `fit_params`: a Param that the data do not determine (a run that never excites it, or an entry of a matrix
89
+ that only appears in a sum with another, such as the two off-diagonal entries of a spring's stiffness) has
90
+ `std` `inf`. It was `0.0`, which read as certainty. Along such a direction the fit used to end wherever the
91
+ rounding of the machine left it (the difference of those two entries came out as 4.06, 3.67 or -2.31 on
92
+ different CPUs); it now stays at the start, inside the bounds and only if the fit stays as good. The values
93
+ and the standard errors of the Params that the data do determine are the same as before.
94
+
95
+ ### Changed
96
+
97
+ - An unknown geometry in `helyx.arm`, `helyx.model` or `helyx.hardware` raises a `KeyError` that names it and
98
+ lists the known geometries (it was the bare name).
99
+ - The `ValueError` that a law or an estimator raises for a `StateController` now says what to use instead:
100
+ `underactuated.controller(compiled, "frozen")` without `gravity=True` (that one reads the motors), or
101
+ `DirectionalForce` for a force. It used to say "the plain frozen controller", which a `gravity=True`
102
+ controller is not.
103
+
7
104
  ## [1.2.1] - 2026-10-10
8
105
 
9
106
  A patch: a Ctrl-C can no longer lose the log of a real-time run. Nothing else changes.
@@ -346,7 +443,7 @@ tank, tuning and the calibrations), which was never released on its own.
346
443
  geometric terms out and is not provided.
347
444
  - `KalmanFilter(system, dt, Q=None, P0=None, gate=40.0, robot=None)` and `Measurement(q, v, Rq,
348
445
  Rv, observed, name)`: a Kalman filter of the robot's state (q, v). Its process model is the
349
- robot's own dynamics, linearised at the estimate at rest and held over the step (the lab's
446
+ robot's own dynamics, linearized at the estimate at rest and held over the step (the lab's
350
447
  frozen mass matrix, in general form), with the command going through the system's
351
448
  transmission. It fuses encoders (`kf.encoder`) and any sensor that sees part of the state,
352
449
  gates each measurement on its innovation, and reports the sensors it rejected (`rejected`,
@@ -437,9 +534,9 @@ tank, tuning and the calibrations), which was never released on its own.
437
534
  covariance, on a mass, spring and damper. The tutorial "Fit Params to a run" uses it.
438
535
  - `KalmanFilter(..., unscented=True, substeps=10)`: the prediction sends sigma points of the
439
536
  estimate (the scaled unscented transform, a root of three standard deviations out) through the
440
- robot's own integrator, in `substeps` steps, instead of linearising at the estimate; the sensors
537
+ robot's own integrator, in `substeps` steps, instead of linearizing at the estimate; the sensors
441
538
  stay linear, so the update is the same. On a double pendulum it follows the mean of a Monte
442
- Carlo to 0.003 where the linearised prediction is off by 2; on a linear robot the two agree.
539
+ Carlo to 0.003 where the linearized prediction is off by 2; on a linear robot the two agree.
443
540
  - `vmc.estimation.MomentumObserver(system, dt, gain, robot=None)`: the external force on a robot
444
541
  from its motion, without accelerations. From the momentum and what the model says would change
445
542
  it, it gives the generalized force the model does not explain, as a low-pass filter of bandwidth
@@ -831,7 +928,14 @@ First public release.
831
928
  - `robots.adapt`: the ADAPT finger (two motors, coupled distal joints), joint-angle coordinate
832
929
  and joint-limit spring.
833
930
 
834
- [Unreleased]: https://github.com/vigno0405/VirtualModelControl/compare/v0.3.0...HEAD
931
+ [Unreleased]: https://github.com/vigno0405/VirtualModelControl/compare/v1.3.0...HEAD
932
+ [1.3.0]: https://github.com/vigno0405/VirtualModelControl/compare/v1.2.2...v1.3.0
933
+ [1.2.2]: https://github.com/vigno0405/VirtualModelControl/compare/v1.2.1...v1.2.2
934
+ [1.2.1]: https://github.com/vigno0405/VirtualModelControl/compare/v1.2.0...v1.2.1
935
+ [1.2.0]: https://github.com/vigno0405/VirtualModelControl/compare/v1.1.0...v1.2.0
936
+ [1.1.0]: https://github.com/vigno0405/VirtualModelControl/compare/v1.0.0...v1.1.0
937
+ [1.0.0]: https://github.com/vigno0405/VirtualModelControl/compare/v0.5.0...v1.0.0
938
+ [0.5.0]: https://github.com/vigno0405/VirtualModelControl/compare/v0.3.0...v0.5.0
835
939
  [0.3.0]: https://github.com/vigno0405/VirtualModelControl/compare/v0.2.0...v0.3.0
836
940
  [0.2.0]: https://github.com/vigno0405/VirtualModelControl/compare/v0.1.0...v0.2.0
837
941
  [0.1.0]: https://github.com/vigno0405/VirtualModelControl/releases/tag/v0.1.0
@@ -1,8 +1,8 @@
1
1
  cff-version: 1.2.0
2
2
  message: "If you use this software, please cite it as below."
3
3
  type: software
4
- version: 0.3.0
5
- date-released: "2026-10-05"
4
+ version: 1.3.0
5
+ date-released: "2026-10-30"
6
6
  title: "virtualmodelcontrol: Virtual Model Control for robots"
7
7
  authors:
8
8
  - family-names: Vignoli
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: virtualmodelcontrol
3
- Version: 1.2.1
3
+ Version: 1.3.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/
@@ -1,7 +1,10 @@
1
1
  # API
2
2
 
3
- Scripts need only `import virtualmodelcontrol as vmc`: the classes and functions of the
4
- tutorials are available from there. The modules, from the bottom layer up:
3
+ Scripts start with `import virtualmodelcontrol as vmc`: the classes and functions of the
4
+ tutorials, and the modules `vmc.sim`, `vmc.viz` and the others below, are available from there.
5
+ The robot templates are the one exception: import them as
6
+ `from virtualmodelcontrol.robots import helyx` (or `adapt`, `bimanual`, `turtle`). The modules, from
7
+ the bottom layer up:
5
8
 
6
9
  ```{eval-rst}
7
10
  .. autosummary::
@@ -24,4 +27,6 @@ tutorials are available from there. The modules, from the bottom layer up:
24
27
  ~virtualmodelcontrol.hardware
25
28
  ~virtualmodelcontrol.viz
26
29
  ~virtualmodelcontrol.robots
30
+ ~virtualmodelcontrol.config
31
+ ~virtualmodelcontrol.testing
27
32
  ```
@@ -1,13 +1,17 @@
1
1
  # Conventions and glossary
2
2
 
3
+ The rules that every part of the library follows, and the words it uses. Read it once, and come back when a sign or a unit surprises you.
4
+
3
5
  ## Units and signs
4
6
 
5
7
  - SI everywhere: m, rad, s, N, N·m, kg. Degrees stay at the boundary with the hardware, in the
6
8
  robot's hardware profile. A driver's raw units (encoder ticks, motor currents) never enter
7
9
  the library.
8
10
  - A positive motor angle pulls its tendon. Each template states the sign of its robot's
9
- encoders against this convention (`helyx.ENCODER_SIGN`, `bimanual.ENCODER_SIGN`,
10
- `turtle.MOTOR_SIGNS`); multiply raw readings and commands by it.
11
+ encoders against this convention (`helyx.ENCODER_SIGN`, one sign for each geometry,
12
+ `bimanual.ENCODER_SIGN`, one sign, and `turtle.MOTOR_SIGNS`, one sign per motor). The robot's
13
+ hardware profile applies it for you; if you convert by hand, multiply raw readings and commands
14
+ by it.
11
15
  - Controllers send their torques as computed, never divided by an efficiency. A robot's
12
16
  efficiency maps the commanded motor torques to the delivered ones. It is 1 by default,
13
17
  because the templates' stiffness and damping were identified from the commanded torques
@@ -17,7 +21,10 @@
17
21
 
18
22
  - The configuration `q` lives on a space, and the velocity `v` in its tangent space. So `q` and
19
23
  `v` may differ in size (a floating body, for example).
20
- - Motor angles are `θ`, a generalized force is `τ`, actuator commands are `u`.
24
+ - A generalized force is `τ`, actuator commands are `u`. Symbols are local to a page, and each page
25
+ says what it uses. The one to watch is `θ`: a motor angle in the robot's signals
26
+ (`motor_position`); a joint angle in the finger and hand pages, where the motors are `q`; the
27
+ bend of a segment in the PCC page.
21
28
  - A spring's deflection is `y = x − x_ref`, so it pulls `x` towards `x_ref`. Storage gives
22
29
  `f = −∂V/∂y`, a damper `f = −D ẏ`, and every force reaches the robot as `τ = Jᵀ f`.
23
30
  - Arrays in, arrays out: inputs accept anything array-like; outputs are numpy arrays (torch
@@ -25,7 +32,8 @@
25
32
 
26
33
  ## Continuum robots
27
34
 
28
- - The arc parameter `s ∈ [0, 1]` runs from the base to the tip, uniformly in arc length.
35
+ - The arc parameter `s ∈ [0, 1]` runs from the base to the tip, uniformly in rest length (the arc
36
+ length while no segment stretches).
29
37
  - A segment's configuration is `Δ = (Dx, Dy, Dl)` [m]. The base frame's `z` axis runs along
30
38
  the straight body. See [soft-arm kinematics](pcc.md).
31
39
 
@@ -56,13 +64,29 @@ virtual state
56
64
  A degree of freedom of the controller itself, such as the turtle's flywheel; it needs an
57
65
  inertance.
58
66
 
67
+ inertance
68
+ A mass or an inertia on a coordinate, and the component that gives it. A virtual state needs
69
+ one; a robot has its own.
70
+
71
+ live Param
72
+ A Param that may change while the controller runs (scope `stage`), for example with
73
+ `controller.set`; the others are folded in when the controller is compiled
74
+ ([parameters](../tutorials/parameters.md)).
75
+
76
+ law
77
+ A rule that changes a controller's live Params at every step, such as `ForceTracking`.
78
+
79
+ guard
80
+ The check of a run that sends zero torque when a reading is missing, not a number, or too old.
81
+
59
82
  site
60
83
  A named point of a kinematic model, such as `"tip"`; continuum models also accept an arc
61
84
  parameter `s`.
62
85
 
63
86
  plant
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.
87
+ What the controller drives: a simulator such as `ModelPlant`, or the real robot. In a plan,
88
+ `Problem(system, plant=robot)` plans the motion of a larger `robot` than the controller's own
89
+ (see [Optimize](../tutorials/optimize.md)).
66
90
 
67
91
  tank
68
92
  An energy budget for changing a running controller: a change is applied as far as the tank
@@ -70,7 +94,7 @@ tank
70
94
 
71
95
  output stage
72
96
  An optional correction of the motor commands for real hardware: friction compensation,
73
- pretension, an offset or a torque limit.
97
+ pretension, a tension floor, an offset or a torque limit.
74
98
 
75
99
  template
76
100
  A function that builds a ready-made robot, such as `helyx.arm`, with every geometric number
@@ -54,21 +54,24 @@ $$
54
54
  $$
55
55
 
56
56
  with each coefficient one value for every motor or one per motor. A number passed as
57
- `efficiency=` is the linear coefficient $c_1$. `vmc.Efficiency(1.0)` is the default. The
58
- coefficients are Params, to change, tune or identify:
57
+ `efficiency=` is the linear coefficient $c_1$. `vmc.Efficiency(1.0)` is the default, and
58
+ `Efficiency(..., friction=...)` adds the static friction of the motors
59
+ ([Static friction](../tutorials/friction.md)). The coefficients are Params, to change, tune or
60
+ identify:
59
61
 
60
62
  ```{code-cell} python
61
63
  import numpy as np
62
64
  import virtualmodelcontrol as vmc
63
65
  from virtualmodelcontrol.robots import helyx
64
66
 
65
- cubic = vmc.Efficiency(0.10, 0.0, 0.40) # one polynomial for every motor
67
+ cubic = vmc.Efficiency(0.10, 0.0, 0.40) # made-up numbers, for all motors
66
68
  arm = helyx.arm(efficiency=cubic)
67
69
  arm.params["efficiency.c3"]
68
70
  ```
69
71
 
70
72
  A robot with an efficiency other than 1 receives the delivered torques, so its stiffness,
71
- damping and masses must be the physical ones, referred to the delivered torque. In a
73
+ damping and masses must be the physical ones, referred to the delivered torque: the values
74
+ identified from the commanded torques, times $\eta$, as above. In a
72
75
  simulator, `vmc.sim.ModelPlant(robot, runtime=["*efficiency*"])` keeps the coefficients live.
73
76
 
74
77
  ## Identify it from static measurements
@@ -96,7 +99,7 @@ holds = plateaus(t, command, tolerance=1e-6) # settled half of each hold
96
99
  u = np.array([command[h].mean() for h in holds])
97
100
  y = np.array([measured[h].mean() for h in holds])
98
101
  linear = fit_efficiency(u, y)
99
- cubic = fit_efficiency(u, y, degree=3)
102
+ cubic_fit = fit_efficiency(u, y, degree=3)
100
103
  ```
101
104
 
102
105
  ```{code-cell} python
@@ -108,7 +111,7 @@ grid = np.linspace(0.0, 1.05, 100)
108
111
  fig, ax = plt.subplots()
109
112
  ax.plot(u, y, "o", color=viz.PALETTE[0], label="plateaus")
110
113
  ax.plot(grid, linear(grid), "--", color=viz.PALETTE[1], label="linear fit")
111
- ax.plot(grid, cubic(grid), color=viz.PALETTE[2], label="cubic fit")
114
+ ax.plot(grid, cubic_fit(grid), color=viz.PALETTE[2], label="cubic fit")
112
115
  ax.set_xlabel(r"commanded torque [N$\cdot$m]")
113
116
  ax.set_ylabel(r"delivered torque [N$\cdot$m]")
114
117
  ax.legend();
@@ -125,8 +128,8 @@ def r2(fit):
125
128
 
126
129
  glue("eta_linear", float(linear.params["c1"].value[0]), display=False)
127
130
  glue("r2_linear", float(r2(linear)), display=False)
128
- glue("r2_cubic", float(r2(cubic)), display=False)
129
- glue("c3", float(cubic.params["c3"].value[0]), display=False)
131
+ glue("r2_cubic", float(r2(cubic_fit)), display=False)
132
+ glue("c3", float(cubic_fit.params["c3"].value[0]), display=False)
130
133
  ```
131
134
 
132
135
  The linear fit gives a constant efficiency of {glue:text}`eta_linear:.3f` ($R^2$ =
@@ -8,7 +8,7 @@ kernelspec:
8
8
 
9
9
  The ADAPT finger and hand are rigid chains of phalanges driven through tendons and cables, with
10
10
  fewer motors than joints. This page gives the equations of `robots.adapt`: how motor angles set
11
- joint angles, and how joint angles place the fingertip.
11
+ joint angles, and how joint angles place the fingertip, and then how the hand's motors drive its joints.
12
12
 
13
13
  ```{code-cell} python
14
14
  :tags: [remove-cell]
@@ -33,7 +33,8 @@ glue("pip", float(adapt.COUPLING[1, 1]), display=False)
33
33
 
34
34
  The finger has three phalanges, proximal, middle and distal, of {glue:text}`a:.1f`,
35
35
  {glue:text}`b:.1f` and {glue:text}`c:.1f` mm, joined by three revolute joints, MCP, PIP and
36
- DIP, all turning about $x$. Straight, it points along $y$. Bending it turns the tip towards $z$.
36
+ DIP (the metacarpophalangeal, proximal interphalangeal and distal interphalangeal joints), all
37
+ turning about $x$. Straight, it points along $y$. Bending it turns the tip towards $z$.
37
38
 
38
39
  ```{code-cell} python
39
40
  :tags: [remove-input]
@@ -45,11 +46,11 @@ schematic.figure();
45
46
 
46
47
  Two motors drive the three joints. The first pulls a cable on a pulley of the MCP joint. The
47
48
  second drives the PIP joint through a cable, and the DIP joint follows the PIP joint. With
48
- motor angles $q_1, q_2$,
49
+ motor angles $q_0, q_1$,
49
50
 
50
51
  $$
51
- \theta_\text{MCP} = \frac{r_p}{r_m}\,q_1, \qquad
52
- \theta_\text{PIP} = \theta_\text{DIP} = \frac{r_m}{c_p}\,q_2,
52
+ \theta_\text{MCP} = \frac{r_p}{r_m}\,q_0, \qquad
53
+ \theta_\text{PIP} = \theta_\text{DIP} = \frac{r_m}{c_p}\,q_1,
53
54
  $$
54
55
 
55
56
  with $r_m$ the motor pulley's radius, $r_p$ that of the MCP pulley and $c_p$ the cable constant
@@ -100,9 +101,8 @@ glue("spread", ", ".join(coefficients[:3]) + " and " + coefficients[3], display=
100
101
  ```
101
102
 
102
103
  The hand has a thumb and four fingers, each a chain of revolute joints from the hand's base.
103
- The thumb has the joints CMC1, CMC2, MCP and IP, and each finger has the joints spread, MCP,
104
- PIP and DIP. The origins and axes of the joints come from the hand's design files, as tables
105
- of the module.
104
+ The thumb has the joints CMC1, CMC2 (carpometacarpal), MCP and IP (interphalangeal), and each
105
+ finger has the joints spread, MCP, PIP and DIP. The origins and axes of the joints are tables in `robots.adapt` (`HAND_JOINTS`, `HAND_FINGER_BASES`).
106
106
  {glue:text}`motors:.0f` motors drive its {glue:text}`joints:.0f` joints, $\theta = C\,q$:
107
107
 
108
108
  - each thumb joint has a motor of its own;
@@ -6,8 +6,9 @@ kernelspec:
6
6
 
7
7
  # How the library is organized
8
8
 
9
- The library is a stack of layers. Each layer uses only the layers below it. The ready-made
10
- robots and the figures sit at the edges. They may use every layer, and no layer uses them.
9
+ This page is a map: what each part of the library does, and which names to look for. The library
10
+ is a stack of layers. Each layer uses only the layers below it. The ready-made robots and the
11
+ figures sit at the edges. They may use every layer, and no layer uses them.
11
12
 
12
13
  ```{code-cell} python
13
14
  :tags: [remove-cell]
@@ -20,11 +21,15 @@ from schematics import library_map
20
21
  library_map.figure();
21
22
  ```
22
23
 
24
+ From the bottom, the layers are `core` (Params and signals), `math`, `mechanisms`, `models`,
25
+ `system`, `compiler` and `dynamics`, `control`, `sim`, `estimation` and `identification`, and
26
+ `adaptation` and `optimization`. The edges are `robots`, `hardware`, `viz`, `config` and `testing`.
27
+
23
28
  A controller needs only the layers up to `control`: describe the robot with `models`, place
24
29
  virtual elements with `mechanisms`, pair them in a `VirtualMechanismSystem`, `compile` it and
25
30
  run it with `VMCController`. Simulation, figures and the robot templates are optional.
26
- `lint-imports` enforces the order: it checks the contracts written in `pyproject.toml` on every
27
- change, including that nothing in the library imports ROS.
31
+ The order is checked automatically on every change, and so is that nothing in the library imports
32
+ a robot middleware such as ROS: signals come in and go out as arrays.
28
33
 
29
34
  ## Where things are
30
35
 
@@ -34,7 +39,7 @@ change, including that nothing in the library imports ROS.
34
39
  | describe a new robot | `vmc.models`: `PCC`, `SerialChain`, `JointSpace`, `LinearCoupling`, `Assembly`, `TendonTransmission` |
35
40
  | place virtual elements | `vmc.Mechanism`, coordinates and components such as `vmc.LinearSpring` |
36
41
  | compile and run a controller | `vmc.VirtualMechanismSystem`, `vmc.compile`, `vmc.VMCController` |
37
- | correct commands for real hardware | `vmc.control.output`: friction compensation, pretension, limits |
42
+ | correct commands for real hardware | `vmc.control.output`: friction compensation, pretension, a tension floor, limits |
38
43
  | get positions, Jacobians, Hessians | `vmc.Kinematics` |
39
44
  | get the robot's equations of motion | `vmc.compile_dynamics` (from the components, or from a function with `vmc.models.Equations`) |
40
45
  | simulate a closed loop | `vmc.sim`: `ModelPlant`, `run`, `SimClock` |
@@ -46,7 +51,7 @@ change, including that nothing in the library imports ROS.
46
51
  | describe an experiment in a file | `vmc.config`: `load`, `Experiment` |
47
52
  | draw and animate | `vmc.viz` |
48
53
  | run a model without CasADi | `backend="numpy"` or `"torch"`, `Dynamics.export`, `Compiled.export` |
49
- | parameters, units, scopes | `vmc.Param`, `vmc.ParamSet` |
54
+ | parameters, units, scopes | `vmc.Param`, `vmc.ParamSet` ([Parameters](../tutorials/parameters.md)) |
50
55
 
51
56
  ## One symbolic source
52
57
 
@@ -61,9 +66,11 @@ $$
61
66
  \end{aligned}
62
67
  $$
63
68
 
64
- with $M$ the mass matrix, $h$ the velocity and gravity terms, $B$ the actuation map, $f_k$ the
65
- forces of the robot's own components and $J_k$ the Jacobian of each one's coordinate with
66
- respect to the velocity. A model whose dynamics are not made of such components (a black box)
69
+ with $M$ the mass matrix, $h$ the velocity terms of the kinetic energy (Coriolis and centrifugal),
70
+ $B$ the actuation map, $f_k$ the forces of the robot's own components (springs, dampers, gravity)
71
+ and $J_k$ the Jacobian of each one's coordinate with respect to the velocity. A model whose dynamics are not made of such components (a black box)
67
72
  gives the residual itself, as a function. The numpy and PyTorch versions of a model are not
68
73
  written again: they are generated from the same graph ([Use a model outside
69
74
  CasADi](../tutorials/outside.md)).
75
+
76
+ To use these parts, start with [your first controller](../tutorials/first-controller.md).
@@ -24,13 +24,13 @@ energy_flow.figure();
24
24
 
25
25
  ## The controller's energy balance
26
26
 
27
- The controller stores $E_c = V + T$: $V$ in its springs, $T$ in the inertances of its virtual
28
- states. Three powers change it. The port, $P = \tau^\top v$, is the power its torques give the
29
- robot. The dissipation is $D = \sum f \cdot \dot y \le 0$ over its dampers. The source power is
30
- $S = \sum f \cdot \dot y$ over its sources. With the [VMC equations](vmc.md),
27
+ The controller stores $E_c = V + T$: $V$ in its springs, measured from its lowest value so that
28
+ $E_c \ge 0$, and $T$ in the inertances of its virtual states. Three powers change it. The port, $P = \tau^\top v$, is the power its torques give the
29
+ robot. The dissipation power is $P_D = \sum f \cdot \dot y \le 0$ over its dampers. The source power is
30
+ $P_S = \sum f \cdot \dot y$ over its sources. With the [VMC equations](vmc.md),
31
31
 
32
32
  $$
33
- \dot E_c = -P + D + S .
33
+ \dot E_c = -P + P_D + P_S .
34
34
  $$
35
35
 
36
36
  The compiled controller computes each term (`compiled.energy`, `compiled.power`), so the balance can be
@@ -41,10 +41,10 @@ checked on any run.
41
41
  Without sources, integrating the balance gives
42
42
 
43
43
  $$
44
- \int_0^t P\,\mathrm{d}t = E_c(0) - E_c(t) + \int_0^t D\,\mathrm{d}t \;\le\; E_c(0),
44
+ \int_0^t P\,\mathrm{d}t = E_c(0) - E_c(t) + \int_0^t P_D\,\mathrm{d}t \;\le\; E_c(0),
45
45
  $$
46
46
 
47
- since $E_c(t) \ge 0$ and $D \le 0$. Whatever the robot does, the controller gives it at most the
47
+ since $E_c(t) \ge 0$ and $P_D \le 0$. Whatever the robot does, the controller gives it at most the
48
48
  energy it stored at the start: it is passive.
49
49
 
50
50
  ## The robot and its controller together
@@ -54,7 +54,7 @@ by its input power and its own dissipation. With the default [efficiency](effici
54
54
  and no output stage, its input power is the controller's port $P$, so the two balances add up:
55
55
 
56
56
  $$
57
- \dot E_r + \dot E_c = D_r + D + S .
57
+ \dot E_r + \dot E_c = P_{D,r} + P_D + P_S .
58
58
  $$
59
59
 
60
60
  Without sources the total energy can only fall. It is bounded by its value at the start. Where
@@ -24,44 +24,45 @@ pcc.figure();
24
24
 
25
25
  Segment $i$ has the coordinates $\Delta_i = (D_x, D_y, D_l)$ [m]: $D_x$ and $D_y$ bend it
26
26
  towards $(D_x, D_y)$, and $D_l$ lengthens it. With rest length $L_0$, section radius $d$ and
27
- local arc fraction $s \in [0, 1]$,
27
+ local arc fraction $s \in [0, 1]$, the size of the bend is $\rho$ and its angle at $s$ is $\theta$:
28
28
 
29
29
  $$
30
30
  \begin{gathered}
31
- D = \sqrt{D_x^2 + D_y^2 + \varepsilon}, \\
32
- \theta(s) = s\,D/d .
31
+ \rho = \sqrt{D_x^2 + D_y^2 + \varepsilon}, \\
32
+ \theta(s) = s\,\rho/d .
33
33
  \end{gathered}
34
34
  $$
35
35
 
36
- The frame at $s$ is turned by $\theta$ about the axis $(-D_y, D_x, 0)/D$, and its origin is
36
+ The frame at $s$ is turned by $\theta$ about the axis $(-D_y, D_x, 0)/\rho$, and its origin is
37
37
 
38
38
  $$
39
- t(s) = \frac{d\,(L_0 + D_l)}{D^2}
40
- \begin{bmatrix} D_x (1 - \cos\theta) \\ D_y (1 - \cos\theta) \\ D \sin\theta \end{bmatrix},
39
+ t(s) = \frac{d\,(L_0 + D_l)}{\rho^2}
40
+ \begin{bmatrix} D_x (1 - \cos\theta) \\ D_y (1 - \cos\theta) \\ \rho \sin\theta \end{bmatrix},
41
41
  $$
42
42
 
43
- the point at arc length $s\,(L_0 + D_l)$ on an arc of radius $d\,(L_0 + D_l)/D$. The tangent
43
+ the point at arc length $s\,(L_0 + D_l)$ on an arc of radius $d\,(L_0 + D_l)/\rho$. The tangent
44
44
  is the frame's $z$ axis. The small $\varepsilon$ ($10^{-12}$ m²) keeps the straight pose
45
45
  smooth.
46
46
 
47
47
  ## The whole arm
48
48
 
49
49
  The configuration stacks the segments, base to tip: $q = (\Delta_1, \dots, \Delta_n)$. The arc
50
- parameter $s \in [0, 1]$ of the whole arm is uniform in arc length, so segment $i$ spans
50
+ parameter $s \in [0, 1]$ of the whole arm is uniform in rest length (it is the arc length while no segment stretches), so
51
+ segment $i$ spans
51
52
  $[b_{i-1}, b_i]$ with $b_i = \sum_{j \le i} L_{0,j} / \sum_j L_{0,j}$. Each segment's frame
52
53
  starts where the previous one ends. `arm.point(s=...)` accepts a symbolic $s$ as well, so an
53
54
  attachment point can itself be optimized.
54
55
 
55
56
  ## Tendons
56
57
 
57
- A tendon at angle $\delta$ around the section and distance $d$ from the backbone changes
58
- length by
58
+ A tendon at angle $\delta$ around the section changes length by
59
59
 
60
60
  $$
61
61
  \Delta L = D_l - D_x \cos\delta - D_y \sin\delta ,
62
62
  $$
63
63
 
64
- and its motor, with spool radius $r$, turns by $\theta_m = -\Delta L / r$: a positive motor
64
+ (the distance $d$ of the tendon from the backbone is already inside $D_x$ and $D_y$), and its motor,
65
+ with spool radius $r$, turns by $\theta_m = -\Delta L / r$: a positive motor
65
66
  angle pulls the tendon. With three tendons per segment this map is invertible, so the measured
66
67
  motor angles give $\Delta$ exactly. The motor torques that realize a generalized force $\tau$
67
68
  solve $B u = \tau$ with $B = (\partial\theta_m/\partial\Delta)^\top$. The transmission's
@@ -70,7 +71,7 @@ ones.
70
71
 
71
72
  ## The templates
72
73
 
73
- `robots.helyx` builds Helyx arms from these equations. Three geometries are ready: the soft
74
+ `robots.helyx` builds Helyx arms from these equations. Three geometries are ready, named by their segment lengths in mm: the soft
74
75
  arm of the [soft-arm example](../examples/soft-arm.md) (on its side), the
75
76
  [hanging soft arm](../examples/hanging-arm.md) and the arms of the
76
77
  [two-arm example](../examples/two-arms.md). Their segment lengths, their mounting and the sign
@@ -81,12 +82,14 @@ of their encoders against the convention above are:
81
82
  from IPython.display import Markdown
82
83
  from virtualmodelcontrol.robots import helyx
83
84
 
84
- rows = ["| Geometry | Segments, base to tip | Gravity in the base frame | Encoder sign |",
85
- "|---|---|---|---|"]
85
+ used = {"145-145-145": "soft arm", "145-290-290": "hanging arm", "290-145-145": "two arms"}
86
+ rows = ["| Geometry | Used in | Segments, base to tip | Gravity in the base frame | Encoder sign |",
87
+ "|---|---|---|---|---|"]
86
88
  for name, spec in helyx.GEOMETRIES.items():
87
89
  lengths = ", ".join(f"{1000 * L:.0f}" for L in spec["L0"]) + " mm"
88
90
  gravity = "[" + ", ".join(f"{g:g}" for g in spec["gravity"]) + "] m/s²"
89
- rows.append(f"| `{name}` | {lengths} | {gravity} | {helyx.ENCODER_SIGN[name]:+.0f} |")
91
+ rows.append(f"| `{name}` | {used[name]} | {lengths} | {gravity} "
92
+ f"| {helyx.ENCODER_SIGN[name]:+.0f} |")
90
93
  Markdown("\n".join(rows))
91
94
  ```
92
95
 
@@ -101,5 +104,5 @@ short = helyx.arm(
101
104
  lengths=(0.2, 0.2), # [m], two segments
102
105
  tendon_angles=np.radians([[0, 120, -120], [60, 180, -60]]),
103
106
  )
104
- short.actuation.motor_sizes(short.space) # motor angles and rates
107
+ short.actuation.motor_sizes(short.space) # 6 motor angles and 6 rates
105
108
  ```
@@ -46,15 +46,15 @@ $J_z$ need no hand derivation.
46
46
  ## Elements and their forces
47
47
 
48
48
  Each element gives a force $f$ on its coordinate. Springs store energy, $f = -\partial V/\partial y$
49
- with $V \ge 0$. A linear spring of stiffness $K$ on $y = x - x_\text{ref}$ pulls $x$ towards
49
+ with $V$ bounded below. A linear spring of stiffness $K$ on $y = x - x_\text{ref}$ pulls $x$ towards
50
50
  $x_\text{ref}$ with $f = -K y$. Dampers dissipate, $f \cdot \dot y \le 0$, as $f = -D \dot y$.
51
- Inertances give the virtual states their mass. Sources add forces of their own, such as gravity
52
- compensation, $f = -m g$ on each of the robot's masses.
51
+ Inertances give mass to a virtual state of the controller, or to a coordinate of the robot. Sources add forces of their own, such as gravity
52
+ compensation, $f = -m g$ on each of the robot's masses $m$, with $g$ the gravity vector.
53
53
 
54
54
  ## From forces to motor torques
55
55
 
56
- The torque that a force $f$ on $y$ exerts on the robot follows from virtual work:
57
- $f \cdot \delta y = \tau^\top \delta q$ for every small motion, so
56
+ The torque that a force $f$ on $y$ exerts on the robot follows from power:
57
+ $f \cdot \dot y = \tau^\top v$ for every velocity $v$, so
58
58
 
59
59
  $$
60
60
  \tau = \sum_k J_{q,k}^\top f_k ,
@@ -70,8 +70,8 @@ with $B$ the robot's actuation map. For a tendon arm $B = (\partial\theta/\parti
70
70
  with $\theta$ the motor angles. With one motor per joint $B$ is the identity. The controller
71
71
  never divides $u$ by an [efficiency](efficiency.md). A robot with fewer motors than joints has
72
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.
73
+ $u = B^+\tau$, and the part of $\tau$ outside the range of $B$, which they cannot give, is the
74
+ torque defect of [the underactuated tutorial](../tutorials/underactuated.md).
75
75
 
76
76
  ## Virtual states
77
77
 
@@ -52,7 +52,7 @@ intersphinx_mapping = {
52
52
 
53
53
  html_theme = "sphinx_immaterial"
54
54
  html_title = "virtualmodelcontrol"
55
- html_logo = "_static/logo-light.svg" # the header is navy in both colour schemes
55
+ html_logo = "_static/logo-light.svg" # the header is navy in both color schemes
56
56
  html_favicon = "_static/favicon.svg"
57
57
  # Tooltips of API objects without their synopsis, which the theme joins with an em dash.
58
58
  object_description_options = [("py:.*", {"generate_synopses": None})]
@@ -77,7 +77,7 @@ html_theme_options = {
77
77
  {
78
78
  "media": "(prefers-color-scheme: light)",
79
79
  "scheme": "default",
80
- "primary": "custom", # colours in _static/custom.css
80
+ "primary": "custom", # colors in _static/custom.css
81
81
  "accent": "custom",
82
82
  "toggle": {"icon": "material/weather-night", "name": "Dark mode"},
83
83
  },
@@ -1,5 +1,7 @@
1
1
  # Contributing
2
2
 
3
+ How to set up a working copy, run the checks, and send a change.
4
+
3
5
  ## Set up
4
6
 
5
7
  From a clone of the repository, on Linux or macOS:
@@ -72,7 +74,9 @@ Pages are MyST notebooks: every code cell runs at each build, and an error fails
72
74
 
73
75
  Versions follow semantic versioning and come from git tags. To release:
74
76
 
75
- 1. In `CHANGELOG.md`, rename "Unreleased" to the new version and date.
77
+ 1. In `CHANGELOG.md`, rename "Unreleased" to the new version and date, and add the version's
78
+ comparison link at the end of the file. Give `CITATION.cff` the same version and date, and the
79
+ pin example of `docs/installation.md` the new version.
76
80
  2. Push `main`, then tag and push the tag:
77
81
 
78
82
  ```bash