jaxsim 0.4.3.dev159__tar.gz → 0.4.3.dev169__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 (125) hide show
  1. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/.pre-commit-config.yaml +3 -3
  2. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/PKG-INFO +1 -1
  3. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/_version.py +2 -2
  4. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/api/contact.py +67 -16
  5. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/api/data.py +5 -1
  6. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/api/kin_dyn_parameters.py +14 -1
  7. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/api/ode.py +11 -4
  8. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/rbda/contacts/__init__.py +2 -1
  9. jaxsim-0.4.3.dev169/src/jaxsim/rbda/contacts/visco_elastic.py +1053 -0
  10. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim.egg-info/PKG-INFO +1 -1
  11. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim.egg-info/SOURCES.txt +1 -0
  12. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/.devcontainer/Dockerfile +0 -0
  13. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/.devcontainer/devcontainer.json +0 -0
  14. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/.gitattributes +0 -0
  15. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/.github/CODEOWNERS +0 -0
  16. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/.github/workflows/ci_cd.yml +0 -0
  17. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/.github/workflows/read_the_docs.yml +0 -0
  18. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/.github/workflows/update_pixi_lockfile.yml +0 -0
  19. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/.gitignore +0 -0
  20. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/.readthedocs.yaml +0 -0
  21. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/CONTRIBUTING.md +0 -0
  22. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/LICENSE +0 -0
  23. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/README.md +0 -0
  24. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/Makefile +0 -0
  25. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/conf.py +0 -0
  26. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/examples.rst +0 -0
  27. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/guide/install.rst +0 -0
  28. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/index.rst +0 -0
  29. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/make.bat +0 -0
  30. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/modules/api.rst +0 -0
  31. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/modules/integrators.rst +0 -0
  32. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/modules/math.rst +0 -0
  33. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/modules/mujoco.rst +0 -0
  34. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/modules/parsers.rst +0 -0
  35. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/modules/rbda.rst +0 -0
  36. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/modules/typing.rst +0 -0
  37. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/docs/modules/utils.rst +0 -0
  38. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/environment.yml +0 -0
  39. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/examples/.gitattributes +0 -0
  40. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/examples/.gitignore +0 -0
  41. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/examples/PD_controller.ipynb +0 -0
  42. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/examples/Parallel_computing.ipynb +0 -0
  43. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/examples/README.md +0 -0
  44. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/examples/assets/cartpole.urdf +0 -0
  45. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/pixi.lock +0 -0
  46. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/pyproject.toml +0 -0
  47. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/setup.cfg +0 -0
  48. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/setup.py +0 -0
  49. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/__init__.py +0 -0
  50. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/api/__init__.py +0 -0
  51. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/api/com.py +0 -0
  52. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/api/common.py +0 -0
  53. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/api/frame.py +0 -0
  54. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/api/joint.py +0 -0
  55. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/api/link.py +0 -0
  56. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/api/model.py +0 -0
  57. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/api/ode_data.py +0 -0
  58. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/api/references.py +0 -0
  59. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/exceptions.py +0 -0
  60. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/integrators/__init__.py +0 -0
  61. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/integrators/common.py +0 -0
  62. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/integrators/fixed_step.py +0 -0
  63. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/integrators/variable_step.py +0 -0
  64. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/logging.py +0 -0
  65. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/math/__init__.py +0 -0
  66. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/math/adjoint.py +0 -0
  67. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/math/cross.py +0 -0
  68. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/math/inertia.py +0 -0
  69. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/math/joint_model.py +0 -0
  70. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/math/quaternion.py +0 -0
  71. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/math/rotation.py +0 -0
  72. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/math/skew.py +0 -0
  73. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/math/transform.py +0 -0
  74. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/mujoco/__init__.py +0 -0
  75. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/mujoco/__main__.py +0 -0
  76. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/mujoco/loaders.py +0 -0
  77. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/mujoco/model.py +0 -0
  78. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/mujoco/visualizer.py +0 -0
  79. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/parsers/__init__.py +0 -0
  80. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
  81. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/parsers/descriptions/collision.py +0 -0
  82. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/parsers/descriptions/joint.py +0 -0
  83. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/parsers/descriptions/link.py +0 -0
  84. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/parsers/descriptions/model.py +0 -0
  85. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/parsers/kinematic_graph.py +0 -0
  86. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/parsers/rod/__init__.py +0 -0
  87. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/parsers/rod/parser.py +0 -0
  88. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/parsers/rod/utils.py +0 -0
  89. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/rbda/__init__.py +0 -0
  90. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/rbda/aba.py +0 -0
  91. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/rbda/collidable_points.py +0 -0
  92. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/rbda/contacts/common.py +0 -0
  93. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/rbda/contacts/relaxed_rigid.py +0 -0
  94. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/rbda/contacts/rigid.py +0 -0
  95. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/rbda/contacts/soft.py +0 -0
  96. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/rbda/crba.py +0 -0
  97. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/rbda/forward_kinematics.py +0 -0
  98. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/rbda/jacobian.py +0 -0
  99. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/rbda/rnea.py +0 -0
  100. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/rbda/utils.py +0 -0
  101. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/terrain/__init__.py +0 -0
  102. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/terrain/terrain.py +0 -0
  103. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/typing.py +0 -0
  104. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/utils/__init__.py +0 -0
  105. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
  106. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/utils/tracing.py +0 -0
  107. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim/utils/wrappers.py +0 -0
  108. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim.egg-info/dependency_links.txt +0 -0
  109. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim.egg-info/requires.txt +0 -0
  110. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/src/jaxsim.egg-info/top_level.txt +0 -0
  111. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/__init__.py +0 -0
  112. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/conftest.py +0 -0
  113. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/test_api_com.py +0 -0
  114. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/test_api_contact.py +0 -0
  115. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/test_api_data.py +0 -0
  116. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/test_api_frame.py +0 -0
  117. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/test_api_joint.py +0 -0
  118. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/test_api_link.py +0 -0
  119. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/test_api_model.py +0 -0
  120. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/test_automatic_differentiation.py +0 -0
  121. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/test_contact.py +0 -0
  122. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/test_exceptions.py +0 -0
  123. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/test_pytree.py +0 -0
  124. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/test_simulations.py +0 -0
  125. {jaxsim-0.4.3.dev159 → jaxsim-0.4.3.dev169}/tests/utils_idyntree.py +0 -0
@@ -8,7 +8,7 @@ default_language_version:
8
8
 
9
9
  repos:
10
10
  - repo: https://github.com/pre-commit/pre-commit-hooks
11
- rev: v4.6.0
11
+ rev: v5.0.0
12
12
  hooks:
13
13
  - id: check-ast
14
14
  - id: check-merge-conflict
@@ -17,7 +17,7 @@ repos:
17
17
  - id: trailing-whitespace
18
18
 
19
19
  - repo: https://github.com/psf/black-pre-commit-mirror
20
- rev: 24.4.2
20
+ rev: 24.8.0
21
21
  hooks:
22
22
  - id: black
23
23
  args: ["--check", "--diff"]
@@ -29,7 +29,7 @@ repos:
29
29
  args: ["--check", "--diff"]
30
30
 
31
31
  - repo: https://github.com/astral-sh/ruff-pre-commit
32
- rev: v0.5.1
32
+ rev: v0.6.9
33
33
  hooks:
34
34
  - id: ruff
35
35
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.4.3.dev159
3
+ Version: 0.4.3.dev169
4
4
  Summary: A differentiable physics engine and multibody dynamics library for control and robot learning.
5
5
  Author-email: Diego Ferigo <dgferigo@gmail.com>
6
6
  Maintainer-email: Diego Ferigo <dgferigo@gmail.com>, Filippo Luca Ferretti <filippo.ferretti@iit.it>
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.4.3.dev159'
16
- __version_tuple__ = version_tuple = (0, 4, 3, 'dev159')
15
+ __version__ = version = '0.4.3.dev169'
16
+ __version_tuple__ = version_tuple = (0, 4, 3, 'dev169')
@@ -6,9 +6,12 @@ import jax
6
6
  import jax.numpy as jnp
7
7
 
8
8
  import jaxsim.api as js
9
+ import jaxsim.exceptions
9
10
  import jaxsim.terrain
10
11
  import jaxsim.typing as jtp
12
+ from jaxsim import logging
11
13
  from jaxsim.math import Adjoint, Cross, Transform
14
+ from jaxsim.rbda import contacts
12
15
 
13
16
  from .common import VelRepr
14
17
 
@@ -156,14 +159,11 @@ def collidable_point_dynamics(
156
159
  Instead, the 6D forces are returned in the active representation.
157
160
  """
158
161
 
159
- # Import privately the contacts classes.
160
- from jaxsim.rbda.contacts import RelaxedRigidContacts, RigidContacts, SoftContacts
161
-
162
162
  # Build the soft contact model.
163
163
  match model.contact_model:
164
164
 
165
- case SoftContacts():
166
- assert isinstance(model.contact_model, SoftContacts)
165
+ case contacts.SoftContacts():
166
+ assert isinstance(model.contact_model, contacts.SoftContacts)
167
167
 
168
168
  # Compute the 6D force expressed in the inertial frame and applied to each
169
169
  # collidable point, and the corresponding material deformation rate.
@@ -178,8 +178,8 @@ def collidable_point_dynamics(
178
178
  # of the ODE system. We need to pass its dynamics to the integrator.
179
179
  aux_data = dict(m_dot=CW_ṁ)
180
180
 
181
- case RigidContacts():
182
- assert isinstance(model.contact_model, RigidContacts)
181
+ case contacts.RigidContacts():
182
+ assert isinstance(model.contact_model, contacts.RigidContacts)
183
183
 
184
184
  # Compute the 6D force expressed in the inertial frame and applied to each
185
185
  # collidable point.
@@ -192,8 +192,8 @@ def collidable_point_dynamics(
192
192
 
193
193
  aux_data = dict()
194
194
 
195
- case RelaxedRigidContacts():
196
- assert isinstance(model.contact_model, RelaxedRigidContacts)
195
+ case contacts.RelaxedRigidContacts():
196
+ assert isinstance(model.contact_model, contacts.RelaxedRigidContacts)
197
197
 
198
198
  # Compute the 6D force expressed in the inertial frame and applied to each
199
199
  # collidable point.
@@ -206,6 +206,31 @@ def collidable_point_dynamics(
206
206
 
207
207
  aux_data = dict()
208
208
 
209
+ case contacts.ViscoElasticContacts():
210
+ assert isinstance(model.contact_model, contacts.ViscoElasticContacts)
211
+
212
+ # It is not yet clear how to pass the time step to this stage.
213
+ # A possibility is to restrict the integrator to only forward Euler
214
+ # and store the Δt inside the model.
215
+ module = jaxsim.rbda.contacts.visco_elastic.step.__module__
216
+ name = jaxsim.rbda.contacts.visco_elastic.step.__name__
217
+ msg = "You need to use the custom '{}.{}' function with this contact model."
218
+ jaxsim.exceptions.raise_runtime_error_if(
219
+ condition=True, msg=msg.format(module, name)
220
+ )
221
+
222
+ # Compute the 6D force expressed in the inertial frame and applied to each
223
+ # collidable point.
224
+ W_f_Ci, (W_f̿_Ci, m_tf) = model.contact_model.compute_contact_forces(
225
+ model=model,
226
+ data=data,
227
+ dt=None, # TODO
228
+ link_forces=link_forces,
229
+ joint_force_references=joint_force_references,
230
+ )
231
+
232
+ aux_data = dict(W_f_avg2_C=W_f̿_Ci, m_tf=m_tf)
233
+
209
234
  case _:
210
235
  raise ValueError(f"Invalid contact model {model.contact_model}")
211
236
 
@@ -278,7 +303,6 @@ def in_contact(
278
303
  return links_in_contact
279
304
 
280
305
 
281
- @jax.jit
282
306
  def estimate_good_soft_contacts_parameters(
283
307
  model: js.model.JaxSimModel,
284
308
  *,
@@ -287,9 +311,15 @@ def estimate_good_soft_contacts_parameters(
287
311
  number_of_active_collidable_points_steady_state: jtp.IntLike = 1,
288
312
  damping_ratio: jtp.FloatLike = 1.0,
289
313
  max_penetration: jtp.FloatLike | None = None,
290
- ) -> jaxsim.rbda.contacts.SoftContactsParams:
314
+ **kwargs,
315
+ ) -> (
316
+ jaxsim.rbda.contacts.RelaxedRigidContactsParams
317
+ | jaxsim.rbda.contacts.RigidContactsParams
318
+ | jaxsim.rbda.contacts.SoftContactsParams
319
+ | jaxsim.rbda.contacts.ViscoElasticContactsParams
320
+ ):
291
321
  """
292
- Estimate good soft contacts parameters for the given model.
322
+ Estimate good parameters for soft-like contact models.
293
323
 
294
324
  Args:
295
325
  model: The model to consider.
@@ -313,7 +343,10 @@ def estimate_good_soft_contacts_parameters(
313
343
  """
314
344
 
315
345
  def estimate_model_height(model: js.model.JaxSimModel) -> jtp.Float:
316
- """"""
346
+ """
347
+ Displacement between the CoM and the lowest collidable point using zero
348
+ joint positions.
349
+ """
317
350
 
318
351
  zero_data = js.data.JaxSimModelData.build(
319
352
  model=model,
@@ -338,21 +371,39 @@ def estimate_good_soft_contacts_parameters(
338
371
 
339
372
  match model.contact_model:
340
373
 
341
- case jaxsim.rbda.contacts.SoftContacts():
342
- assert isinstance(model.contact_model, jaxsim.rbda.contacts.SoftContacts)
374
+ case contacts.SoftContacts():
375
+ assert isinstance(model.contact_model, contacts.SoftContacts)
376
+
377
+ parameters = contacts.SoftContactsParams.build_default_from_jaxsim_model(
378
+ model=model,
379
+ standard_gravity=standard_gravity,
380
+ static_friction_coefficient=static_friction_coefficient,
381
+ max_penetration=max_δ,
382
+ number_of_active_collidable_points_steady_state=nc,
383
+ damping_ratio=damping_ratio,
384
+ p=model.contact_model.parameters.p,
385
+ q=model.contact_model.parameters.q,
386
+ )
387
+
388
+ case contacts.ViscoElasticContacts():
389
+ assert isinstance(model.contact_model, contacts.ViscoElasticContacts)
343
390
 
344
391
  parameters = (
345
- jaxsim.rbda.contacts.SoftContactsParams.build_default_from_jaxsim_model(
392
+ contacts.ViscoElasticContactsParams.build_default_from_jaxsim_model(
346
393
  model=model,
347
394
  standard_gravity=standard_gravity,
348
395
  static_friction_coefficient=static_friction_coefficient,
349
396
  max_penetration=max_δ,
350
397
  number_of_active_collidable_points_steady_state=nc,
351
398
  damping_ratio=damping_ratio,
399
+ p=model.contact_model.parameters.p,
400
+ q=model.contact_model.parameters.q,
401
+ **kwargs,
352
402
  )
353
403
  )
354
404
 
355
405
  case _:
406
+ logging.warning("The active contact model is not soft-like, no-op.")
356
407
  parameters = model.contact_model.parameters
357
408
 
358
409
  return parameters
@@ -233,7 +233,11 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
233
233
 
234
234
  if contacts_params is None:
235
235
 
236
- if isinstance(model.contact_model, jaxsim.rbda.contacts.SoftContacts):
236
+ if isinstance(
237
+ model.contact_model,
238
+ jaxsim.rbda.contacts.SoftContacts
239
+ | jaxsim.rbda.contacts.ViscoElasticContacts,
240
+ ):
237
241
  contacts_params = js.contact.estimate_good_soft_contacts_parameters(
238
242
  model=model, standard_gravity=standard_gravity
239
243
  )
@@ -5,6 +5,8 @@ import dataclasses
5
5
  import jax.lax
6
6
  import jax.numpy as jnp
7
7
  import jax_dataclasses
8
+ import numpy as np
9
+ import numpy.typing as npt
8
10
  from jax_dataclasses import Static
9
11
 
10
12
  import jaxsim.typing as jtp
@@ -753,6 +755,13 @@ class ContactParameters(JaxsimDataclass):
753
755
 
754
756
  point: jtp.Matrix = dataclasses.field(default_factory=lambda: jnp.array([]))
755
757
 
758
+ enabled: Static[tuple[bool, ...]] = dataclasses.field(default_factory=tuple)
759
+
760
+ @property
761
+ def indices_of_enabled_collidable_points(self) -> npt.NDArray:
762
+
763
+ return np.where(np.array(self.enabled))[0]
764
+
756
765
  @staticmethod
757
766
  def build_from(model_description: ModelDescription) -> ContactParameters:
758
767
  """
@@ -785,7 +794,11 @@ class ContactParameters(JaxsimDataclass):
785
794
  )
786
795
 
787
796
  # Build the ContactParameters object.
788
- cp = ContactParameters(point=points, body=link_index_of_points)
797
+ cp = ContactParameters(
798
+ point=points,
799
+ body=link_index_of_points,
800
+ enabled=tuple(True for _ in link_index_of_points),
801
+ )
789
802
 
790
803
  assert cp.point.shape[1] == 3, cp.point.shape[1]
791
804
  assert cp.point.shape[0] == len(cp.body), cp.point.shape[0]
@@ -8,6 +8,7 @@ import jaxsim.rbda
8
8
  import jaxsim.typing as jtp
9
9
  from jaxsim.integrators import Time
10
10
  from jaxsim.math import Quaternion
11
+ from jaxsim.rbda import contacts
11
12
 
12
13
  from .common import VelRepr
13
14
  from .ode_data import ODEState
@@ -371,8 +372,6 @@ def system_dynamics(
371
372
  by the system dynamics evaluation.
372
373
  """
373
374
 
374
- from jaxsim.rbda.contacts import RelaxedRigidContacts, RigidContacts, SoftContacts
375
-
376
375
  # Compute the accelerations and the material deformation rate.
377
376
  W_v̇_WB, s̈, aux_dict = system_velocity_dynamics(
378
377
  model=model,
@@ -387,10 +386,18 @@ def system_dynamics(
387
386
 
388
387
  match model.contact_model:
389
388
 
390
- case SoftContacts():
389
+ case contacts.SoftContacts():
391
390
  extended_ode_state["tangential_deformation"] = aux_dict["m_dot"]
392
391
 
393
- case RigidContacts() | RelaxedRigidContacts():
392
+ case contacts.ViscoElasticContacts():
393
+
394
+ extended_ode_state["contacts_state"] = {
395
+ "tangential_deformation": jnp.zeros_like(
396
+ data.state.extended["tangential_deformation"]
397
+ )
398
+ }
399
+
400
+ case contacts.RigidContacts() | contacts.RelaxedRigidContacts():
394
401
  pass
395
402
 
396
403
  case _:
@@ -1,5 +1,6 @@
1
- from . import relaxed_rigid, rigid, soft
1
+ from . import relaxed_rigid, rigid, soft, visco_elastic
2
2
  from .common import ContactModel, ContactsParams
3
3
  from .relaxed_rigid import RelaxedRigidContacts, RelaxedRigidContactsParams
4
4
  from .rigid import RigidContacts, RigidContactsParams
5
5
  from .soft import SoftContacts, SoftContactsParams
6
+ from .visco_elastic import ViscoElasticContacts, ViscoElasticContactsParams