jaxsim 0.4.3.dev68__py3-none-any.whl → 0.4.3.dev77__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/terrain/terrain.py CHANGED
@@ -46,66 +46,82 @@ class Terrain(abc.ABC):
46
46
  @jax_dataclasses.pytree_dataclass
47
47
  class FlatTerrain(Terrain):
48
48
 
49
- z: float = dataclasses.field(default=0.0, kw_only=True)
49
+ _height: float = dataclasses.field(default=0.0, kw_only=True)
50
50
 
51
51
  @staticmethod
52
52
  def build(height: jtp.FloatLike) -> FlatTerrain:
53
53
 
54
- return FlatTerrain(z=float(height))
54
+ return FlatTerrain(_height=float(height))
55
55
 
56
56
  def height(self, x: jtp.FloatLike, y: jtp.FloatLike) -> jtp.Float:
57
57
 
58
- return jnp.array(self.z, dtype=float)
58
+ return jnp.array(self._height, dtype=float)
59
+
60
+ def normal(self, x: jtp.FloatLike, y: jtp.FloatLike) -> jtp.Vector:
61
+
62
+ return jnp.array([0.0, 0.0, 1.0], dtype=float)
59
63
 
60
64
  def __hash__(self) -> int:
61
65
 
62
- return hash(self.z)
66
+ return hash(self._height)
63
67
 
64
68
  def __eq__(self, other: FlatTerrain) -> bool:
65
69
 
66
70
  if not isinstance(other, FlatTerrain):
67
71
  return False
68
72
 
69
- return self.z == other.z
73
+ return self._height == other._height
70
74
 
71
75
 
72
76
  @jax_dataclasses.pytree_dataclass
73
77
  class PlaneTerrain(FlatTerrain):
74
78
 
