jaxsim 0.4.3.dev169__tar.gz → 0.4.3.dev177__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.dev169 → jaxsim-0.4.3.dev177}/PKG-INFO +1 -1
  2. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/_version.py +2 -2
  3. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/api/data.py +0 -25
  4. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/api/model.py +38 -29
  5. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/api/ode.py +0 -1
  6. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/contacts/visco_elastic.py +13 -11
  7. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim.egg-info/PKG-INFO +1 -1
  8. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/test_simulations.py +4 -10
  9. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/.devcontainer/Dockerfile +0 -0
  10. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/.devcontainer/devcontainer.json +0 -0
  11. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/.gitattributes +0 -0
  12. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/.github/CODEOWNERS +0 -0
  13. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/.github/workflows/ci_cd.yml +0 -0
  14. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/.github/workflows/read_the_docs.yml +0 -0
  15. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/.github/workflows/update_pixi_lockfile.yml +0 -0
  16. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/.gitignore +0 -0
  17. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/.pre-commit-config.yaml +0 -0
  18. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/.readthedocs.yaml +0 -0
  19. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/CONTRIBUTING.md +0 -0
  20. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/LICENSE +0 -0
  21. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/README.md +0 -0
  22. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/Makefile +0 -0
  23. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/conf.py +0 -0
  24. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/examples.rst +0 -0
  25. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/guide/install.rst +0 -0
  26. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/index.rst +0 -0
  27. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/make.bat +0 -0
  28. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/modules/api.rst +0 -0
  29. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/modules/integrators.rst +0 -0
  30. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/modules/math.rst +0 -0
  31. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/modules/mujoco.rst +0 -0
  32. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/modules/parsers.rst +0 -0
  33. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/modules/rbda.rst +0 -0
  34. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/modules/typing.rst +0 -0
  35. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/docs/modules/utils.rst +0 -0
  36. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/environment.yml +0 -0
  37. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/examples/.gitattributes +0 -0
  38. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/examples/.gitignore +0 -0
  39. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/examples/PD_controller.ipynb +0 -0
  40. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/examples/Parallel_computing.ipynb +0 -0
  41. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/examples/README.md +0 -0
  42. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/examples/assets/cartpole.urdf +0 -0
  43. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/pixi.lock +0 -0
  44. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/pyproject.toml +0 -0
  45. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/setup.cfg +0 -0
  46. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/setup.py +0 -0
  47. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/__init__.py +0 -0
  48. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/api/__init__.py +0 -0
  49. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/api/com.py +0 -0
  50. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/api/common.py +0 -0
  51. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/api/contact.py +0 -0
  52. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/api/frame.py +0 -0
  53. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/api/joint.py +0 -0
  54. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
  55. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/api/link.py +0 -0
  56. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/api/ode_data.py +0 -0
  57. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/api/references.py +0 -0
  58. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/exceptions.py +0 -0
  59. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/integrators/__init__.py +0 -0
  60. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/integrators/common.py +0 -0
  61. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/integrators/fixed_step.py +0 -0
  62. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/integrators/variable_step.py +0 -0
  63. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/logging.py +0 -0
  64. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/math/__init__.py +0 -0
  65. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/math/adjoint.py +0 -0
  66. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/math/cross.py +0 -0
  67. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/math/inertia.py +0 -0
  68. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/math/joint_model.py +0 -0
  69. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/math/quaternion.py +0 -0
  70. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/math/rotation.py +0 -0
  71. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/math/skew.py +0 -0
  72. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/math/transform.py +0 -0
  73. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/mujoco/__init__.py +0 -0
  74. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/mujoco/__main__.py +0 -0
  75. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/mujoco/loaders.py +0 -0
  76. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/mujoco/model.py +0 -0
  77. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/mujoco/visualizer.py +0 -0
  78. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/parsers/__init__.py +0 -0
  79. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
  80. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/parsers/descriptions/collision.py +0 -0
  81. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/parsers/descriptions/joint.py +0 -0
  82. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/parsers/descriptions/link.py +0 -0
  83. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/parsers/descriptions/model.py +0 -0
  84. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/parsers/kinematic_graph.py +0 -0
  85. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/parsers/rod/__init__.py +0 -0
  86. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/parsers/rod/parser.py +0 -0
  87. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/parsers/rod/utils.py +0 -0
  88. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/__init__.py +0 -0
  89. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/aba.py +0 -0
  90. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/collidable_points.py +0 -0
  91. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/contacts/__init__.py +0 -0
  92. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/contacts/common.py +0 -0
  93. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/contacts/relaxed_rigid.py +0 -0
  94. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/contacts/rigid.py +0 -0
  95. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/contacts/soft.py +0 -0
  96. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/crba.py +0 -0
  97. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/forward_kinematics.py +0 -0
  98. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/jacobian.py +0 -0
  99. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/rnea.py +0 -0
  100. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/rbda/utils.py +0 -0
  101. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/terrain/__init__.py +0 -0
  102. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/terrain/terrain.py +0 -0
  103. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/typing.py +0 -0
  104. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/utils/__init__.py +0 -0
  105. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
  106. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/utils/tracing.py +0 -0
  107. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim/utils/wrappers.py +0 -0
  108. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim.egg-info/SOURCES.txt +0 -0
  109. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim.egg-info/dependency_links.txt +0 -0
  110. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim.egg-info/requires.txt +0 -0
  111. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/src/jaxsim.egg-info/top_level.txt +0 -0
  112. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/__init__.py +0 -0
  113. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/conftest.py +0 -0
  114. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/test_api_com.py +0 -0
  115. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/test_api_contact.py +0 -0
  116. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/test_api_data.py +0 -0
  117. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/test_api_frame.py +0 -0
  118. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/test_api_joint.py +0 -0
  119. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/test_api_link.py +0 -0
  120. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/test_api_model.py +0 -0
  121. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/test_automatic_differentiation.py +0 -0
  122. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/test_contact.py +0 -0
  123. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/test_exceptions.py +0 -0
  124. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/tests/test_pytree.py +0 -0
  125. {jaxsim-0.4.3.dev169 → jaxsim-0.4.3.dev177}/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.dev169
