jaxsim 0.2.dev366__py3-none-any.whl → 0.2.dev388__py3-none-any.whl

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.
jaxsim/_version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.2.dev366'
16
- __version_tuple__ = version_tuple = (0, 2, 'dev366')
15
+ __version__ = version = '0.2.dev388'
16
+ __version_tuple__ = version_tuple = (0, 2, 'dev388')
jaxsim/api/common.py CHANGED
@@ -89,7 +89,7 @@ class ModelDataWithVelocityRepresentation(JaxsimDataclass, abc.ABC):
89
89
  transform: jtp.Matrix,
90
90
  is_force: bool = False,
91
91
  ) -> jtp.Array:
92
- """
92
+ r"""
93
93
  Convert a 6D quantity from inertial-fixed to another representation.
94
94
 
95
95
  Args:
@@ -155,7 +155,7 @@ class ModelDataWithVelocityRepresentation(JaxsimDataclass, abc.ABC):
155
155
  transform: jtp.Matrix,
156
156
  is_force: bool = False,
157
157
  ) -> jtp.Array:
158
- """
158
+ r"""
159
159
  Convert a 6D quantity from another representation to inertial-fixed.
160
160
 
161
161
  Args:
jaxsim/api/data.py CHANGED
@@ -415,9 +415,9 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
415
415
 
416
416
  @jax.jit
417
417
  def generalized_position(self) -> tuple[jtp.Matrix, jtp.Vector]:
418
- """
418
+ r"""
419
419
  Get the generalized position
420
- :math:`\mathbf{q} = ({}^W \mathbf{H}_B, \mathbf{s}) \in \text{SO}(3) \times \mathbb{R}^n`.
420
+ :math:`\\mathbf{q} = ({}^W \\mathbf{H}_B, \\mathbf{s}) \\in \text{SO}(3) \times \\mathbb{R}^n`.
421
421
 
422
422
  Returns:
423
423
  A tuple containing the base transform and the joint positions.
@@ -427,9 +427,9 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
427
427
 
428
428
  @jax.jit
429
429
  def generalized_velocity(self) -> jtp.Vector:
430
- """
430
+ r"""
431
431
  Get the generalized velocity
432
- :math:`\boldsymbol{\nu} = (\boldsymbol{v}_{W,B};\, \boldsymbol{\omega}_{W,B};\, \mathbf{s}) \in \mathbb{R}^{6+n}`
432
+ :math:`\boldsymbol{\nu} = (\boldsymbol{v}_{W,B};\\, \boldsymbol{\\omega}_{W,B};\\, \\mathbf{s}) \\in \\mathbb{R}^{6+n}`
433
433
 
434
434
  Returns:
435
435
  The generalized velocity in the active representation.
jaxsim/api/model.py CHANGED
@@ -52,6 +52,8 @@ class JaxSimModel(JaxsimDataclass):
52
52
  def build_from_model_description(
53
53
  model_description: str | pathlib.Path | rod.Model,
54
54
  model_name: str | None = None,
55
+ *,
56
+ terrain: jaxsim.terrain.Terrain | None = None,
55
57
  is_urdf: bool | None = None,
56
58
  considered_joints: list[str] | None = None,
57
59
  ) -> JaxSimModel:
@@ -65,6 +67,8 @@ class JaxSimModel(JaxsimDataclass):
65
67
  model_name:
66
68
  The optional name of the model that overrides the one in
67
69
  the description.
70
+ terrain:
71
+ The optional terrain to consider.
68
72
  is_urdf:
69
73
  Whether the model description is a URDF or an SDF. This is
70
74
  automatically inferred if the model description is a path to a file.
@@ -92,7 +96,9 @@ class JaxSimModel(JaxsimDataclass):
92
96
 
93
97
  # Build the model
94
98
  model = JaxSimModel.build(
95
- model_description=intermediate_description, model_name=model_name
99
+ model_description=intermediate_description,
100
+ model_name=model_name,
101
+ terrain=terrain,
96
102
  )
97
103
 
98
104
  # Store the origin of the model, in case downstream logic needs it
