jaxsim 0.2.1.dev47__tar.gz → 0.2.1.dev54__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.
Files changed (115) hide show
  1. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/PKG-INFO +2 -2
  2. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/environment.yml +2 -5
  3. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/setup.cfg +1 -1
  4. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/_version.py +2 -2
  5. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/mujoco/loaders.py +3 -3
  6. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/parsers/kinematic_graph.py +2 -1
  7. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/parsers/rod/parser.py +70 -4
  8. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim.egg-info/PKG-INFO +2 -2
  9. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim.egg-info/requires.txt +1 -1
  10. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/.devcontainer/Dockerfile +0 -0
  11. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/.devcontainer/devcontainer.json +0 -0
  12. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/.gitattributes +0 -0
  13. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/.github/CODEOWNERS +0 -0
  14. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/.github/workflows/ci_cd.yml +0 -0
  15. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/.github/workflows/read_the_docs.yml +0 -0
  16. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/.github/workflows/style.yml +0 -0
  17. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/.gitignore +0 -0
  18. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/.pre-commit-config.yaml +0 -0
  19. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/.readthedocs.yaml +0 -0
  20. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/CONTRIBUTING.md +0 -0
  21. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/LICENSE +0 -0
  22. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/README.md +0 -0
  23. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/Makefile +0 -0
  24. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/conf.py +0 -0
  25. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/guide/install.rst +0 -0
  26. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/index.rst +0 -0
  27. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/make.bat +0 -0
  28. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/modules/api.rst +0 -0
  29. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/modules/index.rst +0 -0
  30. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/modules/integrators.rst +0 -0
  31. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/modules/math.rst +0 -0
  32. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/modules/mujoco.rst +0 -0
  33. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/modules/parsers.rst +0 -0
  34. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/modules/rbda.rst +0 -0
  35. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/modules/typing.rst +0 -0
  36. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/docs/modules/utils.rst +0 -0
  37. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/examples/.gitattributes +0 -0
  38. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/examples/.gitignore +0 -0
  39. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/examples/PD_controller.ipynb +0 -0
  40. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/examples/Parallel_computing.ipynb +0 -0
  41. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/examples/README.md +0 -0
  42. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/examples/assets/cartpole.urdf +0 -0
  43. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/pixi.lock +0 -0
  44. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/pyproject.toml +0 -0
  45. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/setup.py +0 -0
  46. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/__init__.py +0 -0
  47. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/api/__init__.py +0 -0
  48. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/api/com.py +0 -0
  49. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/api/common.py +0 -0
  50. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/api/contact.py +0 -0
  51. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/api/data.py +0 -0
  52. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/api/joint.py +0 -0
  53. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
  54. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/api/link.py +0 -0
  55. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/api/model.py +0 -0
  56. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/api/ode.py +0 -0
  57. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/api/ode_data.py +0 -0
  58. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/api/references.py +0 -0
  59. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/integrators/__init__.py +0 -0
  60. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/integrators/common.py +0 -0
  61. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/integrators/fixed_step.py +0 -0
  62. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/integrators/variable_step.py +0 -0
  63. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/logging.py +0 -0
  64. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/math/__init__.py +0 -0
  65. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/math/adjoint.py +0 -0
  66. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/math/cross.py +0 -0
  67. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/math/inertia.py +0 -0
  68. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/math/joint_model.py +0 -0
  69. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/math/quaternion.py +0 -0
  70. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/math/rotation.py +0 -0
  71. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/math/skew.py +0 -0
  72. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/math/transform.py +0 -0
  73. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/mujoco/__init__.py +0 -0
  74. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/mujoco/__main__.py +0 -0
  75. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/mujoco/model.py +0 -0
  76. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/mujoco/visualizer.py +0 -0
  77. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/parsers/__init__.py +0 -0
  78. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
  79. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/parsers/descriptions/collision.py +0 -0
  80. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/parsers/descriptions/joint.py +0 -0
  81. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/parsers/descriptions/link.py +0 -0
  82. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/parsers/descriptions/model.py +0 -0
  83. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/parsers/rod/__init__.py +0 -0
  84. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/parsers/rod/utils.py +0 -0
  85. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/rbda/__init__.py +0 -0
  86. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/rbda/aba.py +0 -0
  87. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/rbda/collidable_points.py +0 -0
  88. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/rbda/crba.py +0 -0
  89. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/rbda/forward_kinematics.py +0 -0
  90. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/rbda/jacobian.py +0 -0
  91. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/rbda/rnea.py +0 -0
  92. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/rbda/soft_contacts.py +0 -0
  93. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/rbda/utils.py +0 -0
  94. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/terrain/__init__.py +0 -0
  95. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/terrain/terrain.py +0 -0
  96. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/typing.py +0 -0
  97. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/utils/__init__.py +0 -0
  98. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/utils/hashless.py +0 -0
  99. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
  100. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim/utils/tracing.py +0 -0
  101. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim.egg-info/SOURCES.txt +0 -0
  102. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim.egg-info/dependency_links.txt +0 -0
  103. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim.egg-info/not-zip-safe +0 -0
  104. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/src/jaxsim.egg-info/top_level.txt +0 -0
  105. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/tests/__init__.py +0 -0
  106. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/tests/conftest.py +0 -0
  107. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/tests/test_api_com.py +0 -0
  108. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/tests/test_api_data.py +0 -0
  109. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/tests/test_api_joint.py +0 -0
  110. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/tests/test_api_link.py +0 -0
  111. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/tests/test_api_model.py +0 -0
  112. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/tests/test_automatic_differentiation.py +0 -0
  113. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/tests/test_pytree.py +0 -0
  114. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/tests/test_simulations.py +0 -0
  115. {jaxsim-0.2.1.dev47 → jaxsim-0.2.1.dev54}/tests/utils_idyntree.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.2.1.dev47
3
+ Version: 0.2.1.dev54
4
4
  Home-page: https://github.com/ami-iit/jaxsim
5
5
  Author: Diego Ferigo
6
6
  Author-email: diego.ferigo@iit.it
@@ -37,7 +37,7 @@ Requires-Dist: jaxlib>=0.4.13
37
37
  Requires-Dist: jaxlie>=1.3.0
38
38
  Requires-Dist: jax_dataclasses>=1.4.0
39
39
  Requires-Dist: pptree
40
- Requires-Dist: rod>=0.2.0
40
+ Requires-Dist: rod>=0.3.0
41
41
  Requires-Dist: typing_extensions; python_version < "3.12"
42
42
  Provides-Extra: style
43
43
  Requires-Dist: black[jupyter]~=24.0; extra == "style"
@@ -12,7 +12,7 @@ dependencies:
12
12
  - jaxlie >= 1.3.0
13
13
  - jax-dataclasses >= 1.4.0
14
14
  - pptree
15
- - rod >= 0.2.0
15
+ - rod >= 0.3.0
16
16
  - typing_extensions # python<3.12
17
17
  # ====================================
18
18
  # Optional dependencies from setup.cfg
@@ -41,18 +41,15 @@ dependencies:
41
41
  - pip
42
42
  - sphinx
43
43
  - sphinx-autodoc-typehints
44
+ - sphinx-book-theme
44
45
  - sphinx-copybutton
45
46
  - sphinx-design
46
47
  - sphinx_fontawesome
47
48
  - sphinx-jinja2-compat
48
49
  - sphinx-multiversion
49
50
  - sphinx_rtd_theme
50
- - sphinx-book-theme
51
51
  - sphinx-toolbox
52
52
  # ========================================
53
53
  # Other dependencies for GitHub Codespaces
54
54
  # ========================================
55
- # System dependencies to run the tests
56
- - gz-sim7
57
- # Other packages
58
55
  - ipython
@@ -57,7 +57,7 @@ install_requires =
57
57
  jaxlie >= 1.3.0
58
58
  jax_dataclasses >= 1.4.0
59
59
  pptree
60
- rod >= 0.2.0
60
+ rod >= 0.3.0
61
61
  typing_extensions ; python_version < '3.12'
62
62
 
63
63
  [options.packages.find]
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.2.1.dev47'
16
- __version_tuple__ = version_tuple = (0, 2, 1, 'dev47')
15
+ __version__ = version = '0.2.1.dev54'
16
+ __version_tuple__ = version_tuple = (0, 2, 1, 'dev54')
@@ -203,10 +203,10 @@ class RodModelToMjcf:
203
203
  joints_dict[joint_name].type = "fixed"
