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.
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/PKG-INFO +1 -1
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/examples/PD_controller.ipynb +6 -4
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/examples/Parallel_computing.ipynb +22 -22
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/pyproject.toml +11 -10
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/__init__.py +5 -5
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/_version.py +2 -2
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/com.py +3 -4
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/common.py +11 -11
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/contact.py +11 -3
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/data.py +3 -6
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/frame.py +9 -10
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/kin_dyn_parameters.py +25 -28
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/link.py +12 -12
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/model.py +47 -43
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/ode.py +19 -12
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/ode_data.py +11 -11
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/integrators/common.py +19 -29
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/integrators/fixed_step.py +10 -10
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/integrators/variable_step.py +13 -13
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/__init__.py +2 -1
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/joint_model.py +2 -1
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/quaternion.py +3 -9
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/transform.py +2 -2
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/mujoco/loaders.py +5 -5
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/mujoco/model.py +6 -6
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/mujoco/visualizer.py +3 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/descriptions/joint.py +1 -1
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/descriptions/link.py +3 -4
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/descriptions/model.py +1 -1
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/kinematic_graph.py +38 -39
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/rod/parser.py +14 -14
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/rod/utils.py +9 -11
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/aba.py +6 -12
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/collidable_points.py +8 -7
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/contacts/soft.py +29 -27
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/crba.py +3 -3
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/forward_kinematics.py +1 -1
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/jacobian.py +8 -8
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/rnea.py +3 -3
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/utils.py +1 -1
- jaxsim-0.3.1.dev94/src/jaxsim/terrain/terrain.py +160 -0
- jaxsim-0.3.1.dev94/src/jaxsim/typing.py +34 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/utils/jaxsim_dataclass.py +4 -4
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/utils/wrappers.py +5 -1
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim.egg-info/PKG-INFO +1 -1
- jaxsim-0.3.1.dev94/tests/__init__.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/conftest.py +3 -3
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_data.py +2 -2
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_model.py +5 -5
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_automatic_differentiation.py +9 -9
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/utils_idyntree.py +8 -8
- jaxsim-0.3.1.dev62/src/jaxsim/parsers/__init__.py +0 -1
- jaxsim-0.3.1.dev62/src/jaxsim/terrain/terrain.py +0 -82
- jaxsim-0.3.1.dev62/src/jaxsim/typing.py +0 -42
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.devcontainer/Dockerfile +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.devcontainer/devcontainer.json +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.gitattributes +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.github/CODEOWNERS +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.github/workflows/ci_cd.yml +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.github/workflows/read_the_docs.yml +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.github/workflows/style.yml +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.gitignore +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.pre-commit-config.yaml +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/.readthedocs.yaml +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/CONTRIBUTING.md +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/LICENSE +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/README.md +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/Makefile +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/conf.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/guide/install.rst +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/index.rst +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/make.bat +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/api.rst +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/index.rst +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/integrators.rst +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/math.rst +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/mujoco.rst +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/parsers.rst +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/rbda.rst +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/typing.rst +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/docs/modules/utils.rst +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/environment.yml +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/examples/.gitattributes +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/examples/.gitignore +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/examples/README.md +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/examples/assets/cartpole.urdf +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/pixi.lock +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/setup.cfg +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/setup.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/__init__.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/joint.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/api/references.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/exceptions.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/integrators/__init__.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/logging.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/adjoint.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/cross.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/inertia.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/rotation.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/math/skew.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/mujoco/__init__.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/mujoco/__main__.py +0 -0
- {jaxsim-0.3.1.dev62/src/jaxsim/rbda/contacts → jaxsim-0.3.1.dev94/src/jaxsim/parsers}/__init__.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/descriptions/collision.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/parsers/rod/__init__.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/__init__.py +0 -0
- {jaxsim-0.3.1.dev62/tests → jaxsim-0.3.1.dev94/src/jaxsim/rbda/contacts}/__init__.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/rbda/contacts/common.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/terrain/__init__.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/utils/__init__.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim/utils/tracing.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim.egg-info/SOURCES.txt +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim.egg-info/dependency_links.txt +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim.egg-info/not-zip-safe +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim.egg-info/requires.txt +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/src/jaxsim.egg-info/top_level.txt +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_com.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_contact.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_frame.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_joint.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_api_link.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_contact.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_exceptions.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_pytree.py +0 -0
- {jaxsim-0.3.1.dev62 → jaxsim-0.3.1.dev94}/tests/test_simulations.py +0 -0
@@ -20,7 +20,7 @@
|
|
20
20
|
"outputs": [],
|
21
21
|
"source": [
|
22
22
|
"# @title Imports and setup\n",
|
23
|
-
"from IPython.display import clear_output
|
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
|
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(
|
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(
|
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 =
|
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
|
-
"
|
143
|
-
" model
|
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
|
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
|
-
"
|
174
|
-
"
|
175
|
-
"
|
176
|
-
"
|
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
|
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.
|
16
|
-
__version_tuple__ = version_tuple = (0, 3, 1, '
|
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 =
|
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 =
|
181
|
+
B_H_G = jaxsim.math.Transform.inverse(W_H_B) @ W_H_G
|
183
182
|
|
184
|
-
B_Xv_G =
|
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
|
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 =
|
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 =
|
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 =
|
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 =
|
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 =
|
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 =
|
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 =
|
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 =
|
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
|
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
|
-
|
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
|
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.
|
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
|
-
|
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
|
-
).
|
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
|
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 =
|
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 =
|
243
|
-
F_X_L =
|
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 =
|
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 =
|
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
|
|