3
+ Version: 0.4.3.dev177
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.dev169'
16
- __version_tuple__ = version_tuple = (0, 4, 3, 'dev169')
15
+ __version__ = version = '0.4.3.dev177'
16
+ __version_tuple__ = version_tuple = (0, 4, 3, 'dev177')
@@ -38,12 +38,6 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
38
38
 
39
39
  contacts_params: jaxsim.rbda.contacts.ContactsParams = dataclasses.field(repr=False)
40
40
 
41
- time_ns: jtp.Int = dataclasses.field(
42
- default_factory=lambda: jnp.array(
43
- 0, dtype=jnp.uint64 if jax.config.read("jax_enable_x64") else jnp.uint32
44
- ),
45
- )
46
-
47
41
  def __hash__(self) -> int:
48
42
 
49
43
  from jaxsim.utils.wrappers import HashedNumpyArray
@@ -52,7 +46,6 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
52
46
  (
53
47
  hash(self.state),
54
48
  HashedNumpyArray.hash_of_array(self.gravity),
55
- HashedNumpyArray.hash_of_array(self.time_ns),
56
49
  hash(self.contacts_params),
57
50
  )
58
51
  )
@@ -115,7 +108,6 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
115
108
  standard_gravity: jtp.FloatLike = jaxsim.math.StandardGravity,
116
109
  contacts_params: jaxsim.rbda.contacts.ContactsParams | None = None,
117
110
  velocity_representation: VelRepr = VelRepr.Inertial,
118
- time: jtp.FloatLike | None = None,
119
111
  extended_ode_state: dict[str, jtp.PyTree] | None = None,
120
112
  ) -> JaxSimModelData:
