jaxsim 0.4.3.dev186__tar.gz → 0.4.3.dev207__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.dev186 → jaxsim-0.4.3.dev207}/PKG-INFO +1 -1
- jaxsim-0.4.3.dev207/docs/examples.rst +46 -0
- jaxsim-0.4.3.dev207/examples/README.md +41 -0
- jaxsim-0.4.3.dev207/examples/assets/build_cartpole_urdf.py +202 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/examples/assets/cartpole.urdf +21 -24
- jaxsim-0.4.3.dev207/examples/jaxsim_as_physics_engine.ipynb +481 -0
- jaxsim-0.4.3.dev207/examples/jaxsim_for_robot_controllers.ipynb +482 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/_version.py +2 -2
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/api/contact.py +58 -19
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/api/data.py +3 -2
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/api/model.py +8 -12
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/contacts/__init__.py +7 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/contacts/common.py +49 -3
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/contacts/relaxed_rigid.py +133 -72
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/contacts/rigid.py +94 -115
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/contacts/soft.py +21 -37
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/contacts/visco_elastic.py +3 -3
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim.egg-info/PKG-INFO +1 -1
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim.egg-info/SOURCES.txt +3 -2
- jaxsim-0.4.3.dev207/tests/test_simulations.py +424 -0
- jaxsim-0.4.3.dev186/docs/examples.rst +0 -46
- jaxsim-0.4.3.dev186/examples/PD_controller.ipynb +0 -328
- jaxsim-0.4.3.dev186/examples/Parallel_computing.ipynb +0 -317
- jaxsim-0.4.3.dev186/examples/README.md +0 -40
- jaxsim-0.4.3.dev186/tests/test_simulations.py +0 -188
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/.devcontainer/Dockerfile +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/.devcontainer/devcontainer.json +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/.gitattributes +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/.github/CODEOWNERS +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/.github/workflows/ci_cd.yml +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/.github/workflows/read_the_docs.yml +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/.github/workflows/update_pixi_lockfile.yml +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/.gitignore +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/.pre-commit-config.yaml +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/.readthedocs.yaml +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/CONTRIBUTING.md +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/LICENSE +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/README.md +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/docs/Makefile +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/docs/conf.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/docs/guide/install.rst +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/docs/index.rst +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/docs/make.bat +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/docs/modules/api.rst +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/docs/modules/integrators.rst +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/docs/modules/math.rst +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/docs/modules/mujoco.rst +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/docs/modules/parsers.rst +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/docs/modules/rbda.rst +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/docs/modules/typing.rst +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/docs/modules/utils.rst +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/environment.yml +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/examples/.gitattributes +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/examples/.gitignore +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/pixi.lock +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/pyproject.toml +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/setup.cfg +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/setup.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/__init__.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/api/__init__.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/api/com.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/api/common.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/api/frame.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/api/joint.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/api/link.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/api/ode.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/api/ode_data.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/api/references.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/exceptions.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/integrators/__init__.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/integrators/common.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/integrators/fixed_step.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/integrators/variable_step.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/logging.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/math/__init__.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/math/adjoint.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/math/cross.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/math/inertia.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/math/joint_model.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/math/quaternion.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/math/rotation.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/math/skew.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/math/transform.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/mujoco/__init__.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/mujoco/__main__.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/mujoco/loaders.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/mujoco/model.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/mujoco/utils.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/mujoco/visualizer.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/parsers/__init__.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/parsers/descriptions/collision.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/parsers/descriptions/joint.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/parsers/descriptions/link.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/parsers/descriptions/model.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/parsers/kinematic_graph.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/parsers/rod/__init__.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/parsers/rod/parser.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/parsers/rod/utils.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/__init__.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/aba.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/collidable_points.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/crba.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/forward_kinematics.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/jacobian.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/rnea.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/rbda/utils.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/terrain/__init__.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/terrain/terrain.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/typing.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/utils/__init__.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/utils/tracing.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim/utils/wrappers.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim.egg-info/dependency_links.txt +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim.egg-info/requires.txt +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/src/jaxsim.egg-info/top_level.txt +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/tests/__init__.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/tests/conftest.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/tests/test_api_com.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/tests/test_api_contact.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/tests/test_api_data.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/tests/test_api_frame.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/tests/test_api_joint.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/tests/test_api_link.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/tests/test_api_model.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/tests/test_automatic_differentiation.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/tests/test_contact.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/tests/test_exceptions.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/tests/test_pytree.py +0 -0
- {jaxsim-0.4.3.dev186 → jaxsim-0.4.3.dev207}/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.dev207
|
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>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
.. _collections:
|
2
|
+
|
3
|
+
Example Notebooks
|
4
|
+
=================
|
5
|
+
|
6
|
+
.. toctree::
|
7
|
+
:glob:
|
8
|
+
:hidden:
|
9
|
+
:maxdepth: 1
|
10
|
+
|
11
|
+
_collections/examples/README.md
|
12
|
+
|
13
|
+
.. raw:: html
|
14
|
+
|
15
|
+
<div class="sphx-glr-thumbnails">
|
16
|
+
|
17
|
+
.. raw:: html
|
18
|
+
|
19
|
+
<div class="sphx-glr-thumbcontainer" tooltip="JaxSim as a hardware-accelerated parallel physics engine">
|
20
|
+
|
21
|
+
.. only:: html
|
22
|
+
|
23
|
+
:doc:`_collections/examples/jaxsim_as_physics_engine`
|
24
|
+
|
25
|
+
.. raw:: html
|
26
|
+
|
27
|
+
<div class="sphx-glr-thumbnail-title">JaxSim as a hardware-accelerated parallel physics engine</div>
|
28
|
+
</div>
|
29
|
+
|
30
|
+
|
31
|
+
.. raw:: html
|
32
|
+
|
33
|
+
<div class="sphx-glr-thumbcontainer" tooltip="JaxSim for developing closed-loop robot controllers">
|
34
|
+
|
35
|
+
.. only:: html
|
36
|
+
|
37
|
+
:doc:`_collections/examples/jaxsim_for_robot_controllers`
|
38
|
+
|
39
|
+
.. raw:: html
|
40
|
+
|
41
|
+
<div class="sphx-glr-thumbnail-title">JaxSim for developing closed-loop robot controllers</div>
|
42
|
+
</div>
|
43
|
+
|
44
|
+
.. raw:: html
|
45
|
+
|
46
|
+
</div>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# JaxSim Examples
|
2
|
+
|
3
|
+
This folder contains Jupyter notebooks that demonstrate the practical usage of JaxSim.
|
4
|
+
|
5
|
+
## Featured examples
|
6
|
+
|
7
|
+
| Notebook | Google Colab | Description |
|
8
|
+
| :--- | :---: | :--- |
|
9
|
+
| [`jaxsim_as_physics_engine.ipynb`](./jaxsim_as_physics_engine.ipynb) | [![Open In Colab][colab_badge]][ipynb_jaxsim_as_physics_engine] | An example demonstrating how to simulate vectorized models in parallel. |
|
10
|
+
| [`jaxsim_for_robot_controllers.ipynb`](./jaxsim_for_robot_controllers.ipynb) | [![Open In Colab][colab_badge]][ipynb_jaxsim_closed_loop] | A basic example showing how to simulate a PD controller with gravity compensation for a 2-DOF cart-pole. |
|
11
|
+
|
12
|
+
[colab_badge]: https://colab.research.google.com/assets/colab-badge.svg
|
13
|
+
[ipynb_jaxsim_closed_loop]: https://colab.research.google.com/github/ami-iit/jaxsim/blob/main/examples/jaxsim_for_robot_controllers.ipynb
|
14
|
+
[ipynb_jaxsim_as_physics_engine]: https://colab.research.google.com/github/ami-iit/jaxsim/blob/main/examples/jaxsim_as_physics_engine.ipynb
|
15
|
+
|
16
|
+
## How to run the examples
|
17
|
+
|
18
|
+
You can run the JaxSim examples with hardware acceleration in two ways.
|
19
|
+
|
20
|
+
### Option 1: Google Colab (recommended)
|
21
|
+
|
22
|
+
The easiest way is to use the provided Google Colab links to run the notebooks in a hosted environment
|
23
|
+
with no setup required.
|
24
|
+
|
25
|
+
### Option 2: Local execution with `pixi`
|
26
|
+
|
27
|
+
To run the examples locally, first install `pixi` following the [official documentation][pixi_installation]:
|
28
|
+
|
29
|
+
[pixi_installation]: https://pixi.sh/#installation
|
30
|
+
|
31
|
+
```bash
|
32
|
+
curl -fsSL https://pixi.sh/install.sh | bash
|
33
|
+
```
|
34
|
+
|
35
|
+
Then, from the repository's root directory, execute the example notebooks using:
|
36
|
+
|
37
|
+
```bash
|
38
|
+
pixi run examples
|
39
|
+
```
|
40
|
+
|
41
|
+
This command will automatically handle all necessary dependencies and run the examples in a self-contained environment.
|
@@ -0,0 +1,202 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
if "ROD_LOGGING_LEVEL" not in os.environ:
|
4
|
+
os.environ["ROD_LOGGING_LEVEL"] = "WARNING"
|
5
|
+
|
6
|
+
import numpy as np
|
7
|
+
import rod.kinematics.tree_transforms
|
8
|
+
from rod.builder import primitives
|
9
|
+
|
10
|
+
if __name__ == "__main__":
|
11
|
+
|
12
|
+
# ================
|
13
|
+
# Model parameters
|
14
|
+
# ================
|
15
|
+
|
16
|
+
# Rail parameters.
|
17
|
+
rail_height = 1.2
|
18
|
+
rail_length = 5.0
|
19
|
+
rail_radius = 0.005
|
20
|
+
rail_mass = 5.0
|
21
|
+
|
22
|
+
# Cart parameters.
|
23
|
+
cart_mass = 1.0
|
24
|
+
cart_size = (0.1, 0.2, 0.05)
|
25
|
+
|
26
|
+
# Pole parameters.
|
27
|
+
pole_mass = 0.5
|
28
|
+
pole_length = 1.0
|
29
|
+
pole_radius = 0.005
|
30
|
+
|
31
|
+
# ========================
|
32
|
+
# Create the link builders
|
33
|
+
# ========================
|
34
|
+
|
35
|
+
rail_builder = primitives.CylinderBuilder(
|
36
|
+
name="rail",
|
37
|
+
mass=rail_mass,
|
38
|
+
radius=rail_radius,
|
39
|
+
length=rail_length,
|
40
|
+
)
|
41
|
+
|
42
|
+
cart_builder = primitives.BoxBuilder(
|
43
|
+
name="cart",
|
44
|
+
mass=cart_mass,
|
45
|
+
x=cart_size[0],
|
46
|
+
y=cart_size[1],
|
47
|
+
z=cart_size[2],
|
48
|
+
)
|
49
|
+
|
50
|
+
pole_builder = primitives.CylinderBuilder(
|
51
|
+
name="pole",
|
52
|
+
mass=pole_mass,
|
53
|
+
radius=pole_radius,
|
54
|
+
length=pole_length,
|
55
|
+
)
|
56
|
+
|
57
|
+
# =================
|
58
|
+
# Create the joints
|
59
|
+
# =================
|
60
|
+
|
61
|
+
world_to_rail = rod.Joint(
|
62
|
+
name="world_to_rail",
|
63
|
+
type="fixed",
|
64
|
+
parent="world",
|
65
|
+
child=rail_builder.name,
|
66
|
+
pose=primitives.PrimitiveBuilder.build_pose(
|
67
|
+
relative_to="world",
|
68
|
+
),
|
69
|
+
)
|
70
|
+
|
71
|
+
linear = rod.Joint(
|
72
|
+
name="linear",
|
73
|
+
type="prismatic",
|
74
|
+
parent=rail_builder.name,
|
75
|
+
child=cart_builder.name,
|
76
|
+
pose=primitives.PrimitiveBuilder.build_pose(
|
77
|
+
relative_to=rail_builder.name,
|
78
|
+
pos=np.array([0, 0, rail_height]),
|
79
|
+
),
|
80
|
+
axis=rod.Axis(
|
81
|
+
xyz=rod.Xyz(xyz=[0, 1, 0]),
|
82
|
+
limit=rod.Limit(
|
83
|
+
upper=(rail_length / 2 - cart_size[1] / 2),
|
84
|
+
lower=-(rail_length / 2 - cart_size[1] / 2),
|
85
|
+
effort=500.0,
|
86
|
+
velocity=10.0,
|
87
|
+
),
|
88
|
+
),
|
89
|
+
)
|
90
|
+
|
91
|
+
pivot = rod.Joint(
|
92
|
+
name="pivot",
|
93
|
+
type="continuous",
|
94
|
+
parent=cart_builder.name,
|
95
|
+
child=pole_builder.name,
|
96
|
+
pose=primitives.PrimitiveBuilder.build_pose(
|
97
|
+
relative_to=cart_builder.name,
|
98
|
+
),
|
99
|
+
axis=rod.Axis(
|
100
|
+
xyz=rod.Xyz(xyz=[1, 0, 0]),
|
101
|
+
limit=rod.Limit(),
|
102
|
+
),
|
103
|
+
)
|
104
|
+
|
105
|
+
# ================
|
106
|
+
# Create the links
|
107
|
+
# ================
|
108
|
+
|
109
|
+
rail_elements_pose = primitives.PrimitiveBuilder.build_pose(
|
110
|
+
pos=np.array([0, 0, rail_height]),
|
111
|
+
rpy=np.array([np.pi / 2, 0, 0]),
|
112
|
+
)
|
113
|
+
|
114
|
+
rail = (
|
115
|
+
rail_builder.build_link(
|
116
|
+
name=rail_builder.name,
|
117
|
+
pose=primitives.PrimitiveBuilder.build_pose(
|
118
|
+
relative_to=world_to_rail.name,
|
119
|
+
),
|
120
|
+
)
|
121
|
+
.add_inertial(pose=rail_elements_pose)
|
122
|
+
.add_visual(pose=rail_elements_pose)
|
123
|
+
.add_collision(pose=rail_elements_pose)
|
124
|
+
.build()
|
125
|
+
)
|
126
|
+
|
127
|
+
cart = (
|
128
|
+
cart_builder.build_link(
|
129
|
+
name=cart_builder.name,
|
130
|
+
pose=primitives.PrimitiveBuilder.build_pose(relative_to=linear.name),
|
131
|
+
)
|
132
|
+
.add_inertial()
|
133
|
+
.add_visual()
|
134
|
+
.add_collision()
|
135
|
+
.build()
|
136
|
+
)
|
137
|
+
|
138
|
+
pole_elements_pose = primitives.PrimitiveBuilder.build_pose(
|
139
|
+
pos=np.array([0, 0, pole_length / 2]),
|
140
|
+
)
|
141
|
+
|
142
|
+
pole = (
|
143
|
+
pole_builder.build_link(
|
144
|
+
name=pole_builder.name,
|
145
|
+
pose=primitives.PrimitiveBuilder.build_pose(
|
146
|
+
relative_to=pivot.name,
|
147
|
+
),
|
148
|
+
)
|
149
|
+
.add_inertial(pose=pole_elements_pose)
|
150
|
+
.add_visual(pose=pole_elements_pose)
|
151
|
+
.add_collision(pose=pole_elements_pose)
|
152
|
+
.build()
|
153
|
+
)
|
154
|
+
|
155
|
+
# ===========
|
156
|
+
# Build model
|
157
|
+
# ===========
|
158
|
+
|
159
|
+
# Create ROD in-memory model.
|
160
|
+
model = rod.Model(
|
161
|
+
name="cartpole",
|
162
|
+
canonical_link=rail.name,
|
163
|
+
link=[
|
164
|
+
rail,
|
165
|
+
cart,
|
166
|
+
pole,
|
167
|
+
],
|
168
|
+
joint=[
|
169
|
+
world_to_rail,
|
170
|
+
linear,
|
171
|
+
pivot,
|
172
|
+
],
|
173
|
+
)
|
174
|
+
|
175
|
+
# Update the pose elements to be closer to those expected in URDF.
|
176
|
+
model.switch_frame_convention(
|
177
|
+
frame_convention=rod.FrameConvention.Urdf, explicit_frames=True
|
178
|
+
)
|
179
|
+
|
180
|
+
# ==============
|
181
|
+
# Get SDF string
|
182
|
+
# ==============
|
183
|
+
|
184
|
+
# Create the top-level SDF object.
|
185
|
+
sdf = rod.Sdf(version="1.10", model=model)
|
186
|
+
|
187
|
+
# Generate the SDF string.
|
188
|
+
# sdf_string = sdf.serialize(pretty=True, validate=True)
|
189
|
+
|
190
|
+
# ===============
|
191
|
+
# Get URDF string
|
192
|
+
# ===============
|
193
|
+
|
194
|
+
import rod.urdf.exporter
|
195
|
+
|
196
|
+
# Convert the SDF to URDF.
|
197
|
+
urdf_string = rod.urdf.exporter.UrdfExporter(
|
198
|
+
pretty=True, indent=" "
|
199
|
+
).to_urdf_string(sdf=sdf)
|
200
|
+
|
201
|
+
# Print the URDF string.
|
202
|
+
print(urdf_string)
|
@@ -1,5 +1,4 @@
|
|
1
1
|
<?xml version="1.0" encoding="utf-8"?>
|
2
|
-
<!--Create with rod using build_cartpole_model.py -->
|
3
2
|
<robot name="cartpole">
|
4
3
|
<link name="world"/>
|
5
4
|
<link name="rail">
|
@@ -22,29 +21,29 @@
|
|
22
21
|
</collision>
|
23
22
|
</link>
|
24
23
|
<link name="cart">
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
24
|
+
<inertial>
|
25
|
+
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
|
26
|
+
<mass value="1.0"/>
|
27
|
+
<inertia ixx="0.0035416666666666674" ixy="0.0" ixz="0.0" iyy="0.0010416666666666669" iyz="0.0" izz="0.0041666666666666675"/>
|
28
|
+
</inertial>
|
29
|
+
<visual name="cart_visual">
|
30
|
+
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
|
31
|
+
<geometry>
|
32
|
+
<box size="0.1 0.2 0.05"/>
|
33
|
+
</geometry>
|
34
|
+
</visual>
|
35
|
+
<collision name="cart_collision">
|
36
|
+
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
|
37
|
+
<geometry>
|
38
|
+
<box size="0.1 0.2 0.05"/>
|
39
|
+
</geometry>
|
40
|
+
</collision>
|
42
41
|
</link>
|
43
42
|
<link name="pole">
|
44
43
|
<inertial>
|
45
44
|
<origin xyz="0.0 0.0 0.5" rpy="0.0 0.0 0.0"/>
|
46
|
-
<mass value="0.
|
47
|
-
<inertia ixx="0.
|
45
|
+
<mass value="0.5"/>
|
46
|
+
<inertia ixx="0.04166979166666667" ixy="0.0" ixz="0.0" iyy="0.04166979166666667" iyz="0.0" izz="6.25e-06"/>
|
48
47
|
</inertial>
|
49
48
|
<visual name="pole_visual">
|
50
49
|
<origin xyz="0.0 0.0 0.5" rpy="0.0 0.0 0.0"/>
|
@@ -71,13 +70,11 @@
|
|
71
70
|
<axis xyz="0 1 0"/>
|
72
71
|
<limit effort="500.0" velocity="10.0" lower="-2.4" upper="2.4"/>
|
73
72
|
</joint>
|
74
|
-
<joint name="pivot" type="
|
73
|
+
<joint name="pivot" type="continuous">
|
75
74
|
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
|
76
75
|
<parent link="cart"/>
|
77
76
|
<child link="pole"/>
|
78
77
|
<axis xyz="1 0 0"/>
|
79
|
-
|
80
|
-
TODO(traversaro) report issue in mujoco upstream -->
|
81
|
-
<limit effort="500.0" velocity="10.0" lower="-100000000" upper="100000000"/>
|
78
|
+
<limit effort="3.4028235e+38" velocity="3.4028235e+38"/>
|
82
79
|
</joint>
|
83
80
|
</robot>
|