jaxsim 0.4.3.dev31__tar.gz → 0.4.3.dev64__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.
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/PKG-INFO +2 -1
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/environment.yml +1 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/pyproject.toml +2 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/_version.py +2 -2
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/api/contact.py +27 -1
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/api/data.py +30 -8
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/api/joint.py +62 -2
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/api/model.py +1 -1
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/api/ode.py +19 -24
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/api/ode_data.py +11 -1
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/integrators/common.py +1 -1
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/math/inertia.py +1 -1
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/mujoco/loaders.py +3 -3
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/parsers/kinematic_graph.py +3 -3
- jaxsim-0.4.3.dev64/src/jaxsim/rbda/contacts/relaxed_rigid.py +384 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/rbda/contacts/rigid.py +11 -41
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/terrain/terrain.py +41 -25
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/typing.py +1 -1
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/utils/jaxsim_dataclass.py +12 -9
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/utils/wrappers.py +1 -1
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim.egg-info/PKG-INFO +2 -1
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim.egg-info/SOURCES.txt +1 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim.egg-info/requires.txt +1 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/.devcontainer/Dockerfile +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/.devcontainer/devcontainer.json +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/.gitattributes +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/.github/CODEOWNERS +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/.github/workflows/ci_cd.yml +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/.github/workflows/read_the_docs.yml +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/.github/workflows/update_pixi_lockfile.yml +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/.gitignore +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/.pre-commit-config.yaml +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/.readthedocs.yaml +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/CONTRIBUTING.md +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/LICENSE +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/README.md +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/Makefile +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/conf.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/examples.rst +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/guide/install.rst +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/index.rst +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/make.bat +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/modules/api.rst +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/modules/integrators.rst +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/modules/math.rst +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/modules/mujoco.rst +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/modules/parsers.rst +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/modules/rbda.rst +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/modules/typing.rst +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/docs/modules/utils.rst +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/examples/.gitattributes +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/examples/.gitignore +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/examples/PD_controller.ipynb +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/examples/Parallel_computing.ipynb +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/examples/README.md +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/examples/assets/cartpole.urdf +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/pixi.lock +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/setup.cfg +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/setup.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/__init__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/api/__init__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/api/com.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/api/common.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/api/frame.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/api/link.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/api/references.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/exceptions.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/integrators/__init__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/integrators/fixed_step.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/integrators/variable_step.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/logging.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/math/__init__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/math/adjoint.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/math/cross.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/math/joint_model.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/math/quaternion.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/math/rotation.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/math/skew.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/math/transform.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/mujoco/__init__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/mujoco/__main__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/mujoco/model.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/mujoco/visualizer.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/parsers/__init__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/parsers/descriptions/collision.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/parsers/descriptions/joint.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/parsers/descriptions/link.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/parsers/descriptions/model.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/parsers/rod/__init__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/parsers/rod/parser.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/parsers/rod/utils.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/rbda/__init__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/rbda/aba.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/rbda/collidable_points.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/rbda/contacts/__init__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/rbda/contacts/common.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/rbda/contacts/soft.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/rbda/crba.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/rbda/forward_kinematics.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/rbda/jacobian.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/rbda/rnea.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/rbda/utils.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/terrain/__init__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/utils/__init__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim/utils/tracing.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim.egg-info/dependency_links.txt +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/src/jaxsim.egg-info/top_level.txt +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/__init__.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/conftest.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/test_api_com.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/test_api_contact.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/test_api_data.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/test_api_frame.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/test_api_joint.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/test_api_link.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/test_api_model.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/test_automatic_differentiation.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/test_contact.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/test_exceptions.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/test_pytree.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/tests/test_simulations.py +0 -0
- {jaxsim-0.4.3.dev31 → jaxsim-0.4.3.dev64}/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.
|
3
|
+
Version: 0.4.3.dev64
|
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
|
@@ -45,6 +45,7 @@ classifiers = [
|
|
45
45
|
dependencies = [
|
46
46
|
"coloredlogs",
|
47
47
|
"jax >= 0.4.13",
|
48
|
+
"jaxopt >= 0.8.0",
|
48
49
|
"jaxlib >= 0.4.13",
|
49
50
|
"jaxlie >= 1.3.0",
|
50
51
|
"jax_dataclasses >= 1.4.0",
|
@@ -181,6 +182,7 @@ platforms = ["linux-64", "osx-arm64", "osx-64"]
|
|
181
182
|
coloredlogs = "*"
|
182
183
|
jax = "*"
|
183
184
|
jax-dataclasses = "*"
|
185
|
+
jaxopt = "*"
|
184
186
|
jaxlib = "*"
|
185
187
|
jaxlie = "*"
|
186
188
|
lxml = "*"
|
@@ -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.dev64'
|
16
|
+
__version_tuple__ = version_tuple = (0, 4, 3, 'dev64')
|
@@ -131,7 +131,8 @@ def collidable_point_dynamics(
|
|
131
131
|
Returns:
|
132
132
|
The 6D force applied to each collidable point and additional data based on the contact model configured:
|
133
133
|
- Soft: the material deformation rate.
|
134
|
-
- Rigid:
|
134
|
+
- Rigid: no additional data.
|
135
|
+
- QuasiRigid: no additional data.
|
135
136
|
|
136
137
|
Note:
|
137
138
|
The material deformation rate is always returned in the mixed frame
|
@@ -144,6 +145,10 @@ def collidable_point_dynamics(
|
|
144
145
|
W_p_Ci, W_ṗ_Ci = js.contact.collidable_point_kinematics(model=model, data=data)
|
145
146
|
|
146
147
|
# Import privately the contacts classes.
|
148
|
+
from jaxsim.rbda.contacts.relaxed_rigid import (
|
149
|
+
RelaxedRigidContacts,
|
150
|
+
RelaxedRigidContactsState,
|
151
|
+
)
|
147
152
|
from jaxsim.rbda.contacts.rigid import RigidContacts, RigidContactsState
|
148
153
|
from jaxsim.rbda.contacts.soft import SoftContacts, SoftContactsState
|
149
154
|
|
@@ -190,6 +195,27 @@ def collidable_point_dynamics(
|
|
190
195
|
|
191
196
|
aux_data = dict()
|
192
197
|
|
198
|
+
case RelaxedRigidContacts():
|
199
|
+
assert isinstance(model.contact_model, RelaxedRigidContacts)
|
200
|
+
assert isinstance(data.state.contact, RelaxedRigidContactsState)
|
201
|
+
|
202
|
+
# Build the contact model.
|
203
|
+
relaxed_rigid_contacts = RelaxedRigidContacts(
|
204
|
+
parameters=data.contacts_params, terrain=model.terrain
|
205
|
+
)
|
206
|
+
|
207
|
+
# Compute the 6D force expressed in the inertial frame and applied to each
|
208
|
+
# collidable point.
|
209
|
+
W_f_Ci, _ = relaxed_rigid_contacts.compute_contact_forces(
|
210
|
+
position=W_p_Ci,
|
211
|
+
velocity=W_ṗ_Ci,
|
212
|
+
model=model,
|
213
|
+
data=data,
|
214
|
+
link_forces=link_forces,
|
215
|
+
)
|
216
|
+
|
217
|
+
aux_data = dict()
|
218
|
+
|
193
219
|
case _:
|
194
220
|
raise ValueError(f"Invalid contact model {model.contact_model}")
|
195
221
|
|
@@ -593,16 +593,18 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
|
|
593
593
|
The updated `JaxSimModelData` object.
|
594
594
|
"""
|
595
595
|
|
596
|
-
|
596
|
+
W_Q_B = jnp.array(base_quaternion, dtype=float)
|
597
|
+
|
598
|
+
W_Q_B = jax.lax.select(
|
599
|
+
pred=jnp.allclose(jnp.linalg.norm(W_Q_B), 1.0, atol=1e-6, rtol=0.0),
|
600
|
+
on_true=W_Q_B,
|
601
|
+
on_false=W_Q_B / jnp.linalg.norm(W_Q_B),
|
602
|
+
)
|
597
603
|
|
598
604
|
return self.replace(
|
599
605
|
validate=True,
|
600
606
|
state=self.state.replace(
|
601
|
-
physics_model=self.state.physics_model.replace(
|
602
|
-
base_quaternion=jnp.atleast_1d(base_quaternion.squeeze()).astype(
|
603
|
-
float
|
604
|
-
)
|
605
|
-
)
|
607
|
+
physics_model=self.state.physics_model.replace(base_quaternion=W_Q_B)
|
606
608
|
),
|
607
609
|
)
|
608
610
|
|
@@ -744,6 +746,13 @@ def random_model_data(
|
|
744
746
|
jtp.FloatLike | Sequence[jtp.FloatLike],
|
745
747
|
jtp.FloatLike | Sequence[jtp.FloatLike],
|
746
748
|
] = ((-1, -1, 0.5), 1.0),
|
749
|
+
joint_pos_bounds: (
|
750
|
+
tuple[
|
751
|
+
jtp.FloatLike | Sequence[jtp.FloatLike],
|
752
|
+
jtp.FloatLike | Sequence[jtp.FloatLike],
|
753
|
+
]
|
754
|
+
| None
|
755
|
+
) = None,
|
747
756
|
base_vel_lin_bounds: tuple[
|
748
757
|
jtp.FloatLike | Sequence[jtp.FloatLike],
|
749
758
|
jtp.FloatLike | Sequence[jtp.FloatLike],
|
@@ -769,6 +778,8 @@ def random_model_data(
|
|
769
778
|
key: The random key.
|
770
779
|
velocity_representation: The velocity representation to use.
|
771
780
|
base_pos_bounds: The bounds for the base position.
|
781
|
+
joint_pos_bounds:
|
782
|
+
The bounds for the joint positions (reading the joint limits if None).
|
772
783
|
base_vel_lin_bounds: The bounds for the base linear velocity.
|
773
784
|
base_vel_ang_bounds: The bounds for the base angular velocity.
|
774
785
|
joint_vel_bounds: The bounds for the joint velocities.
|
@@ -813,8 +824,19 @@ def random_model_data(
|
|
813
824
|
).wxyz
|
814
825
|
|
815
826
|
if model.number_of_joints() > 0:
|
816
|
-
|
817
|
-
|
827
|
+
|
828
|
+
s_min, s_max = (
|
829
|
+
jnp.array(joint_pos_bounds, dtype=float)
|
830
|
+
if joint_pos_bounds is not None
|
831
|
+
else (None, None)
|
832
|
+
)
|
833
|
+
|
834
|
+
physics_model_state.joint_positions = (
|
835
|
+
js.joint.random_joint_positions(model=model, key=k3)
|
836
|
+
if (s_min is None or s_max is None)
|
837
|
+
else jax.random.uniform(
|
838
|
+
key=k3, shape=(model.dofs(),), minval=s_min, maxval=s_max
|
839
|
+
)
|
818
840
|
)
|
819
841
|
|
820
842
|
physics_model_state.joint_velocities = jax.random.uniform(
|
@@ -180,17 +180,77 @@ def random_joint_positions(
|
|
180
180
|
|
181
181
|
Args:
|
182
182
|
model: The model to consider.
|
183
|
-
joint_names: The names of the joints.
|
184
|
-
key: The random key.
|
183
|
+
joint_names: The names of the considered joints (all if None).
|
184
|
+
key: The random key (initialized from seed 0 if None).
|
185
|
+
|
186
|
+
Note:
|
187
|
+
If the joint range or revolute joints is larger than 2π, their joint positions
|
188
|
+
will be sampled from an interval of size 2π.
|
185
189
|
|
186
190
|
Returns:
|
187
191
|
The random joint positions.
|
188
192
|
"""
|
189
193
|
|
194
|
+
# Consider the key corresponding to a zero seed if it was not passed.
|
190
195
|
key = key if key is not None else jax.random.PRNGKey(seed=0)
|
191
196
|
|
197
|
+
# Get the joint limits parsed from the model description.
|
192
198
|
s_min, s_max = position_limits(model=model, joint_names=joint_names)
|
193
199
|
|
200
|
+
# Get the joint indices.
|
201
|
+
# Note that it will trigger an exception if the given `joint_names` are not valid.
|
202
|
+
joint_names = joint_names if joint_names is not None else model.joint_names()
|
203
|
+
joint_indices = names_to_idxs(model=model, joint_names=joint_names)
|
204
|
+
|
205
|
+
from jaxsim.parsers.descriptions.joint import JointType
|
206
|
+
|
207
|
+
# Filter for revolute joints.
|
208
|
+
is_revolute = jnp.where(
|
209
|
+
jnp.array(model.kin_dyn_parameters.joint_model.joint_types[1:])[joint_indices]
|
210
|
+
== JointType.Revolute,
|
211
|
+
True,
|
212
|
+
False,
|
213
|
+
)
|
214
|
+
|
215
|
+
# Shorthand for π.
|
216
|
+
π = jnp.pi
|
217
|
+
|
218
|
+
# Filter for revolute with full range (or continuous).
|
219
|
+
is_revolute_full_range = jnp.logical_and(is_revolute, s_max - s_min >= 2 * π)
|
220
|
+
|
221
|
+
# Clip the lower limit to -π if the joint range is larger than [-π, π].
|
222
|
+
s_min = jnp.where(
|
223
|
+
jnp.logical_and(
|
224
|
+
is_revolute_full_range, jnp.logical_and(s_min <= -π, s_max >= π)
|
225
|
+
),
|
226
|
+
-π,
|
227
|
+
s_min,
|
228
|
+
)
|
229
|
+
|
230
|
+
# Clip the upper limit to +π if the joint range is larger than [-π, π].
|
231
|
+
s_max = jnp.where(
|
232
|
+
jnp.logical_and(
|
233
|
+
is_revolute_full_range, jnp.logical_and(s_min <= -π, s_max >= π)
|
234
|
+
),
|
235
|
+
π,
|
236
|
+
s_max,
|
237
|
+
)
|
238
|
+
|
239
|
+
# Shift the lower limit if the upper limit is smaller than +π.
|
240
|
+
s_min = jnp.where(
|
241
|
+
jnp.logical_and(is_revolute_full_range, s_max < π),
|
242
|
+
s_max - 2 * π,
|
243
|
+
s_min,
|
244
|
+
)
|
245
|
+
|
246
|
+
# Shift the upper limit if the lower limit is larger than -π.
|
247
|
+
s_max = jnp.where(
|
248
|
+
jnp.logical_and(is_revolute_full_range, s_min > -π),
|
249
|
+
s_min + 2 * π,
|
250
|
+
s_max,
|
251
|
+
)
|
252
|
+
|
253
|
+
# Sample the joint positions.
|
194
254
|
s_random = jax.random.uniform(
|
195
255
|
minval=s_min,
|
196
256
|
maxval=s_max,
|
@@ -1935,7 +1935,7 @@ def step(
|
|
1935
1935
|
tf_ns = jnp.where(tf_ns >= t0_ns, tf_ns, jnp.array(0, dtype=t0_ns.dtype))
|
1936
1936
|
|
1937
1937
|
jax.lax.cond(
|
1938
|
-
pred=tf_ns
|
1938
|
+
pred=tf_ns < t0_ns,
|
1939
1939
|
true_fun=lambda: jax.debug.print(
|
1940
1940
|
"The simulation time overflowed, resetting simulation time to 0."
|
1941
1941
|
),
|
@@ -175,17 +175,15 @@ def system_velocity_dynamics(
|
|
175
175
|
forces=W_f_Li_terrain,
|
176
176
|
additive=True,
|
177
177
|
)
|
178
|
-
|
179
|
-
|
178
|
+
|
179
|
+
# Get the link forces in inertial representation
|
180
180
|
f_L_total = references.link_forces(model=model, data=data)
|
181
181
|
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
model=model, data=data, joint_forces=joint_forces, link_forces=f_L_total
|
186
|
-
)
|
182
|
+
v̇_WB, s̈ = system_acceleration(
|
183
|
+
model=model, data=data, joint_forces=joint_forces, link_forces=f_L_total
|
184
|
+
)
|
187
185
|
|
188
|
-
return
|
186
|
+
return v̇_WB, s̈, aux_data
|
189
187
|
|
190
188
|
|
191
189
|
def system_acceleration(
|
@@ -196,7 +194,7 @@ def system_acceleration(
|
|
196
194
|
link_forces: jtp.MatrixLike | None = None,
|
197
195
|
) -> tuple[jtp.Vector, jtp.Vector]:
|
198
196
|
"""
|
199
|
-
Compute the system acceleration in
|
197
|
+
Compute the system acceleration in the active representation.
|
200
198
|
|
201
199
|
Args:
|
202
200
|
model: The model to consider.
|
@@ -206,7 +204,7 @@ def system_acceleration(
|
|
206
204
|
The 6D forces to apply to the links expressed in the same representation of data.
|
207
205
|
|
208
206
|
Returns:
|
209
|
-
A tuple containing the base 6D acceleration in
|
207
|
+
A tuple containing the base 6D acceleration in in the active representation
|
210
208
|
and the joint accelerations.
|
211
209
|
"""
|
212
210
|
|
@@ -272,18 +270,15 @@ def system_acceleration(
|
|
272
270
|
)
|
273
271
|
|
274
272
|
# - Joint accelerations: s̈ ∈ ℝⁿ
|
275
|
-
# - Base
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
link_forces=references.link_forces(),
|
285
|
-
)
|
286
|
-
return W_v̇_WB, s̈
|
273
|
+
# - Base acceleration: v̇_WB ∈ ℝ⁶
|
274
|
+
v̇_WB, s̈ = js.model.forward_dynamics_aba(
|
275
|
+
model=model,
|
276
|
+
data=data,
|
277
|
+
joint_forces=references.joint_force_references(model=model),
|
278
|
+
link_forces=references.link_forces(model=model, data=data),
|
279
|
+
)
|
280
|
+
|
281
|
+
return v̇_WB, s̈
|
287
282
|
|
288
283
|
|
289
284
|
@jax.jit
|
@@ -353,7 +348,7 @@ def system_dynamics(
|
|
353
348
|
corresponding derivative, and the dictionary of auxiliary data returned
|
354
349
|
by the system dynamics evaluation.
|
355
350
|
"""
|
356
|
-
|
351
|
+
from jaxsim.rbda.contacts.relaxed_rigid import RelaxedRigidContacts
|
357
352
|
from jaxsim.rbda.contacts.rigid import RigidContacts
|
358
353
|
from jaxsim.rbda.contacts.soft import SoftContacts
|
359
354
|
|
@@ -371,7 +366,7 @@ def system_dynamics(
|
|
371
366
|
case SoftContacts():
|
372
367
|
ode_state_kwargs["tangential_deformation"] = aux_dict["m_dot"]
|
373
368
|
|
374
|
-
case RigidContacts():
|
369
|
+
case RigidContacts() | RelaxedRigidContacts():
|
375
370
|
pass
|
376
371
|
|
377
372
|
case _:
|
@@ -6,6 +6,10 @@ import jax_dataclasses
|
|
6
6
|
import jaxsim.api as js
|
7
7
|
import jaxsim.typing as jtp
|
8
8
|
from jaxsim.rbda import ContactsState
|
9
|
+
from jaxsim.rbda.contacts.relaxed_rigid import (
|
10
|
+
RelaxedRigidContacts,
|
11
|
+
RelaxedRigidContactsState,
|
12
|
+
)
|
9
13
|
from jaxsim.rbda.contacts.rigid import RigidContacts, RigidContactsState
|
10
14
|
from jaxsim.rbda.contacts.soft import SoftContacts, SoftContactsState
|
11
15
|
from jaxsim.utils import JaxsimDataclass
|
@@ -173,6 +177,10 @@ class ODEState(JaxsimDataclass):
|
|
173
177
|
)
|
174
178
|
case RigidContacts():
|
175
179
|
contact = RigidContactsState.build()
|
180
|
+
|
181
|
+
case RelaxedRigidContacts():
|
182
|
+
contact = RelaxedRigidContactsState.build()
|
183
|
+
|
176
184
|
case _:
|
177
185
|
raise ValueError("Unable to determine contact state class prefix.")
|
178
186
|
|
@@ -216,7 +224,9 @@ class ODEState(JaxsimDataclass):
|
|
216
224
|
|
217
225
|
# Get the contact model from the `JaxSimModel`.
|
218
226
|
match contact:
|
219
|
-
case
|
227
|
+
case (
|
228
|
+
SoftContactsState() | RigidContactsState() | RelaxedRigidContactsState()
|
229
|
+
):
|
220
230
|
pass
|
221
231
|
case None:
|
222
232
|
contact = SoftContactsState.zero(model=model)
|
@@ -497,7 +497,7 @@ class ExplicitRungeKutta(Integrator[PyTreeType, PyTreeType], Generic[PyTreeType]
|
|
497
497
|
b: jtp.Matrix,
|
498
498
|
c: jtp.Vector,
|
499
499
|
index_of_solution: jtp.IntLike = 0,
|
500
|
-
) -> [bool, int | None]:
|
500
|
+
) -> tuple[bool, int | None]:
|
501
501
|
"""
|
502
502
|
Check if the Butcher tableau supports the FSAL (first-same-as-last) property.
|
503
503
|
|
@@ -45,7 +45,7 @@ class Inertia:
|
|
45
45
|
M (jtp.Matrix): The 6x6 inertia matrix.
|
46
46
|
|
47
47
|
Returns:
|
48
|
-
|
48
|
+
tuple[jtp.Float, jtp.Vector, jtp.Matrix]: A tuple containing mass, center of mass (3D), and inertia matrix (3x3).
|
49
49
|
|
50
50
|
Raises:
|
51
51
|
ValueError: If the input matrix M has an unexpected shape.
|
@@ -211,7 +211,7 @@ class RodModelToMjcf:
|
|
211
211
|
joints_dict = {j.name: j for j in rod_model.joints()}
|
212
212
|
|
213
213
|
# Convert all the joints not considered to fixed joints.
|
214
|
-
for joint_name in
|
214
|
+
for joint_name in {j.name for j in rod_model.joints()} - considered_joints:
|
215
215
|
joints_dict[joint_name].type = "fixed"
|
216
216
|
|
217
217
|
# Convert the ROD model to URDF.
|
@@ -289,10 +289,10 @@ class RodModelToMjcf:
|
|
289
289
|
mj_model = mj.MjModel.from_xml_string(xml=urdf_string, assets=assets)
|
290
290
|
|
291
291
|
# Get the joint names.
|
292
|
-
mj_joint_names =
|
292
|
+
mj_joint_names = {
|
293
293
|
mj.mj_id2name(mj_model, mj.mjtObj.mjOBJ_JOINT, idx)
|
294
294
|
for idx in range(mj_model.njnt)
|
295
|
-
|
295
|
+
}
|
296
296
|
|
297
297
|
# Check that the Mujoco model only has the considered joints.
|
298
298
|
if mj_joint_names != considered_joints:
|
@@ -394,7 +394,7 @@ class KinematicGraph(Sequence[LinkDescription]):
|
|
394
394
|
return copy.deepcopy(self)
|
395
395
|
|
396
396
|
# Check if all considered joints are part of the full kinematic graph
|
397
|
-
if len(set(considered_joints) -
|
397
|
+
if len(set(considered_joints) - {j.name for j in full_graph.joints}) != 0:
|
398
398
|
extra_j = set(considered_joints) - {j.name for j in full_graph.joints}
|
399
399
|
msg = f"Not all joints to consider are part of the graph ({{{extra_j}}})"
|
400
400
|
raise ValueError(msg)
|
@@ -536,8 +536,8 @@ class KinematicGraph(Sequence[LinkDescription]):
|
|
536
536
|
root_link_name=full_graph.root.name,
|
537
537
|
)
|
538
538
|
|
539
|
-
assert
|
540
|
-
|
539
|
+
assert {f.name for f in self.frames}.isdisjoint(
|
540
|
+
{f.name for f in unconnected_frames + reduced_frames}
|
541
541
|
)
|
542
542
|
|
543
543
|
for link in unconnected_links:
|