jaxsim 0.3.1.dev54__tar.gz → 0.3.1.dev59__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 (123) hide show
  1. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/PKG-INFO +1 -1
  2. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/_version.py +2 -2
  3. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/api/contact.py +9 -9
  4. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim.egg-info/PKG-INFO +1 -1
  5. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim.egg-info/SOURCES.txt +1 -0
  6. jaxsim-0.3.1.dev59/tests/test_api_contact.py +58 -0
  7. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/test_api_link.py +68 -0
  8. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/.devcontainer/Dockerfile +0 -0
  9. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/.devcontainer/devcontainer.json +0 -0
  10. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/.gitattributes +0 -0
  11. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/.github/CODEOWNERS +0 -0
  12. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/.github/workflows/ci_cd.yml +0 -0
  13. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/.github/workflows/read_the_docs.yml +0 -0
  14. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/.github/workflows/style.yml +0 -0
  15. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/.gitignore +0 -0
  16. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/.pre-commit-config.yaml +0 -0
  17. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/.readthedocs.yaml +0 -0
  18. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/CONTRIBUTING.md +0 -0
  19. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/LICENSE +0 -0
  20. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/README.md +0 -0
  21. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/Makefile +0 -0
  22. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/conf.py +0 -0
  23. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/guide/install.rst +0 -0
  24. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/index.rst +0 -0
  25. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/make.bat +0 -0
  26. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/modules/api.rst +0 -0
  27. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/modules/index.rst +0 -0
  28. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/modules/integrators.rst +0 -0
  29. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/modules/math.rst +0 -0
  30. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/modules/mujoco.rst +0 -0
  31. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/modules/parsers.rst +0 -0
  32. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/modules/rbda.rst +0 -0
  33. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/modules/typing.rst +0 -0
  34. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/docs/modules/utils.rst +0 -0
  35. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/environment.yml +0 -0
  36. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/examples/.gitattributes +0 -0
  37. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/examples/.gitignore +0 -0
  38. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/examples/PD_controller.ipynb +0 -0
  39. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/examples/Parallel_computing.ipynb +0 -0
  40. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/examples/README.md +0 -0
  41. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/examples/assets/cartpole.urdf +0 -0
  42. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/pixi.lock +0 -0
  43. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/pyproject.toml +0 -0
  44. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/setup.cfg +0 -0
  45. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/setup.py +0 -0
  46. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/__init__.py +0 -0
  47. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/api/__init__.py +0 -0
  48. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/api/com.py +0 -0
  49. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/api/common.py +0 -0
  50. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/api/data.py +0 -0
  51. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/api/frame.py +0 -0
  52. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/api/joint.py +0 -0
  53. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
  54. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/api/link.py +0 -0
  55. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/api/model.py +0 -0
  56. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/api/ode.py +0 -0
  57. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/api/ode_data.py +0 -0
  58. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/api/references.py +0 -0
  59. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/exceptions.py +0 -0
  60. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/integrators/__init__.py +0 -0
  61. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/integrators/common.py +0 -0
  62. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/integrators/fixed_step.py +0 -0
  63. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/integrators/variable_step.py +0 -0
  64. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/logging.py +0 -0
  65. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/math/__init__.py +0 -0
  66. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/math/adjoint.py +0 -0
  67. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/math/cross.py +0 -0
  68. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/math/inertia.py +0 -0
  69. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/math/joint_model.py +0 -0
  70. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/math/quaternion.py +0 -0
  71. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/math/rotation.py +0 -0
  72. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/math/skew.py +0 -0
  73. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/math/transform.py +0 -0
  74. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/mujoco/__init__.py +0 -0
  75. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/mujoco/__main__.py +0 -0
  76. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/mujoco/loaders.py +0 -0
  77. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/mujoco/model.py +0 -0
  78. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/mujoco/visualizer.py +0 -0
  79. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/parsers/__init__.py +0 -0
  80. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
  81. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/parsers/descriptions/collision.py +0 -0
  82. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/parsers/descriptions/joint.py +0 -0
  83. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/parsers/descriptions/link.py +0 -0
  84. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/parsers/descriptions/model.py +0 -0
  85. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/parsers/kinematic_graph.py +0 -0
  86. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/parsers/rod/__init__.py +0 -0
  87. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/parsers/rod/parser.py +0 -0
  88. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/parsers/rod/utils.py +0 -0
  89. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/rbda/__init__.py +0 -0
  90. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/rbda/aba.py +0 -0
  91. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/rbda/collidable_points.py +0 -0
  92. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/rbda/contacts/__init__.py +0 -0
  93. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/rbda/contacts/common.py +0 -0
  94. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/rbda/contacts/soft.py +0 -0
  95. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/rbda/crba.py +0 -0
  96. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/rbda/forward_kinematics.py +0 -0
  97. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/rbda/jacobian.py +0 -0
  98. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/rbda/rnea.py +0 -0
  99. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/rbda/utils.py +0 -0
  100. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/terrain/__init__.py +0 -0
  101. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/terrain/terrain.py +0 -0
  102. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/typing.py +0 -0
  103. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/utils/__init__.py +0 -0
  104. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
  105. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/utils/tracing.py +0 -0
  106. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim/utils/wrappers.py +0 -0
  107. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim.egg-info/dependency_links.txt +0 -0
  108. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim.egg-info/not-zip-safe +0 -0
  109. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim.egg-info/requires.txt +0 -0
  110. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/src/jaxsim.egg-info/top_level.txt +0 -0
  111. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/__init__.py +0 -0
  112. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/conftest.py +0 -0
  113. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/test_api_com.py +0 -0
  114. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/test_api_data.py +0 -0
  115. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/test_api_frame.py +0 -0
  116. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/test_api_joint.py +0 -0
  117. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/test_api_model.py +0 -0
  118. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/test_automatic_differentiation.py +0 -0
  119. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/test_contact.py +0 -0
  120. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/test_exceptions.py +0 -0
  121. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/test_pytree.py +0 -0
  122. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/test_simulations.py +0 -0
  123. {jaxsim-0.3.1.dev54 → jaxsim-0.3.1.dev59}/tests/utils_idyntree.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.3.1.dev54
