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/__init__.py +5 -0
- jaxsim/_version.py +2 -2
- jaxsim/api/contact.py +32 -1
- jaxsim/api/data.py +68 -20
- jaxsim/api/joint.py +62 -2
- jaxsim/api/model.py +37 -23
- jaxsim/api/ode.py +29 -25
- jaxsim/api/ode_data.py +11 -1
- jaxsim/integrators/common.py +1 -1
- jaxsim/math/inertia.py +1 -1
- jaxsim/mujoco/loaders.py +3 -3
- jaxsim/parsers/kinematic_graph.py +3 -3
- jaxsim/parsers/rod/parser.py +18 -14
- jaxsim/rbda/contacts/relaxed_rigid.py +409 -0
- jaxsim/rbda/contacts/rigid.py +21 -41
- jaxsim/terrain/terrain.py +41 -25
- jaxsim/typing.py +1 -1
- jaxsim/utils/jaxsim_dataclass.py +12 -9
- jaxsim/utils/wrappers.py +1 -1
- {jaxsim-0.4.3.dev68.dist-info → jaxsim-0.4.3.dev77.dist-info}/METADATA +2 -1
- {jaxsim-0.4.3.dev68.dist-info → jaxsim-0.4.3.dev77.dist-info}/RECORD +24 -23
- {jaxsim-0.4.3.dev68.dist-info → jaxsim-0.4.3.dev77.dist-info}/WHEEL +1 -1
- {jaxsim-0.4.3.dev68.dist-info → jaxsim-0.4.3.dev77.dist-info}/LICENSE +0 -0
- {jaxsim-0.4.3.dev68.dist-info → jaxsim-0.4.3.dev77.dist-info}/top_level.txt +0 -0
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
|
-
|
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(
|
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.
|
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.
|
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.
|
73
|
+
return self._height == other._height
|
70
74
|
|
71
75
|
|
72
76
|
@jax_dataclasses.pytree_dataclass
|
73
77
|
class PlaneTerrain(FlatTerrain):
|
74
78
|
|
75
|
-
|
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
|
-
|
88
|
-
|
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
|
-
|
95
|
-
|
96
|
+
normal = jnp.array(normal, dtype=float)
|
97
|
+
height = jnp.array(height, dtype=float)
|
96
98
|
|
97
|
-
if
|
99
|
+
if normal.shape != (3,):
|
98
100
|
msg = "Expected a 3D vector for the plane normal, got '{}'."
|
99
|
-
raise ValueError(msg.format(
|
101
|
+
raise ValueError(msg.format(normal.shape))
|
100
102
|
|
101
103
|
# Make sure that the plane normal is a unit vector.
|
102
|
-
|
104
|
+
normal = normal / jnp.linalg.norm(normal)
|
103
105
|
|
104
106
|
return PlaneTerrain(
|
105
|
-
|
106
|
-
|
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.
|
142
|
+
A, B, C = self._normal
|
127
143
|
|
128
144
|
# Compute the final coefficient D considering the terrain height.
|
129
|
-
D = -C * self.
|
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.
|
156
|
+
hash(self._height),
|
141
157
|
HashedNumpyArray.hash_of_array(
|
142
|
-
array=jnp.array(self.
|
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.
|
169
|
+
np.allclose(self._height, other._height)
|
154
170
|
and np.allclose(
|
155
|
-
np.array(self.
|
156
|
-
np.array(other.
|
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
jaxsim/utils/jaxsim_dataclass.py
CHANGED
@@ -135,9 +135,10 @@ class JaxsimDataclass(abc.ABC):
|
|
135
135
|
"""
|
136
136
|
|
137
137
|
return tuple(
|
138
|
-
|
139
|
-
|
140
|
-
|
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
|
-
|
158
|
-
|
159
|
-
|
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
|
-
|
176
|
-
|
177
|
-
|
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
|
-
**(
|
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.
|
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=
|
2
|
-
jaxsim/_version.py,sha256=
|
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=
|
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=
|
10
|
-
jaxsim/api/data.py,sha256=
|
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=
|
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=
|
16
|
-
jaxsim/api/ode.py,sha256=
|
17
|
-
jaxsim/api/ode_data.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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/
|
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=
|
61
|
+
jaxsim/terrain/terrain.py,sha256=xUQg47yGxIOcTkLPbnO3sruEGBhoCd16j1evTGlmNjI,5010
|
61
62
|
jaxsim/utils/__init__.py,sha256=Y5zyoRevl3EMVQadhZ4EtSwTEkDt2vcnFoRhPJjKTZ0,215
|
62
|
-
jaxsim/utils/jaxsim_dataclass.py,sha256=
|
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=
|
65
|
-
jaxsim-0.4.3.
|
66
|
-
jaxsim-0.4.3.
|
67
|
-
jaxsim-0.4.3.
|
68
|
-
jaxsim-0.4.3.
|
69
|
-
jaxsim-0.4.3.
|
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,,
|
File without changes
|
File without changes
|