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,21 +14,20 @@
14
14
  ###########################################################################
15
15
 
16
16
  import argparse
17
- import os
18
17
  import math
18
+ import os
19
19
  from enum import Enum
20
20
 
21
21
  import numpy as np
22
+ from pxr import Usd, UsdGeom
22
23
 
23
24
  import warp as wp
24
-
25
25
  import warp.sim
26
26
  import warp.sim.render
27
27
 
28
- from pxr import Usd, UsdGeom
29
-
30
28
  wp.init()
31
29
 
30
+
32
31
  class IntegratorType(Enum):
33
32
  EULER = "euler"
34
33
  XPBD = "xpbd"
@@ -36,21 +35,12 @@ class IntegratorType(Enum):
36
35
  def __str__(self):
37
36
  return self.value
38
37
 
39
- class Example:
40
- def __init__(self, stage):
41
-
42
- self.parser = argparse.ArgumentParser()
43
- self.parser.add_argument(
44
- "--integrator",
45
- help="Type of integrator",
46
- type=IntegratorType,
47
- choices=list(IntegratorType),
48
- default=IntegratorType.EULER,
49
- )
50
38
 
51
- args = self.parser.parse_args()
39
+ class Example:
40
+ def __init__(self, stage, integrator=IntegratorType.EULER):
41
+ self.device = wp.get_device()
52
42
 
53
- self.integrator_type = args.integrator
43
+ self.integrator_type = integrator
54
44
 
55
45
  self.sim_width = 64
56
46
  self.sim_height = 32
@@ -59,18 +49,19 @@ class Example:
59
49
  self.sim_substeps = 32
60
50
  self.sim_duration = 5.0
61
51
  self.sim_frames = int(self.sim_duration * self.sim_fps)
62
- self.sim_dt = (1.0 / self.sim_fps) / self.sim_substeps
52
+ self.frame_dt = 1.0 / self.sim_fps
53
+ self.sim_dt = self.frame_dt / self.sim_substeps
63
54
  self.sim_time = 0.0
64
55
  self.sim_use_graph = wp.get_device().is_cuda
65
- self.simulate_timer = wp.ScopedTimer("simulate", dict={})
56
+ self.profiler = {}
66
57
 
67
58
  builder = wp.sim.ModelBuilder()
68
59
 
69
60
  if self.integrator_type == IntegratorType.EULER:
70
61
  builder.add_cloth_grid(
71
- pos=(0.0, 4.0, 0.0),
72
- rot=wp.quat_from_axis_angle((1.0, 0.0, 0.0), math.pi * 0.5),
73
- vel=(0.0, 0.0, 0.0),
62
+ pos=wp.vec3(0.0, 4.0, 0.0),
63
+ rot=wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), math.pi * 0.5),
64
+ vel=wp.vec3(0.0, 0.0, 0.0),
74
65
  dim_x=self.sim_width,
75
66
  dim_y=self.sim_height,
76
67
  cell_x=0.1,
@@ -83,9 +74,9 @@ class Example:
83
74
  )
84
75
  else:
85
76
  builder.add_cloth_grid(
86
- pos=(0.0, 4.0, 0.0),
87
- rot=wp.quat_from_axis_angle((1.0, 0.0, 0.0), math.pi * 0.5),
88
- vel=(0.0, 0.0, 0.0),
77
+ pos=wp.vec3(0.0, 4.0, 0.0),
78
+ rot=wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), math.pi * 0.5),
79
+ vel=wp.vec3(0.0, 0.0, 0.0),
89
80
  dim_x=self.sim_width,
90
81
  dim_y=self.sim_height,
91
82
  cell_x=0.1,
