warp-lang 1.0.0b2__py3-none-win_amd64.whl → 1.0.0b6__py3-none-win_amd64.whl

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.

Potentially problematic release.


This version of warp-lang might be problematic. Click here for more details.

Files changed (271) hide show
  1. docs/conf.py +17 -5
  2. examples/env/env_ant.py +1 -1
  3. examples/env/env_cartpole.py +1 -1
  4. examples/env/env_humanoid.py +1 -1
  5. examples/env/env_usd.py +4 -1
  6. examples/env/environment.py +8 -9
  7. examples/example_dem.py +34 -33
  8. examples/example_diffray.py +364 -337
  9. examples/example_fluid.py +32 -23
  10. examples/example_jacobian_ik.py +97 -93
  11. examples/example_marching_cubes.py +6 -16
  12. examples/example_mesh.py +6 -16
  13. examples/example_mesh_intersect.py +16 -14
  14. examples/example_nvdb.py +14 -16
  15. examples/example_raycast.py +14 -13
  16. examples/example_raymarch.py +16 -23
  17. examples/example_render_opengl.py +19 -10
  18. examples/example_sim_cartpole.py +82 -78
  19. examples/example_sim_cloth.py +45 -48
  20. examples/example_sim_fk_grad.py +51 -44
  21. examples/example_sim_fk_grad_torch.py +47 -40
  22. examples/example_sim_grad_bounce.py +108 -133
  23. examples/example_sim_grad_cloth.py +99 -113
  24. examples/example_sim_granular.py +5 -6
  25. examples/{example_sim_sdf_shape.py → example_sim_granular_collision_sdf.py} +37 -26
  26. examples/example_sim_neo_hookean.py +51 -55
  27. examples/example_sim_particle_chain.py +4 -4
  28. examples/example_sim_quadruped.py +126 -81
  29. examples/example_sim_rigid_chain.py +54 -61
  30. examples/example_sim_rigid_contact.py +66 -70
  31. examples/example_sim_rigid_fem.py +3 -3
  32. examples/example_sim_rigid_force.py +1 -1
  33. examples/example_sim_rigid_gyroscopic.py +3 -4
  34. examples/example_sim_rigid_kinematics.py +28 -39
  35. examples/example_sim_trajopt.py +112 -110
  36. examples/example_sph.py +9 -8
  37. examples/example_wave.py +7 -7
  38. examples/fem/bsr_utils.py +30 -17
  39. examples/fem/example_apic_fluid.py +85 -69
  40. examples/fem/example_convection_diffusion.py +97 -93
  41. examples/fem/example_convection_diffusion_dg.py +142 -149
  42. examples/fem/example_convection_diffusion_dg0.py +141 -136
  43. examples/fem/example_deformed_geometry.py +146 -0
  44. examples/fem/example_diffusion.py +115 -84
  45. examples/fem/example_diffusion_3d.py +116 -86
  46. examples/fem/example_diffusion_mgpu.py +102 -79
  47. examples/fem/example_mixed_elasticity.py +139 -100
  48. examples/fem/example_navier_stokes.py +175 -162
  49. examples/fem/example_stokes.py +143 -111
  50. examples/fem/example_stokes_transfer.py +186 -157
  51. examples/fem/mesh_utils.py +59 -97
  52. examples/fem/plot_utils.py +138 -17
  53. tools/ci/publishing/build_nodes_info.py +54 -0
  54. warp/__init__.py +4 -3
  55. warp/__init__.pyi +1 -0
  56. warp/bin/warp-clang.dll +0 -0
  57. warp/bin/warp.dll +0 -0
  58. warp/build.py +5 -3
  59. warp/build_dll.py +29 -9
  60. warp/builtins.py +836 -492
  61. warp/codegen.py +864 -553
  62. warp/config.py +3 -1
  63. warp/context.py +389 -172
  64. warp/fem/__init__.py +24 -6
  65. warp/fem/cache.py +318 -25
  66. warp/fem/dirichlet.py +7 -3
  67. warp/fem/domain.py +14 -0
  68. warp/fem/field/__init__.py +30 -38
  69. warp/fem/field/field.py +149 -0
  70. warp/fem/field/nodal_field.py +244 -138
  71. warp/fem/field/restriction.py +8 -6
  72. warp/fem/field/test.py +127 -59
  73. warp/fem/field/trial.py +117 -60
  74. warp/fem/geometry/__init__.py +5 -1
  75. warp/fem/geometry/deformed_geometry.py +271 -0
  76. warp/fem/geometry/element.py +24 -1
  77. warp/fem/geometry/geometry.py +86 -14
  78. warp/fem/geometry/grid_2d.py +112 -54
  79. warp/fem/geometry/grid_3d.py +134 -65
  80. warp/fem/geometry/hexmesh.py +953 -0
  81. warp/fem/geometry/partition.py +85 -33
  82. warp/fem/geometry/quadmesh_2d.py +532 -0
  83. warp/fem/geometry/tetmesh.py +451 -115
  84. warp/fem/geometry/trimesh_2d.py +197 -92
  85. warp/fem/integrate.py +534 -268
  86. warp/fem/operator.py +58 -31
  87. warp/fem/polynomial.py +11 -0
  88. warp/fem/quadrature/__init__.py +1 -1
  89. warp/fem/quadrature/pic_quadrature.py +150 -58
  90. warp/fem/quadrature/quadrature.py +209 -57
  91. warp/fem/space/__init__.py +230 -53
  92. warp/fem/space/basis_space.py +489 -0
  93. warp/fem/space/collocated_function_space.py +105 -0
  94. warp/fem/space/dof_mapper.py +49 -2
  95. warp/fem/space/function_space.py +90 -39
  96. warp/fem/space/grid_2d_function_space.py +149 -496
  97. warp/fem/space/grid_3d_function_space.py +173 -538
  98. warp/fem/space/hexmesh_function_space.py +352 -0
  99. warp/fem/space/partition.py +129 -76
  100. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  101. warp/fem/space/restriction.py +46 -34
  102. warp/fem/space/shape/__init__.py +15 -0
  103. warp/fem/space/shape/cube_shape_function.py +738 -0
  104. warp/fem/space/shape/shape_function.py +103 -0
  105. warp/fem/space/shape/square_shape_function.py +611 -0
  106. warp/fem/space/shape/tet_shape_function.py +567 -0
  107. warp/fem/space/shape/triangle_shape_function.py +429 -0
  108. warp/fem/space/tetmesh_function_space.py +132 -1039
  109. warp/fem/space/topology.py +295 -0
  110. warp/fem/space/trimesh_2d_function_space.py +104 -742
  111. warp/fem/types.py +13 -11
  112. warp/fem/utils.py +335 -60
  113. warp/native/array.h +120 -34
  114. warp/native/builtin.h +101 -72
  115. warp/native/bvh.cpp +73 -325
  116. warp/native/bvh.cu +406 -23
  117. warp/native/bvh.h +22 -40
  118. warp/native/clang/clang.cpp +1 -0
  119. warp/native/crt.h +2 -0
  120. warp/native/cuda_util.cpp +8 -3
  121. warp/native/cuda_util.h +1 -0
  122. warp/native/exports.h +1522 -1243
  123. warp/native/intersect.h +19 -4
  124. warp/native/intersect_adj.h +8 -8
  125. warp/native/mat.h +76 -17
  126. warp/native/mesh.cpp +33 -108
  127. warp/native/mesh.cu +114 -18
  128. warp/native/mesh.h +395 -40
  129. warp/native/noise.h +272 -329
  130. warp/native/quat.h +51 -8
  131. warp/native/rand.h +44 -34
  132. warp/native/reduce.cpp +1 -1
  133. warp/native/sparse.cpp +4 -4
  134. warp/native/sparse.cu +163 -155
  135. warp/native/spatial.h +2 -2
  136. warp/native/temp_buffer.h +18 -14
  137. warp/native/vec.h +103 -21
  138. warp/native/warp.cpp +2 -1
  139. warp/native/warp.cu +28 -3
  140. warp/native/warp.h +4 -3
  141. warp/render/render_opengl.py +261 -109
  142. warp/sim/__init__.py +1 -2
  143. warp/sim/articulation.py +385 -185
  144. warp/sim/import_mjcf.py +59 -48
  145. warp/sim/import_urdf.py +15 -15
  146. warp/sim/import_usd.py +174 -102
  147. warp/sim/inertia.py +17 -18
  148. warp/sim/integrator_xpbd.py +4 -3
  149. warp/sim/model.py +330 -250
  150. warp/sim/render.py +1 -1
  151. warp/sparse.py +625 -152
  152. warp/stubs.py +341 -309
  153. warp/tape.py +9 -6
  154. warp/tests/__main__.py +3 -6
  155. warp/tests/assets/curlnoise_golden.npy +0 -0
  156. warp/tests/assets/pnoise_golden.npy +0 -0
  157. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  158. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  159. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  160. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  161. warp/tests/aux_test_unresolved_func.py +14 -0
  162. warp/tests/aux_test_unresolved_symbol.py +14 -0
  163. warp/tests/disabled_kinematics.py +239 -0
  164. warp/tests/run_coverage_serial.py +31 -0
  165. warp/tests/test_adam.py +103 -106
  166. warp/tests/test_arithmetic.py +94 -74
  167. warp/tests/test_array.py +82 -101
  168. warp/tests/test_array_reduce.py +57 -23
  169. warp/tests/test_atomic.py +64 -28
  170. warp/tests/test_bool.py +22 -12
  171. warp/tests/test_builtins_resolution.py +1292 -0
  172. warp/tests/test_bvh.py +18 -18
  173. warp/tests/test_closest_point_edge_edge.py +54 -57
  174. warp/tests/test_codegen.py +165 -134
  175. warp/tests/test_compile_consts.py +28 -20
  176. warp/tests/test_conditional.py +108 -24
  177. warp/tests/test_copy.py +10 -12
  178. warp/tests/test_ctypes.py +112 -88
  179. warp/tests/test_dense.py +21 -14
  180. warp/tests/test_devices.py +98 -0
  181. warp/tests/test_dlpack.py +75 -75
  182. warp/tests/test_examples.py +237 -0
  183. warp/tests/test_fabricarray.py +22 -24
  184. warp/tests/test_fast_math.py +15 -11
  185. warp/tests/test_fem.py +1034 -124
  186. warp/tests/test_fp16.py +23 -16
  187. warp/tests/test_func.py +187 -86
  188. warp/tests/test_generics.py +194 -49
  189. warp/tests/test_grad.py +123 -181
  190. warp/tests/test_grad_customs.py +176 -0
  191. warp/tests/test_hash_grid.py +35 -34
  192. warp/tests/test_import.py +10 -23
  193. warp/tests/test_indexedarray.py +24 -25
  194. warp/tests/test_intersect.py +18 -9
  195. warp/tests/test_large.py +141 -0
  196. warp/tests/test_launch.py +14 -41
  197. warp/tests/test_lerp.py +64 -65
  198. warp/tests/test_lvalue.py +493 -0
  199. warp/tests/test_marching_cubes.py +12 -13
  200. warp/tests/test_mat.py +517 -2898
  201. warp/tests/test_mat_lite.py +115 -0
  202. warp/tests/test_mat_scalar_ops.py +2889 -0
  203. warp/tests/test_math.py +103 -9
  204. warp/tests/test_matmul.py +304 -69
  205. warp/tests/test_matmul_lite.py +410 -0
  206. warp/tests/test_mesh.py +60 -22
  207. warp/tests/test_mesh_query_aabb.py +21 -25
  208. warp/tests/test_mesh_query_point.py +111 -22
  209. warp/tests/test_mesh_query_ray.py +12 -24
  210. warp/tests/test_mlp.py +30 -22
  211. warp/tests/test_model.py +92 -89
  212. warp/tests/test_modules_lite.py +39 -0
  213. warp/tests/test_multigpu.py +88 -114
  214. warp/tests/test_noise.py +12 -11
  215. warp/tests/test_operators.py +16 -20
  216. warp/tests/test_options.py +11 -11
  217. warp/tests/test_pinned.py +17 -18
  218. warp/tests/test_print.py +32 -11
  219. warp/tests/test_quat.py +275 -129
  220. warp/tests/test_rand.py +18 -16
  221. warp/tests/test_reload.py +38 -34
  222. warp/tests/test_rounding.py +50 -43
  223. warp/tests/test_runlength_encode.py +168 -20
  224. warp/tests/test_smoothstep.py +9 -11
  225. warp/tests/test_snippet.py +143 -0
  226. warp/tests/test_sparse.py +261 -63
  227. warp/tests/test_spatial.py +276 -243
  228. warp/tests/test_streams.py +110 -85
  229. warp/tests/test_struct.py +268 -63
  230. warp/tests/test_tape.py +39 -21
  231. warp/tests/test_torch.py +90 -86
  232. warp/tests/test_transient_module.py +10 -12
  233. warp/tests/test_types.py +363 -0
  234. warp/tests/test_utils.py +451 -0
  235. warp/tests/test_vec.py +354 -2050
  236. warp/tests/test_vec_lite.py +73 -0
  237. warp/tests/test_vec_scalar_ops.py +2099 -0
  238. warp/tests/test_volume.py +418 -376
  239. warp/tests/test_volume_write.py +124 -134
  240. warp/tests/unittest_serial.py +35 -0
  241. warp/tests/unittest_suites.py +291 -0
  242. warp/tests/unittest_utils.py +342 -0
  243. warp/tests/{test_misc.py → unused_test_misc.py} +13 -5
  244. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  245. warp/thirdparty/appdirs.py +36 -45
  246. warp/thirdparty/unittest_parallel.py +589 -0
  247. warp/types.py +622 -211
  248. warp/utils.py +54 -393
  249. warp_lang-1.0.0b6.dist-info/METADATA +238 -0
  250. warp_lang-1.0.0b6.dist-info/RECORD +409 -0
  251. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/WHEEL +1 -1
  252. examples/example_cache_management.py +0 -40
  253. examples/example_multigpu.py +0 -54
  254. examples/example_struct.py +0 -65
  255. examples/fem/example_stokes_transfer_3d.py +0 -210
  256. warp/bin/warp-clang.so +0 -0
  257. warp/bin/warp.so +0 -0
  258. warp/fem/field/discrete_field.py +0 -80
  259. warp/fem/space/nodal_function_space.py +0 -233
  260. warp/tests/test_all.py +0 -223
  261. warp/tests/test_array_scan.py +0 -60
  262. warp/tests/test_base.py +0 -208
  263. warp/tests/test_unresolved_func.py +0 -7
  264. warp/tests/test_unresolved_symbol.py +0 -7
  265. warp_lang-1.0.0b2.dist-info/METADATA +0 -26
  266. warp_lang-1.0.0b2.dist-info/RECORD +0 -380
  267. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  268. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  269. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  270. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/LICENSE.md +0 -0
  271. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/top_level.txt +0 -0