@@ -105,6 +111,8 @@ class JaxSimModel(JaxsimDataclass):
105
111
  def build(
106
112
  model_description: jaxsim.parsers.descriptions.ModelDescription,
107
113
  model_name: str | None = None,
114
+ *,
115
+ terrain: jaxsim.terrain.Terrain | None = None,
108
116
  ) -> JaxSimModel:
109
117
  """
110
118
  Build a Model object from an intermediate model description.
@@ -115,6 +123,8 @@ class JaxSimModel(JaxsimDataclass):
115
123
  of the model.
116
124
  model_name:
117
125
  The optional name of the model overriding the physics model name.
126
+ terrain:
127
+ The optional terrain to consider.
118
128
 
119
129
  Returns:
120
130
  The built Model object.
@@ -130,6 +140,7 @@ class JaxSimModel(JaxsimDataclass):
130
140
  kin_dyn_parameters=js.kin_dyn_parameters.KynDynParameters.build(
131
141
  model_description=model_description
132
142
  ),
143
+ terrain=terrain or JaxSimModel.__dataclass_fields__["terrain"].default,
133
144
  )
134
145
 
135
146
  return model
@@ -926,7 +937,7 @@ def inverse_dynamics(
926
937
  def free_floating_gravity_forces(
927
938
  model: JaxSimModel, data: js.data.JaxSimModelData
928
939
  ) -> jtp.Vector:
929
- """
940
+ r"""
930
941
  Compute the free-floating gravity forces :math:`g(\mathbf{q})` of the model.
931
942
 
932
943
  Args:
@@ -976,7 +987,7 @@ def free_floating_bias_forces(
976
987
  model: JaxSimModel, data: js.data.JaxSimModelData
977
988
  ) -> jtp.Vector:
978
989
  """
979
- Compute the free-floating bias forces :math:`h(\mathbf{q}, \boldsymbol{\nu})`
990
+ Compute the free-floating bias forces :math:`h(\\mathbf{q}, \boldsymbol{\nu})`
980
991
  of the model.
981
992
 
982
993
  Args:
jaxsim/api/ode.py CHANGED
@@ -8,7 +8,6 @@ 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.utils import Mutability
12
11
 
13
12
  from .common import VelRepr
14
13
  from .ode_data import ODEState
@@ -324,7 +324,7 @@ class ExplicitRungeKutta(Integrator[PyTreeType, PyTreeType], Generic[PyTreeType]
324
324
  def post_process_state(
325
325
  cls, x0: State, t0: Time, xf: NextState, dt: TimeStep
326
326
  ) -> NextState:
327
- """
327
+ r"""
328
328
  Post-process the integrated state at :math:`t_f = t_0 + \Delta t`.
329
329
 
330
330
  Args:
@@ -529,7 +529,7 @@ class ExplicitRungeKutta(Integrator[PyTreeType, PyTreeType], Generic[PyTreeType]
529
529
  # Return the index of the row of A providing the fsal derivative (that is the
530
530
  # possibly intermediate kᵢ derivative).
531
531
  # Note that if multiple rows match (it should not), we return the first match.
532
- return True, int(jnp.where(rows_of_A_with_fsal == True)[0].tolist()[0])
532
+ return True, int(jnp.where(rows_of_A_with_fsal)[0].tolist()[0])
533
533
 
534
534
 
535
535
  class ExplicitRungeKuttaSO3Mixin:
jaxsim/math/transform.py CHANGED
@@ -1,4 +1,3 @@
1
- import jax
2
1
  import jax.numpy as jnp
3
2
  import jaxlie
4
3
 
jaxsim/mujoco/loaders.py CHANGED
@@ -102,7 +102,7 @@ class RodModelToMjcf:
102
102
 
103
103
  if root.find(f".//joint[@name='{floating_joint_name}']") is not None:
104
104
  msg = f"The URDF already has a floating joint '{floating_joint_name}'"
105
- warnings.warn(msg)
105
+ warnings.warn(msg, stacklevel=2)
106
106
  return ET.tostring(root, pretty_print=True).decode()
107
107
 
108
108
  # Create the "world" link if it doesn't exist.
@@ -129,6 +129,8 @@ class RodModelToMjcf:
129
129
  def convert(
130
130
  rod_model: rod.Model,
131
131
  considered_joints: list[str] | None = None,
132
+ plane_normal: tuple[float, float, float] = (0, 0, 1),
133
+ heightmap: bool | None = None,
132
134
  ) -> tuple[str, dict[str, Any]]:
133
135
  """"""
134
136
 
@@ -198,8 +200,6 @@ class RodModelToMjcf:
198
200
  )
199
201
 
200
202
  urdf_string = ET.tostring(root, pretty_print=True).decode()
201
- # print(urdf_string)
202
- # raise
203
203
 
204
204
  # ------------------------------
205
205
  # Post-process all dummy visuals
@@ -358,6 +358,19 @@ class RodModelToMjcf:
358
358
  texuniform="true",
359
359
  )
