jaxsim 0.4.3.dev177__tar.gz → 0.4.3.dev186__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.4.3.dev177 → jaxsim-0.4.3.dev186}/PKG-INFO +1 -1
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/__init__.py +20 -6
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/_version.py +2 -2
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/exceptions.py +4 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/mujoco/__init__.py +1 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/mujoco/loaders.py +1 -1
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/mujoco/model.py +4 -3
- jaxsim-0.4.3.dev186/src/jaxsim/mujoco/utils.py +101 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/mujoco/visualizer.py +1 -1
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim.egg-info/PKG-INFO +1 -1
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim.egg-info/SOURCES.txt +1 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/.devcontainer/Dockerfile +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/.devcontainer/devcontainer.json +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/.gitattributes +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/.github/CODEOWNERS +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/.github/workflows/ci_cd.yml +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/.github/workflows/read_the_docs.yml +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/.github/workflows/update_pixi_lockfile.yml +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/.gitignore +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/.pre-commit-config.yaml +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/.readthedocs.yaml +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/CONTRIBUTING.md +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/LICENSE +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/README.md +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/Makefile +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/conf.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/examples.rst +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/guide/install.rst +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/index.rst +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/make.bat +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/modules/api.rst +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/modules/integrators.rst +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/modules/math.rst +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/modules/mujoco.rst +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/modules/parsers.rst +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/modules/rbda.rst +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/modules/typing.rst +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/docs/modules/utils.rst +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/environment.yml +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/examples/.gitattributes +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/examples/.gitignore +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/examples/PD_controller.ipynb +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/examples/Parallel_computing.ipynb +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/examples/README.md +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/examples/assets/cartpole.urdf +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/pixi.lock +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/pyproject.toml +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/setup.cfg +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/setup.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/api/__init__.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/api/com.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/api/common.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/api/contact.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/api/data.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/api/frame.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/api/joint.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/api/link.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/api/model.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/api/ode.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/api/ode_data.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/api/references.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/integrators/__init__.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/integrators/common.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/integrators/fixed_step.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/integrators/variable_step.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/logging.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/math/__init__.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/math/adjoint.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/math/cross.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/math/inertia.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/math/joint_model.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/math/quaternion.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/math/rotation.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/math/skew.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/math/transform.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/mujoco/__main__.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/parsers/__init__.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/parsers/descriptions/collision.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/parsers/descriptions/joint.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/parsers/descriptions/link.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/parsers/descriptions/model.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/parsers/kinematic_graph.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/parsers/rod/__init__.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/parsers/rod/parser.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/parsers/rod/utils.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/__init__.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/aba.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/collidable_points.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/contacts/__init__.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/contacts/common.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/contacts/relaxed_rigid.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/contacts/rigid.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/contacts/soft.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/contacts/visco_elastic.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/crba.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/forward_kinematics.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/jacobian.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/rnea.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/rbda/utils.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/terrain/__init__.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/terrain/terrain.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/typing.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/utils/__init__.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/utils/tracing.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim/utils/wrappers.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim.egg-info/dependency_links.txt +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim.egg-info/requires.txt +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/src/jaxsim.egg-info/top_level.txt +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/__init__.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/conftest.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/test_api_com.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/test_api_contact.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/test_api_data.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/test_api_frame.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/test_api_joint.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/test_api_link.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/test_api_model.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/test_automatic_differentiation.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/test_contact.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/test_exceptions.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/test_pytree.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/test_simulations.py +0 -0
- {jaxsim-0.4.3.dev177 → jaxsim-0.4.3.dev186}/tests/utils_idyntree.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: jaxsim
|
3
|
-
Version: 0.4.3.
|
3
|
+
Version: 0.4.3.dev186
|
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>
|
6
6
|
Maintainer-email: Diego Ferigo <dgferigo@gmail.com>, Filippo Luca Ferretti <filippo.ferretti@iit.it>
|
@@ -8,21 +8,35 @@ def _jnp_options() -> None:
|
|
8
8
|
|
9
9
|
import jax
|
10
10
|
|
11
|
-
#
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
# Check if running on TPU
|
12
|
+
is_tpu = jax.devices()[0].platform == "tpu"
|
13
|
+
|
14
|
+
# Enable by default 64-bit precision to get accurate physics.
|
15
|
+
# Users can enforce 32-bit precision by setting the following variable to 0.
|
16
|
+
use_x64 = os.environ.get("JAX_ENABLE_X64", "1") != "0"
|
17
|
+
|
18
|
+
# Notify the user if unsupported 64-bit precision was enforced on TPU.
|
19
|
+
if is_tpu and use_x64:
|
20
|
+
msg = "64-bit precision is not allowed on TPU. Enforcing 32bit precision."
|
21
|
+
logging.warning(msg)
|
22
|
+
use_x64 = False
|
23
|
+
|
24
|
+
# Enable 64-bit precision in JAX.
|
25
|
+
if use_x64:
|
26
|
+
logging.info("Enabling JAX to use 64-bit precision")
|
15
27
|
jax.config.update("jax_enable_x64", True)
|
16
28
|
|
17
29
|
import jax.numpy as jnp
|
18
30
|
import numpy as np
|
19
31
|
|
32
|
+
# Verify that 64-bit precision is correctly set.
|
20
33
|
if jnp.empty(0, dtype=float).dtype != jnp.empty(0, dtype=np.float64).dtype:
|
21
|
-
logging.warning("Failed to enable
|
34
|
+
logging.warning("Failed to enable 64-bit precision in JAX")
|
22
35
|
|
36
|
+
# Warn about experimental usage of 32-bit precision.
|
23
37
|
else:
|
24
38
|
logging.warning(
|
25
|
-
"Using
|
39
|
+
"Using 32-bit precision in JaxSim is still experimental, please avoid to use variable step integrators."
|
26
40
|
)
|
27
41
|
|
28
42
|
|
@@ -12,5 +12,5 @@ __version__: str
|
|
12
12
|
__version_tuple__: VERSION_TUPLE
|
13
13
|
version_tuple: VERSION_TUPLE
|
14
14
|
|
15
|
-
__version__ = version = '0.4.3.
|
16
|
-
__version_tuple__ = version_tuple = (0, 4, 3, '
|
15
|
+
__version__ = version = '0.4.3.dev186'
|
16
|
+
__version_tuple__ = version_tuple = (0, 4, 3, 'dev186')
|
@@ -17,6 +17,10 @@ def raise_if(
|
|
17
17
|
format string (fmt), whose fields are filled with the args and kwargs.
|
18
18
|
"""
|
19
19
|
|
20
|
+
# Disable host callback if running on TPU.
|
21
|
+
if jax.devices()[0].platform == "tpu":
|
22
|
+
return
|
23
|
+
|
20
24
|
# Check early that the format string is well-formed.
|
21
25
|
try:
|
22
26
|
_ = msg.format(*args, **kwargs)
|
@@ -646,7 +646,7 @@ class MujocoCamera:
|
|
646
646
|
def build(cls, **kwargs) -> MujocoCamera:
|
647
647
|
|
648
648
|
if not all(isinstance(value, str) for value in kwargs.values()):
|
649
|
-
raise ValueError("Values must be strings")
|
649
|
+
raise ValueError(f"Values must be strings: {kwargs}")
|
650
650
|
|
651
651
|
return cls(**kwargs)
|
652
652
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
import functools
|
4
4
|
import pathlib
|
5
|
-
from collections.abc import Callable
|
5
|
+
from collections.abc import Callable, Sequence
|
6
6
|
from typing import Any
|
7
7
|
|
8
8
|
import mujoco as mj
|
@@ -107,7 +107,8 @@ class MujocoModelHelper:
|
|
107
107
|
size = [float(el) for el in hfield_element["@size"].split(" ")]
|
108
108
|
size[0], size[1] = heightmap_radius_xy
|
109
109
|
size[2] = 1.0
|
110
|
-
|
110
|
+
# The following could be zero but Mujoco complains if it's exactly zero.
|
111
|
+
size[3] = max(0.000_001, -min(hfield))
|
111
112
|
|
112
113
|
# Replace the 'size' attribute.
|
113
114
|
hfields_dict[heightmap_name]["@size"] = " ".join(str(el) for el in size)
|
@@ -315,7 +316,7 @@ class MujocoModelHelper:
|
|
315
316
|
self.data.qpos[sl] = position
|
316
317
|
|
317
318
|
def set_joint_positions(
|
318
|
-
self, joint_names:
|
319
|
+
self, joint_names: Sequence[str], positions: npt.NDArray | list[npt.NDArray]
|
319
320
|
) -> None:
|
320
321
|
"""Set the positions of multiple joints."""
|
321
322
|
|
@@ -0,0 +1,101 @@
|
|
1
|
+
import mujoco as mj
|
2
|
+
import numpy as np
|
3
|
+
|
4
|
+
from . import MujocoModelHelper
|
5
|
+
|
6
|
+
|
7
|
+
def mujoco_data_from_jaxsim(
|
8
|
+
mujoco_model: mj.MjModel,
|
9
|
+
jaxsim_model,
|
10
|
+
jaxsim_data,
|
11
|
+
mujoco_data: mj.MjData | None = None,
|
12
|
+
update_removed_joints: bool = True,
|
13
|
+
) -> mj.MjData:
|
14
|
+
"""
|
15
|
+
Create a Mujoco data object from a JaxSim model and data objects.
|
16
|
+
|
17
|
+
Args:
|
18
|
+
mujoco_model: The Mujoco model object corresponding to the JaxSim model.
|
19
|
+
jaxsim_model: The JaxSim model object from which the Mujoco model was created.
|
20
|
+
jaxsim_data: The JaxSim data object containing the state of the model.
|
21
|
+
mujoco_data: An optional Mujoco data object. If None, a new one will be created.
|
22
|
+
update_removed_joints:
|
23
|
+
If True, the positions of the joints that have been removed during the
|
24
|
+
model reduction process will be set to their initial values.
|
25
|
+
|
26
|
+
Returns:
|
27
|
+
The Mujoco data object containing the state of the JaxSim model.
|
28
|
+
|
29
|
+
Note:
|
30
|
+
This method is useful to initialize a Mujoco data object used for visualization
|
31
|
+
with the state of a JaxSim model. In particular, this function takes care of
|
32
|
+
initializing the positions of the joints that have been removed during the
|
33
|
+
model reduction process. After the initial creation of the Mujoco data object,
|
34
|
+
it's faster to update the state using an external MujocoModelHelper object.
|
35
|
+
"""
|
36
|
+
|
37
|
+
# The package `jaxsim.mujoco` is supposed to be jax-independent.
|
38
|
+
# We import all the JaxSim resources privately.
|
39
|
+
import jaxsim.api as js
|
40
|
+
|
41
|
+
if not isinstance(jaxsim_model, js.model.JaxSimModel):
|
42
|
+
raise ValueError("The `jaxsim_model` argument must be a JaxSimModel object.")
|
43
|
+
|
44
|
+
if not isinstance(jaxsim_data, js.data.JaxSimModelData):
|
45
|
+
raise ValueError("The `jaxsim_data` argument must be a JaxSimModelData object.")
|
46
|
+
|
47
|
+
# Create the helper to operate on the Mujoco model and data.
|
48
|
+
model_helper = MujocoModelHelper(model=mujoco_model, data=mujoco_data)
|
49
|
+
|
50
|
+
# If the model is fixed-base, the Mujoco model won't have the joint corresponding
|
51
|
+
# to the floating base, and the helper would raise an exception.
|
52
|
+
if jaxsim_model.floating_base():
|
53
|
+
|
54
|
+
# Set the model position.
|
55
|
+
model_helper.set_base_position(position=np.array(jaxsim_data.base_position()))
|
56
|
+
|
57
|
+
# Set the model orientation.
|
58
|
+
model_helper.set_base_orientation(
|
59
|
+
orientation=np.array(jaxsim_data.base_orientation())
|
60
|
+
)
|
61
|
+
|
62
|
+
# Set the joint positions.
|
63
|
+
if jaxsim_model.dofs() > 0:
|
64
|
+
|
65
|
+
model_helper.set_joint_positions(
|
66
|
+
joint_names=list(jaxsim_model.joint_names()),
|
67
|
+
positions=np.array(
|
68
|
+
jaxsim_data.joint_positions(
|
69
|
+
model=jaxsim_model, joint_names=jaxsim_model.joint_names()
|
70
|
+
)
|
71
|
+
),
|
72
|
+
)
|
73
|
+
|
74
|
+
# Updating these joints is not necessary after the first time.
|
75
|
+
# Users can disable this update after initialization.
|
76
|
+
if update_removed_joints:
|
77
|
+
|
78
|
+
# Create a dictionary with the joints that have been removed for various reasons
|
79
|
+
# (like link lumping due to model reduction).
|
80
|
+
joints_removed_dict = {
|
81
|
+
j.name: j
|
82
|
+
for j in jaxsim_model.description._joints_removed
|
83
|
+
if j.name not in set(jaxsim_model.joint_names())
|
84
|
+
}
|
85
|
+
|
86
|
+
# Set the positions of the removed joints.
|
87
|
+
_ = [
|
88
|
+
model_helper.set_joint_position(
|
89
|
+
position=joints_removed_dict[joint_name].initial_position,
|
90
|
+
joint_name=joint_name,
|
91
|
+
)
|
92
|
+
# Select all original joint that have been removed from the JaxSim model
|
93
|
+
# that are still present in the Mujoco model.
|
94
|
+
for joint_name in joints_removed_dict
|
95
|
+
if joint_name in model_helper.joint_names()
|
96
|
+
]
|
97
|
+
|
98
|
+
# Return the mujoco data with updated kinematics.
|
99
|
+
mj.mj_forward(mujoco_model, model_helper.data)
|
100
|
+
|
101
|
+
return model_helper.data
|
@@ -89,7 +89,7 @@ class MujocoVideoRecorder:
|
|
89
89
|
if not exist_ok and path.is_file():
|
90
90
|
raise FileExistsError(f"The file '{path}' already exists.")
|
91
91
|
|
92
|
-
media.write_video(path=path, images=self.frames, fps=self.fps)
|
92
|
+
media.write_video(path=path, images=np.array(self.frames), fps=self.fps)
|
93
93
|
|
94
94
|
@staticmethod
|
95
95
|
def compute_down_sampling(original_fps: int, target_min_fps: int) -> int:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: jaxsim
|
3
|
-
Version: 0.4.3.
|
3
|
+
Version: 0.4.3.dev186
|
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>
|
6
6
|
Maintainer-email: Diego Ferigo <dgferigo@gmail.com>, Filippo Luca Ferretti <filippo.ferretti@iit.it>
|
@@ -75,6 +75,7 @@ src/jaxsim/mujoco/__init__.py
|
|
75
75
|
src/jaxsim/mujoco/__main__.py
|
76
76
|
src/jaxsim/mujoco/loaders.py
|
77
77
|
src/jaxsim/mujoco/model.py
|
78
|
+
src/jaxsim/mujoco/utils.py
|
78
79
|
src/jaxsim/mujoco/visualizer.py
|
79
80
|
src/jaxsim/parsers/__init__.py
|
80
81
|
src/jaxsim/parsers/kinematic_graph.py
|
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
|