@@ -14,9 +14,10 @@
14
14
  #
15
15
  ###########################################################################
16
16
 
17
- import numpy as np
18
17
  import os
19
18
 
19
+ import numpy as np
20
+
20
21
  import warp as wp
21
22
  import warp.sim
22
23
  import warp.sim.render
@@ -25,19 +26,8 @@ wp.init()
25
26
 
26
27
 
27
28
  class Example:
28
- frame_dt = 1.0 / 100.0
29
-
30
- episode_duration = 5.0 # seconds
31
- episode_frames = int(episode_duration / frame_dt)
32
-
33
- sim_substeps = 32 # 5
34
- sim_dt = frame_dt / sim_substeps
35
- sim_steps = int(episode_duration / sim_dt)
36
-
37
- sim_time = 0.0
38
- render_time = 0.0
39
-
40
- def __init__(self, stage=None, render=True):
29
+ def __init__(self, stage):
30
+ self.device = wp.get_device()
41
31
  self.chain_length = 8
42
32
  self.chain_width = 1.0
43
33
  self.chain_types = [
@@ -48,9 +38,17 @@ class Example:
48
38
  wp.sim.JOINT_COMPOUND,
49
39
  ]
50
40
 
51
- self.enable_rendering = render
52
41
  builder = wp.sim.ModelBuilder()
53
42
 
43
+ self.sim_time = 0.0
44
+ self.frame_dt = 1.0 / 100.0
45
+
46
+ episode_duration = 5.0 # seconds
47
+ self.episode_frames = int(episode_duration / self.frame_dt)
48
+
49
+ self.sim_substeps = 32 # 5
50
+ self.sim_dt = self.frame_dt / self.sim_substeps
51
+
54
52
  for c, t in enumerate(self.chain_types):
55
53
  # start a new articulation
56
54
  builder.add_articulation()
@@ -67,8 +65,8 @@ class Example:
67
65
  b = builder.add_body(origin=wp.transform([i, 0.0, c * 1.0], wp.quat_identity()), armature=0.1)
68
66
 
69
67
  # create shape
70
- s = builder.add_shape_box(
71
- pos=(self.chain_width * 0.5, 0.0, 0.0),
68
+ builder.add_shape_box(
69
+ pos=wp.vec3(self.chain_width * 0.5, 0.0, 0.0),
72
70
  hx=self.chain_width * 0.5,
73
71
  hy=0.1,
74
72
  hz=0.1,
@@ -137,62 +135,57 @@ class Example:
137
135
 
138
136
  self.integrator = wp.sim.XPBDIntegrator(iterations=5)
139
137
 
140
- # -----------------------
141
- # set up Usd renderer
142
- self.renderer = None
143
- if render:
144
- self.renderer = wp.sim.render.SimRenderer(self.model, stage, scaling=20.0)
145
-
146
- def update(self):
147
- for _ in range(self.sim_substeps):
148
- self.state_0.clear_forces()
149
- self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
150
- self.state_0, self.state_1 = self.state_1, self.state_0
151
-
152
- def render(self, is_live=False):
153
- time = 0.0 if is_live else self.sim_time
154
-
155
- self.renderer.begin_frame(time)
156
- self.renderer.render(self.state_0)
157
- self.renderer.end_frame()
158
-
159
- def run(self, render=True):
160
- # ---------------
161
- # run simulation
138
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage, scaling=20.0)
162
139
 
163
- self.sim_time = 0.0
164
140
  self.state_0 = self.model.state()
165
141
  self.state_1 = self.model.state()
166
142
 
167
143
  wp.sim.eval_fk(self.model, self.model.joint_q, self.model.joint_qd, None, self.state_0)
168
144
 
169
- profiler = {}
170
-
171
- # create update graph
172
- wp.capture_begin()
173
-
174
- # simulate
175
- self.update()
145
+ self.use_graph = wp.get_device().is_cuda
146
+ self.graph = None
176
147
 
177
- graph = wp.capture_end()
148
+ if self.use_graph:
149
+ # create update graph
150
+ wp.capture_begin(self.device)
151
+ try:
152
+ self.update()
153
+ finally:
154
+ self.graph = wp.capture_end(self.device)
178
155
 
179
- # simulate
180
- with wp.ScopedTimer("simulate", detailed=False, print=False, active=True, dict=profiler):
181
- for f in range(0, self.episode_frames):
182
- with wp.ScopedTimer("simulate", active=True):
183
- wp.capture_launch(graph)
156
+ def update(self):
157
+ with wp.ScopedTimer("simulate", active=True):
158
+ if not self.use_graph or self.graph is None:
159
+ for _ in range(self.sim_substeps):
160
+ self.state_0.clear_forces()
161
+ self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
162
+ self.state_0, self.state_1 = self.state_1, self.state_0
163
+ else:
164
+ wp.capture_launch(self.graph)
165
+
166
+ if not wp.get_device().is_capturing:
184
167
  self.sim_time += self.frame_dt
185
168
 
186
- if self.enable_rendering:
187
- with wp.ScopedTimer("render", active=True):
188
- self.render()
169
+ def render(self, is_live=False):
170
+ with wp.ScopedTimer("render", active=True):
171
+ time = 0.0 if is_live else self.sim_time
189
172
 
190
- wp.synchronize()
191
- if self.enable_rendering:
192
- self.renderer.save()
173
+ self.renderer.begin_frame(time)
174
+ self.renderer.render(self.state_0)
175
+ self.renderer.end_frame()
193
176
 
194
177
 
195
178
  if __name__ == "__main__":
196
179
  stage = os.path.join(os.path.dirname(__file__), "outputs/example_sim_rigid_chain.usd")
197
- robot = Example(stage, render=True)
198
- robot.run()
180
+ example = Example(stage)
181
+
182
+ profiler = {}
183
+
184
+ with wp.ScopedTimer("simulate", detailed=False, print=False, active=True, dict=profiler):
185
+ for _ in range(example.episode_frames):
186
+ example.update()
187
+ example.render()
188
+
189
+ wp.synchronize()
190
+
191
+ example.renderer.save()
@@ -13,36 +13,32 @@
13
13
  #
14
14
  ###########################################################################
15
15
 
16
- import os
17
16
  import math
17
+ import os
18
18
 
19
19
  import numpy as np
20
+ from pxr import Usd, UsdGeom
20
21
 
21
22
  import warp as wp
22
23
  import warp.sim
23
24
  import warp.sim.render
24
25
 
25
- from pxr import UsdGeom, Usd
26
-
27
26
  wp.init()
28
27
 
29
28
 
30
29
  class Example:
31
- frame_dt = 1.0 / 60.0
32
-
33
- episode_duration = 20.0 # seconds
34
- episode_frames = int(episode_duration / frame_dt)
35
-
36
- sim_substeps = 10
37
- sim_dt = frame_dt / sim_substeps
38
- sim_steps = int(episode_duration / sim_dt)
30
+ def __init__(self, stage):
31
+ self.device = wp.get_device()
32
+ builder = wp.sim.ModelBuilder()
39
33
 
40
- sim_time = 0.0
34
+ self.sim_time = 0.0
35
+ self.frame_dt = 1.0 / 60.0
41
36
 
42
- def __init__(self, stage=None, render=True):
43
- builder = wp.sim.ModelBuilder()
37
+ episode_duration = 20.0 # seconds
38
+ self.episode_frames = int(episode_duration / self.frame_dt)
44
39
 
45
- self.enable_rendering = render
40
+ self.sim_substeps = 10
41
+ self.sim_dt = self.frame_dt / self.sim_substeps
46
42
 
47
43
  self.num_bodies = 8
48
44
  self.scale = 0.8
@@ -54,8 +50,8 @@ class Example:
54
50
  for i in range(self.num_bodies):
55
51
  b = builder.add_body(origin=wp.transform((i, 1.0, 0.0), wp.quat_identity()))
56
52
 
57
- s = builder.add_shape_box(
58
- pos=(0.0, 0.0, 0.0),
53
+ builder.add_shape_box(
54
+ pos=wp.vec3(0.0, 0.0, 0.0),
59
55
  hx=0.5 * self.scale,
60
56
  hy=0.2 * self.scale,
61
57
  hz=0.2 * self.scale,
@@ -69,16 +65,16 @@ class Example:
69
65
  for i in range(self.num_bodies):
70
66
  b = builder.add_body(origin=wp.transform((i, 1.0, 2.0), wp.quat_identity()))
71
67
 
72
- s = builder.add_shape_sphere(
73
- pos=(0.0, 0.0, 0.0), radius=0.25 * self.scale, body=b, ke=self.ke, kd=self.kd, kf=self.kf
68
+ builder.add_shape_sphere(
69
+ pos=wp.vec3(0.0, 0.0, 0.0), radius=0.25 * self.scale, body=b, ke=self.ke, kd=self.kd, kf=self.kf
74
70
  )
75
71
 
76
72
  # capsules
77
73
  for i in range(self.num_bodies):
78
74
  b = builder.add_body(origin=wp.transform((i, 1.0, 6.0), wp.quat_identity()))
79
75
 
80
- s = builder.add_shape_capsule(
81
- pos=(0.0, 0.0, 0.0),
76
+ builder.add_shape_capsule(
77
+ pos=wp.vec3(0.0, 0.0, 0.0),
82
78
  radius=0.25 * self.scale,
83
79
  half_height=self.scale * 0.5,
84
80
  up_axis=0,
@@ -98,15 +94,15 @@ class Example:
98
94
  b = builder.add_body(
99
95
  origin=wp.transform(
100
96
  (i * 0.5 * self.scale, 1.0 + i * 1.7 * self.scale, 4.0 + i * 0.5 * self.scale),
101
- wp.quat_from_axis_angle((0.0, 1.0, 0.0), math.pi * 0.1 * i),
97
+ wp.quat_from_axis_angle(wp.vec3(0.0, 1.0, 0.0), math.pi * 0.1 * i),
102
98
  )
103
99
  )
104
100
 
105
- s = builder.add_shape_mesh(
101
+ builder.add_shape_mesh(
106
102
  body=b,
107
103
  mesh=bunny,
108
- pos=(0.0, 0.0, 0.0),
109
- scale=(self.scale, self.scale, self.scale),
104
+ pos=wp.vec3(0.0, 0.0, 0.0),
105
+ scale=wp.vec3(self.scale, self.scale, self.scale),
110
106
  ke=self.ke,
111
107
  kd=self.kd,
112
108
  kf=self.kf,
@@ -119,10 +115,23 @@ class Example:
119
115
 
120
116
  self.integrator = wp.sim.SemiImplicitIntegrator()
121
117
 
122
- # -----------------------
123
- # set up OpenGL renderer
124
- if self.enable_rendering:
125
- self.renderer = wp.sim.render.SimRendererOpenGL(self.model, stage, scaling=0.5)
118
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage, scaling=0.5)
119
+
120
+ self.state_0 = self.model.state()
121
+ self.state_1 = self.model.state()
122
+
123
+ wp.sim.eval_fk(self.model, self.model.joint_q, self.model.joint_qd, None, self.state_0)
124
+
125
+ self.use_graph = wp.get_device().is_cuda
126
+ self.graph = None
127
+
128
+ if self.use_graph:
129
+ # create update graph
130
+ wp.capture_begin(self.device)
131
+ try:
132
+ self.update()
133
+ finally:
134
+ self.graph = wp.capture_end(self.device)
126
135
 
127
136
  def load_mesh(self, filename, path):
128
137
  asset_stage = Usd.Stage.Open(filename)
@@ -134,53 +143,40 @@ class Example:
134
143
  return wp.sim.Mesh(points, indices)
135
144
 
136
145
  def update(self):
137
- for _ in range(self.sim_substeps):
138
- self.state_0.clear_forces()
139
- wp.sim.collide(self.model, self.state_0)
140
- self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
141
- self.state_0, self.state_1 = self.state_1, self.state_0
146
+ with wp.ScopedTimer("simulate", active=True):
147
+ if not self.use_graph or self.graph is None:
148
+ for _ in range(self.sim_substeps):
149
+ self.state_0.clear_forces()
150
+ wp.sim.collide(self.model, self.state_0)
151
+ self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
152
+ self.state_0, self.state_1 = self.state_1, self.state_0
153
+ else:
154
+ wp.capture_launch(self.graph)
155
+
156
+ if not wp.get_device().is_capturing:
157
+ self.sim_time += self.frame_dt
142
158
 
143
159
  def render(self, is_live=False):
144
- time = 0.0 if is_live else self.sim_time
160
+ with wp.ScopedTimer("render", active=True):
161
+ time = 0.0 if is_live else self.sim_time
145
162
 
146
- self.renderer.begin_frame(time)
147
- self.renderer.render(self.state_0)
148
- self.renderer.end_frame()
163
+ self.renderer.begin_frame(time)
164
+ self.renderer.render(self.state_0)
165
+ self.renderer.end_frame()
149
166
 
150
- def run(self, render=True):
151
- # ---------------
152
- # run simulation
153
167
 
154
- self.sim_time = 0.0
155
- self.state_0 = self.model.state()
156
- self.state_1 = self.model.state()
157
-
158
- wp.sim.eval_fk(self.model, self.model.joint_q, self.model.joint_qd, None, self.state_0)
159
-
160
- profiler = {}
161
-
162
- # create update graph
163
- wp.capture_begin()
164
-
165
- # simulate
166
- self.update()
167
-
168
- graph = wp.capture_end()
169
-
170
- # simulate
171
- with wp.ScopedTimer("simulate", detailed=False, print=False, active=True, dict=profiler):
172
- for f in range(0, self.episode_frames):
173
- with wp.ScopedTimer("simulate", active=True):
174
- wp.capture_launch(graph)
175
- self.sim_time += self.frame_dt
168
+ if __name__ == "__main__":
169
+ stage = os.path.join(os.path.dirname(__file__), "outputs/example_sim_rigid_contact.usd")
170
+ example = Example(stage)
171
+ example.run()
176
172
 
177
- if self.enable_rendering:
178
- with wp.ScopedTimer("render", active=True):
179
- self.render()
173
+ profiler = {}
180
174
 
181
- wp.synchronize()
175
+ with wp.ScopedTimer("simulate", detailed=False, print=False, active=True, dict=profiler):
176
+ for _ in range(example.episode_frames):
177
+ example.update()
178
+ example.render()
182
179
 
180
+ wp.synchronize()
183
181
 
184
- stage = os.path.join(os.path.dirname(__file__), "outputs/example_sim_rigid_contact.usd")
185
- robot = Example(stage, render=True)
186
- robot.run()
182
+ example.renderer.save()
@@ -40,9 +40,9 @@ class Example:
40
40
  builder.default_particle_radius = 0.01
41
41
 
42
42
  builder.add_soft_grid(
43
- pos=(0.0, 0.0, 0.0),
43
+ pos=wp.vec3(0.0, 0.0, 0.0),
44
44
  rot=wp.quat_identity(),
45
- vel=(0.0, 0.0, 0.0),
45
+ vel=wp.vec3(0.0, 0.0, 0.0),
46
46
  dim_x=20,
47
47
  dim_y=10,
48
48
  dim_z=10,
@@ -69,7 +69,7 @@ class Example:
69
69
  self.state_0 = self.model.state()
70
70
  self.state_1 = self.model.state()
71
71
 
72
- self.renderer = wp.sim.render.SimRendererOpenGL(self.model, stage, scaling=1.0)
72
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage, scaling=1.0)
73
73
 
74
74
  def update(self):
75
75
  with wp.ScopedTimer("simulate", active=True):
@@ -48,7 +48,7 @@ class Example:
48
48
 
49
49
  def update(self):
50
50
  with wp.ScopedTimer("simulate"):
51
- for s in range(self.sim_substeps):
51
+ for _ in range(self.sim_substeps):
52
52
  wp.sim.collide(self.model, self.state_0)
53
53
 
54
54
  self.state_0.clear_forces()
@@ -36,7 +36,7 @@ class Example:
36
36
 
37
37
  # axis shape
38
38
  builder.add_shape_box(
39
- pos=(0.3 * self.scale, 0.0, 0.0),
39
+ pos=wp.vec3(0.3 * self.scale, 0.0, 0.0),
40
40
  hx=0.25 * self.scale,
41
41
  hy=0.1 * self.scale,
42
42
  hz=0.1 * self.scale,
@@ -46,7 +46,7 @@ class Example:
46
46
 
47
47
  # tip shape
48
48
  builder.add_shape_box(
49
- pos=(0.0, 0.0, 0.0), hx=0.05 * self.scale, hy=0.2 * self.scale, hz=1.0 * self.scale, density=100.0, body=b
49
+ pos=wp.vec3(0.0, 0.0, 0.0), hx=0.05 * self.scale, hy=0.2 * self.scale, hz=1.0 * self.scale, density=100.0, body=b
50
50
  )
51
51
 
52
52
  # initial spin
@@ -65,6 +65,7 @@ class Example:
65
65
  with wp.ScopedTimer("simulate", active=True):
66
66
  self.state.clear_forces()
67
67
  self.state = self.integrator.simulate(self.model, self.state, self.state, self.sim_dt)
68
+ self.sim_time += self.sim_dt
68
69
 
69
70
  def render(self, is_live=False):
70
71
  with wp.ScopedTimer("render", active=True):
@@ -74,8 +75,6 @@ class Example:
74
75
  self.renderer.render(self.state)
75
76
  self.renderer.end_frame()
76
77
 
77
- self.sim_time += self.sim_dt
78
-
79
78
 
80
79
  if __name__ == "__main__":
81
80
  stage_path = os.path.join(os.path.dirname(__file__), "outputs/example_sim_rigid_gyroscopic.usd")
@@ -13,8 +13,8 @@
13
13
  #
14
14
  ###########################################################################
15
15
 
16
- import os
17
16
  import math
17
+ import os
18
18
 
19
19
  import numpy as np
20
20
 
@@ -25,24 +25,13 @@ import warp.sim.render
25
25
  wp.init()
26
26
 
27
27
 
28
- class Robot:
29
- frame_dt = 1.0 / 60.0
30
-
31
- episode_duration = 2.0 # seconds
32
- episode_frames = int(episode_duration / frame_dt)
33
-
34
- sim_substeps = 10
35
- sim_dt = frame_dt / sim_substeps
36
- sim_steps = int(episode_duration / sim_dt)
28
+ class Example:
29
+ def __init__(self, stage, num_envs=1, device=None, verbose=False):
30
+ self.verbose = verbose
37
31
 
38
- sim_time = 0.0
39
- render_time = 0.0
40
-
41
- def __init__(self, render=True, num_envs=1, device=None):
42
32
  builder = wp.sim.ModelBuilder()
43
33
 
44
- self.render = render
45
-
34
+ self.sim_time = 0.0
46
35
  self.num_envs = num_envs
47
36
 
48
37
  for i in range(num_envs):
@@ -58,6 +47,7 @@ class Robot:
58
47
  contact_mu=0.75,
59
48
  limit_ke=1.0e3,
60
49
  limit_kd=1.0e1,
50
+ up_axis="y",
61
51
  )
62
52
 
63
53
  coord_count = 15
@@ -69,7 +59,7 @@ class Robot:
69
59
  # base
70
60
  builder.joint_q[coord_start : coord_start + 3] = [i * 2.0, 0.70, 0.0]
71
61
  builder.joint_q[coord_start + 3 : coord_start + 7] = wp.quat_from_axis_angle(
72
- (1.0, 0.0, 0.0), -math.pi * 0.5
62
+ wp.vec3(1.0, 0.0, 0.0), -math.pi * 0.5
73
63
  )
74
64
 
75
65
  # joints
@@ -84,20 +74,11 @@ class Robot:
84
74
 
85
75
  self.integrator = wp.sim.SemiImplicitIntegrator()
86
76
 
87
- # -----------------------
88
- # set up Usd renderer
89
- if self.render:
90
- self.renderer = wp.sim.render.SimRenderer(
91
- self.model,
92
- os.path.join(os.path.dirname(__file__), "outputs/example_sim_rigid_kinematics.usd"),
93
- scaling=50.0,
94
- )
77
+ self.renderer = wp.sim.render.SimRenderer(path=stage, model=self.model, scaling=50.0)
95
78
 
96
- def run(self):
97
- # ---------------
98
- # run simulation
79
+ self.frame_dt = 1.0 / 60.0
99
80
 
100
- self.sim_time = 0.0
81
+ def update(self):
101
82
  self.state = self.model.state()
102
83
 
103
84
  # save a copy of joint values
@@ -114,18 +95,26 @@ class Robot:
114
95
  q_err = q_fk - q_ik.numpy()
115
96
  qd_err = qd_fk - qd_ik.numpy()
116
97
 
117
- if self.render:
118
- self.renderer.begin_frame(self.render_time)
119
- self.renderer.render(self.state)
120
- self.renderer.end_frame()
121
- self.renderer.save()
122
-
123
- print(q_err)
124
- print(qd_err)
98
+ if self.verbose:
99
+ print(f"q_err = {q_err}")
100
+ print(f"qd_err = {qd_err}")
125
101
 
126
102
  assert np.abs(q_err).max() < 1.0e-6
127
103
  assert np.abs(qd_err).max() < 1.0e-6
128
104
 
105
+ self.sim_time += self.frame_dt
106
+
107
+ def render(self):
108
+ self.renderer.begin_frame(self.sim_time)
109
+ self.renderer.render(self.state)
110
+ self.renderer.end_frame()
111
+
112
+
113
+ if __name__ == "__main__":
114
+ stage_path = os.path.join(os.path.dirname(__file__), "outputs/example_sim_rigid_kinematics.usd")
115
+
116
+ example = Example(stage_path, num_envs=1, verbose=True)
117
+ example.update()
118
+ example.render()
129
119
 
130
- robot = Robot(render=False, num_envs=1)
131
- robot.run()
120
+ example.renderer.save()