jaxsim 0.6.2.dev242__tar.gz → 0.6.2.dev259__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 (134) hide show
  1. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/PKG-INFO +1 -1
  2. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/_version.py +2 -2
  3. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/actuation_model.py +30 -1
  4. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/data.py +1 -7
  5. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/integrators.py +108 -0
  6. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/model.py +15 -0
  7. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/rbda/__init__.py +1 -1
  8. jaxsim-0.6.2.dev259/src/jaxsim/rbda/actuation/__init__.py +1 -0
  9. jaxsim-0.6.2.dev259/src/jaxsim/rbda/actuation/common.py +17 -0
  10. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim.egg-info/PKG-INFO +1 -1
  11. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim.egg-info/SOURCES.txt +3 -0
  12. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/conftest.py +1 -0
  13. jaxsim-0.6.2.dev259/tests/test_actuation.py +37 -0
  14. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/.devcontainer/Dockerfile +0 -0
  15. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/.devcontainer/devcontainer.json +0 -0
  16. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/.gitattributes +0 -0
  17. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/.github/CODEOWNERS +0 -0
  18. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/.github/dependabot.yml +0 -0
  19. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/.github/workflows/ci_cd.yml +0 -0
  20. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/.github/workflows/gpu_benchmark.yml +0 -0
  21. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/.github/workflows/pixi.yml +0 -0
  22. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/.github/workflows/read_the_docs.yml +0 -0
  23. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/.gitignore +0 -0
  24. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/.pre-commit-config.yaml +0 -0
  25. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/.readthedocs.yaml +0 -0
  26. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/CONTRIBUTING.md +0 -0
  27. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/LICENSE +0 -0
  28. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/README.md +0 -0
  29. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/Makefile +0 -0
  30. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/conf.py +0 -0
  31. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/examples.rst +0 -0
  32. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/guide/configuration.rst +0 -0
  33. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/guide/install.rst +0 -0
  34. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/index.rst +0 -0
  35. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/make.bat +0 -0
  36. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/modules/api.rst +0 -0
  37. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/modules/math.rst +0 -0
  38. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/modules/mujoco.rst +0 -0
  39. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/modules/parsers.rst +0 -0
  40. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/modules/rbda.rst +0 -0
  41. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/modules/typing.rst +0 -0
  42. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/docs/modules/utils.rst +0 -0
  43. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/environment.yml +0 -0
  44. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/examples/.gitattributes +0 -0
  45. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/examples/.gitignore +0 -0
  46. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/examples/README.md +0 -0
  47. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/examples/assets/build_cartpole_urdf.py +0 -0
  48. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/examples/assets/cartpole.urdf +0 -0
  49. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/examples/jaxsim_as_multibody_dynamics_library.ipynb +0 -0
  50. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/examples/jaxsim_as_physics_engine.ipynb +0 -0
  51. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/examples/jaxsim_as_physics_engine_advanced.ipynb +0 -0
  52. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/examples/jaxsim_for_robot_controllers.ipynb +0 -0
  53. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/pixi.lock +0 -0
  54. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/pyproject.toml +0 -0
  55. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/setup.cfg +0 -0
  56. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/setup.py +0 -0
  57. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/__init__.py +0 -0
  58. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/__init__.py +0 -0
  59. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/com.py +0 -0
  60. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/common.py +0 -0
  61. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/contact.py +0 -0
  62. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/frame.py +0 -0
  63. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/joint.py +0 -0
  64. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
  65. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/link.py +0 -0
  66. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/ode.py +0 -0
  67. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/api/references.py +0 -0
  68. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/exceptions.py +0 -0
  69. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/logging.py +0 -0
  70. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/math/__init__.py +0 -0
  71. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/math/adjoint.py +0 -0
  72. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/math/cross.py +0 -0
  73. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/math/inertia.py +0 -0
  74. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/math/joint_model.py +0 -0
  75. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/math/quaternion.py +0 -0
  76. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/math/rotation.py +0 -0
  77. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/math/skew.py +0 -0
  78. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/math/transform.py +0 -0
  79. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/math/utils.py +0 -0
  80. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/mujoco/__init__.py +0 -0
  81. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/mujoco/__main__.py +0 -0
  82. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/mujoco/loaders.py +0 -0
  83. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/mujoco/model.py +0 -0
  84. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/mujoco/utils.py +0 -0
  85. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/mujoco/visualizer.py +0 -0
  86. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/parsers/__init__.py +0 -0
  87. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
  88. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/parsers/descriptions/collision.py +0 -0
  89. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/parsers/descriptions/joint.py +0 -0
  90. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/parsers/descriptions/link.py +0 -0
  91. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/parsers/descriptions/model.py +0 -0
  92. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/parsers/kinematic_graph.py +0 -0
  93. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/parsers/rod/__init__.py +0 -0
  94. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/parsers/rod/meshes.py +0 -0
  95. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/parsers/rod/parser.py +0 -0
  96. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/parsers/rod/utils.py +0 -0
  97. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/rbda/aba.py +0 -0
  98. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/rbda/collidable_points.py +0 -0
  99. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/rbda/contacts/__init__.py +0 -0
  100. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/rbda/contacts/common.py +0 -0
  101. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/rbda/contacts/relaxed_rigid.py +0 -0
  102. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/rbda/contacts/rigid.py +0 -0
  103. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/rbda/contacts/soft.py +0 -0
  104. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/rbda/crba.py +0 -0
  105. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/rbda/forward_kinematics.py +0 -0
  106. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/rbda/jacobian.py +0 -0
  107. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/rbda/rnea.py +0 -0
  108. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/rbda/utils.py +0 -0
  109. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/terrain/__init__.py +0 -0
  110. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/terrain/terrain.py +0 -0
  111. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/typing.py +0 -0
  112. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/utils/__init__.py +0 -0
  113. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
  114. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/utils/tracing.py +0 -0
  115. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim/utils/wrappers.py +0 -0
  116. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim.egg-info/dependency_links.txt +0 -0
  117. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim.egg-info/requires.txt +0 -0
  118. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/src/jaxsim.egg-info/top_level.txt +0 -0
  119. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/__init__.py +0 -0
  120. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_api_com.py +0 -0
  121. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_api_contact.py +0 -0
  122. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_api_data.py +0 -0
  123. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_api_frame.py +0 -0
  124. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_api_joint.py +0 -0
  125. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_api_link.py +0 -0
  126. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_api_model.py +0 -0
  127. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_automatic_differentiation.py +0 -0
  128. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_benchmark.py +0 -0
  129. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_exceptions.py +0 -0
  130. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_meshes.py +0 -0
  131. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_pytree.py +0 -0
  132. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_simulations.py +0 -0
  133. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/test_visualizer.py +0 -0
  134. {jaxsim-0.6.2.dev242 → jaxsim-0.6.2.dev259}/tests/utils_idyntree.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jaxsim