3
+ Version: 0.3.1.dev59
4
4
  Home-page: https://github.com/ami-iit/jaxsim
5
5
  Author: Diego Ferigo
6
6
  Author-email: diego.ferigo@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.3.1.dev54'
16
- __version_tuple__ = version_tuple = (0, 3, 1, 'dev54')
15
+ __version__ = version = '0.3.1.dev59'
16
+ __version_tuple__ = version_tuple = (0, 3, 1, 'dev59')
@@ -351,17 +351,17 @@ def jacobian(
351
351
  output_vel_repr if output_vel_repr is not None else data.velocity_representation
352
352
  )
353
353
 
354
- # For each collidable point, get the Jacobians of their parent link.
354
+ # Compute the Jacobians of all links.
355
+ W_J_WL = js.model.generalized_free_floating_jacobian(
356
+ model=model, data=data, output_vel_repr=VelRepr.Inertial
357
+ )
358
+
359
+ # Compute the contact Jacobian.
355
360
  # In inertial-fixed output representation, the Jacobian of the parent link is also
356
361
  # the Jacobian of the frame C implicitly associated with the collidable point.
357
- W_J_WC = W_J_WL = jax.vmap(
358
- lambda parent_link_idx: js.link.jacobian(
359
- model=model,
360
- data=data,
361
- link_index=parent_link_idx,
362
- output_vel_repr=VelRepr.Inertial,
363
- )
364
- )(jnp.array(model.kin_dyn_parameters.contact_parameters.body, dtype=int))
362
+ W_J_WC = jax.vmap(lambda parent_link_idx: W_J_WL[parent_link_idx])(
363
+ jnp.array(model.kin_dyn_parameters.contact_parameters.body, dtype=int)
364
+ )
365
365
 
366
366
  # Adjust the output representation.
367
367
  match output_vel_repr:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.3.1.dev54
3
+ Version: 0.3.1.dev59
4
4
  Home-page: https://github.com/ami-iit/jaxsim
5
5
  Author: Diego Ferigo
6
6
  Author-email: diego.ferigo@iit.it
@@ -108,6 +108,7 @@ src/jaxsim/utils/wrappers.py
108
108
  tests/__init__.py
109
109
  tests/conftest.py
110
110
  tests/test_api_com.py
111
+ tests/test_api_contact.py
111
112
  tests/test_api_data.py
112
113
  tests/test_api_frame.py
113
114
  tests/test_api_joint.py