75
- plane_normal: tuple[float, float, float] = jax_dataclasses.field(
79
+ _normal: tuple[float, float, float] = jax_dataclasses.field(
76
80
  default=(0.0, 0.0, 1.0), kw_only=True
77
81
  )
78
82
 
79
83
  @staticmethod
80
- def build(
81
- plane_normal: jtp.VectorLike, plane_height_over_origin: jtp.FloatLike = 0.0
82
- ) -> PlaneTerrain:
84
+ def build(height: jtp.FloatLike = 0.0, *, normal: jtp.VectorLike) -> PlaneTerrain:
83
85
  """
84
86
  Create a PlaneTerrain instance with a specified plane normal vector.
85
87
 
86
88
  Args:
87
- plane_normal: The normal vector of the terrain plane.
88
- plane_height_over_origin: The height of the plane over the origin.
89
+ normal: The normal vector of the terrain plane.
90
+ height: The height of the plane over the origin.
89
91
 
90
92
  Returns:
91
93
  PlaneTerrain: A PlaneTerrain instance.
92
94
  """
93
95
 
94
- plane_normal = jnp.array(plane_normal, dtype=float)
95
- plane_height_over_origin = jnp.array(plane_height_over_origin, dtype=float)
96
+ normal = jnp.array(normal, dtype=float)
97
+ height = jnp.array(height, dtype=float)
96
98
 
97
- if plane_normal.shape != (3,):
99
+ if normal.shape != (3,):
98
100
  msg = "Expected a 3D vector for the plane normal, got '{}'."
99
- raise ValueError(msg.format(plane_normal.shape))
101
+ raise ValueError(msg.format(normal.shape))
100
102
 
101
103
  # Make sure that the plane normal is a unit vector.
102
- plane_normal = plane_normal / jnp.linalg.norm(plane_normal)
104
+ normal = normal / jnp.linalg.norm(normal)
103
105
 
104
106
  return PlaneTerrain(
105
- z=float(plane_height_over_origin),
106
- plane_normal=tuple(plane_normal.tolist()),
107
+ _height=height.item(),
108
+ _normal=tuple(normal.tolist()),
107
109
  )
108
110
 
111
+ def normal(self, x: jtp.FloatLike, y: jtp.FloatLike) -> jtp.Vector:
112
+ """
113
+ Compute the normal vector of the terrain at a specific (x, y) location.
114
+
115
+ Args:
116
+ x: The x-coordinate of the location.
117
+ y: The y-coordinate of the location.
118
+
119
+ Returns:
120
+ The normal vector of the terrain surface at the specified location.
121
+ """
122
+
123
+ return jnp.array(self._normal, dtype=float)
124
+
109
125
  def height(self, x: jtp.FloatLike, y: jtp.FloatLike) -> jtp.Float:
110
126
  """
111
127
  Compute the height of the terrain at a specific (x, y) location on a plane.
@@ -123,10 +139,10 @@ class PlaneTerrain(FlatTerrain):
123
139
  # The height over the origin: -D/C
124
140
 
125
141
  # Get the plane equation coefficients from the terrain normal.
126
- A, B, C = self.plane_normal
142
+ A, B, C = self._normal
127
143
 
128
144
  # Compute the final coefficient D considering the terrain height.
129
- D = -C * self.z
145
+ D = -C * self._height
130
146
 
131
147
  # Invert the plane equation to get the height at the given (x, y) coordinates.
132
148
  return jnp.array(-(A * x + B * y + D) / C).astype(float)
@@ -137,9 +153,9 @@ class PlaneTerrain(FlatTerrain):
137
153
 
138
154
  return hash(
139
155
  (
140
- hash(self.z),
156
+ hash(self._height),
141
157
  HashedNumpyArray.hash_of_array(
142
- array=jnp.array(self.plane_normal, dtype=float)
158
+ array=jnp.array(self._normal, dtype=float)
143
159
  ),
144
160
  )
145
161
  )
@@ -150,10 +166,10 @@ class PlaneTerrain(FlatTerrain):
150
166
  return False
151
167
 
152
168
  if not (
153
- np.allclose(self.z, other.z)
169
+ np.allclose(self._height, other._height)
154
170
  and np.allclose(
155
- np.array(self.plane_normal, dtype=float),
156
- np.array(other.plane_normal, dtype=float),
171
+ np.array(self._normal, dtype=float),
172
+ np.array(other._normal, dtype=float),
157
173
  )
158
174
  ):
159
175
  return False
jaxsim/typing.py CHANGED
@@ -16,7 +16,7 @@ Int = Scalar
16
16
  Bool = Scalar
17
17
  Float = Scalar
18
18
 
19
- PyTree = (
19
+ PyTree: object = (
20
20
  dict[Hashable, TypeVar("PyTree")]
21
21
  | list[TypeVar("PyTree")]
22
22
  | tuple[TypeVar("PyTree")]
@@ -135,9 +135,10 @@ class JaxsimDataclass(abc.ABC):
135
135
  """
136
136
 
137
137
  return tuple(
138
- leaf.shape if hasattr(leaf, "shape") else None
139
- for leaf in jax.tree_util.tree_leaves(tree)
140
- if hasattr(leaf, "shape")
138
+ map(
139
+ lambda leaf: getattr(leaf, "shape", None),
140
+ jax.tree_util.tree_leaves(tree),
141
+ )
141
142
  )
142
143
 
143
144
  @staticmethod
@@ -154,9 +155,10 @@ class JaxsimDataclass(abc.ABC):
154
155
  """
155
156
 
156
157
  return tuple(
157
- leaf.dtype if hasattr(leaf, "dtype") else None
158
- for leaf in jax.tree_util.tree_leaves(tree)
159
- if hasattr(leaf, "dtype")
158
+ map(
159
+ lambda leaf: getattr(leaf, "dtype", None),
160
+ jax.tree_util.tree_leaves(tree),
161
+ )
160
162
  )
161
163
 
162
164
  @staticmethod
@@ -172,9 +174,10 @@ class JaxsimDataclass(abc.ABC):
172
174
  """
173
175
 
174
176
  return tuple(
175
- leaf.weak_type if hasattr(leaf, "weak_type") else False
176
- for leaf in jax.tree_util.tree_leaves(tree)
177
- if hasattr(leaf, "weak_type")
177
+ map(
178
+ lambda leaf: getattr(leaf, "weak_type", None),
179
+ jax.tree_util.tree_leaves(tree),
180
+ )
178
181
  )
179
182
 
180
183
  @staticmethod
jaxsim/utils/wrappers.py CHANGED
@@ -110,7 +110,7 @@ class HashedNumpyArray:
110
110
  return np.allclose(
111
111
  self.array,
112
112
  other.array,
113
- **({dict(atol=self.precision)} if self.precision is not None else {}),
113
+ **(dict(atol=self.precision) if self.precision is not None else {}),
114
114
  )
115
115
 
116
116
  return hash(self) == hash(other)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.4.3.dev68
3
+ Version: 0.4.3.dev77
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
@@ -1,29 +1,29 @@
1
- jaxsim/__init__.py,sha256=ixsS4dYMPex2wOUUp_rkPnwrPhYzkRh1xO_YuMj3Cr4,2626
2
- jaxsim/_version.py,sha256=XDf5LPSlhAhH48AO29kysLP_4FTR5VWOpS0LrK5RSfo,426
1
+ jaxsim/__init__.py,sha256=bSbpggIz5aG6QuGZLa0V2EfHjAOeucMxi-vIYxzLmN8,2788
2
+ jaxsim/_version.py,sha256=iooIC7hyVsbupWXsxWXV06oZTPyCALANUUOu7UZTm8Y,426
3
3
  jaxsim/exceptions.py,sha256=8_h8iqL8DgNR754dR8SZiQ7361GR5V1sUk3ZuZCHw1Q,2069
4
4
  jaxsim/logging.py,sha256=STI-D_upXZYX-ZezLrlJJ0UlD5YspST0vZ_DcIwkzO4,1553
5
- jaxsim/typing.py,sha256=IbFx3UkEXi-cm7UBqMPi58rJAFV_HbZ9E_K4JwfNvVM,753
5
+ jaxsim/typing.py,sha256=2HXy9hgazPXjofi1vLQ09ZubPtgVmg80U9NKmZ6NYiI,761
6
6
  jaxsim/api/__init__.py,sha256=8eV22t2S3UwNyCg8karPetG1dmX1VDBXkyv28_FwNQA,210
7
7
  jaxsim/api/com.py,sha256=m-p3EJDhpnMTlXKplfbZE_aH9NqX_VyLlAE3vUhc6l4,13642
8
8
  jaxsim/api/common.py,sha256=SNgxq42r6eF_-aPszvOjUYkGwXOzz4hKmhDwEUkscFQ,6650
9
- jaxsim/api/contact.py,sha256=HyEAjF7BySDDOlRahN0l7V15IPB0HPXuoM0twamuEW0,20913
10
- jaxsim/api/data.py,sha256=CUh9lvhVk3_clNQ26BUBGpjvFSsK_PrVWVMEWpMdHRM,27206
9
+ jaxsim/api/contact.py,sha256=Ek1xSKB_VWjfqsqRYlK236ountKmGTl1M04cTYqHgsE,22142
10
+ jaxsim/api/data.py,sha256=QldUHniJqKrdNtAcXuRaS9UyeslJ0Rjvb17UA0Ca5Tw,29008
11
11
  jaxsim/api/frame.py,sha256=KS8A5wRfjxhe9NgcVo2QA516iP5zky7UVnWxG7nTa7c,12911
12
- jaxsim/api/joint.py,sha256=L81bQe-noPT6_54KOSF7KBjRmEPAS433ULn2EcXI8vI,5115
12
+ jaxsim/api/joint.py,sha256=lksT1Doxz2jknHyhb4ls20z6f6dofpZSzBJtVacZXAE,7129
13
13
  jaxsim/api/kin_dyn_parameters.py,sha256=CcfSg5Mc8qb1mZeMQ4AK_ffZIsK5yOl7tu397pFhcDA,29369
14
14
  jaxsim/api/link.py,sha256=qPRtc8qqMRjZxUCZYXJMygbB6huDXBfIT1b1b8Durkw,18631
15
- jaxsim/api/model.py,sha256=HXoqCtQ3KStGoxhgvFm8P_Sc-lbEM4l5No2MoHzNlOk,65558
16
- jaxsim/api/ode.py,sha256=Vb2sN4zwpXnaJDD9-ziz2qvfmfa4jvIQ0fONbBIRGmU,13368
17
- jaxsim/api/ode_data.py,sha256=U7F6TL6bENAxpQQl4PupPoDG7d7VfTTFqDAs3xwu6Hs,20003
15
+ jaxsim/api/model.py,sha256=TLjgacgTXm-2YRGDA0Id9pe9nxIem28KoAls6Tdk9WM,66241
16
+ jaxsim/api/ode.py,sha256=ZshGdHptftku0yoUwBiBdd1iOqntH0vVEOjRHfL7Fao,13518
17
+ jaxsim/api/ode_data.py,sha256=7RSoBhfCJdP6P9InQbDwdBVpClPMMuetewI-6AWm-_0,20276
18
18
  jaxsim/api/references.py,sha256=XOVKuQXRmjPoP-T5JWGSbqIGX5DzOkeGafqRpj0ZQEM,20771
19
19
  jaxsim/integrators/__init__.py,sha256=hxvOD-VK_mmd6v31wtC-nb28AYve1gLuZCNLV9wS-Kg,103
20
- jaxsim/integrators/common.py,sha256=ntjflaV3qWaFH_E65pAGZ6QipdnFsgQDasKtIKpxTe4,20432
20
+ jaxsim/integrators/common.py,sha256=XIrJVJDO0ldaZ93WgoGNlFoRvazsRJTpO3DrK9kIXqM,20437
21
21
  jaxsim/integrators/fixed_step.py,sha256=KpjRd6hHtapxDoo6D1kyDrVDSHnke2TepI5grFH7_bM,2693
22
22
  jaxsim/integrators/variable_step.py,sha256=5StkFh9oQba34zlkIoXG2fUN78gbxkHePWbrpQ-QZOI,21274
23
23
  jaxsim/math/__init__.py,sha256=8oPITEoGwgRcOeG8KxtqxPQ8b5uku1HNRMokpCoi9Tc,352
24
24
  jaxsim/math/adjoint.py,sha256=o1FCipkGwPtMbN2gFNIyUV8ADF3TX5fxElpTEXK0bIs,4377
25
25
  jaxsim/math/cross.py,sha256=U7yEx_l75mSy5g6O-jsjBztApvxC3WaV4MpkS5tThu4,1330
26
- jaxsim/math/inertia.py,sha256=_hNpoeyEpAGr9ExDQJjckbjhk39luJFF-jv0SKqefnQ,1614
26
+ jaxsim/math/inertia.py,sha256=01hz6wMFreN2jBA0rVoBS1YMVh77KvwuzXSOpI3pxNk,1614
27
27
  jaxsim/math/joint_model.py,sha256=EzAveaG5B6ZnCFNUzN30KEQUVesd83lfWXJarYR-kUw,9989
28
28
  jaxsim/math/quaternion.py,sha256=_WA7W3iv7px83sWO1V1n0-J78hqAlO4SL1-jofE-UZ4,4754
29
29
  jaxsim/math/rotation.py,sha256=k-nwT79zmWrys3NNAB-lGWxat7Kqm_6JnFRoimJ8rBg,2156
@@ -31,18 +31,18 @@ jaxsim/math/skew.py,sha256=oOGSSR8PUGROl6IJFlrmu6K3gPH-u16hUPfKIkcVv9o,1177
31
31
  jaxsim/math/transform.py,sha256=KXzQgOnCfAtbXCwxhplpJ3F0JT3oEyeLVby1_uRAryQ,2892
32
32
  jaxsim/mujoco/__init__.py,sha256=Zo5GAlN1DYKvX8s1hu1j6HntKIbBMLB9Puv9ouaNAZ8,158
33
33
  jaxsim/mujoco/__main__.py,sha256=GBmB7J-zj75ZnFyuAAmpSOpbxi_HhHhWJeot3ljGDJY,5291
34
- jaxsim/mujoco/loaders.py,sha256=XB-fgXuWMTFiaand5MZlLFQ5__Sh8MK5CJsxIU34MBk,25328
34
+ jaxsim/mujoco/loaders.py,sha256=_8Af_5Yo0-lWHE-46BBMcrqSJnDNxr3peyc519DExtA,25322
35
35
  jaxsim/mujoco/model.py,sha256=AQksXemXWACJ3yvefV2G5HLwwBU9ISoJrOD1wlxdY5w,16386
36
36
  jaxsim/mujoco/visualizer.py,sha256=T1vU-w4NKSmgEkZ0FqVcGmIvYrYO0len2UBSsU4MOZ0,6978
37
37
  jaxsim/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- jaxsim/parsers/kinematic_graph.py,sha256=KijMWKyhTLKSNUmOOk4sYQMgPh_OkA_brncL7gBRHaY,34757
38
+ jaxsim/parsers/kinematic_graph.py,sha256=wT2bgaCS8VQJTHy2H9sENkVPDOiMkRikxEF1t_WaahQ,34748
39
39
  jaxsim/parsers/descriptions/__init__.py,sha256=PbIlunVfb59pB5jSX97YVpMAANRZPRkJ0X-hS14rzv4,221
40
40
  jaxsim/parsers/descriptions/collision.py,sha256=BQeIG-TKi4SVny23w6riDrQ5itC6VRwEMBX6HgAXHxA,3973
41
41
  jaxsim/parsers/descriptions/joint.py,sha256=VSb6C0FBBKMqwrHBKfc-Bbn4rl_J0RzUxMQlhIEvOPM,5185
42
42
  jaxsim/parsers/descriptions/link.py,sha256=Eh0W5qL7_Uw0GV-BkNKXhm9Q2dRTfIWCX5D-87zQkxA,3711
43
43
  jaxsim/parsers/descriptions/model.py,sha256=I2Vsbv8Josl4Le7b5rIvhqA2k9Bbv5JxMqwytayxds0,9833
44
44
  jaxsim/parsers/rod/__init__.py,sha256=G2vqlLajBLUc4gyzXwsEI2Wsi4TMOIF9bLDFeT6KrGU,92
45
- jaxsim/parsers/rod/parser.py,sha256=HskeCqDsbtwH2BDk3vfxvx391wUTVGLaUXNvBrdNo-4,13486
45
+ jaxsim/parsers/rod/parser.py,sha256=9EigYv2oGn4bfIY1q0Cd_55yVKfN2rXP_MuZSZqGxYM,13681
46
46
  jaxsim/parsers/rod/utils.py,sha256=5DsF3OeePZGidOJ5GiFSZx-51uIdnFvMW9EK6SgOW6Q,5698
47
47
  jaxsim/rbda/__init__.py,sha256=H7DhXpxkPOi9lpUvg31IMHFfRafke1UoJLc5GQIdyhA,387
48
48
  jaxsim/rbda/aba.py,sha256=w7ciyxB0IsmueatT0C7PcBQEl9dyiH9oqJgIi3xeTUE,8983
@@ -54,16 +54,17 @@ jaxsim/rbda/rnea.py,sha256=CLfqs9XFVaD-hvkLABshDAfdw5bm_AMV3UVAQ_IvURQ,7542
54
54
  jaxsim/rbda/utils.py,sha256=eeT21Y4DiiyhrdF0lUE_VvRuwru5-rR7yOlOlWzCCWE,5381
55
55
  jaxsim/rbda/contacts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
56
  jaxsim/rbda/contacts/common.py,sha256=VwAs742futAmLnDgbaOuLzNDBFiKDfYItdEZ4UcFgzE,2467
57
- jaxsim/rbda/contacts/rigid.py,sha256=8Vbnxng-ERZ5ka_eZGIBuhBDr2PNjc7m-Or255AfEw4,15862
57
+ jaxsim/rbda/contacts/relaxed_rigid.py,sha256=0rrk73MKMVPkEXf1MTEmCnXaPWzzEw6U9RHZtLNIu_E,13646
58
+ jaxsim/rbda/contacts/rigid.py,sha256=zbSM0miwpgC1rp1d0RoQ1q8pYiKdIkHV8iZimeEPC94,15153
58
59
  jaxsim/rbda/contacts/soft.py,sha256=_wvb5iZDjGcVg6rNQelN4LZN7qSC2NIp0HdKvZmlGfk,15647
59
60
  jaxsim/terrain/__init__.py,sha256=f7lVX-iNpH_wkkjef9Qpjh19TTAUOQw76EiLYJDVizc,78
60
- jaxsim/terrain/terrain.py,sha256=ctyNANIFSM3tZmamprjaEDcWgUSP0oNJbmT1zw9RjPs,4565
61
+ jaxsim/terrain/terrain.py,sha256=xUQg47yGxIOcTkLPbnO3sruEGBhoCd16j1evTGlmNjI,5010
61
62
  jaxsim/utils/__init__.py,sha256=Y5zyoRevl3EMVQadhZ4EtSwTEkDt2vcnFoRhPJjKTZ0,215
62
- jaxsim/utils/jaxsim_dataclass.py,sha256=5xJbY0G8d7C0OTNIW9T4vQxiDak6TGZT9gpNOvRykFI,11373
63
+ jaxsim/utils/jaxsim_dataclass.py,sha256=FSiUvdnq4Y1T9Jaa_mw4ZBQJe8H7deLr3Kupxtlh4iI,11322
63
64
  jaxsim/utils/tracing.py,sha256=KDMoyVPlu2NJvFkhtZwq5AkqMMgajt3munvJom-vEjQ,650
64
- jaxsim/utils/wrappers.py,sha256=JhLUh1g8iU-lhjbuZRfkscPZhYlLCOorVM2Xl3ulRBI,4054
65
- jaxsim-0.4.3.dev68.dist-info/LICENSE,sha256=eaYdFmdeMbiIoIiPzEK0MjP1S9wtFXjXNR5er49uLR0,1546
66
- jaxsim-0.4.3.dev68.dist-info/METADATA,sha256=IrZMXHUptvvLA5YgloveNIge4OdEBjT-DxhdHBrn_WM,17247
67
- jaxsim-0.4.3.dev68.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
68
- jaxsim-0.4.3.dev68.dist-info/top_level.txt,sha256=LxGMA8FLtXjQ6oI7N5gd_R_oSUHxpXxUEOfT1xS_ni0,7
69
- jaxsim-0.4.3.dev68.dist-info/RECORD,,
65
+ jaxsim/utils/wrappers.py,sha256=Fh82ZcaFi5fUnByyFLnmumaobsu1hJIvFdopUVzJ1ps,4052
66
+ jaxsim-0.4.3.dev77.dist-info/LICENSE,sha256=eaYdFmdeMbiIoIiPzEK0MjP1S9wtFXjXNR5er49uLR0,1546
67
+ jaxsim-0.4.3.dev77.dist-info/METADATA,sha256=SfRw58102asAL9OAPXqsvh9nr8FVvLamf9dCNL9XXPo,17276
68
+ jaxsim-0.4.3.dev77.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
69
+ jaxsim-0.4.3.dev77.dist-info/top_level.txt,sha256=LxGMA8FLtXjQ6oI7N5gd_R_oSUHxpXxUEOfT1xS_ni0,7
70
+ jaxsim-0.4.3.dev77.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.1.2)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5