3
- Version: 0.6.2.dev242
3
+ Version: 0.6.2.dev259
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>, Filippo Luca Ferretti <filippoluca.ferretti@outlook.com>
6
6
  Maintainer-email: Filippo Luca Ferretti <filippo.ferretti@iit.it>, Alessandro Croci <alessandro.croci@iit.it>
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.6.2.dev242'
21
- __version_tuple__ = version_tuple = (0, 6, 2, 'dev242')
20
+ __version__ = version = '0.6.2.dev259'
21
+ __version_tuple__ = version_tuple = (0, 6, 2, 'dev259')
@@ -92,5 +92,34 @@ def compute_resultant_torques(
92
92
  # ===============================
93
93
 
94
94
  τ_total = τ_references + τ_friction + τ_position_limit
95
-
95
+ τ_lim = tn_curve_fn(model=model, data=data)
96
+ τ_total = jnp.clip(τ_total, -τ_lim, τ_lim)
96
97
  return τ_total
98
+
99
+
100
+ def tn_curve_fn(
101
+ model: js.model.JaxSimModel, data: js.data.JaxSimModelData
102
+ ) -> jtp.Vector:
103
+ """
104
+ Compute the torque limits using the tn curve.
105
+
106
+ Args:
107
+ model: The model to consider.
108
+ data: The data of the considered model.
109
+
110
+ Returns:
111
+ The torque limits.
112
+ """
113
+
114
+ τ_max = model.actuation_params.torque_max # Max torque (Nm)
115
+ ω_th = model.actuation_params.omega_th # Threshold speed (rad/s)
116
+ ω_max = model.actuation_params.omega_max # Max speed for torque drop-off (rad/s)
117
+ abs_vel = jnp.abs(data.joint_velocities)
118
+ τ_lim = jnp.where(
119
+ abs_vel <= ω_th,
120
+ τ_max,
121
+ jnp.where(
122
+ abs_vel <= ω_max, τ_max * (1 - (abs_vel - ω_th) / (ω_max - ω_th)), 0.0
123
+ ),
124
+ )
125
+ return τ_lim
@@ -431,13 +431,6 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
431
431
  if contact_state is None:
432
432
  contact_state = self.contact_state
433
433
 
434
- if isinstance(model.contact_model, jaxsim.rbda.contacts.SoftContacts):
435
- contact_state = {
436
- "tangential_deformation": jnp.zeros_like(
437
- contact_state["tangential_deformation"]
438
- )
439
- }
440
-
441
434
  # Normalize the quaternion to avoid numerical issues.
442
435
  base_quaternion_norm = jaxsim.math.safe_norm(
443
436
  base_quaternion, axis=-1, keepdims=True
@@ -525,6 +518,7 @@ class JaxSimModelData(common.ModelDataWithVelocityRepresentation):
525
518
  _joint_transforms=joint_transforms,
526
519
  _link_transforms=link_transforms,
527
520
  _link_velocities=link_velocities,
521
+ contact_state=contact_state,
528
522
  validate=validate,
529
523
  )
530
524
 
@@ -156,9 +156,117 @@ def rk4_integration(
156
156
  return data_tf.replace(model=model)
157
157
 
158
158
 
159
+ def rk4fast_integration(
160
+ model: js.model.JaxSimModel,
161
+ data: JaxSimModelData,
162
+ link_forces: jtp.Vector,
163
+ joint_torques: jtp.Vector,
164
+ ) -> JaxSimModelData:
165
+ """
166
+ Integrate the system state using the Runge-Kutta 4 fast method.
167
+
168
+ Note:
169
+ This method is a faster version of the RK4 method, but it may not be as accurate.
170
+ It computes the contact forces only once at the beginning of the integration step.
171
+ """
172
+
173
+ dt = model.time_step
174
+
175
+ if len(model.kin_dyn_parameters.contact_parameters.body) > 0:
176
+
177
+ # Compute the 6D forces W_f ∈ ℝ^{n_L × 6} applied to links due to contact
178
+ # with the terrain.
179
+ W_f_L_terrain, contact_state_derivative = js.contact.link_contact_forces(
180
+ model=model,
181
+ data=data,
182
+ link_forces=link_forces,
183
+ joint_torques=joint_torques,
184
+ )
185
+
186
+ W_f_L_total = link_forces + W_f_L_terrain
187
+
188
+ # Update the contact state data. This is necessary only for the contact models
189
+ # that require propagation and integration of contact state.
190
+ contact_state = model.contact_model.update_contact_state(contact_state_derivative)
191
+
192
+ def f(x) -> dict[str, jtp.Matrix]:
193
+
194
+ with data.switch_velocity_representation(jaxsim.VelRepr.Inertial):
195
+
196
+ data_ti = data.replace(model=model, **x)
197
+
198
+ W_v̇_WB, s̈ = js.model.forward_dynamics_aba(
199
+ model=model,
200
+ data=data_ti,
201
+ joint_forces=joint_torques,
202
+ link_forces=W_f_L_total,
203
+ )
204
+
205
+ W_ṗ_B, W_Q̇_B, ṡ = js.ode.system_position_dynamics(
206
+ data=data,
207
+ baumgarte_quaternion_regularization=1.0,
208
+ )
209
+
210
+ return dict(
211
+ base_position=W_ṗ_B,
212
+ base_quaternion=W_Q̇_B,
213
+ joint_positions=ṡ,
214
+ base_linear_velocity=W_v̇_WB[0:3],
215
+ base_angular_velocity=W_v̇_WB[3:6],
216
+ joint_velocities=s̈,
217
+ # The contact state is not updated here, as it is assumed to be constant.
218
+ contact_state=data_ti.contact_state,
219
+ )
220
+
221
+ base_quaternion_norm = jaxsim.math.safe_norm(data._base_quaternion, axis=-1)
222
+ base_quaternion = data._base_quaternion / jnp.where(
223
+ base_quaternion_norm == 0, 1.0, base_quaternion_norm
224
+ )
225
+
226
+ x_t0 = dict(
227
+ base_position=data._base_position,
228
+ base_quaternion=base_quaternion,
229
+ joint_positions=data._joint_positions,
230
+ base_linear_velocity=data._base_linear_velocity,
231
+ base_angular_velocity=data._base_angular_velocity,
232
+ joint_velocities=data._joint_velocities,
233
+ contact_state=contact_state,
234
+ )
235
+
236
+ euler_mid = lambda x, dxdt: x + (0.5 * dt) * dxdt
237
+ euler_fin = lambda x, dxdt: x + dt * dxdt
238
+
239
+ k1 = f(x_t0)
240
+ k2 = f(jax.tree.map(euler_mid, x_t0, k1))
241
+ k3 = f(jax.tree.map(euler_mid, x_t0, k2))
242
+ k4 = f(jax.tree.map(euler_fin, x_t0, k3))
243
+
244
+ # Average the slopes and compute the RK4 state derivative.
245
+ average = lambda k1, k2, k3, k4: (k1 + 2 * k2 + 2 * k3 + k4) / 6
246
+
247
+ dxdt = jax.tree_util.tree_map(average, k1, k2, k3, k4)
248
+
249
+ # Integrate the dynamics
250
+ x_tf = jax.tree_util.tree_map(euler_fin, x_t0, dxdt)
251
+
252
+ data_tf = dataclasses.replace(
253
+ data,
254
+ _base_position=x_tf["base_position"],
255
+ _base_quaternion=x_tf["base_quaternion"],
256
+ _joint_positions=x_tf["joint_positions"],
257
+ _base_linear_velocity=x_tf["base_linear_velocity"],
258
+ _base_angular_velocity=x_tf["base_angular_velocity"],
259
+ _joint_velocities=x_tf["joint_velocities"],
260
+ contact_state=x_tf["contact_state"],
261
+ )
262
+
263
+ return data_tf.replace(model=model)
264
+
265
+
159
266
  _INTEGRATORS_MAP: dict[
160
267
  js.model.IntegratorType, Callable[..., js.data.JaxSimModelData]
161
268
  ] = {
162
269
  js.model.IntegratorType.SemiImplicitEuler: semi_implicit_euler_integration,
163
270
  js.model.IntegratorType.RungeKutta4: rk4_integration,
271
+ js.model.IntegratorType.RungeKutta4Fast: rk4fast_integration,
164
272
  }
@@ -29,6 +29,7 @@ class IntegratorType(enum.IntEnum):
29
29
 
30
30
  SemiImplicitEuler = enum.auto()
31
31
  RungeKutta4 = enum.auto()
32
+ RungeKutta4Fast = enum.auto()
32
33
 
33
34
 
34
35
  @jax_dataclasses.pytree_dataclass(eq=False, unsafe_hash=False)
@@ -57,6 +58,10 @@ class JaxSimModel(JaxsimDataclass):
57
58
  default=None, repr=False
58
59
  )
59
60
 
61
+ actuation_params: Static[jaxsim.rbda.actuation.ActuationParams] = dataclasses.field(
62
+ default=None, repr=False
63
+ )
64
+
60
65
  kin_dyn_parameters: js.kin_dyn_parameters.KinDynParameters | None = (
61
66
  dataclasses.field(default=None, repr=False)
62
67
  )
@@ -121,6 +126,7 @@ class JaxSimModel(JaxsimDataclass):
121
126
  terrain: jaxsim.terrain.Terrain | None = None,
122
127
  contact_model: jaxsim.rbda.contacts.ContactModel | None = None,
123
128
  contact_params: jaxsim.rbda.contacts.ContactsParams | None = None,
129
+ actuation_params: jaxsim.rbda.actuation.ActuationParams | None = None,
124
130
  integrator: IntegratorType | None = None,
125
131
  is_urdf: bool | None = None,
126
132
  considered_joints: Sequence[str] | None = None,
@@ -143,6 +149,7 @@ class JaxSimModel(JaxsimDataclass):
143
149
  The contact model to consider.
144
150
  If not specified, a soft contacts model is used.
145
151
  contact_params: The parameters of the contact model.
152
+ actuation_params: The parameters of the actuation model.
146
153
  integrator: The integrator to use for the simulation.
147
154
  is_urdf:
148
155
  The optional flag to force the model description to be parsed as a URDF.
@@ -177,6 +184,7 @@ class JaxSimModel(JaxsimDataclass):
177
184
  time_step=time_step,
178
185
  terrain=terrain,
179
186
  contact_model=contact_model,
187
+ actuation_params=actuation_params,
180
188
  contact_params=contact_params,
181
189
  integrator=integrator,
182
190
  gravity=-gravity,
@@ -198,6 +206,7 @@ class JaxSimModel(JaxsimDataclass):
198
206
  terrain: jaxsim.terrain.Terrain | None = None,
199
207
  contact_model: jaxsim.rbda.contacts.ContactModel | None = None,
200
208
  contact_params: jaxsim.rbda.contacts.ContactsParams | None = None,
209
+ actuation_params: jaxsim.rbda.actuation.ActuationParams | None = None,
201
210
  integrator: IntegratorType | None = None,
202
211
  gravity: jtp.FloatLike = jaxsim.math.STANDARD_GRAVITY,
203
212
  ) -> JaxSimModel:
