jaxsim 0.4.3.dev271__tar.gz → 0.4.3.dev280__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.dev271 → jaxsim-0.4.3.dev280}/PKG-INFO +1 -1
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/_version.py +2 -2
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/api/joint.py +5 -2
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/api/ode.py +32 -1
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/parsers/rod/parser.py +3 -2
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim.egg-info/PKG-INFO +1 -1
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/conftest.py +112 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/test_simulations.py +56 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/.devcontainer/Dockerfile +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/.devcontainer/devcontainer.json +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/.gitattributes +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/.github/CODEOWNERS +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/.github/dependabot.yml +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/.github/workflows/ci_cd.yml +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/.github/workflows/read_the_docs.yml +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/.github/workflows/update_pixi_lockfile.yml +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/.gitignore +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/.pre-commit-config.yaml +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/.readthedocs.yaml +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/CONTRIBUTING.md +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/LICENSE +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/README.md +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/Makefile +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/conf.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/examples.rst +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/guide/install.rst +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/index.rst +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/make.bat +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/modules/api.rst +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/modules/integrators.rst +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/modules/math.rst +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/modules/mujoco.rst +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/modules/parsers.rst +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/modules/rbda.rst +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/modules/typing.rst +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/docs/modules/utils.rst +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/environment.yml +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/examples/.gitattributes +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/examples/.gitignore +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/examples/README.md +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/examples/assets/build_cartpole_urdf.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/examples/assets/cartpole.urdf +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/examples/jaxsim_as_multibody_dynamics_library.ipynb +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/examples/jaxsim_as_physics_engine.ipynb +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/examples/jaxsim_for_robot_controllers.ipynb +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/pixi.lock +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/pyproject.toml +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/setup.cfg +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/setup.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/__init__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/api/__init__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/api/com.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/api/common.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/api/contact.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/api/data.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/api/frame.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/api/link.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/api/model.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/api/ode_data.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/api/references.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/exceptions.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/integrators/__init__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/integrators/common.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/integrators/fixed_step.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/integrators/variable_step.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/logging.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/math/__init__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/math/adjoint.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/math/cross.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/math/inertia.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/math/joint_model.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/math/quaternion.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/math/rotation.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/math/skew.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/math/transform.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/mujoco/__init__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/mujoco/__main__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/mujoco/loaders.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/mujoco/model.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/mujoco/utils.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/mujoco/visualizer.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/parsers/__init__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/parsers/descriptions/collision.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/parsers/descriptions/joint.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/parsers/descriptions/link.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/parsers/descriptions/model.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/parsers/kinematic_graph.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/parsers/rod/__init__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/parsers/rod/utils.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/__init__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/aba.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/collidable_points.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/contacts/__init__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/contacts/common.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/contacts/relaxed_rigid.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/contacts/rigid.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/contacts/soft.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/contacts/visco_elastic.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/crba.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/forward_kinematics.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/jacobian.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/rnea.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/rbda/utils.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/terrain/__init__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/terrain/terrain.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/typing.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/utils/__init__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/utils/tracing.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim/utils/wrappers.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim.egg-info/SOURCES.txt +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim.egg-info/dependency_links.txt +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim.egg-info/requires.txt +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/src/jaxsim.egg-info/top_level.txt +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/__init__.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/test_api_com.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/test_api_contact.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/test_api_data.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/test_api_frame.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/test_api_joint.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/test_api_link.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/test_api_model.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/test_automatic_differentiation.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/test_contact.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/test_exceptions.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/tests/test_pytree.py +0 -0
- {jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/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.dev280
|
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.3.
|
16
|
-
__version_tuple__ = version_tuple = (0, 4, 3, '
|
15
|
+
__version__ = version = '0.4.3.dev280'
|
16
|
+
__version_tuple__ = version_tuple = (0, 4, 3, 'dev280')
|
@@ -122,8 +122,11 @@ def position_limit(
|
|
122
122
|
The position limits of the joint.
|
123
123
|
"""
|
124
124
|
|
125
|
-
if model.number_of_joints()
|
126
|
-
|
125
|
+
if model.number_of_joints() == 0:
|
126
|
+
s_min = model.kin_dyn_parameters.joint_parameters.position_limits_min
|
127
|
+
s_max = model.kin_dyn_parameters.joint_parameters.position_limits_max
|
128
|
+
|
129
|
+
return jnp.atleast_1d(s_min).astype(float), jnp.atleast_1d(s_max).astype(float)
|
127
130
|
|
128
131
|
exceptions.raise_value_error_if(
|
129
132
|
condition=jnp.array(
|
@@ -243,9 +243,40 @@ def system_acceleration(
|
|
243
243
|
# Enforce joint limits
|
244
244
|
# ====================
|
245
245
|
|
246
|
-
# TODO: enforce joint limits
|
247
246
|
τ_position_limit = jnp.zeros_like(τ_references).astype(float)
|
248
247
|
|
248
|
+
if model.dofs() > 0:
|
249
|
+
|
250
|
+
# Stiffness and damper parameters for the joint position limits.
|
251
|
+
k_j = jnp.array(
|
252
|
+
model.kin_dyn_parameters.joint_parameters.position_limit_spring
|
253
|
+
).astype(float)
|
254
|
+
d_j = jnp.array(
|
255
|
+
model.kin_dyn_parameters.joint_parameters.position_limit_damper
|
256
|
+
).astype(float)
|
257
|
+
|
258
|
+
# Compute the joint position limit violations.
|
259
|
+
lower_violation = jnp.clip(
|
260
|
+
data.state.physics_model.joint_positions
|
261
|
+
- model.kin_dyn_parameters.joint_parameters.position_limits_min,
|
262
|
+
max=0.0,
|
263
|
+
)
|
264
|
+
|
265
|
+
upper_violation = jnp.clip(
|
266
|
+
data.state.physics_model.joint_positions
|
267
|
+
- model.kin_dyn_parameters.joint_parameters.position_limits_max,
|
268
|
+
min=0.0,
|
269
|
+
)
|
270
|
+
|
271
|
+
# Compute the joint position limit torque.
|
272
|
+
τ_position_limit -= jnp.diag(k_j) @ (lower_violation + upper_violation)
|
273
|
+
|
274
|
+
τ_position_limit -= (
|
275
|
+
jnp.positive(τ_position_limit)
|
276
|
+
* jnp.diag(d_j)
|
277
|
+
@ data.state.physics_model.joint_velocities
|
278
|
+
)
|
279
|
+
|
249
280
|
# ====================
|
250
281
|
# Joint friction model
|
251
282
|
# ====================
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import dataclasses
|
2
|
+
import os
|
2
3
|
import pathlib
|
3
4
|
from typing import NamedTuple
|
4
5
|
|
@@ -273,14 +274,14 @@ def extract_model_data(
|
|
273
274
|
if j.axis is not None
|
274
275
|
and j.axis.limit is not None
|
275
276
|
and j.axis.limit.dissipation is not None
|
276
|
-
else 0.0
|
277
|
+
else os.environ.get("JAXSIM_JOINT_POSITION_LIMIT_DAMPER", 0.0)
|
277
278
|
),
|
278
279
|
position_limit_spring=float(
|
279
280
|
j.axis.limit.stiffness
|
280
281
|
if j.axis is not None
|
281
282
|
and j.axis.limit is not None
|
282
283
|
and j.axis.limit.stiffness is not None
|
283
|
-
else 0.0
|
284
|
+
else os.environ.get("JAXSIM_JOINT_POSITION_LIMIT_SPRING", 0.0)
|
284
285
|
),
|
285
286
|
)
|
286
287
|
for j in sdf_model.joints()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: jaxsim
|
3
|
-
Version: 0.4.3.
|
3
|
+
Version: 0.4.3.dev280
|
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>
|
@@ -250,6 +250,116 @@ def jaxsim_model_ur10() -> js.model.JaxSimModel:
|
|
250
250
|
return build_jaxsim_model(model_description=model_urdf_path)
|
251
251
|
|
252
252
|
|
253
|
+
@pytest.fixture(scope="session")
|
254
|
+
def jaxsim_model_single_pendulum() -> js.model.JaxSimModel:
|
255
|
+
"""
|
256
|
+
Fixture providing the JaxSim model of a single pendulum.
|
257
|
+
Returns:
|
258
|
+
The JaxSim model of a single pendulum.
|
259
|
+
"""
|
260
|
+
|
261
|
+
import numpy as np
|
262
|
+
import rod.builder.primitives
|
263
|
+
|
264
|
+
base_height = 2.15
|
265
|
+
upper_height = 1.0
|
266
|
+
|
267
|
+
# ===================
|
268
|
+
# Create the builders
|
269
|
+
# ===================
|
270
|
+
|
271
|
+
base_builder = rod.builder.primitives.BoxBuilder(
|
272
|
+
name="base",
|
273
|
+
mass=1.0,
|
274
|
+
x=0.15,
|
275
|
+
y=0.15,
|
276
|
+
z=base_height,
|
277
|
+
)
|
278
|
+
|
279
|
+
upper_builder = rod.builder.primitives.BoxBuilder(
|
280
|
+
name="upper",
|
281
|
+
mass=0.5,
|
282
|
+
x=0.15,
|
283
|
+
y=0.15,
|
284
|
+
z=upper_height,
|
285
|
+
)
|
286
|
+
|
287
|
+
# =================
|
288
|
+
# Create the joints
|
289
|
+
# =================
|
290
|
+
|
291
|
+
fixed = rod.Joint(
|
292
|
+
name="fixed_joint",
|
293
|
+
type="fixed",
|
294
|
+
parent="world",
|
295
|
+
child=base_builder.name,
|
296
|
+
)
|
297
|
+
|
298
|
+
pivot = rod.Joint(
|
299
|
+
name="upper_joint",
|
300
|
+
type="continuous",
|
301
|
+
parent=base_builder.name,
|
302
|
+
child=upper_builder.name,
|
303
|
+
axis=rod.Axis(
|
304
|
+
xyz=rod.Xyz([1, 0, 0]),
|
305
|
+
limit=rod.Limit(),
|
306
|
+
),
|
307
|
+
)
|
308
|
+
|
309
|
+
# ================
|
310
|
+
# Create the links
|
311
|
+
# ================
|
312
|
+
|
313
|
+
base = (
|
314
|
+
base_builder.build_link(
|
315
|
+
name=base_builder.name,
|
316
|
+
pose=rod.builder.primitives.PrimitiveBuilder.build_pose(
|
317
|
+
pos=np.array([0, 0, base_height / 2])
|
318
|
+
),
|
319
|
+
)
|
320
|
+
.add_inertial()
|
321
|
+
.add_visual()
|
322
|
+
.add_collision()
|
323
|
+
.build()
|
324
|
+
)
|
325
|
+
|
326
|
+
upper_pose = rod.builder.primitives.PrimitiveBuilder.build_pose(
|
327
|
+
pos=np.array([0, 0, upper_height / 2])
|
328
|
+
)
|
329
|
+
|
330
|
+
upper = (
|
331
|
+
upper_builder.build_link(
|
332
|
+
name=upper_builder.name,
|
333
|
+
pose=rod.builder.primitives.PrimitiveBuilder.build_pose(
|
334
|
+
relative_to=base.name, pos=np.array([0, 0, upper_height])
|
335
|
+
),
|
336
|
+
)
|
337
|
+
.add_inertial(pose=upper_pose)
|
338
|
+
.add_visual(pose=upper_pose)
|
339
|
+
.add_collision(pose=upper_pose)
|
340
|
+
.build()
|
341
|
+
)
|
342
|
+
|
343
|
+
rod_model = rod.Sdf(
|
344
|
+
version="1.10",
|
345
|
+
model=rod.Model(
|
346
|
+
name="single_pendulum",
|
347
|
+
link=[base, upper],
|
348
|
+
joint=[fixed, pivot],
|
349
|
+
),
|
350
|
+
)
|
351
|
+
|
352
|
+
rod_model.model.resolve_frames()
|
353
|
+
|
354
|
+
urdf_string = rod.urdf.exporter.UrdfExporter.sdf_to_urdf_string(
|
355
|
+
sdf=rod_model.models()[0]
|
356
|
+
)
|
357
|
+
|
358
|
+
model = build_jaxsim_model(model_description=urdf_string)
|
359
|
+
|
360
|
+
return model
|
361
|
+
|
362
|
+
|
253
363
|
# ============================
|
254
364
|
# Collections of JaxSim models
|
255
365
|
# ============================
|
@@ -280,6 +390,8 @@ def get_jaxsim_model_fixture(
|
|
280
390
|
return request.getfixturevalue(jaxsim_model_ergocub_reduced.__name__)
|
281
391
|
case "ur10":
|
282
392
|
return request.getfixturevalue(jaxsim_model_ur10.__name__)
|
393
|
+
case "single_pendulum":
|
394
|
+
return request.getfixturevalue(jaxsim_model_single_pendulum.__name__)
|
283
395
|
case _:
|
284
396
|
raise ValueError(model_name)
|
285
397
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import jax
|
2
2
|
import jax.numpy as jnp
|
3
|
+
import numpy as np
|
3
4
|
import pytest
|
4
5
|
|
5
6
|
import jaxsim.api as js
|
@@ -370,3 +371,58 @@ def test_simulation_with_relaxed_rigid_contacts(
|
|
370
371
|
assert data_tf.base_position()[2] + max_penetration == pytest.approx(
|
371
372
|
box_height / 2, abs=0.000_100
|
372
373
|
)
|
374
|
+
|
375
|
+
|
376
|
+
def test_joint_limits(
|
377
|
+
jaxsim_model_single_pendulum: js.model.JaxSimModel,
|
378
|
+
):
|
379
|
+
|
380
|
+
model = jaxsim_model_single_pendulum
|
381
|
+
|
382
|
+
with model.editable(validate=False) as model:
|
383
|
+
model.kin_dyn_parameters.joint_parameters.position_limits_max = jnp.atleast_1d(
|
384
|
+
jnp.array(1.5708)
|
385
|
+
)
|
386
|
+
model.kin_dyn_parameters.joint_parameters.position_limits_min = jnp.atleast_1d(
|
387
|
+
jnp.array(-1.5708)
|
388
|
+
)
|
389
|
+
model.kin_dyn_parameters.joint_parameters.position_limit_spring = (
|
390
|
+
jnp.atleast_1d(jnp.array(75.0))
|
391
|
+
)
|
392
|
+
model.kin_dyn_parameters.joint_parameters.position_limit_damper = (
|
393
|
+
jnp.atleast_1d(jnp.array(0.1))
|
394
|
+
)
|
395
|
+
|
396
|
+
position_limits_min, position_limits_max = js.joint.position_limits(model=model)
|
397
|
+
|
398
|
+
data = js.data.JaxSimModelData.build(
|
399
|
+
model=model,
|
400
|
+
velocity_representation=VelRepr.Inertial,
|
401
|
+
)
|
402
|
+
|
403
|
+
theta = 10 * np.pi / 180
|
404
|
+
|
405
|
+
# Define a tolerance since the spring-damper model does
|
406
|
+
# not guarantee that the joint position will be exactly
|
407
|
+
# below the limit.
|
408
|
+
tolerance = theta * 0.10
|
409
|
+
|
410
|
+
# Test minimum joint position limits.
|
411
|
+
data_t0 = data.reset_joint_positions(positions=position_limits_min - theta)
|
412
|
+
|
413
|
+
data_tf = run_simulation(model=model, data_t0=data_t0, dt=0.005, tf=3.0)
|
414
|
+
|
415
|
+
assert (
|
416
|
+
np.min(np.array(data_tf.joint_positions()), axis=0) + tolerance
|
417
|
+
>= position_limits_min
|
418
|
+
)
|
419
|
+
|
420
|
+
# Test maximum joint position limits.
|
421
|
+
data_t0 = data.reset_joint_positions(positions=position_limits_max - theta)
|
422
|
+
|
423
|
+
data_tf = run_simulation(model=model, data_t0=data_t0, dt=0.001, tf=3.0)
|
424
|
+
|
425
|
+
assert (
|
426
|
+
np.max(np.array(data_tf.joint_positions()), axis=0) - tolerance
|
427
|
+
<= position_limits_max
|
428
|
+
)
|
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
|
{jaxsim-0.4.3.dev271 → jaxsim-0.4.3.dev280}/examples/jaxsim_as_multibody_dynamics_library.ipynb
RENAMED
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
|