jaxsim 0.5.1.dev4__tar.gz → 0.5.1.dev15__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.dev4 → jaxsim-0.5.1.dev15}/PKG-INFO +1 -1
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/examples/jaxsim_as_multibody_dynamics_library.ipynb +112 -33
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/pyproject.toml +3 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/_version.py +2 -2
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/api/frame.py +52 -2
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/api/kin_dyn_parameters.py +10 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/api/model.py +11 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim.egg-info/PKG-INFO +1 -1
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/conftest.py +49 -1
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/test_api_frame.py +6 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/.devcontainer/Dockerfile +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/.devcontainer/devcontainer.json +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/.gitattributes +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/.github/CODEOWNERS +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/.github/dependabot.yml +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/.github/workflows/ci_cd.yml +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/.github/workflows/pixi.yml +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/.github/workflows/read_the_docs.yml +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/.gitignore +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/.pre-commit-config.yaml +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/.readthedocs.yaml +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/CONTRIBUTING.md +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/LICENSE +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/README.md +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/Makefile +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/conf.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/examples.rst +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/guide/install.rst +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/index.rst +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/make.bat +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/modules/api.rst +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/modules/integrators.rst +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/modules/math.rst +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/modules/mujoco.rst +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/modules/parsers.rst +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/modules/rbda.rst +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/modules/typing.rst +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/docs/modules/utils.rst +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/environment.yml +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/examples/.gitattributes +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/examples/.gitignore +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/examples/README.md +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/examples/assets/build_cartpole_urdf.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/examples/assets/cartpole.urdf +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/examples/jaxsim_as_physics_engine.ipynb +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/examples/jaxsim_for_robot_controllers.ipynb +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/pixi.lock +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/setup.cfg +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/setup.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/__init__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/api/__init__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/api/com.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/api/common.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/api/contact.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/api/data.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/api/joint.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/api/link.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/api/ode.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/api/ode_data.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/api/references.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/exceptions.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/integrators/__init__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/integrators/common.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/integrators/fixed_step.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/integrators/variable_step.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/logging.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/math/__init__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/math/adjoint.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/math/cross.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/math/inertia.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/math/joint_model.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/math/quaternion.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/math/rotation.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/math/skew.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/math/transform.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/mujoco/__init__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/mujoco/__main__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/mujoco/loaders.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/mujoco/model.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/mujoco/utils.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/mujoco/visualizer.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/parsers/__init__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/parsers/descriptions/collision.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/parsers/descriptions/joint.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/parsers/descriptions/link.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/parsers/descriptions/model.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/parsers/kinematic_graph.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/parsers/rod/__init__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/parsers/rod/meshes.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/parsers/rod/parser.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/parsers/rod/utils.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/__init__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/aba.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/collidable_points.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/contacts/__init__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/contacts/common.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/contacts/relaxed_rigid.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/contacts/rigid.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/contacts/soft.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/contacts/visco_elastic.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/crba.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/forward_kinematics.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/jacobian.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/rnea.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/rbda/utils.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/terrain/__init__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/terrain/terrain.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/typing.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/utils/__init__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/utils/tracing.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim/utils/wrappers.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim.egg-info/SOURCES.txt +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim.egg-info/dependency_links.txt +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim.egg-info/requires.txt +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/src/jaxsim.egg-info/top_level.txt +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/__init__.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/test_api_com.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/test_api_contact.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/test_api_data.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/test_api_joint.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/test_api_link.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/test_api_model.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/test_automatic_differentiation.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/test_contact.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/test_exceptions.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/test_meshes.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/test_pytree.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/tests/test_simulations.py +0 -0
- {jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/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.dev15
|
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>
|
{jaxsim-0.5.1.dev4 → jaxsim-0.5.1.dev15}/examples/jaxsim_as_multibody_dynamics_library.ipynb
RENAMED
@@ -320,12 +320,18 @@
|
|
320
320
|
"\n",
|
321
321
|
"- **`jaxsim.api.model`**: vectorized functions operating on the whole model.\n",
|
322
322
|
"- **`jaxsim.api.link`**: functions operating on individual links.\n",
|
323
|
+
"- **`jaxsim.api.frame`**: functions operating on individual frames. \n",
|
323
324
|
"\n",
|
324
|
-
"Due to JAX limitations on vectorizable data types, many APIs operate on indices instead of names. Since using indices can be error prone, JaxSim provides conversion functions:\n",
|
325
|
+
"Due to JAX limitations on vectorizable data types, many APIs operate on indices instead of names. Since using indices can be error prone, JaxSim provides conversion functions for both links:\n",
|
325
326
|
"\n",
|
326
327
|
"- **jaxsim.api.link.names_to_idxs()**\n",
|
327
328
|
"- **jaxsim.api.link.idxs_to_names()**\n",
|
328
329
|
"\n",
|
330
|
+
"and frames: \n",
|
331
|
+
"\n",
|
332
|
+
"- **jaxsim.api.frame.names_to_idxs()**\n",
|
333
|
+
"- **jaxsim.api.frame.idxs_to_names()**\n",
|
334
|
+
"\n",
|
329
335
|
"We recommend using names whenever possible to avoid hard-to-trace errors.\n"
|
330
336
|
]
|
331
337
|
},
|
@@ -354,7 +360,7 @@
|
|
354
360
|
},
|
355
361
|
"outputs": [],
|
356
362
|
"source": [
|
357
|
-
"# @title Pose\n",
|
363
|
+
"# @title Link Pose\n",
|
358
364
|
"\n",
|
359
365
|
"# Compute its pose w.r.t. the world frame through forward kinematics.\n",
|
360
366
|
"W_H_L = js.link.transform(model=model, data=data, link_index=link_index)\n",
|
@@ -380,7 +386,7 @@
|
|
380
386
|
},
|
381
387
|
"outputs": [],
|
382
388
|
"source": [
|
383
|
-
"# @title 6D Velocity\n",
|
389
|
+
"# @title Link 6D Velocity\n",
|
384
390
|
"\n",
|
385
391
|
"# JaxSim allows to select the so-called representation of the frame velocity.\n",
|
386
392
|
"L_v_WL = js.link.velocity(model=model, data=data, link_index=link_index, output_vel_repr=VelRepr.Body)\n",
|
@@ -413,10 +419,87 @@
|
|
413
419
|
]
|
414
420
|
},
|
415
421
|
{
|
416
|
-
"cell_type": "
|
422
|
+
"cell_type": "code",
|
423
|
+
"execution_count": null,
|
417
424
|
"metadata": {
|
418
425
|
"id": "SSoziCShtwZ9"
|
419
426
|
},
|
427
|
+
"outputs": [],
|
428
|
+
"source": [
|
429
|
+
"# Find the index of a frame.\n",
|
430
|
+
"frame_name = \"l_foot_front\"\n",
|
431
|
+
"frame_index = js.frame.name_to_idx(model=model, frame_name=frame_name)"
|
432
|
+
]
|
433
|
+
},
|
434
|
+
{
|
435
|
+
"cell_type": "code",
|
436
|
+
"execution_count": null,
|
437
|
+
"metadata": {
|
438
|
+
"colab": {
|
439
|
+
"base_uri": "https://localhost:8080/"
|
440
|
+
},
|
441
|
+
"id": "fVp_xP_1twZ9",
|
442
|
+
"outputId": "cfaa0569-d768-4708-c98c-a5867c056d04"
|
443
|
+
},
|
444
|
+
"outputs": [],
|
445
|
+
"source": [
|
446
|
+
"# @title Frame Pose\n",
|
447
|
+
"\n",
|
448
|
+
"# Compute its pose w.r.t. the world frame through forward kinematics.\n",
|
449
|
+
"W_H_F = js.frame.transform(model=model, data=data, frame_index=frame_index)\n",
|
450
|
+
"\n",
|
451
|
+
"print(f\"Transform of '{frame_name}': shape={W_H_F.shape}\\n{W_H_F}\")"
|
452
|
+
]
|
453
|
+
},
|
454
|
+
{
|
455
|
+
"cell_type": "code",
|
456
|
+
"execution_count": null,
|
457
|
+
"metadata": {
|
458
|
+
"id": "QqaqxneEFYiW"
|
459
|
+
},
|
460
|
+
"outputs": [],
|
461
|
+
"source": [
|
462
|
+
"# @title Frame 6D Velocity\n",
|
463
|
+
"\n",
|
464
|
+
"# JaxSim allows to select the so-called representation of the frame velocity.\n",
|
465
|
+
"F_v_WF = js.frame.velocity(model=model, data=data, frame_index=frame_index, output_vel_repr=VelRepr.Body)\n",
|
466
|
+
"FW_v_WF = js.frame.velocity(model=model, data=data, frame_index=frame_index, output_vel_repr=VelRepr.Mixed)\n",
|
467
|
+
"W_v_WF = js.frame.velocity(model=model, data=data, frame_index=frame_index, output_vel_repr=VelRepr.Inertial)\n",
|
468
|
+
"\n",
|
469
|
+
"print(f\"Body-fixed velocity F_v_WF={F_v_WF}\")\n",
|
470
|
+
"print(f\"Mixed velocity: FW_v_WF={FW_v_WF}\")\n",
|
471
|
+
"print(f\"Inertial-fixed velocity: W_v_WF={W_v_WF}\")\n",
|
472
|
+
"\n",
|
473
|
+
"# These can also be computed passing through the frame free-floating Jacobian.\n",
|
474
|
+
"# This type of Jacobian has a input velocity representation that corresponds\n",
|
475
|
+
"# the velocity representation of ν, and an output velocity representation that\n",
|
476
|
+
"# corresponds to the velocity representation of the desired 6D velocity.\n",
|
477
|
+
"\n",
|
478
|
+
"# You can use the following context manager to easily switch between representations.\n",
|
479
|
+
"with data.switch_velocity_representation(VelRepr.Body):\n",
|
480
|
+
"\n",
|
481
|
+
" # Body-fixed generalized velocity.\n",
|
482
|
+
" B_ν = data.generalized_velocity()\n",
|
483
|
+
"\n",
|
484
|
+
" # Free-floating Jacobian accepting a body-fixed generalized velocity and\n",
|
485
|
+
" # returning an inertial-fixed link velocity.\n",
|
486
|
+
" W_J_WF_B = js.frame.jacobian(\n",
|
487
|
+
" model=model, data=data, frame_index=frame_index, output_vel_repr=VelRepr.Inertial\n",
|
488
|
+
" )\n",
|
489
|
+
"\n",
|
490
|
+
"# Now the following relation should hold.\n",
|
491
|
+
"assert jnp.allclose(W_v_WF, W_J_WF_B @ B_ν)"
|
492
|
+
]
|
493
|
+
},
|
494
|
+
{
|
495
|
+
"cell_type": "markdown",
|
496
|
+
"metadata": {
|
497
|
+
"colab": {
|
498
|
+
"base_uri": "https://localhost:8080/"
|
499
|
+
},
|
500
|
+
"id": "d_vp6D74GoVZ",
|
501
|
+
"outputId": "798b9283-792e-4339-b56c-df2595fac974"
|
502
|
+
},
|
420
503
|
"source": [
|
421
504
|
"## Robot Dynamics\n",
|
422
505
|
"\n",
|
@@ -460,11 +543,7 @@
|
|
460
543
|
"cell_type": "code",
|
461
544
|
"execution_count": null,
|
462
545
|
"metadata": {
|
463
|
-
"
|
464
|
-
"base_uri": "https://localhost:8080/"
|
465
|
-
},
|
466
|
-
"id": "fVp_xP_1twZ9",
|
467
|
-
"outputId": "cfaa0569-d768-4708-c98c-a5867c056d04"
|
546
|
+
"id": "oOKJOVfsH4Ki"
|
468
547
|
},
|
469
548
|
"outputs": [],
|
470
549
|
"source": [
|
@@ -509,7 +588,11 @@
|
|
509
588
|
{
|
510
589
|
"cell_type": "markdown",
|
511
590
|
"metadata": {
|
512
|
-
"
|
591
|
+
"colab": {
|
592
|
+
"base_uri": "https://localhost:8080/"
|
593
|
+
},
|
594
|
+
"id": "FlNo8dNWKKtu",
|
595
|
+
"outputId": "313e939b-f88f-4407-c9ee-b5b3b7443061"
|
513
596
|
},
|
514
597
|
"source": [
|
515
598
|
"### Forward Dynamics\n",
|
@@ -530,11 +613,7 @@
|
|
530
613
|
"cell_type": "code",
|
531
614
|
"execution_count": null,
|
532
615
|
"metadata": {
|
533
|
-
"
|
534
|
-
"base_uri": "https://localhost:8080/"
|
535
|
-
},
|
536
|
-
"id": "d_vp6D74GoVZ",
|
537
|
-
"outputId": "798b9283-792e-4339-b56c-df2595fac974"
|
616
|
+
"id": "LXARuRu1Ly1K"
|
538
617
|
},
|
539
618
|
"outputs": [],
|
540
619
|
"source": [
|
@@ -554,7 +633,11 @@
|
|
554
633
|
{
|
555
634
|
"cell_type": "markdown",
|
556
635
|
"metadata": {
|
557
|
-
"
|
636
|
+
"colab": {
|
637
|
+
"base_uri": "https://localhost:8080/"
|
638
|
+
},
|
639
|
+
"id": "g5GOYXDnLySU",
|
640
|
+
"outputId": "ad4ce77d-d06f-473a-9c32-040680d76aa5"
|
558
641
|
},
|
559
642
|
"source": [
|
560
643
|
"### Inverse Dynamics\n",
|
@@ -575,11 +658,7 @@
|
|
575
658
|
"cell_type": "code",
|
576
659
|
"execution_count": null,
|
577
660
|
"metadata": {
|
578
|
-
"
|
579
|
-
"base_uri": "https://localhost:8080/"
|
580
|
-
},
|
581
|
-
"id": "FlNo8dNWKKtu",
|
582
|
-
"outputId": "313e939b-f88f-4407-c9ee-b5b3b7443061"
|
661
|
+
"id": "UTae5MjhaP2H"
|
583
662
|
},
|
584
663
|
"outputs": [],
|
585
664
|
"source": [
|
@@ -604,7 +683,11 @@
|
|
604
683
|
{
|
605
684
|
"cell_type": "markdown",
|
606
685
|
"metadata": {
|
607
|
-
"
|
686
|
+
"colab": {
|
687
|
+
"base_uri": "https://localhost:8080/"
|
688
|
+
},
|
689
|
+
"id": "gYZ1jK1Neg1H",
|
690
|
+
"outputId": "0de79770-1e18-4027-bb47-5713bc1b4a72"
|
608
691
|
},
|
609
692
|
"source": [
|
610
693
|
"### Centroidal Dynamics\n",
|
@@ -656,11 +739,7 @@
|
|
656
739
|
"cell_type": "code",
|
657
740
|
"execution_count": null,
|
658
741
|
"metadata": {
|
659
|
-
"
|
660
|
-
"base_uri": "https://localhost:8080/"
|
661
|
-
},
|
662
|
-
"id": "g5GOYXDnLySU",
|
663
|
-
"outputId": "ad4ce77d-d06f-473a-9c32-040680d76aa5"
|
742
|
+
"id": "rrSfxp8lh9YZ"
|
664
743
|
},
|
665
744
|
"outputs": [],
|
666
745
|
"source": [
|
@@ -716,7 +795,11 @@
|
|
716
795
|
{
|
717
796
|
"cell_type": "markdown",
|
718
797
|
"metadata": {
|
719
|
-
"
|
798
|
+
"colab": {
|
799
|
+
"base_uri": "https://localhost:8080/"
|
800
|
+
},
|
801
|
+
"id": "Ot6HePB_twaE",
|
802
|
+
"outputId": "02a6abae-257e-45ee-e9de-6a607cdbeb9a"
|
720
803
|
},
|
721
804
|
"source": [
|
722
805
|
"## Contact Frames\n",
|
@@ -746,11 +829,7 @@
|
|
746
829
|
"cell_type": "code",
|
747
830
|
"execution_count": null,
|
748
831
|
"metadata": {
|
749
|
-
"
|
750
|
-
"base_uri": "https://localhost:8080/"
|
751
|
-
},
|
752
|
-
"id": "gYZ1jK1Neg1H",
|
753
|
-
"outputId": "0de79770-1e18-4027-bb47-5713bc1b4a72"
|
832
|
+
"id": "LITRC3STliKR"
|
754
833
|
},
|
755
834
|
"outputs": [],
|
756
835
|
"source": [
|
@@ -268,3 +268,6 @@ cuda-version = "12.*"
|
|
268
268
|
# Pinning a specific version awaiting the following to get addressed:
|
269
269
|
# https://github.com/conda-forge/jaxlib-feedstock/issues/285
|
270
270
|
jaxlib = { version = "<0.4.31", build = "*cuda*" }
|
271
|
+
|
272
|
+
[tool.pixi.feature.gpu.tasks]
|
273
|
+
gpu-tests = { cmd = "pytest --gpu-only", depends_on = ["pipcheck"] }
|
@@ -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.dev15'
|
16
|
+
__version_tuple__ = version_tuple = (0, 5, 1, 'dev15')
|
@@ -58,7 +58,7 @@ def name_to_idx(model: js.model.JaxSimModel, *, frame_name: str) -> jtp.Int:
|
|
58
58
|
The index of the frame.
|
59
59
|
"""
|
60
60
|
|
61
|
-
if frame_name not in model.
|
61
|
+
if frame_name not in model.frame_names():
|
62
62
|
raise ValueError(f"Frame '{frame_name}' not found in the model.")
|
63
63
|
|
64
64
|
return (
|
@@ -180,6 +180,56 @@ def transform(
|
|
180
180
|
return W_H_L @ L_H_F
|
181
181
|
|
182
182
|
|
183
|
+
@functools.partial(jax.jit, static_argnames=["output_vel_repr"])
|
184
|
+
def velocity(
|
185
|
+
model: js.model.JaxSimModel,
|
186
|
+
data: js.data.JaxSimModelData,
|
187
|
+
*,
|
188
|
+
frame_index: jtp.IntLike,
|
189
|
+
output_vel_repr: VelRepr | None = None,
|
190
|
+
) -> jtp.Vector:
|
191
|
+
"""
|
192
|
+
Compute the 6D velocity of the frame.
|
193
|
+
|
194
|
+
Args:
|
195
|
+
model: The model to consider.
|
196
|
+
data: The data of the considered model.
|
197
|
+
frame_index: The index of the frame.
|
198
|
+
output_vel_repr:
|
199
|
+
The output velocity representation of the frame velocity.
|
200
|
+
|
201
|
+
Returns:
|
202
|
+
The 6D velocity of the frame in the specified velocity representation.
|
203
|
+
"""
|
204
|
+
n_l = model.number_of_links()
|
205
|
+
n_f = model.number_of_frames()
|
206
|
+
|
207
|
+
exceptions.raise_value_error_if(
|
208
|
+
condition=jnp.array([frame_index < n_l, frame_index >= n_l + n_f]).any(),
|
209
|
+
msg="Invalid frame index '{idx}'",
|
210
|
+
idx=frame_index,
|
211
|
+
)
|
212
|
+
|
213
|
+
output_vel_repr = (
|
214
|
+
output_vel_repr if output_vel_repr is not None else data.velocity_representation
|
215
|
+
)
|
216
|
+
|
217
|
+
# Get the frame jacobian having I as input representation (taken from data)
|
218
|
+
# and O as output representation, specified by the user (or taken from data).
|
219
|
+
O_J_WF_I = jacobian(
|
220
|
+
model=model,
|
221
|
+
data=data,
|
222
|
+
frame_index=frame_index,
|
223
|
+
output_vel_repr=output_vel_repr,
|
224
|
+
)
|
225
|
+
|
226
|
+
# Get the generalized velocity in the input velocity representation.
|
227
|
+
I_ν = data.generalized_velocity()
|
228
|
+
|
229
|
+
# Compute the frame velocity in the output velocity representation.
|
230
|
+
return O_J_WF_I @ I_ν
|
231
|
+
|
232
|
+
|
183
233
|
@functools.partial(jax.jit, static_argnames=["output_vel_repr"])
|
184
234
|
def jacobian(
|
185
235
|
model: js.model.JaxSimModel,
|
@@ -207,7 +257,7 @@ def jacobian(
|
|
207
257
|
"""
|
208
258
|
|
209
259
|
n_l = model.number_of_links()
|
210
|
-
n_f =
|
260
|
+
n_f = model.number_of_frames()
|
211
261
|
|
212
262
|
exceptions.raise_value_error_if(
|
213
263
|
condition=jnp.array([frame_index < n_l, frame_index >= n_l + n_f]).any(),
|
@@ -268,6 +268,16 @@ class KynDynParameters(JaxsimDataclass):
|
|
268
268
|
|
269
269
|
return len(self.joint_model.joint_names) - 1
|
270
270
|
|
271
|
+
def number_of_frames(self) -> int:
|
272
|
+
"""
|
273
|
+
Return the number of frames of the model.
|
274
|
+
|
275
|
+
Returns:
|
276
|
+
The number of frames of the model.
|
277
|
+
"""
|
278
|
+
|
279
|
+
return len(self.frame_parameters.name)
|
280
|
+
|
271
281
|
def support_body_array(self, link_index: jtp.IntLike) -> jtp.Vector:
|
272
282
|
r"""
|
273
283
|
Return the support parent array :math:`\kappa(i)` of a link.
|
@@ -327,6 +327,17 @@ class JaxSimModel(JaxsimDataclass):
|
|
327
327
|
|
328
328
|
return self.kin_dyn_parameters.number_of_joints()
|
329
329
|
|
330
|
+
def number_of_frames(self) -> int:
|
331
|
+
"""
|
332
|
+
Return the number of frames in the model.
|
333
|
+
|
334
|
+
Returns:
|
335
|
+
The number of frames in the model.
|
336
|
+
|
337
|
+
"""
|
338
|
+
|
339
|
+
return self.kin_dyn_parameters.number_of_frames()
|
340
|
+
|
330
341
|
# =================
|
331
342
|
# Base link methods
|
332
343
|
# =================
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: jaxsim
|
3
|
-
Version: 0.5.1.
|
3
|
+
Version: 0.5.1.dev15
|
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>
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import os
|
2
2
|
import pathlib
|
3
|
+
import subprocess
|
3
4
|
|
4
5
|
import jax
|
5
6
|
import pytest
|
@@ -11,7 +12,45 @@ import jaxsim
|
|
11
12
|
import jaxsim.api as js
|
12
13
|
|
13
14
|
|
14
|
-
def
|
15
|
+
def pytest_addoption(parser):
|
16
|
+
parser.addoption(
|
17
|
+
"--gpu-only",
|
18
|
+
action="store_true",
|
19
|
+
default=False,
|
20
|
+
help="Run tests only if GPU is available and utilized",
|
21
|
+
)
|
22
|
+
|
23
|
+
|
24
|
+
def check_gpu_usage():
|
25
|
+
# Set environment variable to prioritize GPU.
|
26
|
+
os.environ["JAX_PLATFORM_NAME"] = "gpu"
|
27
|
+
|
28
|
+
# Run a simple JAX operation
|
29
|
+
x = jax.device_put(jax.numpy.ones((512, 512)))
|
30
|
+
y = jax.device_put(jax.numpy.ones((512, 512)))
|
31
|
+
_ = jax.numpy.dot(x, y).block_until_ready()
|
32
|
+
|
33
|
+
# Check GPU memory usage with nvidia-smi.
|
34
|
+
result = subprocess.run(
|
35
|
+
["nvidia-smi", "--query-gpu=memory.used", "--format=csv,noheader"],
|
36
|
+
capture_output=True,
|
37
|
+
text=True,
|
38
|
+
)
|
39
|
+
if result.returncode != 0:
|
40
|
+
pytest.exit(
|
41
|
+
"Failed to query GPU usage. Ensure nvidia-smi is installed and accessible."
|
42
|
+
)
|
43
|
+
|
44
|
+
gpu_memory_usage = [
|
45
|
+
int(line.strip().split()[0]) for line in result.stdout.splitlines()
|
46
|
+
]
|
47
|
+
if all(usage == 0 for usage in gpu_memory_usage):
|
48
|
+
pytest.exit(
|
49
|
+
"GPU is available but not utilized during computations. Check your JAX installation."
|
50
|
+
)
|
51
|
+
|
52
|
+
|
53
|
+
def pytest_configure(config) -> None:
|
15
54
|
"""Pytest configuration hook."""
|
16
55
|
|
17
56
|
# This is a global variable that is updated by the `prng_key` fixture.
|
@@ -19,6 +58,15 @@ def pytest_configure() -> None:
|
|
19
58
|
seed=int(os.environ.get("JAXSIM_TEST_SEED", 0))
|
20
59
|
)
|
21
60
|
|
61
|
+
# Check if GPU is available and utilized.
|
62
|
+
if config.getoption("--gpu-only"):
|
63
|
+
devices = jax.devices()
|
64
|
+
if not any(device.platform == "gpu" for device in devices):
|
65
|
+
pytest.exit("No GPU devices found. Check your JAX installation.")
|
66
|
+
|
67
|
+
# Ensure GPU is being used during computation
|
68
|
+
check_gpu_usage()
|
69
|
+
|
22
70
|
|
23
71
|
# ================
|
24
72
|
# Generic fixtures
|
@@ -171,6 +171,12 @@ def test_frame_jacobians(
|
|
171
171
|
J_WL_idt = kin_dyn.jacobian_frame(frame_name=frame_name)
|
172
172
|
assert J_WL_js == pytest.approx(J_WL_idt, abs=1e-9)
|
173
173
|
|
174
|
+
for frame_name, frame_index in zip(frame_names, frame_indices, strict=True):
|
175
|
+
|
176
|
+
v_WF_idt = kin_dyn.frame_velocity(frame_name=frame_name)
|
177
|
+
v_WF_js = js.frame.velocity(model=model, data=data, frame_index=frame_index)
|
178
|
+
assert v_WF_js == pytest.approx(v_WF_idt), frame_name
|
179
|
+
|
174
180
|
|
175
181
|
def test_frame_jacobian_derivative(
|
176
182
|
jaxsim_models_types: js.model.JaxSimModel,
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|