@@ -219,6 +228,7 @@ class JaxSimModel(JaxsimDataclass):
219
228
  The contact model to consider.
220
229
  If not specified, a relaxed-constraints rigid contacts model is used.
221
230
  contact_params: The parameters of the contact model.
231
+ actuation_params: The parameters of the actuation model.
222
232
  integrator: The integrator to use for the simulation.
223
233
  gravity: The gravity constant.
224
234
 
@@ -255,6 +265,9 @@ class JaxSimModel(JaxsimDataclass):
255
265
  if contact_params is None:
256
266
  contact_params = contact_model._parameters_class()
257
267
 
268
+ if actuation_params is None:
269
+ actuation_params = jaxsim.rbda.actuation.ActuationParams()
270
+
258
271
  # Consider the default integrator if not specified.
259
272
  integrator = (
260
273
  integrator
@@ -272,6 +285,7 @@ class JaxSimModel(JaxsimDataclass):
272
285
  terrain=terrain,
273
286
  contact_model=contact_model,
274
287
  contact_params=contact_params,
288
+ actuation_params=actuation_params,
275
289
  integrator=integrator,
276
290
  gravity=gravity,
277
291
  # The following is wrapped as hashless since it's a static argument, and we
@@ -474,6 +488,7 @@ def reduce(
474
488
  terrain=model.terrain,
475
489
  contact_model=model.contact_model,
476
490
  contact_params=model.contact_params,
491
+ actuation_params=model.actuation_params,
477
492
  gravity=model.gravity,
478
493
  integrator=model.integrator,
479
494
  )
@@ -1,4 +1,4 @@
1
- from . import contacts
1
+ from . import actuation, contacts
2
2
  from .aba import aba
3
3
  from .collidable_points import collidable_points_pos_vel
4
4
  from .crba import crba
@@ -0,0 +1 @@
1
+ from .common import ActuationParams
@@ -0,0 +1,17 @@
1
+ import dataclasses
2
+
3
+ import jax_dataclasses
4
+
5
+ import jaxsim.typing as jtp
6
+ from jaxsim.utils import JaxsimDataclass
7
+
8
+
9
+ @jax_dataclasses.pytree_dataclass
10
+ class ActuationParams(JaxsimDataclass):
11
+ """
12
+ Parameters class for the actuation model.
13
+ """
14
+
15
+ torque_max: jtp.Float = dataclasses.field(default=3000.0) # (Nm)
16
+ omega_th: jtp.Float = dataclasses.field(default=30.0) # (rad/s)
17
+ omega_max: jtp.Float = dataclasses.field(default=100.0) # (rad/s)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jaxsim
3
- Version: 0.6.2.dev242
3
+ Version: 0.6.2.dev259
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>, Filippo Luca Ferretti <filippoluca.ferretti@outlook.com>
6
6
  Maintainer-email: Filippo Luca Ferretti <filippo.ferretti@iit.it>, Alessandro Croci <alessandro.croci@iit.it>
@@ -99,6 +99,8 @@ src/jaxsim/rbda/forward_kinematics.py
99
99
  src/jaxsim/rbda/jacobian.py
100
100
  src/jaxsim/rbda/rnea.py
101
101
  src/jaxsim/rbda/utils.py
102
+ src/jaxsim/rbda/actuation/__init__.py
103
+ src/jaxsim/rbda/actuation/common.py
102
104
  src/jaxsim/rbda/contacts/__init__.py
103
105
  src/jaxsim/rbda/contacts/common.py
104
106
  src/jaxsim/rbda/contacts/relaxed_rigid.py
@@ -112,6 +114,7 @@ src/jaxsim/utils/tracing.py
112
114
  src/jaxsim/utils/wrappers.py
113
115
  tests/__init__.py
114
116
  tests/conftest.py
117
+ tests/test_actuation.py
115
118
  tests/test_api_com.py
116
119
  tests/test_api_contact.py
117
120
  tests/test_api_data.py
@@ -133,6 +133,7 @@ def velocity_representation(request) -> jaxsim.VelRepr:
133
133
  params=[
134
134
  pytest.param(IntegratorType.SemiImplicitEuler, id="semi_implicit_euler"),
135
135
  pytest.param(IntegratorType.RungeKutta4, id="runge_kutta_4"),
136
+ pytest.param(IntegratorType.RungeKutta4Fast, id="runge_kutta_4_fast"),
136
137
  ],
137
138
  )
