jaxsim 0.4.3.dev28__tar.gz → 0.4.3.dev61__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.dev28 → jaxsim-0.4.3.dev61}/PKG-INFO +2 -1
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/environment.yml +1 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/pyproject.toml +2 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/_version.py +2 -2
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/contact.py +27 -1
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/data.py +8 -6
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/model.py +1 -1
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/ode.py +19 -24
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/ode_data.py +11 -1
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/integrators/common.py +1 -1
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/inertia.py +1 -1
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/mujoco/loaders.py +3 -3
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/kinematic_graph.py +3 -3
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/rod/parser.py +18 -14
- jaxsim-0.4.3.dev61/src/jaxsim/rbda/contacts/relaxed_rigid.py +384 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/contacts/rigid.py +11 -41
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/terrain/terrain.py +41 -25
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/typing.py +1 -1
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/utils/jaxsim_dataclass.py +12 -9
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/utils/wrappers.py +1 -1
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim.egg-info/PKG-INFO +2 -1
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim.egg-info/SOURCES.txt +1 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim.egg-info/requires.txt +1 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.devcontainer/Dockerfile +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.devcontainer/devcontainer.json +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.gitattributes +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.github/CODEOWNERS +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.github/workflows/ci_cd.yml +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.github/workflows/read_the_docs.yml +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.github/workflows/update_pixi_lockfile.yml +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.gitignore +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.pre-commit-config.yaml +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/.readthedocs.yaml +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/CONTRIBUTING.md +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/LICENSE +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/README.md +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/Makefile +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/conf.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/examples.rst +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/guide/install.rst +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/index.rst +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/make.bat +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/api.rst +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/integrators.rst +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/math.rst +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/mujoco.rst +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/parsers.rst +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/rbda.rst +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/typing.rst +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/docs/modules/utils.rst +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/examples/.gitattributes +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/examples/.gitignore +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/examples/PD_controller.ipynb +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/examples/Parallel_computing.ipynb +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/examples/README.md +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/examples/assets/cartpole.urdf +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/pixi.lock +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/setup.cfg +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/setup.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/__init__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/__init__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/com.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/common.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/frame.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/joint.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/link.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/api/references.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/exceptions.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/integrators/__init__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/integrators/fixed_step.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/integrators/variable_step.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/logging.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/__init__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/adjoint.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/cross.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/joint_model.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/quaternion.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/rotation.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/skew.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/math/transform.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/mujoco/__init__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/mujoco/__main__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/mujoco/model.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/mujoco/visualizer.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/__init__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/descriptions/collision.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/descriptions/joint.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/descriptions/link.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/descriptions/model.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/rod/__init__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/parsers/rod/utils.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/__init__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/aba.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/collidable_points.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/contacts/__init__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/contacts/common.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/contacts/soft.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/crba.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/forward_kinematics.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/jacobian.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/rnea.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/rbda/utils.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/terrain/__init__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/utils/__init__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim/utils/tracing.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim.egg-info/dependency_links.txt +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/src/jaxsim.egg-info/top_level.txt +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/__init__.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/conftest.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_com.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_contact.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_data.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_frame.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_joint.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_link.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_api_model.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_automatic_differentiation.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_contact.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_exceptions.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_pytree.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/tests/test_simulations.py +0 -0
- {jaxsim-0.4.3.dev28 → jaxsim-0.4.3.dev61}/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.dev61
|
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.dev61'
|
16
|
+
__version_tuple__ = version_tuple = (0, 4, 3, 'dev61')
|
@@ -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
|
|
@@ -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:
|
@@ -223,7 +223,7 @@ def extract_model_data(
|
|
223
223
|
child=links_dict[j.child],
|
224
224
|
jtype=utils.joint_to_joint_type(joint=j),
|
225
225
|
axis=(
|
226
|
-
np.array(j.axis.xyz.xyz)
|
226
|
+
np.array(j.axis.xyz.xyz, dtype=float)
|
227
227
|
if j.axis is not None
|
228
228
|
and j.axis.xyz is not None
|
229
229
|
and j.axis.xyz.xyz is not None
|
@@ -232,39 +232,43 @@ def extract_model_data(
|
|
232
232
|
pose=j.pose.transform() if j.pose is not None else np.eye(4),
|
233
233
|
initial_position=0.0,
|
234
234
|
position_limit=(
|
235
|
-
(
|
236
|
-
|
237
|
-
if j.axis is not None
|
238
|
-
|
235
|
+
float(
|
236
|
+
j.axis.limit.lower
|
237
|
+
if j.axis is not None
|
238
|
+
and j.axis.limit is not None
|
239
|
+
and j.axis.limit.lower is not None
|
240
|
+
else jnp.finfo(float).min
|
239
241
|
),
|
240
|
-
(
|
241
|
-
|
242
|
-
if j.axis is not None
|
243
|
-
|
242
|
+
float(
|
243
|
+
j.axis.limit.upper
|
244
|
+
if j.axis is not None
|
245
|
+
and j.axis.limit is not None
|
246
|
+
and j.axis.limit.upper is not None
|
247
|
+
else jnp.finfo(float).max
|
244
248
|
),
|
245
249
|
),
|
246
|
-
friction_static=(
|
250
|
+
friction_static=float(
|
247
251
|
j.axis.dynamics.friction
|
248
252
|
if j.axis is not None
|
249
253
|
and j.axis.dynamics is not None
|
250
254
|
and j.axis.dynamics.friction is not None
|
251
255
|
else 0.0
|
252
256
|
),
|
253
|
-
friction_viscous=(
|
257
|
+
friction_viscous=float(
|
254
258
|
j.axis.dynamics.damping
|
255
259
|
if j.axis is not None
|
256
260
|
and j.axis.dynamics is not None
|
257
261
|
and j.axis.dynamics.damping is not None
|
258
262
|
else 0.0
|
259
263
|
),
|
260
|
-
position_limit_damper=(
|
264
|
+
position_limit_damper=float(
|
261
265
|
j.axis.limit.dissipation
|
262
266
|
if j.axis is not None
|
263
267
|
and j.axis.limit is not None
|
264
268
|
and j.axis.limit.dissipation is not None
|
265
269
|
else 0.0
|
266
270
|
),
|
267
|
-
position_limit_spring=(
|
271
|
+
position_limit_spring=float(
|
268
272
|
j.axis.limit.stiffness
|
269
273
|
if j.axis is not None
|
270
274
|
and j.axis.limit is not None
|
@@ -273,7 +277,7 @@ def extract_model_data(
|
|
273
277
|
),
|
274
278
|
)
|
275
279
|
for j in sdf_model.joints()
|
276
|
-
if j.type in {"revolute", "prismatic", "fixed"}
|
280
|
+
if j.type in {"revolute", "continuous", "prismatic", "fixed"}
|
277
281
|
and j.parent != "world"
|
278
282
|
and j.child in links_dict.keys()
|
279
283
|
]
|