121
113
  """
@@ -134,7 +126,6 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
134
126
  standard_gravity: The standard gravity constant.
135
127
  contacts_params: The parameters of the soft contacts.
136
128
  velocity_representation: The velocity representation to use.
137
- time: The time at which the state is created.
138
129
  extended_ode_state:
139
130
  Additional user-defined state variables that are not part of the
140
131
  standard `ODEState` object. Useful to extend the system dynamics
@@ -196,11 +187,6 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
196
187
  ).squeeze()
197
188
  )
198
189
 
199
- time_ns = jnp.array(
200
- time * 1e9 if time is not None else 0.0,
201
- dtype=jnp.uint64 if jax.config.read("jax_enable_x64") else jnp.uint32,
202
- )
203
-
204
190
  W_H_B = jaxsim.math.Transform.from_quaternion_and_translation(
205
191
  translation=base_position, quaternion=base_quaternion
206
192
  )
@@ -246,7 +232,6 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
246
232
  contacts_params = model.contact_model.parameters
247
233
 
248
234
  return JaxSimModelData(
249
- time_ns=time_ns,
250
235
  state=ode_state,
251
236
  gravity=gravity,
252
237
  contacts_params=contacts_params,
@@ -257,16 +242,6 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
257
242
  # Extract quantities
258
243
  # ==================
259
244
 
260
- def time(self) -> jtp.Float:
261
- """
262
- Get the simulated time.
263
-
264
- Returns:
265
- The simulated time in seconds.
266
- """
267
-
268
- return self.time_ns.astype(float) / 1e9
269
-
270
245
  def standard_gravity(self) -> jtp.Float:
271
246
  """
272
247
  Get the standard gravity constant.
@@ -32,6 +32,10 @@ class JaxSimModel(JaxsimDataclass):
32
32
 
33
33
  model_name: Static[str]
34
34
 
35
+ time_step: jaxsim.integrators.TimeStep = dataclasses.field(
36
+ default_factory=lambda: jnp.array(0.001, dtype=float),
37
+ )
38
+
35
39
  terrain: Static[jaxsim.terrain.Terrain] = dataclasses.field(
36
40
  default_factory=jaxsim.terrain.FlatTerrain.build, repr=False
37
41
  )
@@ -64,6 +68,9 @@ class JaxSimModel(JaxsimDataclass):
64
68
  if self.model_name != other.model_name:
65
69
  return False
66
70
 
71
+ if self.time_step != other.time_step:
72
+ return False
73
+
67
74
  if self.kin_dyn_parameters != other.kin_dyn_parameters:
68
75
  return False
69
76
 
@@ -74,6 +81,7 @@ class JaxSimModel(JaxsimDataclass):
74
81
  return hash(
75
82
  (
76
83
  hash(self.model_name),
84
+ hash(float(self.time_step)),
77
85
  hash(self.kin_dyn_parameters),
78
86
  hash(self.contact_model),
79
87
  )
@@ -88,6 +96,7 @@ class JaxSimModel(JaxsimDataclass):
88
96
  model_description: str | pathlib.Path | rod.Model,
89
97
  model_name: str | None = None,
90
98
  *,
99
+ time_step: jtp.FloatLike | None = None,
91
100
  terrain: jaxsim.terrain.Terrain | None = None,
92
101
  contact_model: jaxsim.rbda.contacts.ContactModel | None = None,
93
102
  is_urdf: bool | None = None,
@@ -102,6 +111,9 @@ class JaxSimModel(JaxsimDataclass):
102
111
  its content, or a pre-parsed/pre-built rod model.
103
112
  model_name:
104
113
  The name of the model. If not specified, it is read from the description.
114
+ time_step:
115
+ The default time step to consider for the simulation. It can be
116
+ manually overridden in the function that steps the simulation.
105
117
  terrain: The terrain to consider (the default is a flat infinite plane).
106
118
  contact_model:
107
119
  The contact model to consider.
@@ -135,6 +147,7 @@ class JaxSimModel(JaxsimDataclass):
135
147
  model = JaxSimModel.build(
136
148
  model_description=intermediate_description,
137
149
  model_name=model_name,
150
+ time_step=time_step,
138
151
  terrain=terrain,
139
152
  contact_model=contact_model,
140
153
  )
@@ -150,6 +163,7 @@ class JaxSimModel(JaxsimDataclass):
150
163
  model_description: ModelDescription,
151
164
  model_name: str | None = None,
152
165
  *,
166
+ time_step: jtp.FloatLike | None = None,
153
167
  terrain: jaxsim.terrain.Terrain | None = None,
154
168
  contact_model: jaxsim.rbda.contacts.ContactModel | None = None,
155
169
  ) -> JaxSimModel:
@@ -162,6 +176,9 @@ class JaxSimModel(JaxsimDataclass):
162
176
  of the model.
163
177
  model_name:
164
178
  The name of the model. If not specified, it is read from the description.
