jaxsim 0.5.1.dev24__tar.gz → 0.5.1.dev37__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.5.1.dev24 → jaxsim-0.5.1.dev37}/PKG-INFO +1 -1
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/examples/jaxsim_as_physics_engine.ipynb +14 -15
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/_version.py +2 -2
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/api/contact.py +2 -14
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/api/data.py +24 -1
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/api/model.py +2 -5
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/contacts/common.py +14 -36
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/contacts/relaxed_rigid.py +1 -33
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/contacts/rigid.py +1 -29
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/contacts/soft.py +3 -37
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/contacts/visco_elastic.py +1 -35
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim.egg-info/PKG-INFO +1 -1
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/test_simulations.py +4 -10
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/.devcontainer/Dockerfile +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/.devcontainer/devcontainer.json +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/.gitattributes +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/.github/CODEOWNERS +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/.github/dependabot.yml +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/.github/workflows/ci_cd.yml +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/.github/workflows/pixi.yml +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/.github/workflows/read_the_docs.yml +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/.gitignore +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/.pre-commit-config.yaml +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/.readthedocs.yaml +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/CONTRIBUTING.md +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/LICENSE +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/README.md +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/Makefile +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/conf.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/examples.rst +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/guide/install.rst +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/index.rst +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/make.bat +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/modules/api.rst +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/modules/integrators.rst +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/modules/math.rst +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/modules/mujoco.rst +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/modules/parsers.rst +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/modules/rbda.rst +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/modules/typing.rst +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/docs/modules/utils.rst +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/environment.yml +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/examples/.gitattributes +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/examples/.gitignore +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/examples/README.md +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/examples/assets/build_cartpole_urdf.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/examples/assets/cartpole.urdf +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/examples/jaxsim_as_multibody_dynamics_library.ipynb +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/examples/jaxsim_for_robot_controllers.ipynb +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/pixi.lock +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/pyproject.toml +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/setup.cfg +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/setup.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/__init__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/api/__init__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/api/com.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/api/common.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/api/frame.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/api/joint.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/api/link.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/api/ode.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/api/ode_data.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/api/references.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/exceptions.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/integrators/__init__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/integrators/common.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/integrators/fixed_step.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/integrators/variable_step.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/logging.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/math/__init__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/math/adjoint.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/math/cross.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/math/inertia.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/math/joint_model.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/math/quaternion.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/math/rotation.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/math/skew.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/math/transform.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/mujoco/__init__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/mujoco/__main__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/mujoco/loaders.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/mujoco/model.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/mujoco/utils.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/mujoco/visualizer.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/parsers/__init__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/parsers/descriptions/collision.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/parsers/descriptions/joint.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/parsers/descriptions/link.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/parsers/descriptions/model.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/parsers/kinematic_graph.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/parsers/rod/__init__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/parsers/rod/meshes.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/parsers/rod/parser.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/parsers/rod/utils.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/__init__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/aba.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/collidable_points.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/contacts/__init__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/crba.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/forward_kinematics.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/jacobian.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/rnea.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/rbda/utils.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/terrain/__init__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/terrain/terrain.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/typing.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/utils/__init__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/utils/tracing.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim/utils/wrappers.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim.egg-info/SOURCES.txt +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim.egg-info/dependency_links.txt +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim.egg-info/requires.txt +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/src/jaxsim.egg-info/top_level.txt +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/__init__.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/conftest.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/test_api_com.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/test_api_contact.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/test_api_data.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/test_api_frame.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/test_api_joint.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/test_api_link.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/test_api_model.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/test_automatic_differentiation.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/test_contact.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/test_exceptions.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/test_meshes.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/test_pytree.py +0 -0
- {jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/tests/utils_idyntree.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: jaxsim
|
3
|
-
Version: 0.5.1.
|
3
|
+
Version: 0.5.1.dev37
|
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>, Filippo Luca Ferretti <filippoluca.ferretti@outlook.com>
|
6
6
|
Maintainer-email: Filippo Luca Ferretti <filippo.ferretti@iit.it>, Alessandro Croci <alessandro.croci@iit.it>
|
@@ -204,27 +204,25 @@
|
|
204
204
|
"with model.editable(validate=False) as model:\n",
|
205
205
|
"\n",
|
206
206
|
" # The SoftContacts class can be replaced with a different contact model.\n",
|
207
|
-
" model.contact_model = jaxsim.rbda.contacts.SoftContacts.build(\n",
|
208
|
-
"
|
209
|
-
"
|
210
|
-
"
|
211
|
-
"
|
212
|
-
"
|
213
|
-
"
|
214
|
-
"
|
215
|
-
"
|
216
|
-
"
|
207
|
+
" model.contact_model = jaxsim.rbda.contacts.SoftContacts.build()\n",
|
208
|
+
"\n",
|
209
|
+
"# JaxSim provides the following helper that estimates good contact\n",
|
210
|
+
"# parameters. While they might not be optimal, usually are a good\n",
|
211
|
+
"# starting point. Users are encouraged to fine-tune them.\n",
|
212
|
+
"contacts_params = js.contact.estimate_good_contact_parameters(\n",
|
213
|
+
" model=model,\n",
|
214
|
+
" number_of_active_collidable_points_steady_state=4,\n",
|
215
|
+
" max_penetration=0.001,\n",
|
216
|
+
")\n",
|
217
217
|
"\n",
|
218
218
|
"# Print the contact parameters.\n",
|
219
219
|
"# Note that these parameters are the nominal parameters shared among\n",
|
220
220
|
"# all parallel instances. If needed, they can be overridden in the\n",
|
221
221
|
"# vectorized data object that will be created later.\n",
|
222
|
-
"print(
|
222
|
+
"print(contacts_params)\n",
|
223
223
|
"\n",
|
224
224
|
"# Update the data object with the new contact model parameters.\n",
|
225
|
-
"data_single = data_single.replace(
|
226
|
-
" contacts_params=model.contact_model.parameters, validate=False\n",
|
227
|
-
")"
|
225
|
+
"data_single = data_single.replace(contacts_params=contacts_params, validate=False)"
|
228
226
|
]
|
229
227
|
},
|
230
228
|
{
|
@@ -297,6 +295,7 @@
|
|
297
295
|
" base_pos_bounds=([0, 0, 0.3], [0, 0, 0.6]),\n",
|
298
296
|
" base_vel_lin_bounds=(0, 0),\n",
|
299
297
|
" base_vel_ang_bounds=(0, 0),\n",
|
298
|
+
" contacts_params=contacts_params,\n",
|
300
299
|
" )\n",
|
301
300
|
")(jnp.vstack(subkeys))\n",
|
302
301
|
"\n",
|
@@ -455,7 +454,7 @@
|
|
455
454
|
"toc_visible": true
|
456
455
|
},
|
457
456
|
"kernelspec": {
|
458
|
-
"display_name": "
|
457
|
+
"display_name": "rsl",
|
459
458
|
"language": "python",
|
460
459
|
"name": "python3"
|
461
460
|
},
|
@@ -12,5 +12,5 @@ __version__: str
|
|
12
12
|
__version_tuple__: VERSION_TUPLE
|
13
13
|
version_tuple: VERSION_TUPLE
|
14
14
|
|
15
|
-
__version__ = version = '0.5.1.
|
16
|
-
__version_tuple__ = version_tuple = (0, 5, 1, '
|
15
|
+
__version__ = version = '0.5.1.dev37'
|
16
|
+
__version_tuple__ = version_tuple = (0, 5, 1, 'dev37')
|
@@ -374,13 +374,7 @@ def estimate_good_contact_parameters(
|
|
374
374
|
max_penetration=max_δ,
|
375
375
|
number_of_active_collidable_points_steady_state=nc,
|
376
376
|
damping_ratio=damping_ratio,
|
377
|
-
**
|
378
|
-
dict(
|
379
|
-
p=model.contact_model.parameters.p,
|
380
|
-
q=model.contact_model.parameters.q,
|
381
|
-
)
|
382
|
-
| kwargs
|
383
|
-
),
|
377
|
+
**kwargs,
|
384
378
|
)
|
385
379
|
|
386
380
|
case contacts.ViscoElasticContacts():
|
@@ -394,13 +388,7 @@ def estimate_good_contact_parameters(
|
|
394
388
|
max_penetration=max_δ,
|
395
389
|
number_of_active_collidable_points_steady_state=nc,
|
396
390
|
damping_ratio=damping_ratio,
|
397
|
-
**
|
398
|
-
dict(
|
399
|
-
p=model.contact_model.parameters.p,
|
400
|
-
q=model.contact_model.parameters.q,
|
401
|
-
)
|
402
|
-
| kwargs
|
403
|
-
),
|
391
|
+
**kwargs,
|
404
392
|
)
|
405
393
|
)
|
406
394
|
|
@@ -230,7 +230,7 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
|
|
230
230
|
)
|
231
231
|
|
232
232
|
else:
|
233
|
-
contacts_params = model.contact_model.
|
233
|
+
contacts_params = model.contact_model._parameters_class()
|
234
234
|
|
235
235
|
return JaxSimModelData(
|
236
236
|
state=ode_state,
|
@@ -775,6 +775,7 @@ def random_model_data(
|
|
775
775
|
jtp.FloatLike | Sequence[jtp.FloatLike],
|
776
776
|
jtp.FloatLike | Sequence[jtp.FloatLike],
|
777
777
|
] = (-1.0, 1.0),
|
778
|
+
contacts_params: jaxsim.rbda.contacts.ContactsParams | None = None,
|
778
779
|
standard_gravity_bounds: tuple[jtp.FloatLike, jtp.FloatLike] = (
|
779
780
|
jaxsim.math.StandardGravity,
|
780
781
|
jaxsim.math.StandardGravity,
|
@@ -797,6 +798,7 @@ def random_model_data(
|
|
797
798
|
base_vel_lin_bounds: The bounds for the base linear velocity.
|
798
799
|
base_vel_ang_bounds: The bounds for the base angular velocity.
|
799
800
|
joint_vel_bounds: The bounds for the joint velocities.
|
801
|
+
contacts_params: The parameters of the contact model.
|
800
802
|
standard_gravity_bounds: The bounds for the standard gravity.
|
801
803
|
|
802
804
|
Returns:
|
@@ -886,4 +888,25 @@ def random_model_data(
|
|
886
888
|
)
|
887
889
|
)
|
888
890
|
|
891
|
+
if contacts_params is None:
|
892
|
+
|
893
|
+
if isinstance(
|
894
|
+
model.contact_model,
|
895
|
+
jaxsim.rbda.contacts.SoftContacts
|
896
|
+
| jaxsim.rbda.contacts.ViscoElasticContacts,
|
897
|
+
):
|
898
|
+
|
899
|
+
random_data = random_data.replace(
|
900
|
+
contacts_params=js.contact.estimate_good_contact_parameters(
|
901
|
+
model=model, standard_gravity=random_data.gravity
|
902
|
+
),
|
903
|
+
validate=False,
|
904
|
+
)
|
905
|
+
|
906
|
+
else:
|
907
|
+
random_data = random_data.replace(
|
908
|
+
contacts_params=model.contact_model._parameters_class(),
|
909
|
+
validate=False,
|
910
|
+
)
|
911
|
+
|
889
912
|
return random_data
|
@@ -41,8 +41,7 @@ class JaxSimModel(JaxsimDataclass):
|
|
41
41
|
)
|
42
42
|
|
43
43
|
# Note that this is the default contact model.
|
44
|
-
|
45
|
-
contact_model: jaxsim.rbda.contacts.ContactModel | None = dataclasses.field(
|
44
|
+
contact_model: Static[jaxsim.rbda.contacts.ContactModel | None] = dataclasses.field(
|
46
45
|
default=None, repr=False
|
47
46
|
)
|
48
47
|
|
@@ -235,9 +234,7 @@ class JaxSimModel(JaxsimDataclass):
|
|
235
234
|
contact_model = (
|
236
235
|
contact_model
|
237
236
|
if contact_model is not None
|
238
|
-
else jaxsim.rbda.contacts.SoftContacts.build(
|
239
|
-
terrain=terrain, parameters=None
|
240
|
-
)
|
237
|
+
else jaxsim.rbda.contacts.SoftContacts.build()
|
241
238
|
)
|
242
239
|
|
243
240
|
# Build the integrator if not provided.
|
@@ -95,30 +95,17 @@ class ContactsParams(JaxsimDataclass):
|
|
95
95
|
class ContactModel(JaxsimDataclass):
|
96
96
|
"""
|
97
97
|
Abstract class representing a contact model.
|
98
|
-
|
99
|
-
Attributes:
|
100
|
-
parameters: The parameters of the contact model.
|
101
|
-
terrain: The considered terrain.
|
102
98
|
"""
|
103
99
|
|
104
|
-
parameters: ContactsParams
|
105
|
-
terrain: jaxsim.terrain.Terrain
|
106
|
-
|
107
100
|
@classmethod
|
108
101
|
@abc.abstractmethod
|
109
102
|
def build(
|
110
103
|
cls: type[Self],
|
111
|
-
parameters: ContactsParams,
|
112
|
-
terrain: jaxsim.terrain.Terrain,
|
113
104
|
**kwargs,
|
114
105
|
) -> Self:
|
115
106
|
"""
|
116
107
|
Create a `ContactModel` instance with specified parameters.
|
117
108
|
|
118
|
-
Args:
|
119
|
-
parameters: The parameters of the contact model.
|
120
|
-
terrain: The considered terrain.
|
121
|
-
|
122
109
|
Returns:
|
123
110
|
The `ContactModel` instance.
|
124
111
|
"""
|
@@ -304,30 +291,21 @@ class ContactModel(JaxsimDataclass):
|
|
304
291
|
|
305
292
|
return {}
|
306
293
|
|
307
|
-
|
308
|
-
|
309
|
-
model: js.model.JaxSimModel,
|
310
|
-
data: js.data.JaxSimModelData,
|
311
|
-
validate: bool = True,
|
312
|
-
) -> tuple[js.model.JaxSimModel, js.data.JaxSimModelData]:
|
294
|
+
@property
|
295
|
+
def _parameters_class(cls) -> type[ContactsParams]:
|
313
296
|
"""
|
314
|
-
|
315
|
-
|
316
|
-
Args:
|
317
|
-
model: The robot model considered by the contact model.
|
318
|
-
data: The data of the considered robot model.
|
319
|
-
validate:
|
320
|
-
Whether to validate if the model and data objects have been
|
321
|
-
initialized with the current contact model.
|
297
|
+
Return the class of the contact parameters.
|
322
298
|
|
323
299
|
Returns:
|
324
|
-
The
|
300
|
+
The class of the contact parameters.
|
325
301
|
"""
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
302
|
+
import importlib
|
303
|
+
|
304
|
+
return getattr(
|
305
|
+
importlib.import_module("jaxsim.rbda.contacts"),
|
306
|
+
(
|
307
|
+
cls.__name__ + "Params"
|
308
|
+
if isinstance(cls, type)
|
309
|
+
else cls.__class__.__name__ + "Params"
|
310
|
+
),
|
311
|
+
)
|
@@ -12,9 +12,7 @@ import optax
|
|
12
12
|
import jaxsim.api as js
|
13
13
|
import jaxsim.rbda.contacts
|
14
14
|
import jaxsim.typing as jtp
|
15
|
-
from jaxsim import logging
|
16
15
|
from jaxsim.api.common import ModelDataWithVelocityRepresentation, VelRepr
|
17
|
-
from jaxsim.terrain.terrain import FlatTerrain, Terrain
|
18
16
|
|
19
17
|
from . import common
|
20
18
|
|
@@ -180,14 +178,6 @@ class RelaxedRigidContactsParams(common.ContactsParams):
|
|
180
178
|
class RelaxedRigidContacts(common.ContactModel):
|
181
179
|
"""Relaxed rigid contacts model."""
|
182
180
|
|
183
|
-
parameters: RelaxedRigidContactsParams = dataclasses.field(
|
184
|
-
default_factory=RelaxedRigidContactsParams.build
|
185
|
-
)
|
186
|
-
|
187
|
-
terrain: jax_dataclasses.Static[Terrain] = dataclasses.field(
|
188
|
-
default_factory=FlatTerrain.build
|
189
|
-
)
|
190
|
-
|
191
181
|
_solver_options_keys: jax_dataclasses.Static[tuple[str, ...]] = dataclasses.field(
|
192
182
|
default=("tol", "maxiter", "memory_size"), kw_only=True
|
193
183
|
)
|
@@ -209,8 +199,6 @@ class RelaxedRigidContacts(common.ContactModel):
|
|
209
199
|
@classmethod
|
210
200
|
def build(
|
211
201
|
cls: type[Self],
|
212
|
-
parameters: RelaxedRigidContactsParams | None = None,
|
213
|
-
terrain: Terrain | None = None,
|
214
202
|
solver_options: dict[str, Any] | None = None,
|
215
203
|
**kwargs,
|
216
204
|
) -> Self:
|
@@ -218,17 +206,12 @@ class RelaxedRigidContacts(common.ContactModel):
|
|
218
206
|
Create a `RelaxedRigidContacts` instance with specified parameters.
|
219
207
|
|
220
208
|
Args:
|
221
|
-
parameters: The parameters of the rigid contacts model.
|
222
|
-
terrain: The considered terrain.
|
223
209
|
solver_options: The options to pass to the L-BFGS solver.
|
224
210
|
|
225
211
|
Returns:
|
226
212
|
The `RelaxedRigidContacts` instance.
|
227
213
|
"""
|
228
214
|
|
229
|
-
if len(kwargs) != 0:
|
230
|
-
logging.debug(msg=f"Ignoring extra arguments: {kwargs}")
|
231
|
-
|
232
215
|
# Get the default solver options.
|
233
216
|
default_solver_options = dict(
|
234
217
|
zip(cls._solver_options_keys, cls._solver_options_values, strict=True)
|
@@ -250,18 +233,9 @@ class RelaxedRigidContacts(common.ContactModel):
|
|
250
233
|
) from exc
|
251
234
|
|
252
235
|
return cls(
|
253
|
-
parameters=(
|
254
|
-
parameters
|
255
|
-
if parameters is not None
|
256
|
-
else cls.__dataclass_fields__["parameters"].default_factory()
|
257
|
-
),
|
258
|
-
terrain=(
|
259
|
-
terrain
|
260
|
-
if terrain is not None
|
261
|
-
else cls.__dataclass_fields__["terrain"].default_factory()
|
262
|
-
),
|
263
236
|
_solver_options_keys=tuple(solver_options.keys()),
|
264
237
|
_solver_options_values=tuple(solver_options.values()),
|
238
|
+
**kwargs,
|
265
239
|
)
|
266
240
|
|
267
241
|
@jax.jit
|
@@ -289,12 +263,6 @@ class RelaxedRigidContacts(common.ContactModel):
|
|
289
263
|
A tuple containing as first element the computed contact forces.
|
290
264
|
"""
|
291
265
|
|
292
|
-
# Initialize the model and data this contact model is operating on.
|
293
|
-
# This will raise an exception if either the contact model or the
|
294
|
-
# contact parameters are not compatible.
|
295
|
-
model, data = self.initialize_model_and_data(model=model, data=data)
|
296
|
-
assert isinstance(data.contacts_params, RelaxedRigidContactsParams)
|
297
|
-
|
298
266
|
link_forces = jnp.atleast_2d(
|
299
267
|
jnp.array(link_forces, dtype=float).squeeze()
|
300
268
|
if link_forces is not None
|
@@ -11,7 +11,6 @@ import jaxsim.api as js
|
|
11
11
|
import jaxsim.typing as jtp
|
12
12
|
from jaxsim import logging
|
13
13
|
from jaxsim.api.common import ModelDataWithVelocityRepresentation, VelRepr
|
14
|
-
from jaxsim.terrain import FlatTerrain, Terrain
|
15
14
|
|
16
15
|
from . import common
|
17
16
|
from .common import ContactModel, ContactsParams
|
@@ -92,14 +91,6 @@ class RigidContactsParams(ContactsParams):
|
|
92
91
|
class RigidContacts(ContactModel):
|
93
92
|
"""Rigid contacts model."""
|
94
93
|
|
95
|
-
parameters: RigidContactsParams = dataclasses.field(
|
96
|
-
default_factory=RigidContactsParams
|
97
|
-
)
|
98
|
-
|
99
|
-
terrain: jax_dataclasses.Static[Terrain] = dataclasses.field(
|
100
|
-
default_factory=FlatTerrain.build
|
101
|
-
)
|
102
|
-
|
103
94
|
regularization_delassus: jax_dataclasses.Static[float] = dataclasses.field(
|
104
95
|
default=1e-6, kw_only=True
|
105
96
|
)
|
@@ -125,8 +116,6 @@ class RigidContacts(ContactModel):
|
|
125
116
|
@classmethod
|
126
117
|
def build(
|
127
118
|
cls: type[Self],
|
128
|
-
parameters: RigidContactsParams | None = None,
|
129
|
-
terrain: Terrain | None = None,
|
130
119
|
regularization_delassus: jtp.FloatLike | None = None,
|
131
120
|
solver_options: dict[str, Any] | None = None,
|
132
121
|
**kwargs,
|
@@ -135,8 +124,6 @@ class RigidContacts(ContactModel):
|
|
135
124
|
Create a `RigidContacts` instance with specified parameters.
|
136
125
|
|
137
126
|
Args:
|
138
|
-
parameters: The parameters of the rigid contacts model.
|
139
|
-
terrain: The considered terrain.
|
140
127
|
regularization_delassus:
|
141
128
|
The regularization term to add to the diagonal of the Delassus matrix.
|
142
129
|
solver_options: The options to pass to the QP solver.
|
@@ -169,16 +156,6 @@ class RigidContacts(ContactModel):
|
|
169
156
|
) from exc
|
170
157
|
|
171
158
|
return cls(
|
172
|
-
parameters=(
|
173
|
-
parameters
|
174
|
-
if parameters is not None
|
175
|
-
else cls.__dataclass_fields__["parameters"].default_factory()
|
176
|
-
),
|
177
|
-
terrain=(
|
178
|
-
terrain
|
179
|
-
if terrain is not None
|
180
|
-
else cls.__dataclass_fields__["terrain"].default_factory()
|
181
|
-
),
|
182
159
|
regularization_delassus=float(
|
183
160
|
regularization_delassus
|
184
161
|
if regularization_delassus is not None
|
@@ -186,6 +163,7 @@ class RigidContacts(ContactModel):
|
|
186
163
|
),
|
187
164
|
_solver_options_keys=tuple(solver_options.keys()),
|
188
165
|
_solver_options_values=tuple(solver_options.values()),
|
166
|
+
**kwargs,
|
189
167
|
)
|
190
168
|
|
191
169
|
@staticmethod
|
@@ -276,12 +254,6 @@ class RigidContacts(ContactModel):
|
|
276
254
|
A tuple containing as first element the computed contact forces.
|
277
255
|
"""
|
278
256
|
|
279
|
-
# Initialize the model and data this contact model is operating on.
|
280
|
-
# This will raise an exception if either the contact model or the
|
281
|
-
# contact parameters are not compatible.
|
282
|
-
model, data = self.initialize_model_and_data(model=model, data=data)
|
283
|
-
assert isinstance(data.contacts_params, RigidContactsParams)
|
284
|
-
|
285
257
|
# Import qpax privately just in this method.
|
286
258
|
import qpax
|
287
259
|
|
@@ -12,7 +12,7 @@ import jaxsim.math
|
|
12
12
|
import jaxsim.typing as jtp
|
13
13
|
from jaxsim import logging
|
14
14
|
from jaxsim.math import StandardGravity
|
15
|
-
from jaxsim.terrain import
|
15
|
+
from jaxsim.terrain import Terrain
|
16
16
|
|
17
17
|
from . import common
|
18
18
|
|
@@ -194,19 +194,9 @@ class SoftContactsParams(common.ContactsParams):
|
|
194
194
|
class SoftContacts(common.ContactModel):
|
195
195
|
"""Soft contacts model."""
|
196
196
|
|
197
|
-
parameters: SoftContactsParams = dataclasses.field(
|
198
|
-
default_factory=SoftContactsParams.build
|
199
|
-
)
|
200
|
-
|
201
|
-
terrain: jax_dataclasses.Static[Terrain] = dataclasses.field(
|
202
|
-
default_factory=FlatTerrain.build
|
203
|
-
)
|
204
|
-
|
205
197
|
@classmethod
|
206
198
|
def build(
|
207
199
|
cls: type[Self],
|
208
|
-
parameters: SoftContactsParams | None = None,
|
209
|
-
terrain: Terrain | None = None,
|
210
200
|
model: js.model.JaxSimModel | None = None,
|
211
201
|
**kwargs,
|
212
202
|
) -> Self:
|
@@ -214,8 +204,6 @@ class SoftContacts(common.ContactModel):
|
|
214
204
|
Create a `SoftContacts` instance with specified parameters.
|
215
205
|
|
216
206
|
Args:
|
217
|
-
parameters: The parameters of the soft contacts model.
|
218
|
-
terrain: The considered terrain.
|
219
207
|
model:
|
220
208
|
The robot model considered by the contact model.
|
221
209
|
If passed, it is used to estimate good default parameters.
|
@@ -227,24 +215,7 @@ class SoftContacts(common.ContactModel):
|
|
227
215
|
if len(kwargs) != 0:
|
228
216
|
logging.debug(msg=f"Ignoring extra arguments: {kwargs}")
|
229
217
|
|
230
|
-
|
231
|
-
# good default parameters, if passed. Users can later override these default
|
232
|
-
# parameters with their own values -- possibly tuned better.
|
233
|
-
if parameters is None:
|
234
|
-
parameters = (
|
235
|
-
SoftContactsParams.build_default_from_jaxsim_model(model=model)
|
236
|
-
if model is not None
|
237
|
-
else cls.__dataclass_fields__["parameters"].default_factory()
|
238
|
-
)
|
239
|
-
|
240
|
-
return cls(
|
241
|
-
parameters=parameters,
|
242
|
-
terrain=(
|
243
|
-
terrain
|
244
|
-
if terrain is not None
|
245
|
-
else cls.__dataclass_fields__["terrain"].default_factory()
|
246
|
-
),
|
247
|
-
)
|
218
|
+
return cls(**kwargs)
|
248
219
|
|
249
220
|
@classmethod
|
250
221
|
def zero_state_variables(cls, model: js.model.JaxSimModel) -> dict[str, jtp.Array]:
|
@@ -422,9 +393,9 @@ class SoftContacts(common.ContactModel):
|
|
422
393
|
|
423
394
|
return W_f, ṁ
|
424
395
|
|
396
|
+
@staticmethod
|
425
397
|
@jax.jit
|
426
398
|
def compute_contact_forces(
|
427
|
-
self,
|
428
399
|
model: js.model.JaxSimModel,
|
429
400
|
data: js.data.JaxSimModelData,
|
430
401
|
) -> tuple[jtp.Matrix, dict[str, jtp.PyTree]]:
|
@@ -440,11 +411,6 @@ class SoftContacts(common.ContactModel):
|
|
440
411
|
second element a dictionary with derivative of the material deformation.
|
441
412
|
"""
|
442
413
|
|
443
|
-
# Initialize the model and data this contact model is operating on.
|
444
|
-
# This will raise an exception if either the contact model or the
|
445
|
-
# contact parameters are not compatible.
|
446
|
-
model, data = self.initialize_model_and_data(model=model, data=data)
|
447
|
-
|
448
414
|
# Get the indices of the enabled collidable points.
|
449
415
|
indices_of_enabled_collidable_points = (
|
450
416
|
model.kin_dyn_parameters.contact_parameters.indices_of_enabled_collidable_points
|
@@ -15,7 +15,7 @@ import jaxsim.typing as jtp
|
|
15
15
|
from jaxsim import logging
|
16
16
|
from jaxsim.api.common import ModelDataWithVelocityRepresentation
|
17
17
|
from jaxsim.math import StandardGravity
|
18
|
-
from jaxsim.terrain import
|
18
|
+
from jaxsim.terrain import Terrain
|
19
19
|
|
20
20
|
from . import common
|
21
21
|
from .soft import SoftContacts, SoftContactsParams
|
@@ -188,21 +188,11 @@ class ViscoElasticContactsParams(common.ContactsParams):
|
|
188
188
|
class ViscoElasticContacts(common.ContactModel):
|
189
189
|
"""Visco-elastic contacts model."""
|
190
190
|
|
191
|
-
parameters: ViscoElasticContactsParams = dataclasses.field(
|
192
|
-
default_factory=ViscoElasticContactsParams
|
193
|
-
)
|
194
|
-
|
195
|
-
terrain: jax_dataclasses.Static[Terrain] = dataclasses.field(
|
196
|
-
default_factory=FlatTerrain
|
197
|
-
)
|
198
|
-
|
199
191
|
max_squarings: jax_dataclasses.Static[int] = dataclasses.field(default=25)
|
200
192
|
|
201
193
|
@classmethod
|
202
194
|
def build(
|
203
195
|
cls: type[Self],
|
204
|
-
parameters: SoftContactsParams | None = None,
|
205
|
-
terrain: Terrain | None = None,
|
206
196
|
model: js.model.JaxSimModel | None = None,
|
207
197
|
max_squarings: jtp.IntLike | None = None,
|
208
198
|
**kwargs,
|
@@ -211,8 +201,6 @@ class ViscoElasticContacts(common.ContactModel):
|
|
211
201
|
Create a `ViscoElasticContacts` instance with specified parameters.
|
212
202
|
|
213
203
|
Args:
|
214
|
-
parameters: The parameters of the soft contacts model.
|
215
|
-
terrain: The considered terrain.
|
216
204
|
model:
|
217
205
|
The robot model considered by the contact model.
|
218
206
|
If passed, it is used to estimate good default parameters.
|
@@ -226,23 +214,7 @@ class ViscoElasticContacts(common.ContactModel):
|
|
226
214
|
if len(kwargs) != 0:
|
227
215
|
logging.debug(msg=f"Ignoring extra arguments: {kwargs}")
|
228
216
|
|
229
|
-
# Build the contact parameters if not provided. Use the model to estimate
|
230
|
-
# good default parameters, if passed. Users can later override these default
|
231
|
-
# parameters with their own values -- possibly tuned better.
|
232
|
-
if parameters is None:
|
233
|
-
parameters = (
|
234
|
-
ViscoElasticContactsParams.build_default_from_jaxsim_model(model=model)
|
235
|
-
if model is not None
|
236
|
-
else cls.__dataclass_fields__["parameters"].default_factory()
|
237
|
-
)
|
238
|
-
|
239
217
|
return cls(
|
240
|
-
parameters=parameters,
|
241
|
-
terrain=(
|
242
|
-
terrain
|
243
|
-
if terrain is not None
|
244
|
-
else cls.__dataclass_fields__["terrain"].default_factory()
|
245
|
-
),
|
246
218
|
max_squarings=int(
|
247
219
|
max_squarings
|
248
220
|
if max_squarings is not None
|
@@ -301,12 +273,6 @@ class ViscoElasticContacts(common.ContactModel):
|
|
301
273
|
a dictionary of optional additional information.
|
302
274
|
"""
|
303
275
|
|
304
|
-
# Initialize the model and data this contact model is operating on.
|
305
|
-
# This will raise an exception if either the contact model or the
|
306
|
-
# contact parameters are not compatible.
|
307
|
-
model, data = self.initialize_model_and_data(model=model, data=data)
|
308
|
-
assert isinstance(data.contacts_params, ViscoElasticContactsParams)
|
309
|
-
|
310
276
|
# Extract the indices corresponding to the enabled collidable points.
|
311
277
|
indices_of_enabled_collidable_points = (
|
312
278
|
model.kin_dyn_parameters.contact_parameters.indices_of_enabled_collidable_points
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: jaxsim
|
3
|
-
Version: 0.5.1.
|
3
|
+
Version: 0.5.1.dev37
|
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>, Filippo Luca Ferretti <filippoluca.ferretti@outlook.com>
|
6
6
|
Maintainer-email: Filippo Luca Ferretti <filippo.ferretti@iit.it>, Alessandro Croci <alessandro.croci@iit.it>
|
@@ -209,9 +209,7 @@ def test_simulation_with_soft_contacts(
|
|
209
209
|
|
210
210
|
with model.editable(validate=False) as model:
|
211
211
|
|
212
|
-
model.contact_model = jaxsim.rbda.contacts.SoftContacts.build(
|
213
|
-
terrain=model.terrain,
|
214
|
-
)
|
212
|
+
model.contact_model = jaxsim.rbda.contacts.SoftContacts.build()
|
215
213
|
# Enable a subset of the collidable points.
|
216
214
|
enabled_collidable_points_mask = np.zeros(
|
217
215
|
len(model.kin_dyn_parameters.contact_parameters.body), dtype=bool
|
@@ -261,9 +259,7 @@ def test_simulation_with_visco_elastic_contacts(
|
|
261
259
|
|
262
260
|
with model.editable(validate=False) as model:
|
263
261
|
|
264
|
-
model.contact_model = jaxsim.rbda.contacts.ViscoElasticContacts.build(
|
265
|
-
terrain=model.terrain,
|
266
|
-
)
|
262
|
+
model.contact_model = jaxsim.rbda.contacts.ViscoElasticContacts.build()
|
267
263
|
|
268
264
|
# Initialize the maximum penetration of each collidable point at steady state.
|
269
265
|
max_penetration = 0.001
|
@@ -304,8 +300,6 @@ def test_simulation_with_rigid_contacts(
|
|
304
300
|
with model.editable(validate=False) as model:
|
305
301
|
|
306
302
|
model.contact_model = jaxsim.rbda.contacts.RigidContacts.build(
|
307
|
-
terrain=model.terrain,
|
308
|
-
parameters=jaxsim.rbda.contacts.RigidContactsParams.build(K=0.0),
|
309
303
|
solver_options={"solver_tol": 1e-3},
|
310
304
|
)
|
311
305
|
# Enable a subset of the collidable points.
|
@@ -358,8 +352,6 @@ def test_simulation_with_relaxed_rigid_contacts(
|
|
358
352
|
with model.editable(validate=False) as model:
|
359
353
|
|
360
354
|
model.contact_model = jaxsim.rbda.contacts.RelaxedRigidContacts.build(
|
361
|
-
terrain=model.terrain,
|
362
|
-
parameters=jaxsim.rbda.contacts.RelaxedRigidContactsParams.build(mu=0.001),
|
363
355
|
solver_options={"tol": 1e-3},
|
364
356
|
)
|
365
357
|
# Enable a subset of the collidable points.
|
@@ -390,8 +382,10 @@ def test_simulation_with_relaxed_rigid_contacts(
|
|
390
382
|
# gets broken if it is updated in the future.
|
391
383
|
contacts_params=js.contact.estimate_good_contact_parameters(
|
392
384
|
model=model,
|
385
|
+
static_friction_coefficient=0.001,
|
393
386
|
),
|
394
387
|
)
|
388
|
+
|
395
389
|
# ===========================================
|
396
390
|
# Run the simulation and test the final state
|
397
391
|
# ===========================================
|
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
|
{jaxsim-0.5.1.dev24 → jaxsim-0.5.1.dev37}/examples/jaxsim_as_multibody_dynamics_library.ipynb
RENAMED
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
|