jaxsim 0.5.1.dev2__tar.gz → 0.5.1.dev12__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.
Files changed (131) hide show
  1. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/PKG-INFO +1 -1
  2. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/examples/jaxsim_as_multibody_dynamics_library.ipynb +112 -33
  3. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/_version.py +2 -2
  4. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/api/frame.py +52 -2
  5. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/api/kin_dyn_parameters.py +10 -0
  6. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/api/model.py +11 -0
  7. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/contacts/relaxed_rigid.py +1 -1
  8. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim.egg-info/PKG-INFO +1 -1
  9. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/test_api_frame.py +6 -0
  10. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/.devcontainer/Dockerfile +0 -0
  11. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/.devcontainer/devcontainer.json +0 -0
  12. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/.gitattributes +0 -0
  13. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/.github/CODEOWNERS +0 -0
  14. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/.github/dependabot.yml +0 -0
  15. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/.github/workflows/ci_cd.yml +0 -0
  16. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/.github/workflows/pixi.yml +0 -0
  17. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/.github/workflows/read_the_docs.yml +0 -0
  18. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/.gitignore +0 -0
  19. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/.pre-commit-config.yaml +0 -0
  20. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/.readthedocs.yaml +0 -0
  21. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/CONTRIBUTING.md +0 -0
  22. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/LICENSE +0 -0
  23. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/README.md +0 -0
  24. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/Makefile +0 -0
  25. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/conf.py +0 -0
  26. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/examples.rst +0 -0
  27. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/guide/install.rst +0 -0
  28. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/index.rst +0 -0
  29. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/make.bat +0 -0
  30. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/modules/api.rst +0 -0
  31. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/modules/integrators.rst +0 -0
  32. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/modules/math.rst +0 -0
  33. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/modules/mujoco.rst +0 -0
  34. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/modules/parsers.rst +0 -0
  35. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/modules/rbda.rst +0 -0
  36. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/modules/typing.rst +0 -0
  37. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/docs/modules/utils.rst +0 -0
  38. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/environment.yml +0 -0
  39. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/examples/.gitattributes +0 -0
  40. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/examples/.gitignore +0 -0
  41. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/examples/README.md +0 -0
  42. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/examples/assets/build_cartpole_urdf.py +0 -0
  43. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/examples/assets/cartpole.urdf +0 -0
  44. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/examples/jaxsim_as_physics_engine.ipynb +0 -0
  45. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/examples/jaxsim_for_robot_controllers.ipynb +0 -0
  46. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/pixi.lock +0 -0
  47. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/pyproject.toml +0 -0
  48. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/setup.cfg +0 -0
  49. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/setup.py +0 -0
  50. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/__init__.py +0 -0
  51. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/api/__init__.py +0 -0
  52. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/api/com.py +0 -0
  53. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/api/common.py +0 -0
  54. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/api/contact.py +0 -0
  55. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/api/data.py +0 -0
  56. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/api/joint.py +0 -0
  57. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/api/link.py +0 -0
  58. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/api/ode.py +0 -0
  59. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/api/ode_data.py +0 -0
  60. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/api/references.py +0 -0
  61. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/exceptions.py +0 -0
  62. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/integrators/__init__.py +0 -0
  63. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/integrators/common.py +0 -0
  64. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/integrators/fixed_step.py +0 -0
  65. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/integrators/variable_step.py +0 -0
  66. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/logging.py +0 -0
  67. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/math/__init__.py +0 -0
  68. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/math/adjoint.py +0 -0
  69. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/math/cross.py +0 -0
  70. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/math/inertia.py +0 -0
  71. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/math/joint_model.py +0 -0
  72. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/math/quaternion.py +0 -0
  73. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/math/rotation.py +0 -0
  74. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/math/skew.py +0 -0
  75. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/math/transform.py +0 -0
  76. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/mujoco/__init__.py +0 -0
  77. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/mujoco/__main__.py +0 -0
  78. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/mujoco/loaders.py +0 -0
  79. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/mujoco/model.py +0 -0
  80. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/mujoco/utils.py +0 -0
  81. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/mujoco/visualizer.py +0 -0
  82. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/parsers/__init__.py +0 -0
  83. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
  84. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/parsers/descriptions/collision.py +0 -0
  85. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/parsers/descriptions/joint.py +0 -0
  86. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/parsers/descriptions/link.py +0 -0
  87. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/parsers/descriptions/model.py +0 -0
  88. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/parsers/kinematic_graph.py +0 -0
  89. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/parsers/rod/__init__.py +0 -0
  90. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/parsers/rod/meshes.py +0 -0
  91. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/parsers/rod/parser.py +0 -0
  92. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/parsers/rod/utils.py +0 -0
  93. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/__init__.py +0 -0
  94. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/aba.py +0 -0
  95. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/collidable_points.py +0 -0
  96. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/contacts/__init__.py +0 -0
  97. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/contacts/common.py +0 -0
  98. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/contacts/rigid.py +0 -0
  99. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/contacts/soft.py +0 -0
  100. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/contacts/visco_elastic.py +0 -0
  101. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/crba.py +0 -0
  102. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/forward_kinematics.py +0 -0
  103. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/jacobian.py +0 -0
  104. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/rnea.py +0 -0
  105. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/rbda/utils.py +0 -0
  106. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/terrain/__init__.py +0 -0
  107. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/terrain/terrain.py +0 -0
  108. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/typing.py +0 -0
  109. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/utils/__init__.py +0 -0
  110. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
  111. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/utils/tracing.py +0 -0
  112. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim/utils/wrappers.py +0 -0
  113. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim.egg-info/SOURCES.txt +0 -0
  114. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim.egg-info/dependency_links.txt +0 -0
  115. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim.egg-info/requires.txt +0 -0
  116. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/src/jaxsim.egg-info/top_level.txt +0 -0
  117. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/__init__.py +0 -0
  118. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/conftest.py +0 -0
  119. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/test_api_com.py +0 -0
  120. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/test_api_contact.py +0 -0
  121. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/test_api_data.py +0 -0
  122. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/test_api_joint.py +0 -0
  123. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/test_api_link.py +0 -0
  124. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/test_api_model.py +0 -0
  125. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/test_automatic_differentiation.py +0 -0
  126. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/test_contact.py +0 -0
  127. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/test_exceptions.py +0 -0
  128. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/test_meshes.py +0 -0
  129. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/test_pytree.py +0 -0
  130. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/tests/test_simulations.py +0 -0
  131. {jaxsim-0.5.1.dev2 → jaxsim-0.5.1.dev12}/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.dev2