138
139
  def integrator(request) -> str:
@@ -0,0 +1,37 @@
1
+ import jax.numpy as jnp
2
+
3
+ import jaxsim.api as js
4
+ import jaxsim.rbda
5
+ from jaxsim import VelRepr
6
+
7
+
8
+ def test_tn_curve(jaxsim_model_single_pendulum: js.model.JaxSimModel):
9
+
10
+ model = jaxsim_model_single_pendulum
11
+ new_act_params = jaxsim.rbda.actuation.ActuationParams()
12
+ with new_act_params.editable(validate=False) as new_act_params:
13
+ new_act_params.torque_max = 10
14
+ new_act_params.omega_th = 1
15
+ new_act_params.omega_max = 2
16
+ with model.editable(validate=False) as model:
17
+ model.actuation_params = new_act_params
18
+ data = js.data.JaxSimModelData.build(
19
+ model=model,
20
+ velocity_representation=VelRepr.Inertial,
21
+ )
22
+ new_joint_velocities = 1.5 * jnp.ones(model.dofs())
23
+ joint_torques_0 = 30 * jnp.ones(model.dofs())
24
+ data_0 = data.replace(model=model, joint_velocities=new_joint_velocities)
25
+
26
+ τ_total = js.actuation_model.compute_resultant_torques(
27
+ model, data_0, joint_force_references=joint_torques_0
28
+ )
29
+ assert (τ_total <= joint_torques_0).all()
30
+ new_joint_velocities = 2.5 * jnp.ones(model.dofs())
31
+ joint_torques_0 = 30 * jnp.ones(model.dofs())
32
+ data_0 = data.replace(model=model, joint_velocities=new_joint_velocities)
33
+
34
+ τ_total = js.actuation_model.compute_resultant_torques(
35
+ model, data_0, joint_force_references=joint_torques_0
36
+ )
37
+ assert (τ_total == jnp.zeros(model.dofs())).all()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes