jaxsim 0.3.1.dev62__tar.gz → 0.3.1.dev94__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 (126) hide show
  1. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/PKG-INFO +1 -1
  2. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/examples/PD_controller.ipynb +6 -4
  3. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/examples/Parallel_computing.ipynb +22 -22
  4. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/pyproject.toml +11 -10
  5. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/__init__.py +5 -5
  6. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/_version.py +2 -2
  7. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/com.py +3 -4
  8. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/common.py +11 -11
  9. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/contact.py +11 -3
  10. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/data.py +3 -6
  11. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/frame.py +9 -10
  12. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/kin_dyn_parameters.py +25 -28
  13. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/link.py +12 -12
  14. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/model.py +47 -43
  15. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/ode.py +19 -12
  16. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/ode_data.py +11 -11
  17. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/integrators/common.py +19 -29
  18. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/integrators/fixed_step.py +10 -10
  19. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/integrators/variable_step.py +13 -13
  20. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/__init__.py +2 -1
  21. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/joint_model.py +2 -1
  22. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/quaternion.py +3 -9
  23. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/transform.py +2 -2
  24. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/mujoco/loaders.py +5 -5
  25. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/mujoco/model.py +6 -6
  26. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/mujoco/visualizer.py +3 -0
  27. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/descriptions/joint.py +1 -1
  28. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/descriptions/link.py +3 -4
  29. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/descriptions/model.py +1 -1
  30. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/kinematic_graph.py +38 -39
  31. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/rod/parser.py +14 -14
  32. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/rod/utils.py +9 -11
  33. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/aba.py +6 -12
  34. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/collidable_points.py +8 -7
  35. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/contacts/soft.py +29 -27
  36. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/crba.py +3 -3
  37. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/forward_kinematics.py +1 -1
  38. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/jacobian.py +8 -8
  39. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/rnea.py +3 -3
  40. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/utils.py +1 -1
  41. jaxsim-0.3.1.dev94/src/jaxsim/terrain/terrain.py +160 -0
  42. jaxsim-0.3.1.dev94/src/jaxsim/typing.py +34 -0
  43. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/utils/jaxsim_dataclass.py +4 -4
  44. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/utils/wrappers.py +5 -1
  45. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim.egg-info/PKG-INFO +1 -1
  46. jaxsim-0.3.1.dev94/tests/__init__.py +0 -0
  47. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/conftest.py +3 -3
  48. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_data.py +2 -2
  49. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_model.py +5 -5
  50. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_automatic_differentiation.py +9 -9
  51. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/utils_idyntree.py +8 -8
  52. jaxsim-0.3.1.dev62/src/jaxsim/parsers/__init__.py +0 -1
  53. jaxsim-0.3.1.dev62/src/jaxsim/terrain/terrain.py +0 -82
  54. jaxsim-0.3.1.dev62/src/jaxsim/typing.py +0 -42
  55. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.devcontainer/Dockerfile +0 -0
  56. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.devcontainer/devcontainer.json +0 -0
  57. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.gitattributes +0 -0
  58. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.github/CODEOWNERS +0 -0
  59. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.github/workflows/ci_cd.yml +0 -0
  60. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.github/workflows/read_the_docs.yml +0 -0
  61. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.github/workflows/style.yml +0 -0
  62. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.gitignore +0 -0
  63. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.pre-commit-config.yaml +0 -0
  64. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.readthedocs.yaml +0 -0
  65. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/CONTRIBUTING.md +0 -0
  66. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/LICENSE +0 -0
  67. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/README.md +0 -0
  68. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/Makefile +0 -0
  69. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/conf.py +0 -0
  70. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/guide/install.rst +0 -0
  71. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/index.rst +0 -0
  72. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/make.bat +0 -0
  73. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/api.rst +0 -0
  74. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/index.rst +0 -0
  75. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/integrators.rst +0 -0
  76. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/math.rst +0 -0
  77. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/mujoco.rst +0 -0
  78. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/parsers.rst +0 -0
  79. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/rbda.rst +0 -0
  80. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/typing.rst +0 -0
  81. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/utils.rst +0 -0
  82. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/environment.yml +0 -0
  83. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/examples/.gitattributes +0 -0
  84. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/examples/.gitignore +0 -0
  85. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/examples/README.md +0 -0
  86. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/examples/assets/cartpole.urdf +0 -0
  87. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/pixi.lock +0 -0
  88. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/setup.cfg +0 -0
  89. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/setup.py +0 -0
  90. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/__init__.py +0 -0
  91. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/joint.py +0 -0
  92. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/references.py +0 -0
  93. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/exceptions.py +0 -0
  94. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/integrators/__init__.py +0 -0
  95. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/logging.py +0 -0
  96. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/adjoint.py +0 -0
  97. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/cross.py +0 -0
  98. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/inertia.py +0 -0
  99. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/rotation.py +0 -0
  100. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/skew.py +0 -0
  101. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/mujoco/__init__.py +0 -0
  102. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/mujoco/__main__.py +0 -0
  103. {jaxsim-0.3.1.dev62/src/jaxsim/rbda/contacts → jaxsim-0.3.1.dev94/src/jaxsim/parsers}/__init__.py +0 -0
  104. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
  105. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/descriptions/collision.py +0 -0
  106. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/rod/__init__.py +0 -0
  107. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/__init__.py +0 -0
  108. {jaxsim-0.3.1.dev62/tests → jaxsim-0.3.1.dev94/src/jaxsim/rbda/contacts}/__init__.py +0 -0
  109. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/contacts/common.py +0 -0
  110. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/terrain/__init__.py +0 -0
  111. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/utils/__init__.py +0 -0
  112. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/utils/tracing.py +0 -0
  113. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim.egg-info/SOURCES.txt +0 -0
  114. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim.egg-info/dependency_links.txt +0 -0
  115. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim.egg-info/not-zip-safe +0 -0
  116. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim.egg-info/requires.txt +0 -0
  117. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim.egg-info/top_level.txt +0 -0
  118. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_com.py +0 -0
  119. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_contact.py +0 -0
  120. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_frame.py +0 -0
  121. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_joint.py +0 -0
  122. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_link.py +0 -0
  123. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_contact.py +0 -0
  124. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_exceptions.py +0 -0
  125. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_pytree.py +0 -0
  126. {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_simulations.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.3.1.dev62
3
+ Version: 0.3.1.dev94
4
4
  Home-page: https://github.com/ami-iit/jaxsim
5
5
  Author: Diego Ferigo
6
6
  Author-email: diego.ferigo@iit.it
@@ -20,7 +20,7 @@
20
20
  "outputs": [],
21
21
  "source": [
22
22
  "# @title Imports and setup\n",
23
- "from IPython.display import clear_output, HTML, display\n",
23
+ "from IPython.display import clear_output\n",
24
24
  "import sys\n",
25
25
  "\n",
26
26
  "IS_COLAB = \"google.colab\" in sys.modules\n",
@@ -100,6 +100,8 @@
100
100
  "from jaxsim import integrators\n",
101
101
  "\n",
102
102
  "dt = 0.01\n",
103
+ "integration_time = 5.0\n",
104
+ "num_steps = int(integration_time / dt)\n",
103
105
  "\n",
104
106
  "model = js.model.JaxSimModel.build_from_model_description(\n",
105
107
  " model_description=model_urdf_string, is_urdf=True\n",
@@ -150,7 +152,7 @@
150
152
  "source": [
151
153
  "# @title Set up MuJoCo renderer\n",
152
154
  "\n",
153
- "from jaxsim.mujoco import RodModelToMjcf, MujocoModelHelper, MujocoVideoRecorder\n",
155
+ "from jaxsim.mujoco import MujocoModelHelper, MujocoVideoRecorder\n",
154
156
  "from jaxsim.mujoco.loaders import UrdfToMjcf\n",
155
157
  "\n",
156
158
  "import os\n",
@@ -227,7 +229,7 @@
227
229
  "source": [
228
230
  "import mediapy as media\n",
229
231
  "\n",
230
- "for _ in range(500):\n",
232
+ "for _ in range(num_steps):\n",
231
233
  " data, integrator_state = js.model.step(\n",
232
234
  " dt=dt,\n",
233
235
  " model=model,\n",
@@ -299,7 +301,7 @@
299
301
  "metadata": {},
300
302
  "outputs": [],
301
303
  "source": [
302
- "for _ in range(500):\n",
304
+ "for _ in range(num_steps):\n",
303
305
  " control_torques = pd_controller(\n",
304
306
  " data=data,\n",
305
307
  " q_d=jnp.array([0.0, 0.0]),\n",
@@ -23,8 +23,6 @@
23
23
  "# @title Imports and setup\n",
24
24
  "import sys\n",
25
25
  "\n",
26
- "from IPython.display import HTML, clear_output, display\n",
27
- "\n",
28
26
  "IS_COLAB = \"google.colab\" in sys.modules\n",
29
27
  "\n",
30
28
  "# Install JAX and Gazebo\n",
@@ -40,15 +38,12 @@
40
38
  "%env XLA_PYTHON_CLIENT_MEM_PREALLOCATE=false\n",
41
39
  "\n",
42
40
  "import time\n",
43
- "from typing import Dict, Tuple\n",
44
41
  "\n",
45
42
  "import jax\n",
46
43
  "import jax.numpy as jnp\n",
47
- "import jax_dataclasses\n",
48
44
  "import rod\n",
49
45
  "from rod.builder.primitives import SphereBuilder\n",
50
46
  "\n",
51
- "import jaxsim.typing as jtp\n",
52
47
  "from jaxsim import logging\n",
53
48
  "\n",
54
49
  "logging.set_logging_level(logging.LoggingLevel.INFO)\n",
@@ -105,7 +100,7 @@
105
100
  "from jaxsim import integrators\n",
106
101
  "\n",
107
102
  "dt = 0.001\n",
108
- "integration_time = 1500\n",
103
+ "integration_time = 1.5 # seconds\n",
109
104
  "\n",
110
105
  "model = js.model.JaxSimModel.build_from_model_description(\n",
111
106
  " model_description=model_sdf_string\n",
@@ -129,7 +124,9 @@
129
124
  "\n",
130
125
  "By default, in JaxSim a sphere primitive has 250 collision points. This can be modified by setting the `JAXSIM_COLLISION_SPHERE_POINTS` environment variable.\n",
131
126
  "\n",
132
- "Given that at its steady-state the sphere will act on two or three points, we can estimate the ground parameters by explicitly setting the number of active points to these values."
127
+ "Given that at its steady-state the sphere will act on two or three points, we can estimate the ground parameters by explicitly setting the number of active points to these values. \n",
128
+ "\n",
129
+ "Eventually, you can specify the maximum penetration depth of the sphere into the terrain by passing `max_penetraion` to the `estimate_good_soft_contacts_parameters` function."
133
130
  ]
134
131
  },
135
132
  {
@@ -139,8 +136,10 @@
139
136
  "outputs": [],
140
137
  "source": [
141
138
  "data = data.replace(\n",
142
- " soft_contacts_params=js.contact.estimate_good_soft_contacts_parameters(\n",
143
- " model, number_of_active_collidable_points_steady_state=3\n",
139
+ " contacts_params=js.contact.estimate_good_soft_contacts_parameters(\n",
140
+ " model=model,\n",
141
+ " number_of_active_collidable_points_steady_state=3,\n",
142
+ " max_penetration=None,\n",
144
143
  " )\n",
145
144
  ")"
146
145
  ]
@@ -149,7 +148,7 @@
149
148
  "cell_type": "markdown",
150
149
  "metadata": {},
151
150
  "source": [
152
- "Let's create a position vector for a 3x3 grid. Every sphere will be placed at a different height."
151
+ "Let's create a position vector for a 4x4 grid. Every sphere will be placed at a different height."
153
152
  ]
154
153
  },
155
154
  {
@@ -169,14 +168,13 @@
169
168
  "def grid(edge_len, envs_per_row):\n",
170
169
  " edge = jnp.linspace(-edge_len, edge_len, envs_per_row)\n",
171
170
  " xx, yy = jnp.meshgrid(edge, edge)\n",
172
- "\n",
173
- " poses = [\n",
174
- " [[xx[i, j], yy[i, j], 0.2 + 0.1 * (i * envs_per_row + j)], [0, 0, 0]]\n",
175
- " for i in range(xx.shape[0])\n",
176
- " for j in range(yy.shape[0])\n",
177
- " ]\n",
178
- "\n",
179
- " return jnp.array(poses)\n",
171
+ " zz = 0.2 + 0.1 * (\n",
172
+ " jnp.arange(envs_per_row**2) % envs_per_row\n",
173
+ " + jnp.arange(envs_per_row**2) // envs_per_row\n",
174
+ " )\n",
175
+ " zz = zz.reshape(envs_per_row, envs_per_row)\n",
176
+ " poses = jnp.stack([xx, yy, zz], axis=-1).reshape(envs_per_row**2, 3)\n",
177
+ " return poses\n",
180
178
  "\n",
181
179
  "\n",
182
180
  "logging.info(f\"Simulating {envs_per_row**2} environments\")\n",
@@ -200,11 +198,13 @@
200
198
  "def simulate(\n",
201
199
  " data: js.data.JaxSimModelData, integrator_state: dict, pose: jnp.array\n",
202
200
  ") -> tuple:\n",
203
- "\n",
201
+ " # Set the base position to the initial pose\n",
204
202
  " data = data.reset_base_position(base_position=pose)\n",
203
+ "\n",
204
+ " # Create a list to store the base position over time\n",
205
205
  " x_t_i = []\n",
206
206
  "\n",
207
- " for _ in range(integration_time):\n",
207
+ " for _ in range(int(integration_time // dt)):\n",
208
208
  " data, integrator_state = js.model.step(\n",
209
209
  " dt=dt,\n",
210
210
  " model=model,\n",
@@ -243,7 +243,7 @@
243
243
  "# Run and time the simulation\n",
244
244
  "now = time.perf_counter()\n",
245
245
  "\n",
246
- "x_t = simulate_vectorized(data, integrator_state, poses[:, 0])\n",
246
+ "x_t = simulate_vectorized(data, integrator_state, poses)\n",
247
247
  "\n",
248
248
  "comp_time = time.perf_counter() - now\n",
249
249
  "\n",
@@ -251,7 +251,7 @@
251
251
  " f\"Running simulation with {envs_per_row**2} models took {comp_time} seconds.\"\n",
252
252
  ")\n",
253
253
  "logging.info(\n",
254
- " f\"This corresponds to an RTF (Real Time Factor) of {(envs_per_row**2 *integration_time/comp_time):.2f}\"\n",
254
+ " f\"This corresponds to an RTF (Real Time Factor) of {(envs_per_row**2 * integration_time / comp_time):.2f}\"\n",
255
255
  ")"
256
256
  ]
257
257
  },
@@ -41,25 +41,26 @@ preview = true
41
41
 
42
42
  [tool.ruff.lint]
43
43
  # https://docs.astral.sh/ruff/rules/
44
+ select = [
45
+ "B",
46
+ "E",
47
+ "F",
48
+ "I",
49
+ "W",
50
+ "RUF",
51
+ "YTT",
52
+ ]
53
+
44
54
  ignore = [
45
55
  "B008", # Function call in default argument
46
56
  "B024", # Abstract base class without abstract methods
47
- "B904", # Raise without from inside exception
48
- "B905", # Zip without explicit strict
49
57
  "E402", # Module level import not at top of file
50
58
  "E501", # Line too long
51
59
  "E731", # Do not assign a `lambda` expression, use a `def`
52
60
  "E741", # Ambiguous variable name
53
61
  "F841", # Local variable is assigned to but never used
54
62
  "I001", # Import block is unsorted or unformatted
55
- ]
56
- select = [
57
- "B",
58
- "E",
59
- "F",
60
- "I",
61
- "W",
62
- "YTT",
63
+ "RUF003", # Ambigous unicode character in comment
63
64
  ]
64
65
 
65
66
  [tool.ruff.lint.per-file-ignores]
@@ -33,17 +33,17 @@ def _is_editable() -> bool:
33
33
  import pathlib
34
34
  import site
35
35
 
36
- # Get the ModuleSpec of jaxsim
36
+ # Get the ModuleSpec of jaxsim.
37
37
  jaxsim_spec = importlib.util.find_spec(name="jaxsim")
38
38
 
39
39
  # This can be None. If it's None, assume non-editable installation.
40
40
  if jaxsim_spec.origin is None:
41
41
  return False
42
42
 
43
- # Get the folder containing the jaxsim package
43
+ # Get the folder containing the jaxsim package.
44
44
  jaxsim_package_dir = str(pathlib.Path(jaxsim_spec.origin).parent.parent)
45
45
 
46
- # The installation is editable if the package dir is not in any {site|dist}-packages
46
+ # The installation is editable if the package dir is not in any {site|dist}-packages.
47
47
  return jaxsim_package_dir not in site.getsitepackages()
48
48
 
49
49
 
@@ -82,10 +82,10 @@ def _get_default_logging_level(env_var: str) -> logging.LoggingLevel:
82
82
  logging.configure(level=_get_default_logging_level(env_var="JAXSIM_LOGGING_LEVEL"))
83
83
 
84
84
 
85
- # Configure JAX
85
+ # Configure JAX.
86
86
  _jnp_options()
87
87
 
88
- # Initialize the numpy print options
88
+ # Initialize the numpy print options.
89
89
  _np_options()
90
90
 
91
91
  del _jnp_options
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.3.1.dev62'
16
- __version_tuple__ = version_tuple = (0, 3, 1, 'dev62')
15
+ __version__ = version = '0.3.1.dev94'
16
+ __version_tuple__ = version_tuple = (0, 3, 1, 'dev94')
@@ -1,6 +1,5 @@
1
1
  import jax
2
2
  import jax.numpy as jnp
3
- import jaxlie
4
3
 
5
4
  import jaxsim.api as js
6
5
  import jaxsim.math
@@ -28,7 +27,7 @@ def com_position(
28
27
 
29
28
  W_H_L = js.model.forward_kinematics(model=model, data=data)
30
29
  W_H_B = data.base_transform()
31
- B_H_W = jaxlie.SE3.from_matrix(W_H_B).inverse().as_matrix()
30
+ B_H_W = jaxsim.math.Transform.inverse(transform=W_H_B)
32
31
 
33
32
  def B_p̃_LCoM(i) -> jtp.Vector:
34
33
  m = js.link.mass(model=model, link_index=i)
@@ -179,9 +178,9 @@ def locked_centroidal_spatial_inertia(
179
178
  case _:
180
179
  raise ValueError(data.velocity_representation)
181
180
 
182
- B_H_G = jaxlie.SE3.from_matrix(jaxsim.math.Transform.inverse(W_H_B) @ W_H_G)
181
+ B_H_G = jaxsim.math.Transform.inverse(W_H_B) @ W_H_G
183
182
 
184
- B_Xv_G = B_H_G.adjoint()
183
+ B_Xv_G = jaxsim.math.Adjoint.from_transform(transform=B_H_G)
185
184
  G_Xf_B = B_Xv_G.transpose()
186
185
 
187
186
  return G_Xf_B @ B_Mbb_B @ B_Xv_G
@@ -8,10 +8,10 @@ from typing import ContextManager
8
8
  import jax
9
9
  import jax.numpy as jnp
10
10
  import jax_dataclasses
11
- import jaxlie
12
11
  from jax_dataclasses import Static
13
12
 
14
13
  import jaxsim.typing as jtp
14
+ from jaxsim.math import Adjoint
15
15
  from jaxsim.utils import JaxsimDataclass, Mutability
16
16
 
17
17
  try:
@@ -59,7 +59,7 @@ class ModelDataWithVelocityRepresentation(JaxsimDataclass, abc.ABC):
59
59
 
60
60
  try:
61
61
 
62
- # First, we replace the velocity representation
62
+ # First, we replace the velocity representation.
63
63
  with self.mutable_context(
64
64
  mutability=Mutability.MUTABLE_NO_VALIDATION,
65
65
  restore_after_exception=True,
@@ -97,7 +97,7 @@ class ModelDataWithVelocityRepresentation(JaxsimDataclass, abc.ABC):
97
97
  array: The 6D quantity to convert.
98
98
  other_representation: The representation to convert to.
99
99
  transform:
100
- The `math:W \mathbf{H}_O` transform, where `math:O` is the
100
+ The :math:`W \mathbf{H}_O` transform, where :math:`O` is the
101
101
  reference frame of the other representation.
102
102
  is_force: Whether the quantity is a 6D force or a 6D velocity.
103
103
 
@@ -122,11 +122,11 @@ class ModelDataWithVelocityRepresentation(JaxsimDataclass, abc.ABC):
122
122
  case VelRepr.Body:
123
123
 
124
124
  if not is_force:
125
- O_Xv_W = jaxlie.SE3.from_matrix(W_H_O).inverse().adjoint()
125
+ O_Xv_W = Adjoint.from_transform(transform=W_H_O, inverse=True)
126
126
  O_array = O_Xv_W @ W_array
127
127
 
128
128
  else:
129
- O_Xf_W = jaxlie.SE3.from_matrix(W_H_O).adjoint().T
129
+ O_Xf_W = Adjoint.from_transform(transform=W_H_O).T
130
130
  O_array = O_Xf_W @ W_array
131
131
 
132
132
  return O_array
@@ -136,11 +136,11 @@ class ModelDataWithVelocityRepresentation(JaxsimDataclass, abc.ABC):
136
136
  W_H_OW = jnp.eye(4).at[0:3, 3].set(W_p_O)
137
137
 
138
138
  if not is_force:
139
- OW_Xv_W = jaxlie.SE3.from_matrix(W_H_OW).inverse().adjoint()
139
+ OW_Xv_W = Adjoint.from_transform(transform=W_H_OW, inverse=True)
140
140
  OW_array = OW_Xv_W @ W_array
141
141
 
142
142
  else:
143
- OW_Xf_W = jaxlie.SE3.from_matrix(W_H_OW).adjoint().transpose()
143
+ OW_Xf_W = Adjoint.from_transform(transform=W_H_OW).T
144
144
  OW_array = OW_Xf_W @ W_array
145
145
 
146
146
  return OW_array
@@ -190,11 +190,11 @@ class ModelDataWithVelocityRepresentation(JaxsimDataclass, abc.ABC):
190
190
  O_array = array
191
191
 
192
192
  if not is_force:
193
- W_Xv_O: jtp.Array = jaxlie.SE3.from_matrix(W_H_O).adjoint()
193
+ W_Xv_O: jtp.Array = Adjoint.from_transform(W_H_O)
194
194
  W_array = W_Xv_O @ O_array
195
195
 
196
196
  else:
197
- W_Xf_O = jaxlie.SE3.from_matrix(W_H_O).inverse().adjoint().T
197
+ W_Xf_O = Adjoint.from_transform(transform=W_H_O, inverse=True).T
198
198
  W_array = W_Xf_O @ O_array
199
199
 
200
200
  return W_array
@@ -205,11 +205,11 @@ class ModelDataWithVelocityRepresentation(JaxsimDataclass, abc.ABC):
205
205
  W_H_OW = jnp.eye(4).at[0:3, 3].set(W_p_O)
206
206
 
207
207
  if not is_force:
208
- W_Xv_BW: jtp.Array = jaxlie.SE3.from_matrix(W_H_OW).adjoint()
208
+ W_Xv_BW: jtp.Array = Adjoint.from_transform(W_H_OW)
209
209
  W_array = W_Xv_BW @ BW_array
210
210
 
211
211
  else:
212
- W_Xf_BW = jaxlie.SE3.from_matrix(W_H_OW).inverse().adjoint().T
212
+ W_Xf_BW = Adjoint.from_transform(transform=W_H_OW, inverse=True).T
213
213
  W_array = W_Xf_BW @ BW_array
214
214
 
215
215
  return W_array
@@ -8,7 +8,7 @@ import jax.numpy as jnp
8
8
  import jaxsim.api as js
9
9
  import jaxsim.terrain
10
10
  import jaxsim.typing as jtp
11
- from jaxsim.rbda.contacts.soft import SoftContacts, SoftContactsParams
11
+ from jaxsim.rbda.contacts.soft import SoftContactsParams
12
12
 
13
13
  from .common import VelRepr
14
14
 
@@ -137,9 +137,17 @@ def collidable_point_dynamics(
137
137
  # all collidable points belonging to the robot.
138
138
  W_p_Ci, W_ṗ_Ci = js.contact.collidable_point_kinematics(model=model, data=data)
139
139
 
140
+ # Import privately the soft contacts classes.
141
+ from jaxsim.rbda.contacts.soft import SoftContacts, SoftContactsState
142
+
140
143
  # Build the soft contact model.
141
144
  match model.contact_model:
142
- case s if isinstance(s, SoftContacts):
145
+
146
+ case SoftContacts():
147
+
148
+ assert isinstance(model.contact_model, SoftContacts)
149
+ assert isinstance(data.state.contact, SoftContactsState)
150
+
143
151
  # Build the contact model.
144
152
  soft_contacts = SoftContacts(
145
153
  parameters=data.contacts_params, terrain=model.terrain
@@ -337,7 +345,7 @@ def jacobian(
337
345
  The output velocity representation of the free-floating jacobian.
338
346
 
339
347
  Returns:
340
- The stacked 6×(6+n) free-floating jacobians of the frames associated to the
348
+ The stacked :math:`6 \times (6+n)` free-floating jacobians of the frames associated to the
341
349
  collidable points.
342
350
 
343
351
  Note:
@@ -8,7 +8,6 @@ import jax
8
8
  import jax.numpy as jnp
9
9
  import jax_dataclasses
10
10
  import jaxlie
11
- import numpy as np
12
11
 
13
12
  import jaxsim.api as js
14
13
  import jaxsim.rbda
@@ -390,7 +389,7 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
390
389
  ).astype(float)
391
390
 
392
391
  @jax.jit
393
- def base_transform(self) -> jtp.MatrixJax:
392
+ def base_transform(self) -> jtp.Matrix:
394
393
  """
395
394
  Get the base transform.
396
395
 
@@ -625,9 +624,7 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
625
624
 
626
625
  W_p_B = base_pose[0:3, 3]
627
626
 
628
- to_wxyz = np.array([3, 0, 1, 2])
629
- W_R_B: jaxlie.SO3 = jaxlie.SO3.from_matrix(base_pose[0:3, 0:3]) # noqa
630
- W_Q_B = W_R_B.as_quaternion_xyzw()[to_wxyz]
627
+ W_Q_B = jaxsim.math.Quaternion.from_dcm(dcm=base_pose[0:3, 0:3])
631
628
 
632
629
  return self.reset_base_position(base_position=W_p_B).reset_base_quaternion(
633
630
  base_quaternion=W_Q_B
@@ -815,7 +812,7 @@ def random_model_data(
815
812
 
816
813
  physics_model_state.base_quaternion = jaxlie.SO3.from_rpy_radians(
817
814
  *jax.random.uniform(key=k2, shape=(3,), minval=0, maxval=2 * jnp.pi)
818
- ).as_quaternion_xyzw()[np.array([3, 0, 1, 2])]
815
+ ).wxyz
819
816
 
820
817
  if model.number_of_joints() > 0:
821
818
  physics_model_state.joint_positions = js.joint.random_joint_positions(
@@ -3,12 +3,11 @@ from typing import Sequence
3
3
 
4
4
  import jax
5
5
  import jax.numpy as jnp
6
- import jaxlie
7
6
 
8
7
  import jaxsim.api as js
9
- import jaxsim.math
10
8
  import jaxsim.typing as jtp
11
9
  from jaxsim import exceptions
10
+ from jaxsim.math import Adjoint, Transform
12
11
 
13
12
  from .common import VelRepr
14
13
 
@@ -189,7 +188,7 @@ def jacobian(
189
188
  frame_index: jtp.IntLike,
190
189
  output_vel_repr: VelRepr | None = None,
191
190
  ) -> jtp.Matrix:
192
- """
191
+ r"""
193
192
  Compute the free-floating jacobian of the frame.
194
193
 
195
194
  Args:
@@ -200,7 +199,7 @@ def jacobian(
200
199
  The output velocity representation of the free-floating jacobian.
201
200
 
202
201
  Returns:
203
- The 6×(6+n) free-floating jacobian of the frame.
202
+ The :math:`6 \times (6+n)` free-floating jacobian of the frame.
204
203
 
205
204
  Note:
206
205
  The input representation of the free-floating jacobian is the active
@@ -228,29 +227,29 @@ def jacobian(
228
227
  model=model, data=data, link_index=L, output_vel_repr=VelRepr.Body
229
228
  )
230
229
 
231
- # Adjust the output representation
230
+ # Adjust the output representation.
232
231
  match output_vel_repr:
233
232
  case VelRepr.Inertial:
234
233
  W_H_L = js.link.transform(model=model, data=data, link_index=L)
235
- W_X_L = jaxlie.SE3.from_matrix(W_H_L).adjoint()
234
+ W_X_L = Adjoint.from_transform(transform=W_H_L)
236
235
  W_J_WL = W_X_L @ L_J_WL
237
236
  O_J_WL_I = W_J_WL
238
237
 
239
238
  case VelRepr.Body:
240
239
  W_H_L = js.link.transform(model=model, data=data, link_index=L)
241
240
  W_H_F = transform(model=model, data=data, frame_index=frame_index)
242
- F_H_L = jaxsim.math.Transform.inverse(W_H_F) @ W_H_L
243
- F_X_L = jaxlie.SE3.from_matrix(F_H_L).adjoint()
241
+ F_H_L = Transform.inverse(W_H_F) @ W_H_L
242
+ F_X_L = Adjoint.from_transform(transform=F_H_L)
244
243
  F_J_WL = F_X_L @ L_J_WL
245
244
  O_J_WL_I = F_J_WL
246
245
 
247
246
  case VelRepr.Mixed:
248
247
  W_H_L = js.link.transform(model=model, data=data, link_index=L)
249
248
  W_H_F = transform(model=model, data=data, frame_index=frame_index)
250
- F_H_L = jaxsim.math.Transform.inverse(W_H_F) @ W_H_L
249
+ F_H_L = Transform.inverse(W_H_F) @ W_H_L
251
250
  FW_H_F = W_H_F.at[0:3, 3].set(jnp.zeros(3))
252
251
  FW_H_L = FW_H_F @ F_H_L
253
- FW_X_L = jaxlie.SE3.from_matrix(FW_H_L).adjoint()
252
+ FW_X_L = Adjoint.from_transform(transform=FW_H_L)
254
253
  FW_J_WL = FW_X_L @ L_J_WL
255
254
  O_J_WL_I = FW_J_WL
256
255