3
+ Version: 0.5.1.dev12
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>
@@ -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": "markdown",
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
- "colab": {
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
- "id": "QqaqxneEFYiW"
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
- "colab": {
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
- "id": "oOKJOVfsH4Ki"
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
- "colab": {
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
- "id": "LXARuRu1Ly1K"
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
- "colab": {
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
- "id": "UTae5MjhaP2H"
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
- "colab": {
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": [
@@ -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.dev2'
16
- __version_tuple__ = version_tuple = (0, 5, 1, 'dev2')
15
+ __version__ = version = '0.5.1.dev12'
16
+ __version_tuple__ = version_tuple = (0, 5, 1, 'dev12')
@@ -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.kin_dyn_parameters.frame_parameters.name:
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 = len(model.frame_names())
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
  # =================
@@ -376,7 +376,7 @@ class RelaxedRigidContacts(common.ContactModel):
376
376
 
377
377
  # Compute the Delassus matrix and the free mixed linear acceleration of
378
378
  # the collidable points.
379
- G = Jl_WC @ jnp.linalg.lstsq(M, Jl_WC.T)[0]
379
+ G = Jl_WC @ jnp.linalg.pinv(M) @ Jl_WC.T
380
380
  CW_al_free_WC = Jl_WC @ BW_ν̇_free + J̇_WC @ BW_ν
381
381
 
382
382
  # Calculate quantities for the linear optimization problem.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.5.1.dev2
3
+ Version: 0.5.1.dev12
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>
@@ -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