jaxsim 0.4.3.dev159__py3-none-any.whl → 0.4.3.dev169__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 +2 -2
- jaxsim/api/contact.py +67 -16
- jaxsim/api/data.py +5 -1
- jaxsim/api/kin_dyn_parameters.py +14 -1
- jaxsim/api/ode.py +11 -4
- jaxsim/rbda/contacts/__init__.py +2 -1
- jaxsim/rbda/contacts/visco_elastic.py +1053 -0
- {jaxsim-0.4.3.dev159.dist-info → jaxsim-0.4.3.dev169.dist-info}/METADATA +1 -1
- {jaxsim-0.4.3.dev159.dist-info → jaxsim-0.4.3.dev169.dist-info}/RECORD +12 -11
- {jaxsim-0.4.3.dev159.dist-info → jaxsim-0.4.3.dev169.dist-info}/LICENSE +0 -0
- {jaxsim-0.4.3.dev159.dist-info → jaxsim-0.4.3.dev169.dist-info}/WHEEL +0 -0
- {jaxsim-0.4.3.dev159.dist-info → jaxsim-0.4.3.dev169.dist-info}/top_level.txt +0 -0
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.4.3.
|
16
|
-
__version_tuple__ = version_tuple = (0, 4, 3, '
|
15
|
+
__version__ = version = '0.4.3.dev169'
|
16
|
+
__version_tuple__ = version_tuple = (0, 4, 3, 'dev169')
|
jaxsim/api/contact.py
CHANGED
@@ -6,9 +6,12 @@ import jax
|
|
6
6
|
import jax.numpy as jnp
|
7
7
|
|
8
8
|
import jaxsim.api as js
|
9
|
+
import jaxsim.exceptions
|
9
10
|
import jaxsim.terrain
|
10
11
|
import jaxsim.typing as jtp
|
12
|
+
from jaxsim import logging
|
11
13
|
from jaxsim.math import Adjoint, Cross, Transform
|
14
|
+
from jaxsim.rbda import contacts
|
12
15
|
|
13
16
|
from .common import VelRepr
|
14
17
|
|
@@ -156,14 +159,11 @@ def collidable_point_dynamics(
|
|
156
159
|
Instead, the 6D forces are returned in the active representation.
|
157
160
|
"""
|
158
161
|
|
159
|
-
# Import privately the contacts classes.
|
160
|
-
from jaxsim.rbda.contacts import RelaxedRigidContacts, RigidContacts, SoftContacts
|
161
|
-
|
162
162
|
# Build the soft contact model.
|
163
163
|
match model.contact_model:
|
164
164
|
|
165
|
-
case SoftContacts():
|
166
|
-
assert isinstance(model.contact_model, SoftContacts)
|
165
|
+
case contacts.SoftContacts():
|
166
|
+
assert isinstance(model.contact_model, contacts.SoftContacts)
|
167
167
|
|
168
168
|
# Compute the 6D force expressed in the inertial frame and applied to each
|
169
169
|
# collidable point, and the corresponding material deformation rate.
|
@@ -178,8 +178,8 @@ def collidable_point_dynamics(
|
|
178
178
|
# of the ODE system. We need to pass its dynamics to the integrator.
|
179
179
|
aux_data = dict(m_dot=CW_ṁ)
|
180
180
|
|
181
|
-
case RigidContacts():
|
182
|
-
assert isinstance(model.contact_model, RigidContacts)
|
181
|
+
case contacts.RigidContacts():
|
182
|
+
assert isinstance(model.contact_model, contacts.RigidContacts)
|
183
183
|
|
184
184
|
# Compute the 6D force expressed in the inertial frame and applied to each
|
185
185
|
# collidable point.
|
@@ -192,8 +192,8 @@ def collidable_point_dynamics(
|
|
192
192
|
|
193
193
|
aux_data = dict()
|
194
194
|
|
195
|
-
case RelaxedRigidContacts():
|
196
|
-
assert isinstance(model.contact_model, RelaxedRigidContacts)
|
195
|
+
case contacts.RelaxedRigidContacts():
|
196
|
+
assert isinstance(model.contact_model, contacts.RelaxedRigidContacts)
|
197
197
|
|
198
198
|
# Compute the 6D force expressed in the inertial frame and applied to each
|
199
199
|
# collidable point.
|
@@ -206,6 +206,31 @@ def collidable_point_dynamics(
|
|
206
206
|
|
207
207
|
aux_data = dict()
|
208
208
|
|
209
|
+
case contacts.ViscoElasticContacts():
|
210
|
+
assert isinstance(model.contact_model, contacts.ViscoElasticContacts)
|
211
|
+
|
212
|
+
# It is not yet clear how to pass the time step to this stage.
|
213
|
+
# A possibility is to restrict the integrator to only forward Euler
|
214
|
+
# and store the Δt inside the model.
|
215
|
+
module = jaxsim.rbda.contacts.visco_elastic.step.__module__
|
216
|
+
name = jaxsim.rbda.contacts.visco_elastic.step.__name__
|
217
|
+
msg = "You need to use the custom '{}.{}' function with this contact model."
|
218
|
+
jaxsim.exceptions.raise_runtime_error_if(
|
219
|
+
condition=True, msg=msg.format(module, name)
|
220
|
+
)
|
221
|
+
|
222
|
+
# Compute the 6D force expressed in the inertial frame and applied to each
|
223
|
+
# collidable point.
|
224
|
+
W_f_Ci, (W_f̿_Ci, m_tf) = model.contact_model.compute_contact_forces(
|
225
|
+
model=model,
|
226
|
+
data=data,
|
227
|
+
dt=None, # TODO
|
228
|
+
link_forces=link_forces,
|
229
|
+
joint_force_references=joint_force_references,
|
230
|
+
)
|
231
|
+
|
232
|
+
aux_data = dict(W_f_avg2_C=W_f̿_Ci, m_tf=m_tf)
|
233
|
+
|
209
234
|
case _:
|
210
235
|
raise ValueError(f"Invalid contact model {model.contact_model}")
|
211
236
|
|
@@ -278,7 +303,6 @@ def in_contact(
|
|
278
303
|
return links_in_contact
|
279
304
|
|
280
305
|
|
281
|
-
@jax.jit
|
282
306
|
def estimate_good_soft_contacts_parameters(
|
283
307
|
model: js.model.JaxSimModel,
|
284
308
|
*,
|
@@ -287,9 +311,15 @@ def estimate_good_soft_contacts_parameters(
|
|
287
311
|
number_of_active_collidable_points_steady_state: jtp.IntLike = 1,
|
288
312
|
damping_ratio: jtp.FloatLike = 1.0,
|
289
313
|
max_penetration: jtp.FloatLike | None = None,
|
290
|
-
|
314
|
+
**kwargs,
|
315
|
+
) -> (
|
316
|
+
jaxsim.rbda.contacts.RelaxedRigidContactsParams
|
317
|
+
| jaxsim.rbda.contacts.RigidContactsParams
|
318
|
+
| jaxsim.rbda.contacts.SoftContactsParams
|
319
|
+
| jaxsim.rbda.contacts.ViscoElasticContactsParams
|
320
|
+
):
|
291
321
|
"""
|
292
|
-
Estimate good
|
322
|
+
Estimate good parameters for soft-like contact models.
|
293
323
|
|
294
324
|
Args:
|
295
325
|
model: The model to consider.
|
@@ -313,7 +343,10 @@ def estimate_good_soft_contacts_parameters(
|
|
313
343
|
"""
|
314
344
|
|
315
345
|
def estimate_model_height(model: js.model.JaxSimModel) -> jtp.Float:
|
316
|
-
"""
|
346
|
+
"""
|
347
|
+
Displacement between the CoM and the lowest collidable point using zero
|
348
|
+
joint positions.
|
349
|
+
"""
|
317
350
|
|
318
351
|
zero_data = js.data.JaxSimModelData.build(
|
319
352
|
model=model,
|
@@ -338,21 +371,39 @@ def estimate_good_soft_contacts_parameters(
|
|
338
371
|
|
339
372
|
match model.contact_model:
|
340
373
|
|
341
|
-
case
|
342
|
-
assert isinstance(model.contact_model,
|
374
|
+
case contacts.SoftContacts():
|
375
|
+
assert isinstance(model.contact_model, contacts.SoftContacts)
|
376
|
+
|
377
|
+
parameters = contacts.SoftContactsParams.build_default_from_jaxsim_model(
|
378
|
+
model=model,
|
379
|
+
standard_gravity=standard_gravity,
|
380
|
+
static_friction_coefficient=static_friction_coefficient,
|
381
|
+
max_penetration=max_δ,
|
382
|
+
number_of_active_collidable_points_steady_state=nc,
|
383
|
+
damping_ratio=damping_ratio,
|
384
|
+
p=model.contact_model.parameters.p,
|
385
|
+
q=model.contact_model.parameters.q,
|
386
|
+
)
|
387
|
+
|
388
|
+
case contacts.ViscoElasticContacts():
|
389
|
+
assert isinstance(model.contact_model, contacts.ViscoElasticContacts)
|
343
390
|
|
344
391
|
parameters = (
|
345
|
-
|
392
|
+
contacts.ViscoElasticContactsParams.build_default_from_jaxsim_model(
|
346
393
|
model=model,
|
347
394
|
standard_gravity=standard_gravity,
|
348
395
|
static_friction_coefficient=static_friction_coefficient,
|
349
396
|
max_penetration=max_δ,
|
350
397
|
number_of_active_collidable_points_steady_state=nc,
|
351
398
|
damping_ratio=damping_ratio,
|
399
|
+
p=model.contact_model.parameters.p,
|
400
|
+
q=model.contact_model.parameters.q,
|
401
|
+
**kwargs,
|
352
402
|
)
|
353
403
|
)
|
354
404
|
|
355
405
|
case _:
|
406
|
+
logging.warning("The active contact model is not soft-like, no-op.")
|
356
407
|
parameters = model.contact_model.parameters
|
357
408
|
|
358
409
|
return parameters
|
jaxsim/api/data.py
CHANGED
@@ -233,7 +233,11 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
|
|
233
233
|
|
234
234
|
if contacts_params is None:
|
235
235
|
|
236
|
-
if isinstance(
|
236
|
+
if isinstance(
|
237
|
+
model.contact_model,
|
238
|
+
jaxsim.rbda.contacts.SoftContacts
|
239
|
+
| jaxsim.rbda.contacts.ViscoElasticContacts,
|
240
|
+
):
|
237
241
|
contacts_params = js.contact.estimate_good_soft_contacts_parameters(
|
238
242
|
model=model, standard_gravity=standard_gravity
|
239
243
|
)
|
jaxsim/api/kin_dyn_parameters.py
CHANGED
@@ -5,6 +5,8 @@ import dataclasses
|
|
5
5
|
import jax.lax
|
6
6
|
import jax.numpy as jnp
|
7
7
|
import jax_dataclasses
|
8
|
+
import numpy as np
|
9
|
+
import numpy.typing as npt
|
8
10
|
from jax_dataclasses import Static
|
9
11
|
|
10
12
|
import jaxsim.typing as jtp
|
@@ -753,6 +755,13 @@ class ContactParameters(JaxsimDataclass):
|
|
753
755
|
|
754
756
|
point: jtp.Matrix = dataclasses.field(default_factory=lambda: jnp.array([]))
|
755
757
|
|
758
|
+
enabled: Static[tuple[bool, ...]] = dataclasses.field(default_factory=tuple)
|
759
|
+
|
760
|
+
@property
|
761
|
+
def indices_of_enabled_collidable_points(self) -> npt.NDArray:
|
762
|
+
|
763
|
+
return np.where(np.array(self.enabled))[0]
|
764
|
+
|
756
765
|
@staticmethod
|
757
766
|
def build_from(model_description: ModelDescription) -> ContactParameters:
|
758
767
|
"""
|
@@ -785,7 +794,11 @@ class ContactParameters(JaxsimDataclass):
|
|
785
794
|
)
|
786
795
|
|
787
796
|
# Build the ContactParameters object.
|
788
|
-
cp = ContactParameters(
|
797
|
+
cp = ContactParameters(
|
798
|
+
point=points,
|
799
|
+
body=link_index_of_points,
|
800
|
+
enabled=tuple(True for _ in link_index_of_points),
|
801
|
+
)
|
789
802
|
|
790
803
|
assert cp.point.shape[1] == 3, cp.point.shape[1]
|
791
804
|
assert cp.point.shape[0] == len(cp.body), cp.point.shape[0]
|
jaxsim/api/ode.py
CHANGED
@@ -8,6 +8,7 @@ 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.rbda import contacts
|
11
12
|
|
12
13
|
from .common import VelRepr
|
13
14
|
from .ode_data import ODEState
|
@@ -371,8 +372,6 @@ def system_dynamics(
|
|
371
372
|
by the system dynamics evaluation.
|
372
373
|
"""
|
373
374
|
|
374
|
-
from jaxsim.rbda.contacts import RelaxedRigidContacts, RigidContacts, SoftContacts
|
375
|
-
|
376
375
|
# Compute the accelerations and the material deformation rate.
|
377
376
|
W_v̇_WB, s̈, aux_dict = system_velocity_dynamics(
|
378
377
|
model=model,
|
@@ -387,10 +386,18 @@ def system_dynamics(
|
|
387
386
|
|
388
387
|
match model.contact_model:
|
389
388
|
|
390
|
-
case SoftContacts():
|
389
|
+
case contacts.SoftContacts():
|
391
390
|
extended_ode_state["tangential_deformation"] = aux_dict["m_dot"]
|
392
391
|
|
393
|
-
case
|
392
|
+
case contacts.ViscoElasticContacts():
|
393
|
+
|
394
|
+
extended_ode_state["contacts_state"] = {
|
395
|
+
"tangential_deformation": jnp.zeros_like(
|
396
|
+
data.state.extended["tangential_deformation"]
|
397
|
+
)
|
398
|
+
}
|
399
|
+
|
400
|
+
case contacts.RigidContacts() | contacts.RelaxedRigidContacts():
|
394
401
|
pass
|
395
402
|
|
396
403
|
case _:
|
jaxsim/rbda/contacts/__init__.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
from . import relaxed_rigid, rigid, soft
|
1
|
+
from . import relaxed_rigid, rigid, soft, visco_elastic
|
2
2
|
from .common import ContactModel, ContactsParams
|
3
3
|
from .relaxed_rigid import RelaxedRigidContacts, RelaxedRigidContactsParams
|
4
4
|
from .rigid import RigidContacts, RigidContactsParams
|
5
5
|
from .soft import SoftContacts, SoftContactsParams
|
6
|
+
from .visco_elastic import ViscoElasticContacts, ViscoElasticContactsParams
|