204
204
 
205
205
  # Convert the ROD model to URDF.
206
- urdf_string = rod.urdf.exporter.UrdfExporter.sdf_to_urdf_string(
206
+ urdf_string = rod.urdf.exporter.UrdfExporter(
207
+ gazebo_preserve_fixed_joints=False, pretty=True
208
+ ).to_urdf_string(
207
209
  sdf=rod.Sdf(model=rod_model, version="1.7"),
208
- gazebo_preserve_fixed_joints=False,
209
- pretty=True,
210
210
  )
211
211
 
212
212
  # -------------------------------------
@@ -121,7 +121,8 @@ class KinematicGraph(Sequence[descriptions.LinkDescription]):
121
121
  # Also here, we assume the model is fixed-base, therefore the first frame will
122
122
  # have last_link_idx + 1. These frames are not part of the physics model.
123
123
  for index, frame in enumerate(self.frames):
124
- frame.index = index + len(self.link_names())
124
+ with frame.mutable_context(mutability=Mutability.MUTABLE_NO_VALIDATION):
125
+ frame.index = int(index + len(self.link_names()))
125
126
 
126
127
  # Number joints so that their index matches their child link index
127
128
  links_dict = {l.name: l for l in iter(self)}
@@ -6,6 +6,7 @@ import jax.numpy as jnp
6
6
  import numpy as np
7
7
  import rod
8
8
 
9
+ import jaxsim.utils
9
10
  from jaxsim import logging
10
11
  from jaxsim.math.quaternion import Quaternion
11
12
  from jaxsim.parsers import descriptions, kinematic_graph
@@ -25,6 +26,7 @@ class SDFData(NamedTuple):
25
26
 
26
27
  link_descriptions: List[descriptions.LinkDescription]
27
28
  joint_descriptions: List[descriptions.JointDescription]
29
+ frame_descriptions: List[descriptions.LinkDescription]
28
30
  collision_shapes: List[descriptions.CollisionShape]
29
31
 
30
32
  sdf_model: rod.Model | None = None
@@ -70,6 +72,8 @@ def extract_model_data(
70
72
 
71
73
  # Jaxsim supports only models compatible with URDF, i.e. those having all links
72
74
  # directly attached to their parent joint without additional roto-translations.
75
+ # Furthermore, the following switch also post-processes frames such that their
76
+ # pose is expressed wrt the parent link they are rigidly attached to.
73
77
  sdf_model.switch_frame_convention(frame_convention=rod.FrameConvention.Urdf)
74
78
 
75
79
  # Log type of base link
@@ -113,6 +117,23 @@ def extract_model_data(
113
117
  # Create a dictionary to find easily links
114
118
  links_dict: Dict[str, descriptions.LinkDescription] = {l.name: l for l in links}
115
119
 
120
+ # ============
121
+ # Parse frames
122
+ # ============
123
+
124
+ # Parse the frames (unconnected)
125
+ frames = [
126
+ descriptions.LinkDescription(
127
+ name=f.name,
128
+ mass=jnp.array(0.0, dtype=float),
129
+ inertia=jnp.zeros(shape=(3, 3)),
130
+ parent=links_dict[f.attached_to],
131
+ pose=f.pose.transform() if f.pose is not None else jnp.eye(4),
132
+ )
133
+ for f in sdf_model.frames()
134
+ if f.attached_to in links_dict
135
+ ]
136
+
116
137
  # =========================
117
138
  # Process fixed-base models
118
139
  # =========================
@@ -309,6 +330,7 @@ def extract_model_data(
309
330
  model_name=sdf_model.name,
310
331
  link_descriptions=links,
311
332
  joint_descriptions=joints,
333
+ frame_descriptions=frames,
312
334
  collision_shapes=collisions,
313
335
  fixed_base=sdf_model.is_fixed_base(),
314
336
  base_link_name=sdf_model.get_canonical_link(),
@@ -338,10 +360,14 @@ def build_model_description(
338
360
  model_description=model_description, model_name=None, is_urdf=is_urdf
339
361
  )
340
362
 
341
- # Build the model description.
363
+ # Build the intermediate representation used for building a JaxSim model.
364
+ # This process, beyond other operations, removes the fixed joints.
342
365
  # Note: if the model is fixed-base, the fixed joint between world and the first
343
366
  # link is removed and the pose of the first link is updated.
344
- model = descriptions.ModelDescription.build_model_from(
367
+ #
368
+ # The whole process is:
369
+ # URDF/SDF ⟶ rod.Model ⟶ ModelDescription ⟶ JaxSimModel.
370
+ graph = descriptions.ModelDescription.build_model_from(
345
371
  name=sdf_data.model_name,
346
372
  links=sdf_data.link_descriptions,
347
373
  joints=sdf_data.joint_descriptions,
@@ -356,7 +382,47 @@ def build_model_description(
356
382
  ],
357
383
  )
358
384
 
385
+ # Depending on how the model is reduced due to the removal of fixed joints,
386
+ # there might be frames that are no longer attached to existing links.
387
+ # We need to change the link to which they are attached to, and update their pose.
388
+ frames_with_no_parent_link = (
389
+ f for f in sdf_data.frame_descriptions if f.parent.name not in graph
390
+ )
391
+
392
+ # Build the object to compute forward kinematics.
393
+ fk = kinematic_graph.KinematicGraphTransforms(graph=graph)
394
+
395
+ for frame in frames_with_no_parent_link:
396
+ # Get the original data of the frame.
397
+ original_pose = frame.pose
398
+ original_parent_link = frame.parent.name
399
+
400
+ # The parent link, that has been removed, became a frame.
401
+ assert original_parent_link in graph.frames_dict, (frame, original_parent_link)
402
+
403
+ # Get the new parent of the frame corresponding to the removed parent link.
404
+ new_parent_link = graph.frames_dict[original_parent_link].parent.name
405
+ logging.debug(f"Frame '{frame.name}' is now attached to '{new_parent_link}'")
406
+
407
+ # Get the transform from the new parent link to the original parent link.
408
+ # The original pose is expressed wrt the original parent link.
409
+ F_H_P = fk.relative_transform(
410
+ relative_to=new_parent_link, name=original_parent_link
411
+ )
412
+
413
+ # Update the frame with the updated data.
414
+ with frame.mutable_context(
415
+ mutability=jaxsim.utils.Mutability.MUTABLE_NO_VALIDATION
416
+ ):
417
+ frame.parent = graph.links_dict[new_parent_link]
418
+ frame.pose = np.array(F_H_P @ original_pose)
419
+
420
+ # Include the SDF frames originally stored in the SDF.
421
+ graph = dataclasses.replace(
422
+ graph, frames=sdf_data.frame_descriptions + graph.frames
423
+ )
424
+
359
425
  # Store the parsed SDF tree as extra info
360
- model = dataclasses.replace(model, extra_info={"sdf_model": sdf_data.sdf_model})
426
+ graph = dataclasses.replace(graph, extra_info={"sdf_model": sdf_data.sdf_model})
361
427
 
362
- return model
428
+ return graph
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.2.1.dev47
3
+ Version: 0.2.1.dev54
4
4
  Home-page: https://github.com/ami-iit/jaxsim
5
5
  Author: Diego Ferigo
6
6
  Author-email: diego.ferigo@iit.it
@@ -37,7 +37,7 @@ Requires-Dist: jaxlib>=0.4.13
37
37
  Requires-Dist: jaxlie>=1.3.0
38
38
  Requires-Dist: jax_dataclasses>=1.4.0
39
39
  Requires-Dist: pptree
40
- Requires-Dist: rod>=0.2.0
40
+ Requires-Dist: rod>=0.3.0
41
41
  Requires-Dist: typing_extensions; python_version < "3.12"
42
42
  Provides-Extra: style
43
43
  Requires-Dist: black[jupyter]~=24.0; extra == "style"
@@ -4,7 +4,7 @@ jaxlib>=0.4.13
4
4
  jaxlie>=1.3.0
5
5
  jax_dataclasses>=1.4.0
6
6
  pptree
7
- rod>=0.2.0
7
+ rod>=0.3.0
8
8
 
9
9
  [:python_version < "3.12"]
10
10
  typing_extensions
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes