jaxsim 0.2.dev366__tar.gz → 0.2.dev376__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 (114) hide show
  1. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/PKG-INFO +1 -1
  2. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/_version.py +2 -2
  3. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/api/model.py +12 -1
  4. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/mujoco/loaders.py +33 -7
  5. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/mujoco/model.py +43 -2
  6. jaxsim-0.2.dev376/src/jaxsim/terrain/__init__.py +2 -0
  7. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim.egg-info/PKG-INFO +1 -1
  8. jaxsim-0.2.dev366/src/jaxsim/terrain/__init__.py +0 -2
  9. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/.devcontainer/Dockerfile +0 -0
  10. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/.devcontainer/devcontainer.json +0 -0
  11. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/.github/CODEOWNERS +0 -0
  12. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/.github/workflows/ci_cd.yml +0 -0
  13. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/.github/workflows/read_the_docs.yml +0 -0
  14. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/.github/workflows/style.yml +0 -0
  15. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/.gitignore +0 -0
  16. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/.pre-commit-config.yaml +0 -0
  17. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/.readthedocs.yaml +0 -0
  18. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/CONTRIBUTING.md +0 -0
  19. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/LICENSE +0 -0
  20. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/README.md +0 -0
  21. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/docs/Makefile +0 -0
  22. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/docs/conf.py +0 -0
  23. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/docs/guide/install.rst +0 -0
  24. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/docs/index.rst +0 -0
  25. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/docs/make.bat +0 -0
  26. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/docs/modules/high_level.rst +0 -0
  27. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/docs/modules/math.rst +0 -0
  28. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/docs/modules/parsers.rst +0 -0
  29. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/docs/modules/physics.rst +0 -0
  30. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/docs/modules/simulation.rst +0 -0
  31. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/docs/modules/typing.rst +0 -0
  32. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/docs/modules/utils.rst +0 -0
  33. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/environment.yml +0 -0
  34. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/examples/.gitattributes +0 -0
  35. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/examples/.gitignore +0 -0
  36. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/examples/PD_controller.ipynb +0 -0
  37. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/examples/Parallel_computing.ipynb +0 -0
  38. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/examples/README.md +0 -0
  39. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/examples/assets/cartpole.urdf +0 -0
  40. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/examples/pixi.lock +0 -0
  41. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/examples/pixi.toml +0 -0
  42. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/pyproject.toml +0 -0
  43. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/setup.cfg +0 -0
  44. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/setup.py +0 -0
  45. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/__init__.py +0 -0
  46. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/api/__init__.py +0 -0
  47. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/api/com.py +0 -0
  48. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/api/common.py +0 -0
  49. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/api/contact.py +0 -0
  50. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/api/data.py +0 -0
  51. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/api/joint.py +0 -0
  52. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/api/kin_dyn_parameters.py +0 -0
  53. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/api/link.py +0 -0
  54. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/api/ode.py +0 -0
  55. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/api/ode_data.py +0 -0
  56. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/api/references.py +0 -0
  57. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/integrators/__init__.py +0 -0
  58. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/integrators/common.py +0 -0
  59. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/integrators/fixed_step.py +0 -0
  60. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/integrators/variable_step.py +0 -0
  61. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/logging.py +0 -0
  62. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/math/__init__.py +0 -0
  63. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/math/adjoint.py +0 -0
  64. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/math/cross.py +0 -0
  65. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/math/inertia.py +0 -0
  66. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/math/joint_model.py +0 -0
  67. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/math/quaternion.py +0 -0
  68. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/math/rotation.py +0 -0
  69. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/math/skew.py +0 -0
  70. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/math/transform.py +0 -0
  71. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/mujoco/__init__.py +0 -0
  72. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/mujoco/__main__.py +0 -0
  73. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/mujoco/visualizer.py +0 -0
  74. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/parsers/__init__.py +0 -0
  75. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/parsers/descriptions/__init__.py +0 -0
  76. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/parsers/descriptions/collision.py +0 -0
  77. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/parsers/descriptions/joint.py +0 -0
  78. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/parsers/descriptions/link.py +0 -0
  79. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/parsers/descriptions/model.py +0 -0
  80. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/parsers/kinematic_graph.py +0 -0
  81. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/parsers/rod/__init__.py +0 -0
  82. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/parsers/rod/parser.py +0 -0
  83. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/parsers/rod/utils.py +0 -0
  84. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/rbda/__init__.py +0 -0
  85. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/rbda/aba.py +0 -0
  86. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/rbda/collidable_points.py +0 -0
  87. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/rbda/crba.py +0 -0
  88. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/rbda/forward_kinematics.py +0 -0
  89. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/rbda/jacobian.py +0 -0
  90. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/rbda/rnea.py +0 -0
  91. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/rbda/soft_contacts.py +0 -0
  92. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/rbda/utils.py +0 -0
  93. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/terrain/terrain.py +0 -0
  94. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/typing.py +0 -0
  95. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/utils/__init__.py +0 -0
  96. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/utils/hashless.py +0 -0
  97. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/utils/jaxsim_dataclass.py +0 -0
  98. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim/utils/tracing.py +0 -0
  99. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim.egg-info/SOURCES.txt +0 -0
  100. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim.egg-info/dependency_links.txt +0 -0
  101. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim.egg-info/not-zip-safe +0 -0
  102. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim.egg-info/requires.txt +0 -0
  103. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/src/jaxsim.egg-info/top_level.txt +0 -0
  104. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/tests/__init__.py +0 -0
  105. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/tests/conftest.py +0 -0
  106. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/tests/test_api_com.py +0 -0
  107. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/tests/test_api_data.py +0 -0
  108. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/tests/test_api_joint.py +0 -0
  109. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/tests/test_api_link.py +0 -0
  110. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/tests/test_api_model.py +0 -0
  111. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/tests/test_automatic_differentiation.py +0 -0
  112. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/tests/test_pytree.py +0 -0
  113. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/tests/test_simulations.py +0 -0
  114. {jaxsim-0.2.dev366 → jaxsim-0.2.dev376}/tests/utils_idyntree.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.2.dev366
3
+ Version: 0.2.dev376
4
4
  Summary: A physics engine in reduced coordinates implemented with JAX.
5
5
  Home-page: https://github.com/ami-iit/jaxsim
6
6
  Author: Diego Ferigo
@@ -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.dev366'
16
- __version_tuple__ = version_tuple = (0, 2, 'dev366')
15
+ __version__ = version = '0.2.dev376'
16
+ __version_tuple__ = version_tuple = (0, 2, 'dev376')
@@ -52,6 +52,8 @@ class JaxSimModel(JaxsimDataclass):
52
52
  def build_from_model_description(
53
53
  model_description: str | pathlib.Path | rod.Model,
54
54
  model_name: str | None = None,
55
+ *,
56
+ terrain: jaxsim.terrain.Terrain | None = None,
55
57
  is_urdf: bool | None = None,
56
58
  considered_joints: list[str] | None = None,
57
59
  ) -> JaxSimModel:
@@ -65,6 +67,8 @@ class JaxSimModel(JaxsimDataclass):
65
67
  model_name:
66
68
  The optional name of the model that overrides the one in
67
69
  the description.
70
+ terrain:
71
+ The optional terrain to consider.
68
72
  is_urdf:
69
73
  Whether the model description is a URDF or an SDF. This is
70
74
  automatically inferred if the model description is a path to a file.
@@ -92,7 +96,9 @@ class JaxSimModel(JaxsimDataclass):
92
96
 
93
97
  # Build the model
94
98
  model = JaxSimModel.build(
95
- model_description=intermediate_description, model_name=model_name
99
+ model_description=intermediate_description,
100
+ model_name=model_name,
101
+ terrain=terrain,
96
102
  )
97
103
 
98
104
  # Store the origin of the model, in case downstream logic needs it
@@ -105,6 +111,8 @@ class JaxSimModel(JaxsimDataclass):
105
111
  def build(
106
112
  model_description: jaxsim.parsers.descriptions.ModelDescription,
107
113
  model_name: str | None = None,
114
+ *,
115
+ terrain: jaxsim.terrain.Terrain | None = None,
108
116
  ) -> JaxSimModel:
109
117
  """
110
118
  Build a Model object from an intermediate model description.
@@ -115,6 +123,8 @@ class JaxSimModel(JaxsimDataclass):
115
123
  of the model.
116
124
  model_name:
117
125
  The optional name of the model overriding the physics model name.
126
+ terrain:
127
+ The optional terrain to consider.
118
128
 
119
129
  Returns:
120
130
  The built Model object.
@@ -130,6 +140,7 @@ class JaxSimModel(JaxsimDataclass):
130
140
  kin_dyn_parameters=js.kin_dyn_parameters.KynDynParameters.build(
131
141
  model_description=model_description
132
142
  ),
143
+ terrain=terrain or JaxSimModel.__dataclass_fields__["terrain"].default,
133
144
  )
134
145
 
135
146
  return model
@@ -129,6 +129,8 @@ class RodModelToMjcf:
129
129
  def convert(
130
130
  rod_model: rod.Model,
131
131
  considered_joints: list[str] | None = None,
132
+ plane_normal: tuple[float, float, float] = (0, 0, 1),
133
+ heightmap: bool | None = None,
132
134
  ) -> tuple[str, dict[str, Any]]:
133
135
  """"""
134
136
 
@@ -198,8 +200,6 @@ class RodModelToMjcf:
198
200
  )
199
201
 
200
202
  urdf_string = ET.tostring(root, pretty_print=True).decode()
201
- # print(urdf_string)
202
- # raise
203
203
 
204
204
  # ------------------------------
205
205
  # Post-process all dummy visuals
@@ -358,6 +358,19 @@ class RodModelToMjcf:
358
358
  texuniform="true",
359
359
  )
360
360
 
361
+ _ = (
362
+ ET.SubElement(
363
+ asset_element,
364
+ "hfield",
365
+ name="terrain",
366
+ nrow="100",
367
+ ncol="100",
368
+ size="5 5 1 1",
369
+ )
370
+ if heightmap
371
+ else None
372
+ )
373
+
361
374
  # ----------------------------------
362
375
  # Populate the scene with the assets
363
376
  # ----------------------------------
@@ -368,12 +381,14 @@ class RodModelToMjcf:
368
381
  worldbody_scene_element,
369
382
  "geom",
370
383
  name="floor",
371
- type="plane",
384
+ type="plane" if not heightmap else "hfield",
372
385
  size="0 0 0.05",
373
386
  material="plane_material",
374
387
  condim="3",
375
388
  contype="1",
376
389
  conaffinity="1",
390
+ zaxis=" ".join(map(str, plane_normal)),
391
+ **({"hfield": "terrain"} if heightmap else {}),
377
392
  )
378
393
 
379
394
  _ = ET.SubElement(
@@ -407,13 +422,14 @@ class RodModelToMjcf:
407
422
  raise RuntimeError("Failed to find the <worldbody> element of the model")
408
423
 
409
424
  # Camera attached to the model
425
+ # It can be manually copied from `python -m mujoco.viewer --mjcf=<URDF_PATH>`
410
426
  _ = ET.SubElement(
411
427
  worldbody_element,
412
428
  "camera",
413
429
  name="track",
414
430
  mode="trackcom",
415
- pos="1 0 5",
416
- zaxis="0 0 1",
431
+ pos="1.930 -2.279 0.556",
432
+ xyaxes="0.771 0.637 0.000 -0.116 0.140 0.983",
417
433
  fovy="60",
418
434
  )
419
435
 
@@ -449,6 +465,8 @@ class UrdfToMjcf:
449
465
  urdf: str | pathlib.Path,
450
466
  considered_joints: list[str] | None = None,
451
467
  model_name: str | None = None,
468
+ plane_normal: tuple[float, float, float] = (0, 0, 1),
469
+ heightmap: bool | None = None,
452
470
  ) -> tuple[str, dict[str, Any]]:
453
471
  """"""
454
472
 
@@ -461,7 +479,10 @@ class UrdfToMjcf:
461
479
 
462
480
  # Convert the ROD model to MJCF.
463
481
  return RodModelToMjcf.convert(
464
- rod_model=rod_model, considered_joints=considered_joints
482
+ rod_model=rod_model,
483
+ considered_joints=considered_joints,
484
+ plane_normal=plane_normal,
485
+ heightmap=heightmap,
465
486
  )
466
487
 
467
488
 
@@ -471,6 +492,8 @@ class SdfToMjcf:
471
492
  sdf: str | pathlib.Path,
472
493
  considered_joints: list[str] | None = None,
473
494
  model_name: str | None = None,
495
+ plane_normal: tuple[float, float, float] = (0, 0, 1),
496
+ heightmap: bool | None = None,
474
497
  ) -> tuple[str, dict[str, Any]]:
475
498
  """"""
476
499
 
@@ -483,5 +506,8 @@ class SdfToMjcf:
483
506
 
484
507
  # Convert the ROD model to MJCF.
485
508
  return RodModelToMjcf.convert(
486
- rod_model=rod_model, considered_joints=considered_joints
509
+ rod_model=rod_model,
510
+ considered_joints=considered_joints,
511
+ plane_normal=plane_normal,
512
+ heightmap=heightmap,
487
513
  )
@@ -1,12 +1,14 @@
1
1
  import functools
2
2
  import pathlib
3
- from typing import Any
3
+ from typing import Any, Callable
4
4
 
5
5
  import mujoco as mj
6
6
  import numpy as np
7
7
  import numpy.typing as npt
8
8
  from scipy.spatial.transform import Rotation
9
9
 
10
+ HeightmapCallable = Callable[[jtp.FloatLike, jtp.FloatLike], jtp.FloatLike]
11
+
10
12
 
11
13
  class MujocoModelHelper:
12
14
  """