360
360
 
361
+ _ = (
362
+ ET.SubElement(
363
+ asset_element,
364
+ "hfield",
365
+ name="terrain",
366
+ nrow="100",
367
+ ncol="100",
368
+ size="5 5 1 1",
369
+ )
370
+ if heightmap
371
+ else None
372
+ )
373
+
361
374
  # ----------------------------------
362
375
  # Populate the scene with the assets
363
376
  # ----------------------------------
@@ -368,12 +381,14 @@ class RodModelToMjcf:
368
381
  worldbody_scene_element,
369
382
  "geom",
370
383
  name="floor",
371
- type="plane",
384
+ type="plane" if not heightmap else "hfield",
372
385
  size="0 0 0.05",
373
386
  material="plane_material",
374
387
  condim="3",
375
388
  contype="1",
376
389
  conaffinity="1",
390
+ zaxis=" ".join(map(str, plane_normal)),
391
+ **({"hfield": "terrain"} if heightmap else {}),
377
392
  )
378
393
 
379
394
  _ = ET.SubElement(
@@ -407,13 +422,14 @@ class RodModelToMjcf:
407
422
  raise RuntimeError("Failed to find the <worldbody> element of the model")
408
423
 
409
424
  # Camera attached to the model
425
+ # It can be manually copied from `python -m mujoco.viewer --mjcf=<URDF_PATH>`
410
426
  _ = ET.SubElement(
411
427
  worldbody_element,
412
428
  "camera",
413
429
  name="track",
414
430
  mode="trackcom",
415
- pos="1 0 5",
416
- zaxis="0 0 1",
431
+ pos="1.930 -2.279 0.556",
432
+ xyaxes="0.771 0.637 0.000 -0.116 0.140 0.983",
417
433
  fovy="60",
418
434
  )
419
435
 
@@ -449,6 +465,8 @@ class UrdfToMjcf:
449
465
  urdf: str | pathlib.Path,
450
466
  considered_joints: list[str] | None = None,
451
467
  model_name: str | None = None,
468
+ plane_normal: tuple[float, float, float] = (0, 0, 1),
469
+ heightmap: bool | None = None,
452
470
  ) -> tuple[str, dict[str, Any]]:
453
471
  """"""
454
472
 
@@ -461,7 +479,10 @@ class UrdfToMjcf:
461
479
 
462
480
  # Convert the ROD model to MJCF.
463
481
  return RodModelToMjcf.convert(
464
- rod_model=rod_model, considered_joints=considered_joints
482
+ rod_model=rod_model,
483
+ considered_joints=considered_joints,
484
+ plane_normal=plane_normal,
485
+ heightmap=heightmap,
465
486
  )
466
487
 
467
488
 
@@ -471,6 +492,8 @@ class SdfToMjcf:
471
492
  sdf: str | pathlib.Path,
472
493
  considered_joints: list[str] | None = None,
473
494
  model_name: str | None = None,
495
+ plane_normal: tuple[float, float, float] = (0, 0, 1),
496
+ heightmap: bool | None = None,
474
497
  ) -> tuple[str, dict[str, Any]]:
475
498
  """"""
476
499
 
