jaxsim 0.4.3.dev28__tar.gz → 0.4.3.dev61__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 (124) hide show
  1. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/PKG-INFO +2 -1
  2. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/environment.yml +1 -0
  3. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/pyproject.toml +2 -0
  4. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/_version.py +2 -2
  5. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/contact.py +27 -1
  6. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/data.py +8 -6
  7. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/model.py +1 -1
  8. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/ode.py +19 -24
  9. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/ode_data.py +11 -1
  10. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/integrators/common.py +1 -1
  11. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/inertia.py +1 -1
  12. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/mujoco/loaders.py +3 -3
  13. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/kinematic_graph.py +3 -3
  14. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/rod/parser.py +18 -14
  15. jaxsim-0.4.3.dev61/src/jaxsim/rbda/contacts/relaxed_rigid.py +384 -0
  16. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/contacts/rigid.py +11 -41
  17. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/terrain/terrain.py +41 -25
  18. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/typing.py +1 -1
  19. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/utils/jaxsim_dataclass.py +12 -9
  20. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/utils/wrappers.py +1 -1
  21. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim.egg-info/PKG-INFO +2 -1
  22. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim.egg-info/SOURCES.txt +1 -0
  23. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim.egg-info/requires.txt +1 -0
  24. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.devcontainer/Dockerfile +0 -0
  25. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.devcontainer/devcontainer.json +0 -0
  26. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.gitattributes +0 -0
  27. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.github/CODEOWNERS +0 -0
  28. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.github/workflows/ci_cd.yml +0 -0
  29. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.github/workflows/read_the_docs.yml +0 -0
  30. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.github/workflows/update_pixi_lockfile.yml +0 -0
  31. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.gitignore +0 -0
  32. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.pre-commit-config.yaml +0 -0
  33. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.readthedocs.yaml +0 -0
  34. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/CONTRIBUTING.md +0 -0
  35. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/LICENSE +0 -0
  36. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/README.md +0 -0
  37. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/Makefile +0 -0
  38. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/conf.py +0 -0
  39. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/examples.rst +0 -0
  40. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/guide/install.rst +0 -0
  41. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/index.rst +0 -0
  42. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/make.bat +0 -0
  43. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/api.rst +0 -0
  44. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/integrators.rst +0 -0
  45. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/math.rst +0 -0
  46. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/mujoco.rst +0 -0
  47. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/parsers.rst +0 -0
  48. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/rbda.rst +0 -0
  49. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/typing.rst +0 -0
  50. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/utils.rst +0 -0
  51. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/examples/.gitattributes +0 -0
  52. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/examples/.gitignore +0 -0
  53. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/examples/PD_controller.ipynb +0 -0
  54. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/examples/Parallel_computing.ipynb +0 -0
  55. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/examples/README.md +0 -0
  56. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/examples/assets/cartpole.urdf +0 -0
  57. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/pixi.lock +0 -0
  58. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/setup.cfg +0 -0
  59. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/setup.py +0 -0
  60. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/__init__.py +0 -0
  61. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/__init__.py +0 -0
  62. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/com.py +0 -0
  63. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/common.py +0 -0
  64. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/frame.py +0 -0
  65. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/joint.py +0 -0
  66. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
  67. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/link.py +0 -0
  68. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/references.py +0 -0
  69. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/exceptions.py +0 -0
  70. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/integrators/__init__.py +0 -0
  71. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/integrators/fixed_step.py +0 -0
  72. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/integrators/variable_step.py +0 -0
  73. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/logging.py +0 -0
  74. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/__init__.py +0 -0
  75. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/adjoint.py +0 -0
  76. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/cross.py +0 -0
  77. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/joint_model.py +0 -0
  78. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/quaternion.py +0 -0
  79. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/rotation.py +0 -0
  80. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/skew.py +0 -0
  81. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/transform.py +0 -0
  82. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/mujoco/__init__.py +0 -0
  83. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/mujoco/__main__.py +0 -0
  84. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/mujoco/model.py +0 -0
  85. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/mujoco/visualizer.py +0 -0
  86. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/__init__.py +0 -0
  87. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
  88. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/descriptions/collision.py +0 -0
  89. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/descriptions/joint.py +0 -0
  90. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/descriptions/link.py +0 -0
  91. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/descriptions/model.py +0 -0
  92. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/rod/__init__.py +0 -0
  93. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/rod/utils.py +0 -0
  94. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/__init__.py +0 -0
  95. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/aba.py +0 -0
  96. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/collidable_points.py +0 -0
  97. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/contacts/__init__.py +0 -0
  98. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/contacts/common.py +0 -0
  99. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/contacts/soft.py +0 -0
  100. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/crba.py +0 -0
  101. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/forward_kinematics.py +0 -0
  102. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/jacobian.py +0 -0
  103. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/rnea.py +0 -0
  104. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/utils.py +0 -0
  105. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/terrain/__init__.py +0 -0
  106. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/utils/__init__.py +0 -0
  107. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/utils/tracing.py +0 -0
  108. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim.egg-info/dependency_links.txt +0 -0
  109. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim.egg-info/top_level.txt +0 -0
  110. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/__init__.py +0 -0
  111. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/conftest.py +0 -0
  112. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_com.py +0 -0
  113. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_contact.py +0 -0
  114. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_data.py +0 -0
  115. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_frame.py +0 -0
  116. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_joint.py +0 -0
  117. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_link.py +0 -0
  118. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_model.py +0 -0
  119. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_automatic_differentiation.py +0 -0
  120. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_contact.py +0 -0
  121. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_exceptions.py +0 -0
  122. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_pytree.py +0 -0
  123. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_simulations.py +0 -0
  124. {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/utils_idyntree.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.4.3.dev28
3
+ Version: 0.4.3.dev61
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>
@@ -61,6 +61,7 @@ Description-Content-Type: text/markdown
61
61
  License-File: LICENSE
62
62
  Requires-Dist: coloredlogs
63
63
  Requires-Dist: jax>=0.4.13
64
+ Requires-Dist: jaxopt>=0.8.0
64
65
  Requires-Dist: jaxlib>=0.4.13
65
66
  Requires-Dist: jaxlie>=1.3.0
66
67
  Requires-Dist: jax_dataclasses>=1.4.0
@@ -8,6 +8,7 @@ dependencies:
8
8
  - python >= 3.12.0
9
9
  - coloredlogs
10
10
  - jax >= 0.4.13
11
+ - jaxopt >= 0.8.0
11
12
  - jaxlib >= 0.4.13
12
13
  - jaxlie >= 1.3.0
13
14
  - jax-dataclasses >= 1.4.0
@@ -45,6 +45,7 @@ classifiers = [
45
45
  dependencies = [
46
46
  "coloredlogs",
47
47
  "jax >= 0.4.13",
48
+ "jaxopt >= 0.8.0",
48
49
  "jaxlib >= 0.4.13",
49
50
  "jaxlie >= 1.3.0",
50
51
  "jax_dataclasses >= 1.4.0",
@@ -181,6 +182,7 @@ platforms = ["linux-64", "osx-arm64", "osx-64"]
181
182
  coloredlogs = "*"
182
183
  jax = "*"
183
184
  jax-dataclasses = "*"
185
+ jaxopt = "*"
184
186
  jaxlib = "*"
185
187
  jaxlie = "*"
186
188
  lxml = "*"
@@ -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.dev28'
16
- __version_tuple__ = version_tuple = (0, 4, 3, 'dev28')
15
+ __version__ = version = '0.4.3.dev61'
16
+ __version_tuple__ = version_tuple = (0, 4, 3, 'dev61')
@@ -131,7 +131,8 @@ def collidable_point_dynamics(
131
131
  Returns:
132
132
  The 6D force applied to each collidable point and additional data based on the contact model configured:
133
133
  - Soft: the material deformation rate.
134
- - Rigid: nothing.
134
+ - Rigid: no additional data.
135
+ - QuasiRigid: no additional data.
135
136
 
136
137
  Note:
137
138
  The material deformation rate is always returned in the mixed frame
@@ -144,6 +145,10 @@ def collidable_point_dynamics(
144
145
  W_p_Ci, W_ṗ_Ci = js.contact.collidable_point_kinematics(model=model, data=data)
145
146
 
146
147
  # Import privately the contacts classes.
148
+ from jaxsim.rbda.contacts.relaxed_rigid import (
149
+ RelaxedRigidContacts,
150
+ RelaxedRigidContactsState,
151
+ )
147
152
  from jaxsim.rbda.contacts.rigid import RigidContacts, RigidContactsState
148
153
  from jaxsim.rbda.contacts.soft import SoftContacts, SoftContactsState
149
154
 
@@ -190,6 +195,27 @@ def collidable_point_dynamics(
190
195
 
191
196
  aux_data = dict()
192
197
 
198
+ case RelaxedRigidContacts():
199
+ assert isinstance(model.contact_model, RelaxedRigidContacts)
200
+ assert isinstance(data.state.contact, RelaxedRigidContactsState)
201
+
202
+ # Build the contact model.
203
+ relaxed_rigid_contacts = RelaxedRigidContacts(
204
+ parameters=data.contacts_params, terrain=model.terrain
205
+ )
206
+
207
+ # Compute the 6D force expressed in the inertial frame and applied to each
208
+ # collidable point.
209
+ W_f_Ci, _ = relaxed_rigid_contacts.compute_contact_forces(
210
+ position=W_p_Ci,
211
+ velocity=W_ṗ_Ci,
212
+ model=model,
213
+ data=data,
214
+ link_forces=link_forces,
215
+ )
216
+
217
+ aux_data = dict()
218
+
193
219
  case _:
194
220
  raise ValueError(f"Invalid contact model {model.contact_model}")
195
221
 
@@ -593,16 +593,18 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
593
593
  The updated `JaxSimModelData` object.
594
594
  """
595
595
 
596
- base_quaternion = jnp.array(base_quaternion)
596
+ W_Q_B = jnp.array(base_quaternion, dtype=float)
597
+
598
+ W_Q_B = jax.lax.select(
599
+ pred=jnp.allclose(jnp.linalg.norm(W_Q_B), 1.0, atol=1e-6, rtol=0.0),
600
+ on_true=W_Q_B,
601
+ on_false=W_Q_B / jnp.linalg.norm(W_Q_B),
602
+ )
597
603
 
598
604
  return self.replace(
599
605
  validate=True,
600
606
  state=self.state.replace(
601
- physics_model=self.state.physics_model.replace(
602
- base_quaternion=jnp.atleast_1d(base_quaternion.squeeze()).astype(
603
- float
604
- )
605
- )
607
+ physics_model=self.state.physics_model.replace(base_quaternion=W_Q_B)
606
608
  ),
607
609
  )
608
610
 
@@ -1935,7 +1935,7 @@ def step(
1935
1935
  tf_ns = jnp.where(tf_ns >= t0_ns, tf_ns, jnp.array(0, dtype=t0_ns.dtype))
1936
1936
 
1937
1937
  jax.lax.cond(
1938
- pred=tf_ns >= t0_ns,
1938
+ pred=tf_ns < t0_ns,
1939
1939
  true_fun=lambda: jax.debug.print(
1940
1940
  "The simulation time overflowed, resetting simulation time to 0."
1941
1941
  ),
@@ -175,17 +175,15 @@ def system_velocity_dynamics(
175
175
  forces=W_f_Li_terrain,
176
176
  additive=True,
177
177
  )
178
- # Get the link forces in the data representation
179
- with references.switch_velocity_representation(data.velocity_representation):
178
+
179
+ # Get the link forces in inertial representation
180
180
  f_L_total = references.link_forces(model=model, data=data)
181
181
 
182
- # The following method always returns the inertial-fixed acceleration, and expects
183
- # the link_forces expressed in the inertial frame.
184
- W_v̇_WB, s̈ = system_acceleration(
185
- model=model, data=data, joint_forces=joint_forces, link_forces=f_L_total
186
- )
182
+ v̇_WB, = system_acceleration(
183
+ model=model, data=data, joint_forces=joint_forces, link_forces=f_L_total
184
+ )
187
185
 
188
- return W_v̇_WB, s̈, aux_data
186
+ return v̇_WB, s̈, aux_data
189
187
 
190
188
 
191
189
  def system_acceleration(
@@ -196,7 +194,7 @@ def system_acceleration(
196
194
  link_forces: jtp.MatrixLike | None = None,
197
195
  ) -> tuple[jtp.Vector, jtp.Vector]:
198
196
  """
199
- Compute the system acceleration in inertial-fixed representation.
197
+ Compute the system acceleration in the active representation.
200
198
 
201
199
  Args:
202
200
  model: The model to consider.
@@ -206,7 +204,7 @@ def system_acceleration(
206
204
  The 6D forces to apply to the links expressed in the same representation of data.
207
205
 
208
206
  Returns:
209
- A tuple containing the base 6D acceleration in inertial-fixed representation
207
+ A tuple containing the base 6D acceleration in in the active representation
210
208
  and the joint accelerations.
211
209
  """
212
210
 
@@ -272,18 +270,15 @@ def system_acceleration(
272
270
  )
273
271
 
274
272
  # - Joint accelerations: s̈ ∈ ℝⁿ
275
- # - Base inertial-fixed acceleration: W_v̇_WB = (W_p̈_B, W_ω̇_B) ∈ ℝ⁶
276
- with (
277
- data.switch_velocity_representation(velocity_representation=VelRepr.Inertial),
278
- references.switch_velocity_representation(VelRepr.Inertial),
279
- ):
280
- W_v̇_WB, = js.model.forward_dynamics_aba(
281
- model=model,
282
- data=data,
283
- joint_forces=references.joint_force_references(),
284
- link_forces=references.link_forces(),
285
- )
286
- return W_v̇_WB, s̈
273
+ # - Base acceleration: v̇_WB ∈ ℝ⁶
274
+ v̇_WB, s̈ = js.model.forward_dynamics_aba(
275
+ model=model,
276
+ data=data,
277
+ joint_forces=references.joint_force_references(model=model),
278
+ link_forces=references.link_forces(model=model, data=data),
279
+ )
280
+
281
+ return v̇_WB,
287
282
 
288
283
 
289
284
  @jax.jit
@@ -353,7 +348,7 @@ def system_dynamics(
353
348
  corresponding derivative, and the dictionary of auxiliary data returned
354
349
  by the system dynamics evaluation.
355
350
  """
356
-
351
+ from jaxsim.rbda.contacts.relaxed_rigid import RelaxedRigidContacts
357
352
  from jaxsim.rbda.contacts.rigid import RigidContacts
358
353
  from jaxsim.rbda.contacts.soft import SoftContacts
359
354
 
@@ -371,7 +366,7 @@ def system_dynamics(
371
366
  case SoftContacts():
372
367
  ode_state_kwargs["tangential_deformation"] = aux_dict["m_dot"]
373
368
 
374
- case RigidContacts():
369
+ case RigidContacts() | RelaxedRigidContacts():
375
370
  pass
376
371
 
377
372
  case _:
@@ -6,6 +6,10 @@ import jax_dataclasses
6
6
  import jaxsim.api as js
7
7
  import jaxsim.typing as jtp
8
8
  from jaxsim.rbda import ContactsState
9
+ from jaxsim.rbda.contacts.relaxed_rigid import (
10
+ RelaxedRigidContacts,
11
+ RelaxedRigidContactsState,
12
+ )
9
13
  from jaxsim.rbda.contacts.rigid import RigidContacts, RigidContactsState
10
14
  from jaxsim.rbda.contacts.soft import SoftContacts, SoftContactsState
11
15
  from jaxsim.utils import JaxsimDataclass
@@ -173,6 +177,10 @@ class ODEState(JaxsimDataclass):
173
177
  )
174
178
  case RigidContacts():
175
179
  contact = RigidContactsState.build()
180
+
181
+ case RelaxedRigidContacts():
182
+ contact = RelaxedRigidContactsState.build()
183
+
176
184
  case _:
177
185
  raise ValueError("Unable to determine contact state class prefix.")
178
186
 
@@ -216,7 +224,9 @@ class ODEState(JaxsimDataclass):
216
224
 
217
225
  # Get the contact model from the `JaxSimModel`.
218
226
  match contact:
219
- case SoftContactsState() | RigidContactsState():
227
+ case (
228
+ SoftContactsState() | RigidContactsState() | RelaxedRigidContactsState()
229
+ ):
220
230
  pass
221
231
  case None:
222
232
  contact = SoftContactsState.zero(model=model)
@@ -497,7 +497,7 @@ class ExplicitRungeKutta(Integrator[PyTreeType, PyTreeType], Generic[PyTreeType]
497
497
  b: jtp.Matrix,
498
498
  c: jtp.Vector,
499
499
  index_of_solution: jtp.IntLike = 0,
500
- ) -> [bool, int | None]:
500
+ ) -> tuple[bool, int | None]:
501
501
  """
502
502
  Check if the Butcher tableau supports the FSAL (first-same-as-last) property.
503
503
 
@@ -45,7 +45,7 @@ class Inertia:
45
45
  M (jtp.Matrix): The 6x6 inertia matrix.
46
46
 
47
47
  Returns:
48
- Tuple[jtp.Float, jtp.Vector, jtp.Matrix]: A tuple containing mass, center of mass (3D), and inertia matrix (3x3).
48
+ tuple[jtp.Float, jtp.Vector, jtp.Matrix]: A tuple containing mass, center of mass (3D), and inertia matrix (3x3).
49
49
 
50
50
  Raises:
51
51
  ValueError: If the input matrix M has an unexpected shape.
@@ -211,7 +211,7 @@ class RodModelToMjcf:
211
211
  joints_dict = {j.name: j for j in rod_model.joints()}
212
212
 
213
213
  # Convert all the joints not considered to fixed joints.
214
- for joint_name in set(j.name for j in rod_model.joints()) - considered_joints:
214
+ for joint_name in {j.name for j in rod_model.joints()} - considered_joints:
215
215
  joints_dict[joint_name].type = "fixed"
216
216
 
217
217
  # Convert the ROD model to URDF.
@@ -289,10 +289,10 @@ class RodModelToMjcf:
289
289
  mj_model = mj.MjModel.from_xml_string(xml=urdf_string, assets=assets)
290
290
 
291
291
  # Get the joint names.
292
- mj_joint_names = set(
292
+ mj_joint_names = {
293
293
  mj.mj_id2name(mj_model, mj.mjtObj.mjOBJ_JOINT, idx)
294
294
  for idx in range(mj_model.njnt)
295
- )
295
+ }
296
296
 
297
297
  # Check that the Mujoco model only has the considered joints.
298
298
  if mj_joint_names != considered_joints:
@@ -394,7 +394,7 @@ class KinematicGraph(Sequence[LinkDescription]):
394
394
  return copy.deepcopy(self)
395
395
 
396
396
  # Check if all considered joints are part of the full kinematic graph
397
- if len(set(considered_joints) - set(j.name for j in full_graph.joints)) != 0:
397
+ if len(set(considered_joints) - {j.name for j in full_graph.joints}) != 0:
398
398
  extra_j = set(considered_joints) - {j.name for j in full_graph.joints}
399
399
  msg = f"Not all joints to consider are part of the graph ({{{extra_j}}})"
400
400
  raise ValueError(msg)
@@ -536,8 +536,8 @@ class KinematicGraph(Sequence[LinkDescription]):
536
536
  root_link_name=full_graph.root.name,
537
537
  )
538
538
 
539
- assert set(f.name for f in self.frames).isdisjoint(
540
- set(f.name for f in unconnected_frames + reduced_frames)
539
+ assert {f.name for f in self.frames}.isdisjoint(
540
+ {f.name for f in unconnected_frames + reduced_frames}
541
541
  )
542
542
 
543
543
  for link in unconnected_links:
@@ -223,7 +223,7 @@ def extract_model_data(
223
223
  child=links_dict[j.child],
224
224
  jtype=utils.joint_to_joint_type(joint=j),
225
225
  axis=(
226
- np.array(j.axis.xyz.xyz)
226
+ np.array(j.axis.xyz.xyz, dtype=float)
227
227
  if j.axis is not None
228
228
  and j.axis.xyz is not None
229
229
  and j.axis.xyz.xyz is not None
@@ -232,39 +232,43 @@ def extract_model_data(
232
232
  pose=j.pose.transform() if j.pose is not None else np.eye(4),
233
233
  initial_position=0.0,
234
234
  position_limit=(
235
- (
236
- float(j.axis.limit.lower)
237
- if j.axis is not None and j.axis.limit is not None
238
- else np.finfo(float).min
235
+ float(
236
+ j.axis.limit.lower
237
+ if j.axis is not None
238
+ and j.axis.limit is not None
239
+ and j.axis.limit.lower is not None
240
+ else jnp.finfo(float).min
239
241
  ),
240
- (
241
- float(j.axis.limit.upper)
242
- if j.axis is not None and j.axis.limit is not None
243
- else np.finfo(float).max
242
+ float(
243
+ j.axis.limit.upper
244
+ if j.axis is not None
245
+ and j.axis.limit is not None
246
+ and j.axis.limit.upper is not None
247
+ else jnp.finfo(float).max
244
248
  ),
245
249
  ),
246
- friction_static=(
250
+ friction_static=float(
247
251
  j.axis.dynamics.friction
248
252
  if j.axis is not None
249
253
  and j.axis.dynamics is not None
250
254
  and j.axis.dynamics.friction is not None
251
255
  else 0.0
252
256
  ),
253
- friction_viscous=(
257
+ friction_viscous=float(
254
258
  j.axis.dynamics.damping
255
259
  if j.axis is not None
256
260
  and j.axis.dynamics is not None
257
261
  and j.axis.dynamics.damping is not None
258
262
  else 0.0
259
263
  ),
260
- position_limit_damper=(
264
+ position_limit_damper=float(
261
265
  j.axis.limit.dissipation
262
266
  if j.axis is not None
263
267
  and j.axis.limit is not None
264
268
  and j.axis.limit.dissipation is not None
265
269
  else 0.0
266
270
  ),
267
- position_limit_spring=(
271
+ position_limit_spring=float(
268
272
  j.axis.limit.stiffness
269
273
  if j.axis is not None
270
274
  and j.axis.limit is not None
@@ -273,7 +277,7 @@ def extract_model_data(
273
277
  ),
274
278
  )
275
279
  for j in sdf_model.joints()
276
- if j.type in {"revolute", "prismatic", "fixed"}
280
+ if j.type in {"revolute", "continuous", "prismatic", "fixed"}
277
281
  and j.parent != "world"
278
282
  and j.child in links_dict.keys()
279
283
  ]