@@ -27,7 +29,9 @@ class MujocoModelHelper:
27
29
 
28
30
  @staticmethod
29
31
  def build_from_xml(
30
- mjcf_description: str | pathlib.Path, assets: dict[str, Any] = None
32
+ mjcf_description: str | pathlib.Path,
33
+ assets: dict[str, Any] = None,
34
+ heightmap: HeightmapCallable | None = None,
31
35
  ) -> "MujocoModelHelper":
32
36
  """"""
33
37
 
@@ -40,6 +44,13 @@ class MujocoModelHelper:
40
44
 
41
45
  # Create the Mujoco model from the XML and, optionally, the assets dictionary
42
46
  model = mj.MjModel.from_xml_string(xml=mjcf_description, assets=assets) # noqa
47
+ data = mj.MjData(model)
48
+
49
+ if heightmap:
50
+ nrow = model.hfield_nrow.item()
51
+ ncol = model.hfield_ncol.item()
52
+ new_hfield = generate_hfield(heightmap, (nrow, ncol))
53
+ model.hfield_data = new_hfield
43
54
 
44
55
  return MujocoModelHelper(model=model, data=mj.MjData(model))
45
56
 
@@ -350,3 +361,33 @@ class MujocoModelHelper:
350
361
  ]
351
362
  ).squeeze()
352
363
  )
364
+
365
+
366
+ def generate_hfield(
367
+ heightmap: HeightmapCallable, size: tuple[int, int] = (10, 10)
368
+ ) -> npt.NDArray:
369
+ """
370
+ Generates a numpy array representing the heightmap of
371
+ The map will have the following format:
372
+ ```
373
+ heightmap[0, 0] heightmap[0, 1] ... heightmap[0, size[1]-1]
374
+ heightmap[1, 0] heightmap[1, 1] ... heightmap[1, size[1]-1]
375
+ ...
376
+ heightmap[size[0]-1, 0] heightmap[size[0]-1, 1] ... heightmap[size[0]-1, size[1]-1]
377
+ ```
378
+
379
+ Args:
380
+ heightmap: A function that takes two arguments (x, y) and returns the height
381
+ at that point.
382
+ size: A tuple of two integers representing the size of the grid.
383
+
384
+ Returns:
385
+ np.ndarray: The terrain heightmap
386
+ """
387
+
388
+ # Generate the grid.
389
+ x = np.linspace(0, 1, size[0])
390
+ y = np.linspace(0, 1, size[1])
391
+
392
+ # Generate the heightmap.
393
+ return np.array([[heightmap(xi, yi) for xi in x] for yi in y]).flatten()
@@ -0,0 +1,2 @@
1
+ from . import terrain
2
+ from .terrain import FlatTerrain, PlaneTerrain, Terrain
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxsim
3
- Version: 0.2.dev366
3
+ Version: 0.2.dev376
4
4
  Summary: A physics engine in reduced coordinates implemented with JAX.
5
5
  Home-page: https://github.com/ami-iit/jaxsim
6
6
  Author: Diego Ferigo
@@ -1,2 +0,0 @@
1
- from . import terrain
2
- from .terrain import FlatTerrain, Terrain
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