@@ -483,5 +506,8 @@ class SdfToMjcf:
483
506
 
484
507
  # Convert the ROD model to MJCF.
485
508
  return RodModelToMjcf.convert(
486
- rod_model=rod_model, considered_joints=considered_joints
509
+ rod_model=rod_model,
510
+ considered_joints=considered_joints,
511
+ plane_normal=plane_normal,
512
+ heightmap=heightmap,
487
513
  )
jaxsim/mujoco/model.py CHANGED
@@ -1,12 +1,16 @@
1
1
  import functools
2
2
  import pathlib
3
- from typing import Any
3
+ from typing import Any, Callable
4
4
 
5
5
  import mujoco as mj
6
6
  import numpy as np
7
7
  import numpy.typing as npt
8
8
  from scipy.spatial.transform import Rotation
9
9
 
10
+ import jaxsim.typing as jtp
11
+
12
+ HeightmapCallable = Callable[[jtp.FloatLike, jtp.FloatLike], jtp.FloatLike]
13
+
10
14
 
11
15
  class MujocoModelHelper:
12
16
  """
@@ -27,7 +31,9 @@ class MujocoModelHelper:
27
31
 
28
32
  @staticmethod
29
33
  def build_from_xml(
30
- mjcf_description: str | pathlib.Path, assets: dict[str, Any] = None
34
+ mjcf_description: str | pathlib.Path,
35
+ assets: dict[str, Any] = None,
36
+ heightmap: HeightmapCallable | None = None,
31
37
  ) -> "MujocoModelHelper":
32
38
  """"""
33
39
 
@@ -40,6 +46,13 @@ class MujocoModelHelper:
40
46
 
41
47
  # Create the Mujoco model from the XML and, optionally, the assets dictionary
42
48
  model = mj.MjModel.from_xml_string(xml=mjcf_description, assets=assets) # noqa
49
+ data = mj.MjData(model)
50
+
51
+ if heightmap:
52
+ nrow = model.hfield_nrow.item()
53
+ ncol = model.hfield_ncol.item()
54
+ new_hfield = generate_hfield(heightmap, (nrow, ncol))
55
+ model.hfield_data = new_hfield
43
56
 
44
57
  return MujocoModelHelper(model=model, data=mj.MjData(model))
45
58
 
@@ -350,3 +363,33 @@ class MujocoModelHelper:
350
363
  ]
351
364
  ).squeeze()
352
365
  )
366
+
367
+
368
+ def generate_hfield(
369
+ heightmap: HeightmapCallable, size: tuple[int, int] = (10, 10)
370
+ ) -> npt.NDArray:
371
+ """
372
+ Generates a numpy array representing the heightmap of
373
+ The map will have the following format:
374
+ ```
375
+ heightmap[0, 0] heightmap[0, 1] ... heightmap[0, size[1]-1]
376
+ heightmap[1, 0] heightmap[1, 1] ... heightmap[1, size[1]-1]
377
+ ...
378
+ heightmap[size[0]-1, 0] heightmap[size[0]-1, 1] ... heightmap[size[0]-1, size[1]-1]
379
+ ```
380
+
381
+ Args:
382
+ heightmap: A function that takes two arguments (x, y) and returns the height
383
+ at that point.
384
+ size: A tuple of two integers representing the size of the grid.
385
+
386
+ Returns:
387
+ np.ndarray: The terrain heightmap
388
+ """
389
+
390
+ # Generate the grid.
391
+ x = np.linspace(0, 1, size[0])
392
+ y = np.linspace(0, 1, size[1])
393
+
394
+ # Generate the heightmap.
395
+ return np.array([[heightmap(xi, yi) for xi in x] for yi in y]).flatten()
@@ -268,7 +268,7 @@ class KinematicGraph:
268
268
 
269
269
  # Return early if there is no action to take
270
270
  if len(joint_names_to_remove) == 0:
271
- logging.info(f"The kinematic graph doesn't need to be reduced")
271
+ logging.info("The kinematic graph doesn't need to be reduced")
272
272
  return copy.deepcopy(self)
273
273
 
274
274
  # Check if all considered joints are part of the full kinematic graph
@@ -1,2 +1,2 @@
1
1
  from . import terrain
2
- from .terrain import FlatTerrain, Terrain
2
+ from .terrain import FlatTerrain, PlaneTerrain, Terrain
@@ -1,6 +1,5 @@
1
1
  import abc
2
2
  import contextlib
3
- import copy
4
3
  import dataclasses
5
4
  import functools
6
5
  from collections.abc import Iterator
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.2.dev366
3
+ Version: 0.2.dev388
4
4
  Summary: A physics engine in reduced coordinates implemented with JAX.
5
5
  Home-page: https://github.com/ami-iit/jaxsim
6
6
  Author: Diego Ferigo
@@ -1,21 +1,21 @@
1
1
  jaxsim/__init__.py,sha256=OcrfoYS1DGcmAGqu2AqlCTiUVxcpi-IsVwcr_16x74Q,1789
2
- jaxsim/_version.py,sha256=ncT8dupmzd5NQtuHjYN5ljex6-14cJKuIIfJTJVSFHw,423
2
+ jaxsim/_version.py,sha256=ajN4RtI-FZYlNpUqVy327D57EXvmjZkyMCV_lzLqeUo,423
3
3
  jaxsim/logging.py,sha256=c4zhwBKf9eAYAHVp62kTEllqdsZgh0K-kPKVy8L3elU,1584
4
4
  jaxsim/typing.py,sha256=MeuOCQtLAr-sPkvB_sU8FtwGNRirz1auCwIgRC-QZl8,646
5
5
  jaxsim/api/__init__.py,sha256=fNTCPUeDfOAizRd4RsW3Epv0sLTu0KJGoFRSEsi75VM,162
6
6
  jaxsim/api/com.py,sha256=Qtm_6qpiK4WtDVn6JMUHa8DySgBl9CjgKCybJqZ58Lc,7379
7
- jaxsim/api/common.py,sha256=6oqZO-QTYr2mpMx5qRrAnCIjQpjIJVe7MlavNFIKbNA,6638
7
+ jaxsim/api/common.py,sha256=DV-WZG28sikXopNv458aYvpLjmiAtFr5LRscOwXusuk,6640
8
8
  jaxsim/api/contact.py,sha256=Ve4ZOWkLEBRgK3KhtICxKY7YzsxYvc3lO-pPRBjqSnY,8659
9
- jaxsim/api/data.py,sha256=1AJyKjmXdsWEf_CkvOXRmvRsDZamG706mAAg1Gttll0,26773
9
+ jaxsim/api/data.py,sha256=cPFy6TTm0rNpDk1O0ZxOpvBwWVPu6V14XLRMeC7x81Q,26786
10
10
  jaxsim/api/joint.py,sha256=q31Kp3Cqv-yTcxijjzbj_QADFnGQyjb2al9fYZtzedo,4763
11
11
  jaxsim/api/kin_dyn_parameters.py,sha256=G4mtSi8fElYe0yttLgsxSOPf7vcK-yqTu06Aa5SSrYg,26012
12
12
  jaxsim/api/link.py,sha256=LZVcQhQsTKsfR13KewFtEMYu4siVJl7mqoDwYsoFFes,9240
13
- jaxsim/api/model.py,sha256=mFdEwVuzIR7Lvj4oiIsA1n1oxpRZXWyB0IDzIxcG33Q,43689
14
- jaxsim/api/ode.py,sha256=rbSruK0Dkp09oBgHbB_-NrZS4o2tY9geK0yLLJfXzpM,9821
13
+ jaxsim/api/model.py,sha256=Kpe5PQHP1VCS8Xmu4M_aa6EAJFPkOCO_Y11-TGhEtq8,44091
14
+ jaxsim/api/ode.py,sha256=6l-6i2YHagsQvR8Ac-_fmO6P0hBVT6NkHhwXnrdITEg,9785
15
15
  jaxsim/api/ode_data.py,sha256=dwRFVPJ30XMmdUbPXEu7YxsQ97jZP4L4fd5ZzhrO5Ys,22184
16
16
  jaxsim/api/references.py,sha256=Lvskf17r619KKxwCJP7hAAty2kaXgDXJX1uKqoDIDgo,15483
17
17
  jaxsim/integrators/__init__.py,sha256=hxvOD-VK_mmd6v31wtC-nb28AYve1gLuZCNLV9wS-Kg,103
18
- jaxsim/integrators/common.py,sha256=APmQVXKdN9JMIq7wrVKq2HlI1UKpqvLqaTqAq0VfJJ0,20700
18
+ jaxsim/integrators/common.py,sha256=9HXRVFo95Mpt6RcVhBrOfvOO7mDxqbkXeg_lKUibEFY,20693
19
19
  jaxsim/integrators/fixed_step.py,sha256=JXaEyEzfSiYea0GnPA7l27J3X0YPB0e25D4qfrxAvzQ,2766
20
20
  jaxsim/integrators/variable_step.py,sha256=jq3PStzFiMciU7lux6CTj4B3gVOfSpYgK2oz2yzIbdo,21380
21
21
  jaxsim/math/__init__.py,sha256=inJ9nRFkqstuGa8OyFkfWVudo5U9Ug4WgDBuKva8AIA,337
@@ -26,14 +26,14 @@ jaxsim/math/joint_model.py,sha256=LKLB26VMz6vx9JLdFUWhGyrElYFEQV-bJiQO5kaZUGY,10
26
26
  jaxsim/math/quaternion.py,sha256=X9b8jHf0QemKUjIZSnXRJc3DdMr42CBhBy_mi9_X_AM,5068
27
27
  jaxsim/math/rotation.py,sha256=Z90daUjGpuNEVLfWB3SVtM9EtwAIaneVj9A9UpWXqhA,2182
28
28
  jaxsim/math/skew.py,sha256=oOGSSR8PUGROl6IJFlrmu6K3gPH-u16hUPfKIkcVv9o,1177
29
- jaxsim/math/transform.py,sha256=nqH6ofde6VWjfHihmYdXvDxKFChpOPH6AsoqkUI1Og0,2928
29
+ jaxsim/math/transform.py,sha256=boeuN8df4Yd9NvS64g-xUYoNqG91YafYLam4iITFJVg,2917
30
30
  jaxsim/mujoco/__init__.py,sha256=Zo5GAlN1DYKvX8s1hu1j6HntKIbBMLB9Puv9ouaNAZ8,158
31
31
  jaxsim/mujoco/__main__.py,sha256=GBmB7J-zj75ZnFyuAAmpSOpbxi_HhHhWJeot3ljGDJY,5291
32
- jaxsim/mujoco/loaders.py,sha256=8sXc_tsDFWBYl8nesgFarYd3hA-PESLMrXsnR3Siz1Y,16400
33
- jaxsim/mujoco/model.py,sha256=0kG2GERxjVFqWZ1K3352rgUNfchB4kRtIrsvv4pS4oc,10766
32
+ jaxsim/mujoco/loaders.py,sha256=PG6TrmurdF99B_HJW39daNXMYlwGy3JMofb4oTRwPLc,17406
33
+ jaxsim/mujoco/model.py,sha256=ErL4X4QWPCJJJjCAMHsFsksYTgIpmV_M8xWPZc-gQcA,12117
34
34
  jaxsim/mujoco/visualizer.py,sha256=-qg26t5tleTva6zzQmc5SdnlC8XZ1ZAwZ_lDjdwHJ0A,4400
35
35
  jaxsim/parsers/__init__.py,sha256=sonYi-bBWAoB04kp1mxT4uIORxjb7SdZ0ukGPmVx98Y,44
36
- jaxsim/parsers/kinematic_graph.py,sha256=2B5gtUboiSVJIm6PegbwHb5g_iXltG0R9_7h8RJ-92M,23785
36
+ jaxsim/parsers/kinematic_graph.py,sha256=_ZJr-u1m64qPCeY6BHTI56dSOWhOGfbg2HN49XbTXhA,23784
37
37
  jaxsim/parsers/descriptions/__init__.py,sha256=EbTfnrK3oCxA3pNv--YUwllJ6uICENvFgAdRbYtS9ts,238
38
38
  jaxsim/parsers/descriptions/collision.py,sha256=HUWwuRgI9KznY29FFw1_zU3bGigDEezrcPOJSxSJGNU,3382
39
39
  jaxsim/parsers/descriptions/joint.py,sha256=hpH0ANvIhbEQk-NGRmWIvPv3lXW385TBIMWNgz5rzM4,4106
@@ -51,14 +51,14 @@ jaxsim/rbda/jacobian.py,sha256=9LGGy9ya5m5U0mBmV1NFH5XYZpEMYbx74qnYBvZs7Ok,6360
51
51
  jaxsim/rbda/rnea.py,sha256=DjwkvXQVUSUclM3Uy3UPZ2tao91R5dGd4o7TsS2qObI,7650
52
52
  jaxsim/rbda/soft_contacts.py,sha256=2EZ9Lw4nFWqXTMEeYsirl17H61s82SmTZllKVsP1Yek,10759
53
53
  jaxsim/rbda/utils.py,sha256=zpbFM2Iq8cntku0BFVu9nfEqZhInCWi9D2INT6MFEI8,5003
54
- jaxsim/terrain/__init__.py,sha256=dzekq9yyj3DKTsCARteqc81lAw3OSnl6EhXn8_Q_ozI,64
54
+ jaxsim/terrain/__init__.py,sha256=f7lVX-iNpH_wkkjef9Qpjh19TTAUOQw76EiLYJDVizc,78
55
55
  jaxsim/terrain/terrain.py,sha256=q0xkWqEShVq-p1j2abTLZq8sEhjyJwquxQKm80PaHhM,2161
56
56
  jaxsim/utils/__init__.py,sha256=tnQq1_CavdfeKaLYt3pmO7Jk4MU2RwwQU_qICkjyoTY,197
57
57
  jaxsim/utils/hashless.py,sha256=bFIwKeo9KiWwsY8QM55duEGGQOyyJ4jQyPcuqTLEp5k,297
58
- jaxsim/utils/jaxsim_dataclass.py,sha256=9FtzgXQPSa6AN26FleDgXGsJMse4dtVACDESrn0g3bw,11359
58
+ jaxsim/utils/jaxsim_dataclass.py,sha256=T8nZolb563mYJD7YvTmYW-z-hpkEiaK3cDbYHqwtqRc,11347
59
59
  jaxsim/utils/tracing.py,sha256=KDMoyVPlu2NJvFkhtZwq5AkqMMgajt3munvJom-vEjQ,650
60
- jaxsim-0.2.dev366.dist-info/LICENSE,sha256=EsU2z6_sWW4Zduzq3goVWjZoCZVKQsM4H_y0o7oRA7Q,1547
61
- jaxsim-0.2.dev366.dist-info/METADATA,sha256=D-Ca1OQtpKyTen4FF58yJK_FdC9iAA2yYZj85blGCHg,7630
62
- jaxsim-0.2.dev366.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
63
- jaxsim-0.2.dev366.dist-info/top_level.txt,sha256=LxGMA8FLtXjQ6oI7N5gd_R_oSUHxpXxUEOfT1xS_ni0,7
64
- jaxsim-0.2.dev366.dist-info/RECORD,,
60
+ jaxsim-0.2.dev388.dist-info/LICENSE,sha256=EsU2z6_sWW4Zduzq3goVWjZoCZVKQsM4H_y0o7oRA7Q,1547
61
+ jaxsim-0.2.dev388.dist-info/METADATA,sha256=T1FlCTdSjlgSIOFqv9Fik7fMwpwIcX6Ps5N2fCElQ7I,7630
62
+ jaxsim-0.2.dev388.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
63
+ jaxsim-0.2.dev388.dist-info/top_level.txt,sha256=LxGMA8FLtXjQ6oI7N5gd_R_oSUHxpXxUEOfT1xS_ni0,7
64
+ jaxsim-0.2.dev388.dist-info/RECORD,,