jaxsim 0.4.3.dev155__tar.gz → 0.4.3.dev159__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.dev155 → jaxsim-0.4.3.dev159}/PKG-INFO +1 -1
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/_version.py +2 -2
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/contact.py +0 -1
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/contacts/common.py +8 -2
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/contacts/relaxed_rigid.py +52 -22
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/contacts/rigid.py +55 -9
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim.egg-info/PKG-INFO +1 -1
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.devcontainer/Dockerfile +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.devcontainer/devcontainer.json +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.gitattributes +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.github/CODEOWNERS +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.github/workflows/ci_cd.yml +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.github/workflows/read_the_docs.yml +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.github/workflows/update_pixi_lockfile.yml +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.gitignore +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.pre-commit-config.yaml +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/.readthedocs.yaml +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/CONTRIBUTING.md +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/LICENSE +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/README.md +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/Makefile +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/conf.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/examples.rst +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/guide/install.rst +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/index.rst +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/make.bat +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/api.rst +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/integrators.rst +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/math.rst +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/mujoco.rst +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/parsers.rst +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/rbda.rst +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/typing.rst +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/docs/modules/utils.rst +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/environment.yml +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/examples/.gitattributes +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/examples/.gitignore +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/examples/PD_controller.ipynb +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/examples/Parallel_computing.ipynb +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/examples/README.md +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/examples/assets/cartpole.urdf +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/pixi.lock +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/pyproject.toml +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/setup.cfg +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/setup.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/__init__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/__init__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/com.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/common.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/data.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/frame.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/joint.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/link.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/model.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/ode.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/ode_data.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/api/references.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/exceptions.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/integrators/__init__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/integrators/common.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/integrators/fixed_step.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/integrators/variable_step.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/logging.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/__init__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/adjoint.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/cross.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/inertia.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/joint_model.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/quaternion.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/rotation.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/skew.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/math/transform.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/mujoco/__init__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/mujoco/__main__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/mujoco/loaders.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/mujoco/model.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/mujoco/visualizer.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/__init__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/descriptions/collision.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/descriptions/joint.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/descriptions/link.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/descriptions/model.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/kinematic_graph.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/rod/__init__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/rod/parser.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/parsers/rod/utils.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/__init__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/aba.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/collidable_points.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/contacts/__init__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/contacts/soft.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/crba.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/forward_kinematics.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/jacobian.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/rnea.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/rbda/utils.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/terrain/__init__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/terrain/terrain.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/typing.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/utils/__init__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/utils/tracing.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim/utils/wrappers.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim.egg-info/SOURCES.txt +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim.egg-info/dependency_links.txt +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim.egg-info/requires.txt +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/src/jaxsim.egg-info/top_level.txt +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/__init__.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/conftest.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_com.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_contact.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_data.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_frame.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_joint.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_link.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_api_model.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_automatic_differentiation.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_contact.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_exceptions.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_pytree.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/tests/test_simulations.py +0 -0
- {jaxsim-0.4.3.dev155 → jaxsim-0.4.3.dev159}/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.dev159
|
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>
|
@@ -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.dev159'
|
16
|
+
__version_tuple__ = version_tuple = (0, 4, 3, 'dev159')
|
@@ -17,6 +17,12 @@ except ImportError:
|
|
17
17
|
class ContactsParams(JaxsimDataclass):
|
18
18
|
"""
|
19
19
|
Abstract class representing the parameters of a contact model.
|
20
|
+
|
21
|
+
Note:
|
22
|
+
This class is supposed to store only the tunable parameters of the contact
|
23
|
+
model, i.e. all those parameters that can be changed during runtime.
|
24
|
+
If the contact model has also static parameters, they should be stored
|
25
|
+
in the corresponding `ContactModel` class.
|
20
26
|
"""
|
21
27
|
|
22
28
|
@classmethod
|
@@ -47,7 +53,7 @@ class ContactModel(JaxsimDataclass):
|
|
47
53
|
|
48
54
|
Attributes:
|
49
55
|
parameters: The parameters of the contact model.
|
50
|
-
terrain: The terrain
|
56
|
+
terrain: The considered terrain.
|
51
57
|
"""
|
52
58
|
|
53
59
|
parameters: ContactsParams
|
@@ -85,7 +91,7 @@ class ContactModel(JaxsimDataclass):
|
|
85
91
|
Compute the contact forces.
|
86
92
|
|
87
93
|
Args:
|
88
|
-
model: The model
|
94
|
+
model: The robot model considered by the contact model.
|
89
95
|
data: The data of the considered model.
|
90
96
|
|
91
97
|
Returns:
|
@@ -78,16 +78,6 @@ class RelaxedRigidContactsParams(ContactsParams):
|
|
78
78
|
default_factory=lambda: jnp.array(0.5, dtype=float)
|
79
79
|
)
|
80
80
|
|
81
|
-
# Maximum number of iterations
|
82
|
-
max_iterations: jtp.Int = dataclasses.field(
|
83
|
-
default_factory=lambda: jnp.array(50, dtype=int)
|
84
|
-
)
|
85
|
-
|
86
|
-
# Solver tolerance
|
87
|
-
tolerance: jtp.Float = dataclasses.field(
|
88
|
-
default_factory=lambda: jnp.array(1e-6, dtype=float)
|
89
|
-
)
|
90
|
-
|
91
81
|
def __hash__(self) -> int:
|
92
82
|
from jaxsim.utils.wrappers import HashedNumpyArray
|
93
83
|
|
@@ -103,8 +93,6 @@ class RelaxedRigidContactsParams(ContactsParams):
|
|
103
93
|
HashedNumpyArray(self.stiffness),
|
104
94
|
HashedNumpyArray(self.damping),
|
105
95
|
HashedNumpyArray(self.mu),
|
106
|
-
HashedNumpyArray(self.max_iterations),
|
107
|
-
HashedNumpyArray(self.tolerance),
|
108
96
|
)
|
109
97
|
)
|
110
98
|
|
@@ -125,8 +113,6 @@ class RelaxedRigidContactsParams(ContactsParams):
|
|
125
113
|
stiffness: jtp.FloatLike | None = None,
|
126
114
|
damping: jtp.FloatLike | None = None,
|
127
115
|
mu: jtp.FloatLike | None = None,
|
128
|
-
max_iterations: jtp.IntLike | None = None,
|
129
|
-
tolerance: jtp.FloatLike | None = None,
|
130
116
|
) -> Self:
|
131
117
|
"""Create a `RelaxedRigidContactsParams` instance"""
|
132
118
|
|
@@ -152,8 +138,6 @@ class RelaxedRigidContactsParams(ContactsParams):
|
|
152
138
|
and jnp.all(self.midpoint >= 0.0)
|
153
139
|
and jnp.all(self.power >= 0.0)
|
154
140
|
and jnp.all(self.mu >= 0.0)
|
155
|
-
and jnp.all(self.max_iterations > 0)
|
156
|
-
and jnp.all(self.tolerance > 0.0)
|
157
141
|
)
|
158
142
|
|
159
143
|
|
@@ -169,11 +153,30 @@ class RelaxedRigidContacts(ContactModel):
|
|
169
153
|
default_factory=FlatTerrain.build
|
170
154
|
)
|
171
155
|
|
156
|
+
_solver_options_keys: jax_dataclasses.Static[tuple[str, ...]] = dataclasses.field(
|
157
|
+
default=("tol", "maxiter", "memory_size"), kw_only=True
|
158
|
+
)
|
159
|
+
_solver_options_values: jax_dataclasses.Static[tuple[Any, ...]] = dataclasses.field(
|
160
|
+
default=(1e-6, 50, 10), kw_only=True
|
161
|
+
)
|
162
|
+
|
163
|
+
@property
|
164
|
+
def solver_options(self) -> dict[str, Any]:
|
165
|
+
|
166
|
+
return dict(
|
167
|
+
zip(
|
168
|
+
self._solver_options_keys,
|
169
|
+
self._solver_options_values,
|
170
|
+
strict=True,
|
171
|
+
)
|
172
|
+
)
|
173
|
+
|
172
174
|
@classmethod
|
173
175
|
def build(
|
174
176
|
cls: type[Self],
|
175
177
|
parameters: RelaxedRigidContactsParams | None = None,
|
176
178
|
terrain: Terrain | None = None,
|
179
|
+
solver_options: dict[str, Any] | None = None,
|
177
180
|
**kwargs,
|
178
181
|
) -> Self:
|
179
182
|
"""
|
@@ -182,6 +185,7 @@ class RelaxedRigidContacts(ContactModel):
|
|
182
185
|
Args:
|
183
186
|
parameters: The parameters of the rigid contacts model.
|
184
187
|
terrain: The considered terrain.
|
188
|
+
solver_options: The options to pass to the L-BFGS solver.
|
185
189
|
|
186
190
|
Returns:
|
187
191
|
The `RelaxedRigidContacts` instance.
|
@@ -190,11 +194,31 @@ class RelaxedRigidContacts(ContactModel):
|
|
190
194
|
if len(kwargs) != 0:
|
191
195
|
logging.debug(msg=f"Ignoring extra arguments: {kwargs}")
|
192
196
|
|
197
|
+
# Get the default solver options.
|
198
|
+
default_solver_options = dict(
|
199
|
+
zip(cls._solver_options_keys, cls._solver_options_values, strict=True)
|
200
|
+
)
|
201
|
+
|
202
|
+
# Create the solver options to set by combining the default solver options
|
203
|
+
# with the user-provided solver options.
|
204
|
+
solver_options = default_solver_options | (solver_options or {})
|
205
|
+
|
206
|
+
# Make sure that the solver options are hashable.
|
207
|
+
# We need to check this because the solver options are static.
|
208
|
+
try:
|
209
|
+
hash(tuple(solver_options.values()))
|
210
|
+
except TypeError as exc:
|
211
|
+
raise ValueError(
|
212
|
+
"The values of the solver options must be hashable."
|
213
|
+
) from exc
|
214
|
+
|
193
215
|
return cls(
|
194
216
|
parameters=(
|
195
217
|
parameters or cls.__dataclass_fields__["parameters"].default_factory()
|
196
218
|
),
|
197
219
|
terrain=terrain or cls.__dataclass_fields__["terrain"].default_factory(),
|
220
|
+
_solver_options_keys=tuple(solver_options.keys()),
|
221
|
+
_solver_options_values=tuple(solver_options.values()),
|
198
222
|
)
|
199
223
|
|
200
224
|
@jax.jit
|
@@ -357,17 +381,23 @@ class RelaxedRigidContacts(ContactModel):
|
|
357
381
|
+ D[:, jnp.newaxis] * velocity
|
358
382
|
).flatten()
|
359
383
|
|
360
|
-
#
|
384
|
+
# Get the solver options.
|
385
|
+
solver_options = self.solver_options
|
386
|
+
|
387
|
+
# Extract the options corresponding to the convergence criteria.
|
388
|
+
# All the remaining options are passed to the solver.
|
389
|
+
tol = solver_options.pop("tol")
|
390
|
+
maxiter = solver_options.pop("maxiter")
|
391
|
+
|
392
|
+
# Compute the 3D linear force in C[W] frame.
|
361
393
|
CW_f_Ci, _ = run_optimization(
|
362
394
|
init_params=init_params,
|
363
395
|
A=A,
|
364
396
|
b=b,
|
365
|
-
maxiter=
|
366
|
-
opt=optax.lbfgs(
|
367
|
-
memory_size=10,
|
368
|
-
),
|
397
|
+
maxiter=maxiter,
|
398
|
+
opt=optax.lbfgs(**solver_options),
|
369
399
|
fun=objective,
|
370
|
-
tol=
|
400
|
+
tol=tol,
|
371
401
|
)
|
372
402
|
|
373
403
|
CW_f_Ci = CW_f_Ci.reshape((-1, 3))
|
@@ -91,11 +91,35 @@ class RigidContacts(ContactModel):
|
|
91
91
|
default_factory=FlatTerrain.build
|
92
92
|
)
|
93
93
|
|
94
|
+
regularization_delassus: jax_dataclasses.Static[float] = dataclasses.field(
|
95
|
+
default=1e-6, kw_only=True
|
96
|
+
)
|
97
|
+
|
98
|
+
_solver_options_keys: jax_dataclasses.Static[tuple[str, ...]] = dataclasses.field(
|
99
|
+
default=("solver_tol",), kw_only=True
|
100
|
+
)
|
101
|
+
_solver_options_values: jax_dataclasses.Static[tuple[Any, ...]] = dataclasses.field(
|
102
|
+
default=(1e-3,), kw_only=True
|
103
|
+
)
|
104
|
+
|
105
|
+
@property
|
106
|
+
def solver_options(self) -> dict[str, Any]:
|
107
|
+
|
108
|
+
return dict(
|
109
|
+
zip(
|
110
|
+
self._solver_options_keys,
|
111
|
+
self._solver_options_values,
|
112
|
+
strict=True,
|
113
|
+
)
|
114
|
+
)
|
115
|
+
|
94
116
|
@classmethod
|
95
117
|
def build(
|
96
118
|
cls: type[Self],
|
97
119
|
parameters: RigidContactsParams | None = None,
|
98
120
|
terrain: Terrain | None = None,
|
121
|
+
regularization_delassus: jtp.FloatLike | None = None,
|
122
|
+
solver_options: dict[str, Any] | None = None,
|
99
123
|
**kwargs,
|
100
124
|
) -> Self:
|
101
125
|
"""
|
@@ -104,6 +128,9 @@ class RigidContacts(ContactModel):
|
|
104
128
|
Args:
|
105
129
|
parameters: The parameters of the rigid contacts model.
|
106
130
|
terrain: The considered terrain.
|
131
|
+
regularization_delassus:
|
132
|
+
The regularization term to add to the diagonal of the Delassus matrix.
|
133
|
+
solver_options: The options to pass to the QP solver.
|
107
134
|
|
108
135
|
Returns:
|
109
136
|
The `RigidContacts` instance.
|
@@ -112,11 +139,35 @@ class RigidContacts(ContactModel):
|
|
112
139
|
if len(kwargs) != 0:
|
113
140
|
logging.debug(msg=f"Ignoring extra arguments: {kwargs}")
|
114
141
|
|
142
|
+
# Get the default solver options.
|
143
|
+
default_solver_options = dict(
|
144
|
+
zip(cls._solver_options_keys, cls._solver_options_values, strict=True)
|
145
|
+
)
|
146
|
+
|
147
|
+
# Create the solver options to set by combining the default solver options
|
148
|
+
# with the user-provided solver options.
|
149
|
+
solver_options = default_solver_options | (solver_options or {})
|
150
|
+
|
151
|
+
# Make sure that the solver options are hashable.
|
152
|
+
# We need to check this because the solver options are static.
|
153
|
+
try:
|
154
|
+
hash(tuple(solver_options.values()))
|
155
|
+
except TypeError as exc:
|
156
|
+
raise ValueError(
|
157
|
+
"The values of the solver options must be hashable."
|
158
|
+
) from exc
|
159
|
+
|
115
160
|
return cls(
|
116
161
|
parameters=(
|
117
162
|
parameters or cls.__dataclass_fields__["parameters"].default_factory()
|
118
163
|
),
|
119
164
|
terrain=terrain or cls.__dataclass_fields__["terrain"].default_factory(),
|
165
|
+
regularization_delassus=float(
|
166
|
+
regularization_delassus
|
167
|
+
or cls.__dataclass_fields__["regularization_delassus"].default
|
168
|
+
),
|
169
|
+
_solver_options_keys=tuple(solver_options.keys()),
|
170
|
+
_solver_options_values=tuple(solver_options.values()),
|
120
171
|
)
|
121
172
|
|
122
173
|
@staticmethod
|
@@ -230,8 +281,6 @@ class RigidContacts(ContactModel):
|
|
230
281
|
*,
|
231
282
|
link_forces: jtp.MatrixLike | None = None,
|
232
283
|
joint_force_references: jtp.VectorLike | None = None,
|
233
|
-
regularization_term: jtp.FloatLike = 1e-6,
|
234
|
-
solver_tol: jtp.FloatLike = 1e-3,
|
235
284
|
) -> tuple[jtp.Vector, tuple[Any, ...]]:
|
236
285
|
"""
|
237
286
|
Compute the contact forces.
|
@@ -244,10 +293,6 @@ class RigidContacts(ContactModel):
|
|
244
293
|
expressed in the same representation of data.
|
245
294
|
joint_force_references:
|
246
295
|
Optional `(n_joints,)` vector of joint forces.
|
247
|
-
regularization_term:
|
248
|
-
The regularization term to add to the diagonal of the Delassus
|
249
|
-
matrix for better numerical conditioning.
|
250
|
-
solver_tol: The convergence tolerance to consider in the QP solver.
|
251
296
|
|
252
297
|
Returns:
|
253
298
|
A tuple containing the contact forces.
|
@@ -296,10 +341,11 @@ class RigidContacts(ContactModel):
|
|
296
341
|
terrain_height=terrain_height,
|
297
342
|
)
|
298
343
|
|
344
|
+
# Compute the Delassus matrix.
|
299
345
|
delassus_matrix = RigidContacts._delassus_matrix(M=M, J_WC=J_WC)
|
300
346
|
|
301
|
-
# Add regularization for better numerical conditioning
|
302
|
-
delassus_matrix = delassus_matrix +
|
347
|
+
# Add regularization for better numerical conditioning.
|
348
|
+
delassus_matrix = delassus_matrix + self.regularization_delassus * jnp.eye(
|
303
349
|
delassus_matrix.shape[0]
|
304
350
|
)
|
305
351
|
|
@@ -359,7 +405,7 @@ class RigidContacts(ContactModel):
|
|
359
405
|
|
360
406
|
# Solve the optimization problem
|
361
407
|
solution, *_ = qpax.solve_qp(
|
362
|
-
Q=Q, q=q, A=A, b=b, G=G, h=h_bounds,
|
408
|
+
Q=Q, q=q, A=A, b=b, G=G, h=h_bounds, **self.solver_options
|
363
409
|
)
|
364
410
|
|
365
411
|
f_C_lin = solution.reshape(-1, 3)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: jaxsim
|
3
|
-
Version: 0.4.3.
|
3
|
+
Version: 0.4.3.dev159
|
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>
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|