179
+ time_step:
180
+ The default time step to consider for the simulation. It can be
181
+ manually overridden in the function that steps the simulation.
165
182
  terrain: The terrain to consider (the default is a flat infinite plane).
166
183
  contact_model:
167
184
  The contact model to consider.
@@ -179,6 +196,11 @@ class JaxSimModel(JaxsimDataclass):
179
196
  terrain or JaxSimModel.__dataclass_fields__["terrain"].default_factory()
180
197
  )
181
198
 
199
+ # Consider the default time step if not specified.
200
+ time_step = (
201
+ time_step or JaxSimModel.__dataclass_fields__["time_step"].default_factory()
202
+ )
203
+
182
204
  # Create the default contact model.
183
205
  # It will be populated with an initial estimation of good parameters.
184
206
  # While these might not be the best, they are a good starting point.
@@ -192,6 +214,7 @@ class JaxSimModel(JaxsimDataclass):
192
214
  kin_dyn_parameters=js.kin_dyn_parameters.KynDynParameters.build(
193
215
  model_description=model_description
194
216
  ),
217
+ time_step=time_step,
195
218
  terrain=terrain,
196
219
  contact_model=contact_model,
197
220
  # The following is wrapped as hashless since it's a static argument, and we
@@ -1915,8 +1938,9 @@ def step(
1915
1938
  model: JaxSimModel,
1916
1939
  data: js.data.JaxSimModelData,
1917
1940
  *,
1918
- dt: jtp.FloatLike,
1919
1941
  integrator: jaxsim.integrators.Integrator,
1942
+ t0: jtp.FloatLike = 0.0,
1943
+ dt: jtp.FloatLike | None = None,
1920
1944
  integrator_state: dict[str, Any] | None = None,
1921
1945
  link_forces: jtp.MatrixLike | None = None,
1922
1946
  joint_force_references: jtp.VectorLike | None = None,
@@ -1928,9 +1952,10 @@ def step(
1928
1952
  Args:
1929
1953
  model: The model to consider.
1930
1954
  data: The data of the considered model.
1931
- dt: The time step to consider.
1932
1955
  integrator: The integrator to use.
1933
1956
  integrator_state: The state of the integrator.
1957
+ t0: The initial time to consider. Only relevant for time-dependent dynamics.
1958
+ dt: The time step to consider. If not specified, it is read from the model.
1934
1959
  link_forces:
1935
1960
  The 6D forces to apply to the links expressed in the frame corresponding to
1936
1961
  the velocity representation of `data`.
@@ -1951,17 +1976,20 @@ def step(
1951
1976
 
1952
1977
  integrator_state = integrator_state if integrator_state is not None else dict()
1953
1978
 
1954
- # Extract the initial resources.
1955
- t0_ns = data.time_ns
1979
+ # Initialize the time-related variables.
1956
1980
  state_t0 = data.state
1957
- integrator_state_x0 = integrator_state
1981
+ t0 = jnp.array(t0, dtype=float)
1982
+ dt = jnp.array(dt if dt is not None else model.time_step).astype(float)
1983
+
1984
+ # Rename the integrator state.
1985
+ integrator_state_t0 = integrator_state
1958
1986
 
1959
1987
  # Step the dynamics forward.
1960
1988
  state_tf, integrator_state_tf = integrator.step(
1961
1989
  x0=state_t0,
1962
- t0=jnp.array(t0_ns / 1e9).astype(float),
1990
+ t0=t0,
1963
1991
  dt=dt,
1964
- params=integrator_state_x0,
1992
+ params=integrator_state_t0,
1965
1993
  # Always inject the current (model, data) pair into the system dynamics
1966
1994
  # considered by the integrator, and include the input variables represented
1967
1995
  # by the pair (joint_force_references, link_forces).
@@ -1980,24 +2008,8 @@ def step(
1980
2008
  ),
1981
2009
  )
1982
2010
 
1983
- tf_ns = t0_ns + jnp.array(dt * 1e9, dtype=t0_ns.dtype)
1984
- tf_ns = jnp.where(tf_ns >= t0_ns, tf_ns, jnp.array(0, dtype=t0_ns.dtype))
1985
-
1986
- jax.lax.cond(
1987
- pred=tf_ns < t0_ns,
1988
- true_fun=lambda: jax.debug.print(
1989
- "The simulation time overflowed, resetting simulation time to 0."
1990
- ),
1991
- false_fun=lambda: None,
1992
- )
1993
-
1994
- data_tf = (
1995
- # Store the new state of the model and the new time.
1996
- data.replace(
1997
- state=state_tf,
1998
- time_ns=tf_ns,
1999
- )
2000
- )
2011
+ # Store the new state of the model.
2012
+ data_tf = data.replace(state=state_tf)
2001
2013
 
2002
2014
  # Post process the simulation state, if needed.
2003
2015
  match model.contact_model:
@@ -2064,7 +2076,4 @@ def step(
2064
2076
  velocity_representation=data.velocity_representation, validate=False
2065
2077
  )
2066
2078
 
2067
- return (
2068
- data_tf,
2069
- integrator_state_tf,
2070
- )
2079
+ return data_tf, integrator_state_tf
@@ -63,7 +63,6 @@ def wrap_system_dynamics_for_integration(
63
63
  # Update the state and time stored inside data.
64
64
  with data_f.editable(validate=True) as data_rw:
65
65
  data_rw.state = x
66
- data_rw.time_ns = jnp.array(t * 1e9).astype(data_rw.time_ns.dtype)
67
66
 
68
67
  # Evaluate the system dynamics, allowing to override the kwargs originally
69
68
  # passed when the closure was created.
@@ -263,7 +263,7 @@ class ViscoElasticContacts(common.ContactModel):
263
263
  model: js.model.JaxSimModel,
264
264
  data: js.data.JaxSimModelData,
265
265
  *,
266
- dt: jtp.FloatLike,
266
+ dt: jtp.FloatLike | None = None,
267
267
  link_forces: jtp.MatrixLike | None = None,
268
268
  joint_force_references: jtp.VectorLike | None = None,
269
269
  ) -> tuple[jtp.Vector, tuple[Any, ...]]:
@@ -273,7 +273,7 @@ class ViscoElasticContacts(common.ContactModel):
273
273
  Args:
274
274
  model: The robot model considered by the contact model.
275
275
  data: The data of the considered model.
276
- dt: The integration time step.
276
+ dt: The time step to consider. If not specified, it is read from the model.
277
277
  link_forces:
278
278
  The 6D forces to apply to the links expressed in the frame corresponding
279
279
  to the velocity representation of `data`.
@@ -305,13 +305,16 @@ class ViscoElasticContacts(common.ContactModel):
305
305
  model.kin_dyn_parameters.contact_parameters.indices_of_enabled_collidable_points
306
306
  )
307
307
 
308
+ # Initialize the time step.
309
+ dt = dt if dt is not None else model.time_step
310
+
308
311
  # Compute the average contact linear forces in mixed representation by
309
312
  # integrating the contact dynamics in the continuous time domain.
310
313
  CW_f̅l, CW_fl̿, m_tf = (
311
314
  ViscoElasticContacts._compute_contact_forces_with_exponential_integration(
312
315
  model=model,
313
316
  data=data,
314
- dt=dt,
317
+ dt=jnp.array(dt).astype(float),
315
318
  joint_force_references=joint_force_references,
316
319
  link_forces=link_forces,
317
320
  indices_of_enabled_collidable_points=indices_of_enabled_collidable_points,
@@ -923,14 +926,10 @@ class ViscoElasticContacts(common.ContactModel):
923
926
  )
924
927
 
925
928
  # Create the data at the final time.
926
- with data.editable(validate=True) as data_tf:
927
- data_tf: js.data.JaxSimModelData
928
- data_tf.time_ns = data.time_ns + (dt * 1e9).astype(data.time_ns.dtype)
929
-
929
+ data_tf = data.copy()
930
930
  data_tf = data_tf.reset_joint_positions(q_plus[7:])
931
931
  data_tf = data_tf.reset_base_position(q_plus[0:3])
932
932
  data_tf = data_tf.reset_base_quaternion(q_plus[3:7])
933
-
934
933
  data_tf = data_tf.reset_joint_velocities(W_ν_plus[6:])
935
934
  data_tf = data_tf.reset_base_velocity(
936
935
  W_ν_plus[0:6], velocity_representation=jaxsim.VelRepr.Inertial
@@ -946,7 +945,7 @@ def step(
946
945
  model: js.model.JaxSimModel,
947
946
  data: js.data.JaxSimModelData,
948
947
  *,
949
- dt: jtp.FloatLike,
948
+ dt: jtp.FloatLike | None = None,
950
949
  link_forces: jtp.MatrixLike | None = None,
951
950
  joint_force_references: jtp.VectorLike | None = None,
952
951
  ) -> tuple[js.data.JaxSimModelData, dict[str, Any]]:
@@ -956,7 +955,7 @@ def step(
956
955
  Args:
957
956
  model: The model to consider.
958
957
  data: The data of the considered model.
959
- dt: The time step to consider.
958
+ dt: The time step to consider. If not specified, it is read from the model.
960
959
  link_forces:
961
960
  The 6D forces to apply to the links expressed in the frame corresponding to
962
961
  the velocity representation of `data`.
@@ -970,11 +969,14 @@ def step(
970
969
  assert isinstance(model.contact_model, ViscoElasticContacts)
971
970
  assert isinstance(data.contacts_params, ViscoElasticContactsParams)
972
971
 
972
+ # Initialize the time step.
973
+ dt = dt if dt is not None else model.time_step
974
+
973
975
  # Compute the contact forces with the exponential integrator.
974
976
  W_f̅_C, (W_f̿_C, m_tf) = model.contact_model.compute_contact_forces(
975
977
  model=model,
976
978
  data=data,
977
- dt=dt,
979
+ dt=jnp.array(dt).astype(float),
978
980
  link_forces=link_forces,
979
981
  joint_force_references=joint_force_references,
980
982
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.4.3.dev169
3
+ Version: 0.4.3.dev177
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>
@@ -70,14 +70,14 @@ def test_box_with_external_forces(
70
70
  # Initialize the integrator.
71
71
  tf = 0.5
72
72
  dt = 0.001
73
- T = jnp.arange(start=0, stop=tf * 1e9, step=dt * 1e9, dtype=int)
73
+ T_ns = jnp.arange(start=0, stop=tf * 1e9, step=dt * 1e9, dtype=int)
74
74
  integrator_state = integrator.init(x0=data0.state, t0=0.0, dt=dt)
75
75
 
76
76
  # Copy the initial data...
77
77
  data = data0.copy()
78
78
 
79
79
  # ... and step the simulation.
80
- for t_ns in T:
80
+ for _ in T_ns:
81
81
 
82
82
  data, integrator_state = js.model.step(
83
83
  model=model,
@@ -89,7 +89,6 @@ def test_box_with_external_forces(
89
89
  )
90
90
 
91
91
  # Check that the box didn't move.
92
- assert data.time() == t_ns / 1e9 + dt
93
92
  assert data.base_position() == pytest.approx(data0.base_position())
94
93
  assert data.base_orientation() == pytest.approx(data0.base_orientation())
95
94
 
@@ -158,16 +157,14 @@ def test_box_with_zero_gravity(
158
157
 
159
158
  # Initialize the integrator.
160
159
  tf, dt = 1.0, 0.010
161
- T = jnp.arange(start=0, stop=tf * 1e9, step=dt * 1e9, dtype=int)
160
+ T_ns = jnp.arange(start=0, stop=tf * 1e9, step=dt * 1e9, dtype=int)
162
161
  integrator_state = integrator.init(x0=data0.state, t0=0.0, dt=dt)
163
162
 
164
163
  # Copy the initial data...
165
164
  data = data0.copy()
166
165
 
167
166
  # ... and step the simulation.
168
- for t_ns in T:
169
-
170
- assert data.time() == t_ns / 1e9
167
+ for _ in T_ns:
171
168
 
172
169
  with (
173
170
  data.switch_velocity_representation(velocity_representation),
@@ -183,9 +180,6 @@ def test_box_with_zero_gravity(
183
180
  link_forces=references.link_forces(model=model, data=data),
184
181
  )
185
182
 
186
- # Check the final simulation time.
187
- assert data.time() == T[-1] / 1e9 + dt
188
-
189
183
  # Check that the box moved as expected.
190
184
  assert data.base_position() == pytest.approx(
191
185
  data0.base_position()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes