jaxsim 0.4.1.dev9__tar.gz → 0.4.1.dev15__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/PKG-INFO +1 -1
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/_version.py +2 -2
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/integrators/common.py +24 -33
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/rbda/utils.py +8 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim.egg-info/PKG-INFO +1 -1
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/test_automatic_differentiation.py +3 -3
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/test_simulations.py +50 -30
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/.devcontainer/Dockerfile +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/.devcontainer/devcontainer.json +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/.gitattributes +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/.github/CODEOWNERS +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/.github/workflows/ci_cd.yml +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/.github/workflows/read_the_docs.yml +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/.gitignore +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/.pre-commit-config.yaml +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/.readthedocs.yaml +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/CONTRIBUTING.md +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/LICENSE +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/README.md +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/Makefile +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/conf.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/examples.rst +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/guide/install.rst +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/index.rst +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/make.bat +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/modules/api.rst +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/modules/integrators.rst +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/modules/math.rst +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/modules/mujoco.rst +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/modules/parsers.rst +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/modules/rbda.rst +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/modules/typing.rst +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/docs/modules/utils.rst +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/environment.yml +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/examples/.gitattributes +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/examples/.gitignore +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/examples/PD_controller.ipynb +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/examples/Parallel_computing.ipynb +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/examples/README.md +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/examples/assets/cartpole.urdf +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/pixi.lock +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/pyproject.toml +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/setup.cfg +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/setup.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/__init__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/api/__init__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/api/com.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/api/common.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/api/contact.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/api/data.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/api/frame.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/api/joint.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/api/link.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/api/model.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/api/ode.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/api/ode_data.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/api/references.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/exceptions.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/integrators/__init__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/integrators/fixed_step.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/integrators/variable_step.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/logging.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/math/__init__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/math/adjoint.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/math/cross.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/math/inertia.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/math/joint_model.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/math/quaternion.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/math/rotation.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/math/skew.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/math/transform.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/mujoco/__init__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/mujoco/__main__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/mujoco/loaders.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/mujoco/model.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/mujoco/visualizer.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/parsers/__init__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/parsers/descriptions/collision.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/parsers/descriptions/joint.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/parsers/descriptions/link.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/parsers/descriptions/model.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/parsers/kinematic_graph.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/parsers/rod/__init__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/parsers/rod/parser.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/parsers/rod/utils.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/rbda/__init__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/rbda/aba.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/rbda/collidable_points.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/rbda/contacts/__init__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/rbda/contacts/common.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/rbda/contacts/soft.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/rbda/crba.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/rbda/forward_kinematics.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/rbda/jacobian.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/rbda/rnea.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/terrain/__init__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/terrain/terrain.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/typing.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/utils/__init__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/utils/tracing.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim/utils/wrappers.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim.egg-info/SOURCES.txt +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim.egg-info/dependency_links.txt +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim.egg-info/requires.txt +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/src/jaxsim.egg-info/top_level.txt +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/__init__.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/conftest.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/test_api_com.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/test_api_contact.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/test_api_data.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/test_api_frame.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/test_api_joint.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/test_api_link.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/test_api_model.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/test_contact.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/test_exceptions.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/test_pytree.py +0 -0
- {jaxsim-0.4.1.dev9 → jaxsim-0.4.1.dev15}/tests/utils_idyntree.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: jaxsim
|
3
|
-
Version: 0.4.1.
|
3
|
+
Version: 0.4.1.dev15
|
4
4
|
Summary: A differentiable physics engine and multibody dynamics library for control and robot learning.
|
5
5
|
Author-email: Diego Ferigo <dgferigo@gmail.com>
|
6
6
|
Maintainer-email: Diego Ferigo <dgferigo@gmail.com>, Filippo Luca Ferretti <filippo.ferretti@iit.it>
|
@@ -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.1.
|
16
|
-
__version_tuple__ = version_tuple = (0, 4, 1, '
|
15
|
+
__version__ = version = '0.4.1.dev15'
|
16
|
+
__version_tuple__ = version_tuple = (0, 4, 1, 'dev15')
|
@@ -5,11 +5,12 @@ from typing import Any, ClassVar, Generic, Protocol, Type, TypeVar
|
|
5
5
|
import jax
|
6
6
|
import jax.numpy as jnp
|
7
7
|
import jax_dataclasses
|
8
|
-
import jaxlie
|
9
8
|
from jax_dataclasses import Static
|
10
9
|
|
11
10
|
import jaxsim.api as js
|
11
|
+
import jaxsim.math
|
12
12
|
import jaxsim.typing as jtp
|
13
|
+
from jaxsim import exceptions
|
13
14
|
from jaxsim.utils.jaxsim_dataclass import JaxsimDataclass, Mutability
|
14
15
|
|
15
16
|
try:
|
@@ -539,48 +540,38 @@ class ExplicitRungeKuttaSO3Mixin:
|
|
539
540
|
`PyTreeType = ODEState` to integrate the quaternion on SO(3).
|
540
541
|
"""
|
541
542
|
|
542
|
-
@classmethod
|
543
|
-
def integrate_rk_stage(
|
544
|
-
cls, x0: js.ode_data.ODEState, t0: Time, dt: TimeStep, k: js.ode_data.ODEState
|
545
|
-
) -> js.ode_data.ODEState:
|
546
|
-
|
547
|
-
op = lambda x0_leaf, k_leaf: x0_leaf + dt * k_leaf
|
548
|
-
xf: js.ode_data.ODEState = jax.tree_util.tree_map(op, x0, k)
|
549
|
-
|
550
|
-
W_Q_B_tf = xf.physics_model.base_quaternion
|
551
|
-
|
552
|
-
return xf.replace(
|
553
|
-
physics_model=xf.physics_model.replace(
|
554
|
-
base_quaternion=W_Q_B_tf / jnp.linalg.norm(W_Q_B_tf)
|
555
|
-
)
|
556
|
-
)
|
557
|
-
|
558
543
|
@classmethod
|
559
544
|
def post_process_state(
|
560
545
|
cls, x0: js.ode_data.ODEState, t0: Time, xf: js.ode_data.ODEState, dt: TimeStep
|
561
546
|
) -> js.ode_data.ODEState:
|
562
547
|
|
563
|
-
#
|
564
|
-
|
548
|
+
# Extract the initial base quaternion.
|
549
|
+
W_Q_B_t0 = x0.physics_model.base_quaternion
|
565
550
|
|
566
|
-
#
|
567
|
-
|
568
|
-
|
551
|
+
# We assume that the initial quaternion is already unary.
|
552
|
+
exceptions.raise_runtime_error_if(
|
553
|
+
condition=jnp.logical_not(jnp.allclose(W_Q_B_t0.dot(W_Q_B_t0), 1.0)),
|
554
|
+
msg="The SO(3) integrator received a quaternion at t0 that is not unary.",
|
569
555
|
)
|
570
556
|
|
571
|
-
# Get the
|
572
|
-
# This is
|
573
|
-
# Therefore, by using the ω
|
574
|
-
# on the SO(3) manifold.
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
#
|
580
|
-
|
557
|
+
# Get the angular velocity ω to integrate the quaternion.
|
558
|
+
# This velocity ω[t0] is computed in the previous timestep by averaging the kᵢ
|
559
|
+
# corresponding to the active RK-based scheme. Therefore, by using the ω[t0],
|
560
|
+
# we obtain an explicit RK scheme operating on the SO(3) manifold.
|
561
|
+
# Note that the current integrator is not a semi-implicit scheme, therefore
|
562
|
+
# using the final ω[tf] would be not correct.
|
563
|
+
W_ω_WB_t0 = x0.physics_model.base_angular_velocity
|
564
|
+
|
565
|
+
# Integrate the quaternion on SO(3).
|
566
|
+
W_Q_B_tf = jaxsim.math.Quaternion.integration(
|
567
|
+
quaternion=W_Q_B_t0,
|
568
|
+
dt=dt,
|
569
|
+
omega=W_ω_WB_t0,
|
570
|
+
omega_in_body_fixed=False,
|
571
|
+
)
|
581
572
|
|
582
573
|
# Replace the quaternion in the final state.
|
583
574
|
return xf.replace(
|
584
|
-
physics_model=xf.physics_model.replace(base_quaternion=
|
575
|
+
physics_model=xf.physics_model.replace(base_quaternion=W_Q_B_tf),
|
585
576
|
validate=True,
|
586
577
|
)
|
@@ -2,6 +2,7 @@ import jax.numpy as jnp
|
|
2
2
|
|
3
3
|
import jaxsim.api as js
|
4
4
|
import jaxsim.typing as jtp
|
5
|
+
from jaxsim import exceptions
|
5
6
|
from jaxsim.math import StandardGravity
|
6
7
|
|
7
8
|
|
@@ -131,6 +132,13 @@ def process_inputs(
|
|
131
132
|
if W_Q_B.shape != (4,):
|
132
133
|
raise ValueError(W_Q_B.shape, (4,))
|
133
134
|
|
135
|
+
# Check that the quaternion is unary since our RBDAs make this assumption in order
|
136
|
+
# to prevent introducing additional normalizations that would affect AD.
|
137
|
+
exceptions.raise_value_error_if(
|
138
|
+
condition=jnp.logical_not(jnp.allclose(W_Q_B.dot(W_Q_B), 1.0)),
|
139
|
+
msg="A RBDA received a quaternion that is not normalized.",
|
140
|
+
)
|
141
|
+
|
134
142
|
# Pack the 6D base velocity and acceleration.
|
135
143
|
W_v_WB = jnp.hstack([W_vl_WB, W_ω_WB])
|
136
144
|
W_v̇_WB = jnp.hstack([W_v̇l_WB, W_ω̇_WB])
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: jaxsim
|
3
|
-
Version: 0.4.1.
|
3
|
+
Version: 0.4.1.dev15
|
4
4
|
Summary: A differentiable physics engine and multibody dynamics library for control and robot learning.
|
5
5
|
Author-email: Diego Ferigo <dgferigo@gmail.com>
|
6
6
|
Maintainer-email: Diego Ferigo <dgferigo@gmail.com>, Filippo Luca Ferretti <filippo.ferretti@iit.it>
|
@@ -93,7 +93,7 @@ def test_ad_aba(
|
|
93
93
|
aba = lambda W_p_B, W_Q_B, s, W_v_WB, ṡ, τ, W_f_L, g: jaxsim.rbda.aba(
|
94
94
|
model=model,
|
95
95
|
base_position=W_p_B,
|
96
|
-
base_quaternion=W_Q_B,
|
96
|
+
base_quaternion=W_Q_B / jnp.linalg.norm(W_Q_B),
|
97
97
|
joint_positions=s,
|
98
98
|
base_linear_velocity=W_v_WB[0:3],
|
99
99
|
base_angular_velocity=W_v_WB[3:6],
|
@@ -150,7 +150,7 @@ def test_ad_rnea(
|
|
150
150
|
rnea = lambda W_p_B, W_Q_B, s, W_v_WB, ṡ, W_v̇_WB, s̈, W_f_L, g: jaxsim.rbda.rnea(
|
151
151
|
model=model,
|
152
152
|
base_position=W_p_B,
|
153
|
-
base_quaternion=W_Q_B,
|
153
|
+
base_quaternion=W_Q_B / jnp.linalg.norm(W_Q_B),
|
154
154
|
joint_positions=s,
|
155
155
|
base_linear_velocity=W_v_WB[0:3],
|
156
156
|
base_angular_velocity=W_v_WB[3:6],
|
@@ -229,7 +229,7 @@ def test_ad_fk(
|
|
229
229
|
fk = lambda W_p_B, W_Q_B, s: jaxsim.rbda.forward_kinematics_model(
|
230
230
|
model=model,
|
231
231
|
base_position=W_p_B,
|
232
|
-
base_quaternion=W_Q_B,
|
232
|
+
base_quaternion=W_Q_B / jnp.linalg.norm(W_Q_B),
|
233
233
|
joint_positions=s,
|
234
234
|
)
|
235
235
|
|
@@ -6,7 +6,7 @@ import jaxsim.api as js
|
|
6
6
|
import jaxsim.integrators
|
7
7
|
import jaxsim.rbda
|
8
8
|
from jaxsim import VelRepr
|
9
|
-
from jaxsim.
|
9
|
+
from jaxsim.utils import Mutability
|
10
10
|
|
11
11
|
|
12
12
|
def test_box_with_external_forces(
|
@@ -102,23 +102,19 @@ def test_box_with_zero_gravity(
|
|
102
102
|
|
103
103
|
model = jaxsim_model_box
|
104
104
|
|
105
|
+
# Move the terrain (almost) infinitely far away from the box.
|
106
|
+
with model.mutable_context(mutability=Mutability.MUTABLE_NO_VALIDATION):
|
107
|
+
model.terrain = jaxsim.terrain.FlatTerrain.build(height=-1e9)
|
108
|
+
|
105
109
|
# Split the PRNG key.
|
106
|
-
_, subkey
|
110
|
+
_, subkey = jax.random.split(prng_key, num=2)
|
107
111
|
|
108
112
|
# Build the data of the model.
|
109
113
|
data0 = js.data.JaxSimModelData.build(
|
110
114
|
model=model,
|
111
|
-
base_position=jax.random.uniform(
|
115
|
+
base_position=jax.random.uniform(subkey, shape=(3,)),
|
112
116
|
velocity_representation=velocity_representation,
|
113
117
|
standard_gravity=0.0,
|
114
|
-
contacts_params=SoftContactsParams.build(K=0.0, D=0.0, mu=0.0),
|
115
|
-
)
|
116
|
-
|
117
|
-
# Generate a random linear force.
|
118
|
-
L_f = (
|
119
|
-
jax.random.uniform(subkey, shape=(model.number_of_links(), 6))
|
120
|
-
.at[:, 3:]
|
121
|
-
.set(jnp.zeros(3))
|
122
118
|
)
|
123
119
|
|
124
120
|
# Initialize a references object that simplifies handling external forces.
|
@@ -129,13 +125,29 @@ def test_box_with_zero_gravity(
|
|
129
125
|
)
|
130
126
|
|
131
127
|
# Apply a link forces to the base link.
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
128
|
+
with references.switch_velocity_representation(jaxsim.VelRepr.Mixed):
|
129
|
+
|
130
|
+
# Generate a random linear force.
|
131
|
+
# We enforce them to be the same for all velocity representations so that
|
132
|
+
# we can compare their outcomes.
|
133
|
+
LW_f = 10.0 * (
|
134
|
+
jax.random.uniform(jax.random.key(0), shape=(model.number_of_links(), 6))
|
135
|
+
.at[:, 3:]
|
136
|
+
.set(jnp.zeros(3))
|
137
|
+
)
|
138
|
+
|
139
|
+
# Note that the context manager does not switch back the newly created
|
140
|
+
# `references` (that is not the yielded object) to the original representation.
|
141
|
+
# In the simulation loop below, we need to make sure that we switch both `data`
|
142
|
+
# and `references` to the same representation before extracting the information
|
143
|
+
# passed to the step function.
|
144
|
+
references = references.apply_link_forces(
|
145
|
+
forces=jnp.atleast_2d(LW_f),
|
146
|
+
link_names=model.link_names(),
|
147
|
+
model=model,
|
148
|
+
data=data0,
|
149
|
+
additive=False,
|
150
|
+
)
|
139
151
|
|
140
152
|
# Create the integrator.
|
141
153
|
integrator = jaxsim.integrators.fixed_step.RungeKutta4SO3.build(
|
@@ -145,8 +157,7 @@ def test_box_with_zero_gravity(
|
|
145
157
|
)
|
146
158
|
|
147
159
|
# Initialize the integrator.
|
148
|
-
tf = 1.0
|
149
|
-
dt = 0.010
|
160
|
+
tf, dt = 1.0, 0.010
|
150
161
|
T = jnp.arange(start=0, stop=tf * 1e9, step=dt * 1e9, dtype=int)
|
151
162
|
integrator_state = integrator.init(x0=data0.state, t0=0.0, dt=dt)
|
152
163
|
|
@@ -156,19 +167,28 @@ def test_box_with_zero_gravity(
|
|
156
167
|
# ... and step the simulation.
|
157
168
|
for t_ns in T:
|
158
169
|
|
159
|
-
data
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
170
|
+
assert data.time() == t_ns / 1e9
|
171
|
+
|
172
|
+
with (
|
173
|
+
data.switch_velocity_representation(velocity_representation),
|
174
|
+
references.switch_velocity_representation(velocity_representation),
|
175
|
+
):
|
176
|
+
|
177
|
+
data, integrator_state = js.model.step(
|
178
|
+
model=model,
|
179
|
+
data=data,
|
180
|
+
dt=dt,
|
181
|
+
integrator=integrator,
|
182
|
+
integrator_state=integrator_state,
|
183
|
+
link_forces=references.link_forces(model=model, data=data),
|
184
|
+
)
|
185
|
+
|
186
|
+
# Check the final simulation time.
|
187
|
+
assert data.time() == T[-1] / 1e9 + dt
|
167
188
|
|
168
189
|
# Check that the box moved as expected.
|
169
|
-
assert data.time() == t_ns / 1e9 + dt
|
170
190
|
assert data.base_position() == pytest.approx(
|
171
191
|
data0.base_position()
|
172
|
-
+ 0.5 *
|
192
|
+
+ 0.5 * LW_f[:, :3].squeeze() / js.model.total_mass(model=model) * tf**2,
|
173
193
|
abs=1e-3,
|
174
194
|
)
|
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
|