@@ -109,9 +100,9 @@ class Example:
109
100
  builder.add_shape_mesh(
110
101
  body=-1,
111
102
  mesh=mesh,
112
- pos=(1.0, 0.0, 1.0),
113
- rot=wp.quat_from_axis_angle((0.0, 1.0, 0.0), math.pi * 0.5),
114
- scale=(2.0, 2.0, 2.0),
103
+ pos=wp.vec3(1.0, 0.0, 1.0),
104
+ rot=wp.quat_from_axis_angle(wp.vec3(0.0, 1.0, 0.0), math.pi * 0.5),
105
+ scale=wp.vec3(2.0, 2.0, 2.0),
115
106
  ke=1.0e2,
116
107
  kd=1.0e2,
117
108
  kf=1.0e1,
@@ -131,35 +122,32 @@ class Example:
131
122
  self.state_1 = self.model.state()
132
123
 
133
124
  self.renderer = wp.sim.render.SimRenderer(self.model, stage, scaling=40.0)
125
+ self.graph = None
134
126
 
135
127
  if self.sim_use_graph:
136
128
  # create update graph
137
- wp.capture_begin()
138
-
139
- wp.sim.collide(self.model, self.state_0)
140
-
141
- for s in range(self.sim_substeps):
142
- self.state_0.clear_forces()
143
-
144
- self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
145
-
146
- # swap states
147
- (self.state_0, self.state_1) = (self.state_1, self.state_0)
148
-
149
- self.graph = wp.capture_end()
129
+ wp.capture_begin(self.device)
130
+ try:
131
+ self.update()
132
+ finally:
133
+ self.graph = wp.capture_end(self.device)
150
134
 
151
135
  def update(self):
152
- with self.simulate_timer:
153
- if self.sim_use_graph:
136
+ with wp.ScopedTimer("simulate", dict=self.profiler):
137
+ if self.sim_use_graph and self.graph:
154
138
  wp.capture_launch(self.graph)
139
+ self.sim_time += self.frame_dt
155
140
  else:
156
141
  wp.sim.collide(self.model, self.state_0)
157
142
 
158
- for s in range(self.sim_substeps):
143
+ for _ in range(self.sim_substeps):
159
144
  self.state_0.clear_forces()
160
145
 
161
146
  self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
162
147
 
148
+ if not wp.get_device().is_capturing:
149
+ self.sim_time += self.sim_dt
150
+
163
151
  # swap states
164
152
  (self.state_0, self.state_1) = (self.state_1, self.state_0)
165
153
 
@@ -171,19 +159,28 @@ class Example:
171
159
  self.renderer.render(self.state_0)
172
160
  self.renderer.end_frame()
173
161
 
174
- self.sim_time += 1.0 / self.sim_fps
175
-
176
162
 
177
163
  if __name__ == "__main__":
164
+ parser = argparse.ArgumentParser()
165
+ parser.add_argument(
166
+ "--integrator",
167
+ help="Type of integrator",
168
+ type=IntegratorType,
169
+ choices=list(IntegratorType),
170
+ default=IntegratorType.EULER,
171
+ )
172
+
173
+ args = parser.parse_args()
174
+
178
175
  stage_path = os.path.join(os.path.dirname(__file__), "outputs/example_sim_cloth.usd")
179
176
 
180
- example = Example(stage_path)
177
+ example = Example(stage_path, integrator=args.integrator)
181
178
 
182
179
  for i in range(example.sim_frames):
183
180
  example.update()
184
181
  example.render()
185
182
 
186
- frame_times = example.simulate_timer.dict["simulate"]
183
+ frame_times = example.profiler["simulate"]
187
184
  print("\nAverage frame sim time: {:.2f} ms".format(sum(frame_times) / len(frame_times)))
188
185
 
189
186
  example.renderer.save()
@@ -42,8 +42,14 @@ def step_kernel(x: wp.array(dtype=float), grad: wp.array(dtype=float), alpha: fl
42
42
  x[tid] = x[tid] - grad[tid] * alpha
43
43
 
44
44
 
45
- class Robot:
46
- def __init__(self, render=True, num_envs=1, device=None):
45
+ class Example:
46
+ def __init__(self, stage, device=None, verbose=False):
47
+ self.verbose = verbose
48
+
49
+ self.frame_dt = 1.0 / 60.0
50
+
51
+ self.render_time = 0.0
52
+
47
53
  builder = wp.sim.ModelBuilder()
48
54
 
49
55
  builder.add_articulation()
@@ -78,12 +84,12 @@ class Robot:
78
84
 
79
85
  if i == chain_length - 1:
80
86
  # create end effector
81
- s = builder.add_shape_sphere(pos=(0.0, 0.0, 0.0), radius=0.1, density=10.0, body=b)
87
+ builder.add_shape_sphere(pos=wp.vec3(0.0, 0.0, 0.0), radius=0.1, density=10.0, body=b)
82
88
 
83
89
  else:
84
90
  # create shape
85
- s = builder.add_shape_box(
86
- pos=(chain_width * 0.5, 0.0, 0.0), hx=chain_width * 0.5, hy=0.1, hz=0.1, density=10.0, body=b
91
+ builder.add_shape_box(
92
+ pos=wp.vec3(chain_width * 0.5, 0.0, 0.0), hx=chain_width * 0.5, hy=0.1, hz=0.1, density=10.0, body=b
87
93
  )
88
94
 
89
95
  self.device = wp.get_device(device)
@@ -94,16 +100,7 @@ class Robot:
94
100
 
95
101
  self.state = self.model.state()
96
102
 
97
- # -----------------------
98
- # set up Usd renderer
99
- self.renderer = wp.sim.render.SimRenderer(
100
- self.model, os.path.join(os.path.dirname(__file__), "outputs/example_sim_fk_grad.usd"), scaling=50.0
101
- )
102
-
103
- def run(self, render=True):
104
- render_time = 0.0
105
- train_iters = 1024
106
- train_rate = 0.01
103
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage, scaling=50.0)
107
104
 
108
105
  # optimization variables
109
106
  self.loss = wp.zeros(1, dtype=float, device=self.device)
@@ -112,44 +109,54 @@ class Robot:
112
109
  self.state.body_q.requires_grad = True
113
110
  self.loss.requires_grad = True
114
111
 
115
- for i in range(train_iters):
116
- tape = wp.Tape()
117
- with tape:
118
- wp.sim.eval_fk(self.model, self.model.joint_q, self.model.joint_qd, None, self.state)
119
-
120
- wp.launch(
121
- compute_loss,
122
- dim=1,
123
- inputs=[self.state.body_q, len(self.state.body_q) - 1, self.loss],
124
- device=self.device,
125
- )
112
+ self.train_rate = 0.01
126
113
 
127
- tape.backward(loss=self.loss)
114
+ def update(self):
115
+ tape = wp.Tape()
128
116
 
129
- print(self.loss)
130
- print(tape.gradients[self.model.joint_q])
117
+ with tape:
118
+ wp.sim.eval_fk(self.model, self.model.joint_q, self.model.joint_qd, None, self.state)
131
119
 
132
- # gradient descent
133
120
  wp.launch(
134
- step_kernel,
135
- dim=len(self.model.joint_q),
136
- inputs=[self.model.joint_q, tape.gradients[self.model.joint_q], train_rate],
121
+ compute_loss,
122
+ dim=1,
123
+ inputs=[self.state.body_q, len(self.state.body_q) - 1, self.loss],
137
124
  device=self.device,
138
125
  )
139
126
 
140
- # zero gradients
141
- tape.zero()
127
+ tape.backward(loss=self.loss)
128
+
129
+ if self.verbose:
130
+ print(self.loss)
131
+ print(tape.gradients[self.model.joint_q])
132
+
133
+ # gradient descent
134
+ wp.launch(
135
+ step_kernel,
136
+ dim=len(self.model.joint_q),
137
+ inputs=[self.model.joint_q, tape.gradients[self.model.joint_q], self.train_rate],
138
+ device=self.device,
139
+ )
140
+
141
+ # zero gradients
142
+ tape.zero()
143
+
144
+ def render(self):
145
+ self.renderer.begin_frame(self.render_time)
146
+ self.renderer.render(self.state)
147
+ self.renderer.render_sphere(name="target", pos=TARGET, rot=wp.quat_identity(), radius=0.1)
148
+ self.renderer.end_frame()
149
+ self.render_time += self.frame_dt
142
150
 
143
- # render
144
- self.renderer.begin_frame(render_time)
145
- self.renderer.render(self.state)
146
- self.renderer.render_sphere(name="target", pos=TARGET, rot=wp.quat_identity(), radius=0.1)
147
- self.renderer.end_frame()
148
151
 
149
- render_time += 1.0 / 60.0
152
+ if __name__ == "__main__":
153
+ stage_path = os.path.join(os.path.dirname(__file__), "outputs/example_sim_fk_grad.usd")
154
+ example = Example(stage_path, device=wp.get_preferred_device(), verbose=True)
150
155
 
151
- self.renderer.save()
156
+ train_iters = 512
152
157
 
158
+ for _ in range(train_iters):
159
+ example.update()
160
+ example.render()
153
161
 
154
- robot = Robot(render=True, device=wp.get_preferred_device(), num_envs=1)
155
- robot.run()
162
+ example.renderer.save()
@@ -17,14 +17,12 @@
17
17
  import os
18
18
 
19
19
  import numpy as np
20
-
21
20
  import torch
22
21
 
23
22
  import warp as wp
24
23
  import warp.sim
25
24
  import warp.sim.render
26
25
 
27
-
28
26
  wp.init()
29
27
 
30
28
 
@@ -68,8 +66,14 @@ class ForwardKinematics(torch.autograd.Function):
68
66
  return (wp.to_torch(ctx.tape.gradients[ctx.joint_q]), wp.to_torch(ctx.tape.gradients[ctx.joint_qd]), None)
69
67
 
70
68
 
71
- class Robot:
72
- def __init__(self, render=True, num_envs=1, device=None):
69
+ class Example:
70
+ def __init__(self, stage, device=None, verbose=False):
71
+ self.verbose = verbose
72
+
73
+ self.frame_dt = 1.0 / 60.0
74
+
75
+ self.render_time = 0.0
76
+
73
77
  builder = wp.sim.ModelBuilder()
74
78
 
75
79
  builder.add_articulation()
@@ -91,7 +95,7 @@ class Robot:
91
95
  builder.add_joint_revolute(
92
96
  parent=parent,
93
97
  child=b,
94
- axis=(0.0, 0.0, 1.0),
98
+ axis=wp.vec3(0.0, 0.0, 1.0),
95
99
  parent_xform=parent_joint_xform,
96
100
  child_xform=wp.transform_identity(),
97
101
  limit_lower=-np.deg2rad(60.0),
@@ -104,12 +108,12 @@ class Robot:
104
108
 
105
109
  if i == chain_length - 1:
106
110
  # create end effector
107
- s = builder.add_shape_sphere(pos=(0.0, 0.0, 0.0), radius=0.1, density=10.0, body=b)
111
+ builder.add_shape_sphere(pos=wp.vec3(0.0, 0.0, 0.0), radius=0.1, density=10.0, body=b)
108
112
 
109
113
  else:
110
114
  # create shape
111
- s = builder.add_shape_box(
112
- pos=(chain_width * 0.5, 0.0, 0.0), hx=chain_width * 0.5, hy=0.1, hz=0.1, density=10.0, body=b
115
+ builder.add_shape_box(
116
+ pos=wp.vec3(chain_width * 0.5, 0.0, 0.0), hx=chain_width * 0.5, hy=0.1, hz=0.1, density=10.0, body=b
113
117
  )
114
118
 
115
119
  # finalize model
@@ -118,50 +122,53 @@ class Robot:
118
122
 
119
123
  self.torch_device = wp.device_to_torch(self.model.device)
120
124
 
121
- # -----------------------
122
- # set up Usd renderer
123
- self.renderer = wp.sim.render.SimRenderer(
124
- self.model, os.path.join(os.path.dirname(__file__), "outputs/example_sim_fk_grad.usd"), scaling=50.0
125
- )
125
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage, scaling=50.0)
126
126
 
127
- def run(self, render=True):
128
- render_time = 0.0
129
- train_iters = 1024
130
- train_rate = 0.01
127
+ self.target = torch.from_numpy(np.array((2.0, 1.0, 0.0))).to(self.torch_device)
131
128
 
132
- target = torch.from_numpy(np.array((2.0, 1.0, 0.0))).to(self.torch_device)
129
+ self.body_q = None
130
+ self.body_qd = None
133
131
 
134
132
  # optimization variable
135
- joint_q = torch.zeros(len(self.model.joint_q), requires_grad=True, device=self.torch_device)
136
- joint_qd = torch.zeros(len(self.model.joint_qd), requires_grad=True, device=self.torch_device)
133
+ self.joint_q = torch.zeros(len(self.model.joint_q), requires_grad=True, device=self.torch_device)
134
+ self.joint_qd = torch.zeros(len(self.model.joint_qd), requires_grad=True, device=self.torch_device)
135
+
136
+ self.train_rate = 0.01
137
137
 
138
- for i in range(train_iters):
139
- (body_q, body_qd) = ForwardKinematics.apply(joint_q, joint_qd, self.model)
138
+ def update(self):
139
+ (self.body_q, self.body_qd) = ForwardKinematics.apply(self.joint_q, self.joint_qd, self.model)
140
140
 
141
- l = torch.norm(body_q[self.model.body_count - 1][0:3] - target) ** 2.0
142
- l.backward()
141
+ l = torch.norm(self.body_q[self.model.body_count - 1][0:3] - self.target) ** 2.0
142
+ l.backward()
143
143
 
144
+ if self.verbose:
144
145
  print(l)
145
- print(joint_q.grad)
146
+ print(self.joint_q.grad)
147
+
148
+ with torch.no_grad():
149
+ self.joint_q -= self.joint_q.grad * self.train_rate
150
+ self.joint_q.grad.zero_()
146
151
 
147
- with torch.no_grad():
148
- joint_q -= joint_q.grad * train_rate
149
- joint_q.grad.zero_()
152
+ def render(self):
153
+ s = self.model.state()
154
+ s.body_q = wp.from_torch(self.body_q, dtype=wp.transform, requires_grad=False)
155
+ s.body_qd = wp.from_torch(self.body_qd, dtype=wp.spatial_vector, requires_grad=False)
150
156
 
151
- # render
152
- s = self.model.state()
153
- s.body_q = wp.from_torch(body_q, dtype=wp.transform)
154
- s.body_qd = wp.from_torch(body_qd, dtype=wp.spatial_vector)
157
+ self.renderer.begin_frame(self.render_time)
158
+ self.renderer.render(s)
159
+ self.renderer.render_sphere(name="target", pos=self.target, rot=wp.quat_identity(), radius=0.1)
160
+ self.renderer.end_frame()
161
+ self.render_time += self.frame_dt
155
162
 
156
- self.renderer.begin_frame(render_time)
157
- self.renderer.render(s)
158
- self.renderer.render_sphere(name="target", pos=target, rot=wp.quat_identity(), radius=0.1)
159
- self.renderer.end_frame()
160
163
 
161
- render_time += 1.0 / 60.0
164
+ if __name__ == "__main__":
165
+ stage_path = os.path.join(os.path.dirname(__file__), "outputs/example_sim_fk_grad.usd")
166
+ example = Example(stage_path, device=wp.get_preferred_device(), verbose=True)
162
167
 
163
- self.renderer.save()
168
+ train_iters = 512
164
169
 
170
+ for _ in range(train_iters):
171
+ example.update()
172
+ example.render()
165
173
 
166
- robot = Robot(render=True, device="cuda", num_envs=1)
167
- robot.run()
174
+ example.renderer.save()