@@ -0,0 +1,58 @@
1
+ import jax
2
+ import jax.numpy as jnp
3
+ import pytest
4
+
5
+ import jaxsim.api as js
6
+ from jaxsim import VelRepr
7
+
8
+
9
+ def test_contact_kinematics(
10
+ jaxsim_models_types: js.model.JaxSimModel,
11
+ velocity_representation: VelRepr,
12
+ prng_key: jax.Array,
13
+ ):
14
+
15
+ model = jaxsim_models_types
16
+
17
+ _, subkey = jax.random.split(prng_key, num=2)
18
+ data = js.data.random_model_data(
19
+ model=model,
20
+ key=subkey,
21
+ velocity_representation=velocity_representation,
22
+ )
23
+
24
+ # =====
25
+ # Tests
26
+ # =====
27
+
28
+ # Compute the pose of the implicit contact frame associated to the collidable points
29
+ # and the transforms of all links.
30
+ W_H_C = js.contact.transforms(model=model, data=data)
31
+ W_H_L = js.model.forward_kinematics(model=model, data=data)
32
+
33
+ # Check that the orientation of the implicit contact frame matches with the
34
+ # orientation of the link to which the contact point is attached.
35
+ for contact_idx, index_of_parent_link in enumerate(
36
+ model.kin_dyn_parameters.contact_parameters.body
37
+ ):
38
+ assert W_H_C[contact_idx, 0:3, 0:3] == pytest.approx(
39
+ W_H_L[index_of_parent_link][0:3, 0:3]
40
+ )
41
+
42
+ # Check that the origin of the implicit contact frame is located over the
43
+ # collidable point.
44
+ W_p_C = js.contact.collidable_point_positions(model=model, data=data)
45
+ assert W_p_C == pytest.approx(W_H_C[:, 0:3, 3])
46
+
47
+ # Compute the velocity of the collidable point.
48
+ # This quantity always matches with the linear component of the mixed 6D velocity
49
+ # of the implicit frame associated to the collidable point.
50
+ W_ṗ_C = js.contact.collidable_point_velocities(model=model, data=data)
51
+
52
+ # Compute the velocity of the collidable point using the contact Jacobian.
53
+ ν = data.generalized_velocity()
54
+ CW_J_WC = js.contact.jacobian(model=model, data=data, output_vel_repr=VelRepr.Mixed)
55
+ CW_vl_WC = jnp.einsum("c6g,g->c6", CW_J_WC, ν)[:, 0:3]
56
+
57
+ # Compare the two velocities.
58
+ assert W_ṗ_C == pytest.approx(CW_vl_WC)
@@ -223,6 +223,74 @@ def test_link_bias_acceleration(
223
223
  Jν_js = js.link.bias_acceleration(model=model, data=data, link_index=index)
224
224
  assert pytest.approx(Jν_idt) == Jν_js
225
225
 
226
+ # Test that the conversion of the link bias acceleration works as expected.
227
+ match data.velocity_representation:
228
+
229
+ # We exclude the mixed representation because converting the acceleration is
230
+ # more complex than using the plain 6D transform matrix.
231
+ case VelRepr.Mixed:
232
+ pass
233
+
234
+ # Inertial-fixed to body-fixed conversion.
235
+ case VelRepr.Inertial:
236
+
237
+ W_H_L = js.model.forward_kinematics(model=model, data=data)
238
+
239
+ W_a_bias_WL = jax.vmap(
240
+ lambda index: js.link.bias_acceleration(
241
+ model=model, data=data, link_index=index
242
+ )
243
+ )(jnp.arange(model.number_of_links()))
244
+
245
+ with data.switch_velocity_representation(VelRepr.Body):
246
+
247
+ W_X_L = jax.vmap(
248
+ lambda W_H_L: jaxsim.math.Adjoint.from_transform(transform=W_H_L)
249
+ )(W_H_L)
250
+
251
+ L_a_bias_WL = jax.vmap(
252
+ lambda index: js.link.bias_acceleration(
253
+ model=model, data=data, link_index=index
254
+ )
255
+ )(jnp.arange(model.number_of_links()))
256
+
257
+ W_a_bias_WL_converted = jax.vmap(
258
+ lambda W_X_L, L_a_bias_WL: W_X_L @ L_a_bias_WL
259
+ )(W_X_L, L_a_bias_WL)
260
+
261
+ assert W_a_bias_WL == pytest.approx(W_a_bias_WL_converted)
262
+
263
+ # Body-fixed to inertial-fixed conversion.
264
+ case VelRepr.Body:
265
+
266
+ W_H_L = js.model.forward_kinematics(model=model, data=data)
267
+
268
+ L_a_bias_WL = jax.vmap(
269
+ lambda index: js.link.bias_acceleration(
270
+ model=model, data=data, link_index=index
271
+ )
272
+ )(jnp.arange(model.number_of_links()))
273
+
274
+ with data.switch_velocity_representation(VelRepr.Inertial):
275
+
276
+ L_X_W = jax.vmap(
277
+ lambda W_H_L: jaxsim.math.Adjoint.from_transform(
278
+ transform=W_H_L, inverse=True
279
+ )
280
+ )(W_H_L)
281
+
282
+ W_a_bias_WL = jax.vmap(
283
+ lambda index: js.link.bias_acceleration(
284
+ model=model, data=data, link_index=index
285
+ )
286
+ )(jnp.arange(model.number_of_links()))
287
+
288
+ L_a_bias_WL_converted = jax.vmap(
289
+ lambda L_X_W, W_a_bias_WL: L_X_W @ W_a_bias_WL
290
+ )(L_X_W, W_a_bias_WL)
291
+
292
+ assert L_a_bias_WL == pytest.approx(L_a_bias_WL_converted)
293
+
226
294
 
227
295
  def test_link_jacobian_derivative(
228
296
  jaxsim_models_types: js.model.JaxSimModel,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes