warp-lang 0.11.0__py3-none-manylinux2014_x86_64.whl → 1.0.0__py3-none-manylinux2014_x86_64.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 (170) hide show
  1. warp/__init__.py +8 -0
  2. warp/bin/warp-clang.so +0 -0
  3. warp/bin/warp.so +0 -0
  4. warp/build.py +7 -6
  5. warp/build_dll.py +70 -79
  6. warp/builtins.py +10 -6
  7. warp/codegen.py +51 -19
  8. warp/config.py +7 -8
  9. warp/constants.py +3 -0
  10. warp/context.py +948 -245
  11. warp/dlpack.py +198 -113
  12. warp/examples/assets/bunny.usd +0 -0
  13. warp/examples/assets/cartpole.urdf +110 -0
  14. warp/examples/assets/crazyflie.usd +0 -0
  15. warp/examples/assets/cube.usda +42 -0
  16. warp/examples/assets/nv_ant.xml +92 -0
  17. warp/examples/assets/nv_humanoid.xml +183 -0
  18. warp/examples/assets/quadruped.urdf +268 -0
  19. warp/examples/assets/rocks.nvdb +0 -0
  20. warp/examples/assets/rocks.usd +0 -0
  21. warp/examples/assets/sphere.usda +56 -0
  22. warp/examples/assets/torus.usda +105 -0
  23. warp/examples/benchmarks/benchmark_api.py +383 -0
  24. warp/examples/benchmarks/benchmark_cloth.py +279 -0
  25. warp/examples/benchmarks/benchmark_cloth_cupy.py +88 -0
  26. warp/examples/benchmarks/benchmark_cloth_jax.py +100 -0
  27. warp/examples/benchmarks/benchmark_cloth_numba.py +142 -0
  28. warp/examples/benchmarks/benchmark_cloth_numpy.py +77 -0
  29. warp/examples/benchmarks/benchmark_cloth_pytorch.py +86 -0
  30. warp/examples/benchmarks/benchmark_cloth_taichi.py +112 -0
  31. warp/examples/benchmarks/benchmark_cloth_warp.py +146 -0
  32. warp/examples/benchmarks/benchmark_launches.py +295 -0
  33. warp/examples/core/example_dem.py +221 -0
  34. warp/examples/core/example_fluid.py +267 -0
  35. warp/examples/core/example_graph_capture.py +129 -0
  36. warp/examples/core/example_marching_cubes.py +177 -0
  37. warp/examples/core/example_mesh.py +154 -0
  38. warp/examples/core/example_mesh_intersect.py +193 -0
  39. warp/examples/core/example_nvdb.py +169 -0
  40. warp/examples/core/example_raycast.py +89 -0
  41. warp/examples/core/example_raymarch.py +178 -0
  42. warp/examples/core/example_render_opengl.py +141 -0
  43. warp/examples/core/example_sph.py +389 -0
  44. warp/examples/core/example_torch.py +181 -0
  45. warp/examples/core/example_wave.py +249 -0
  46. warp/examples/fem/bsr_utils.py +380 -0
  47. warp/examples/fem/example_apic_fluid.py +391 -0
  48. warp/examples/fem/example_convection_diffusion.py +168 -0
  49. warp/examples/fem/example_convection_diffusion_dg.py +209 -0
  50. warp/examples/fem/example_convection_diffusion_dg0.py +194 -0
  51. warp/examples/fem/example_deformed_geometry.py +159 -0
  52. warp/examples/fem/example_diffusion.py +173 -0
  53. warp/examples/fem/example_diffusion_3d.py +152 -0
  54. warp/examples/fem/example_diffusion_mgpu.py +214 -0
  55. warp/examples/fem/example_mixed_elasticity.py +222 -0
  56. warp/examples/fem/example_navier_stokes.py +243 -0
  57. warp/examples/fem/example_stokes.py +192 -0
  58. warp/examples/fem/example_stokes_transfer.py +249 -0
  59. warp/examples/fem/mesh_utils.py +109 -0
  60. warp/examples/fem/plot_utils.py +287 -0
  61. warp/examples/optim/example_bounce.py +248 -0
  62. warp/examples/optim/example_cloth_throw.py +210 -0
  63. warp/examples/optim/example_diffray.py +535 -0
  64. warp/examples/optim/example_drone.py +850 -0
  65. warp/examples/optim/example_inverse_kinematics.py +169 -0
  66. warp/examples/optim/example_inverse_kinematics_torch.py +170 -0
  67. warp/examples/optim/example_spring_cage.py +234 -0
  68. warp/examples/optim/example_trajectory.py +201 -0
  69. warp/examples/sim/example_cartpole.py +128 -0
  70. warp/examples/sim/example_cloth.py +184 -0
  71. warp/examples/sim/example_granular.py +113 -0
  72. warp/examples/sim/example_granular_collision_sdf.py +185 -0
  73. warp/examples/sim/example_jacobian_ik.py +213 -0
  74. warp/examples/sim/example_particle_chain.py +106 -0
  75. warp/examples/sim/example_quadruped.py +179 -0
  76. warp/examples/sim/example_rigid_chain.py +191 -0
  77. warp/examples/sim/example_rigid_contact.py +176 -0
  78. warp/examples/sim/example_rigid_force.py +126 -0
  79. warp/examples/sim/example_rigid_gyroscopic.py +97 -0
  80. warp/examples/sim/example_rigid_soft_contact.py +124 -0
  81. warp/examples/sim/example_soft_body.py +178 -0
  82. warp/fabric.py +29 -20
  83. warp/fem/cache.py +0 -1
  84. warp/fem/dirichlet.py +0 -2
  85. warp/fem/integrate.py +0 -1
  86. warp/jax.py +45 -0
  87. warp/jax_experimental.py +339 -0
  88. warp/native/builtin.h +12 -0
  89. warp/native/bvh.cu +18 -18
  90. warp/native/clang/clang.cpp +8 -3
  91. warp/native/cuda_util.cpp +94 -5
  92. warp/native/cuda_util.h +35 -6
  93. warp/native/cutlass_gemm.cpp +1 -1
  94. warp/native/cutlass_gemm.cu +4 -1
  95. warp/native/error.cpp +66 -0
  96. warp/native/error.h +27 -0
  97. warp/native/mesh.cu +2 -2
  98. warp/native/reduce.cu +4 -4
  99. warp/native/runlength_encode.cu +2 -2
  100. warp/native/scan.cu +2 -2
  101. warp/native/sparse.cu +0 -1
  102. warp/native/temp_buffer.h +2 -2
  103. warp/native/warp.cpp +95 -60
  104. warp/native/warp.cu +1053 -218
  105. warp/native/warp.h +49 -32
  106. warp/optim/linear.py +33 -16
  107. warp/render/render_opengl.py +202 -101
  108. warp/render/render_usd.py +82 -40
  109. warp/sim/__init__.py +13 -4
  110. warp/sim/articulation.py +4 -5
  111. warp/sim/collide.py +320 -175
  112. warp/sim/import_mjcf.py +25 -30
  113. warp/sim/import_urdf.py +94 -63
  114. warp/sim/import_usd.py +51 -36
  115. warp/sim/inertia.py +3 -2
  116. warp/sim/integrator.py +233 -0
  117. warp/sim/integrator_euler.py +447 -469
  118. warp/sim/integrator_featherstone.py +1991 -0
  119. warp/sim/integrator_xpbd.py +1420 -640
  120. warp/sim/model.py +765 -487
  121. warp/sim/particles.py +2 -1
  122. warp/sim/render.py +35 -13
  123. warp/sim/utils.py +222 -11
  124. warp/stubs.py +8 -0
  125. warp/tape.py +16 -1
  126. warp/tests/aux_test_grad_customs.py +23 -0
  127. warp/tests/test_array.py +190 -1
  128. warp/tests/test_async.py +656 -0
  129. warp/tests/test_bool.py +50 -0
  130. warp/tests/test_dlpack.py +164 -11
  131. warp/tests/test_examples.py +166 -74
  132. warp/tests/test_fem.py +8 -1
  133. warp/tests/test_generics.py +15 -5
  134. warp/tests/test_grad.py +1 -1
  135. warp/tests/test_grad_customs.py +172 -12
  136. warp/tests/test_jax.py +254 -0
  137. warp/tests/test_large.py +29 -6
  138. warp/tests/test_launch.py +25 -0
  139. warp/tests/test_linear_solvers.py +20 -3
  140. warp/tests/test_matmul.py +61 -16
  141. warp/tests/test_matmul_lite.py +13 -13
  142. warp/tests/test_mempool.py +186 -0
  143. warp/tests/test_multigpu.py +3 -0
  144. warp/tests/test_options.py +16 -2
  145. warp/tests/test_peer.py +137 -0
  146. warp/tests/test_print.py +3 -1
  147. warp/tests/test_quat.py +23 -0
  148. warp/tests/test_sim_kinematics.py +97 -0
  149. warp/tests/test_snippet.py +126 -3
  150. warp/tests/test_streams.py +108 -79
  151. warp/tests/test_torch.py +16 -8
  152. warp/tests/test_utils.py +32 -27
  153. warp/tests/test_verify_fp.py +65 -0
  154. warp/tests/test_volume.py +1 -1
  155. warp/tests/unittest_serial.py +2 -0
  156. warp/tests/unittest_suites.py +12 -0
  157. warp/tests/unittest_utils.py +14 -7
  158. warp/thirdparty/unittest_parallel.py +15 -3
  159. warp/torch.py +10 -8
  160. warp/types.py +363 -246
  161. warp/utils.py +143 -19
  162. warp_lang-1.0.0.dist-info/LICENSE.md +126 -0
  163. warp_lang-1.0.0.dist-info/METADATA +394 -0
  164. {warp_lang-0.11.0.dist-info → warp_lang-1.0.0.dist-info}/RECORD +167 -86
  165. warp/sim/optimizer.py +0 -138
  166. warp_lang-0.11.0.dist-info/LICENSE.md +0 -36
  167. warp_lang-0.11.0.dist-info/METADATA +0 -238
  168. /warp/tests/{walkthough_debug.py → walkthrough_debug.py} +0 -0
  169. {warp_lang-0.11.0.dist-info → warp_lang-1.0.0.dist-info}/WHEEL +0 -0
  170. {warp_lang-0.11.0.dist-info → warp_lang-1.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,191 @@
1
+ # Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
2
+ # NVIDIA CORPORATION and its licensors retain all intellectual property
3
+ # and proprietary rights in and to this software, related documentation
4
+ # and any modifications thereto. Any use, reproduction, disclosure or
5
+ # distribution of this software and related documentation without an express
6
+ # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
+
8
+ ###########################################################################
9
+ # Example Sim Rigid Chain
10
+ #
11
+ # Shows how to set up a chain of rigid bodies connected by different joint
12
+ # types using wp.sim.ModelBuilder(). There is one chain for each joint
13
+ # type, including fixed joints which act as a flexible beam.
14
+ #
15
+ ###########################################################################
16
+
17
+ import os
18
+
19
+ import numpy as np
20
+
21
+ import warp as wp
22
+ import warp.sim
23
+ import warp.sim.render
24
+
25
+ wp.init()
26
+
27
+
28
+ class Example:
29
+ def __init__(self, stage):
30
+ self.chain_length = 8
31
+ self.chain_width = 1.0
32
+ self.chain_types = [
33
+ wp.sim.JOINT_REVOLUTE,
34
+ wp.sim.JOINT_FIXED,
35
+ wp.sim.JOINT_BALL,
36
+ wp.sim.JOINT_UNIVERSAL,
37
+ wp.sim.JOINT_COMPOUND,
38
+ ]
39
+
40
+ builder = wp.sim.ModelBuilder()
41
+
42
+ self.sim_time = 0.0
43
+ self.frame_dt = 1.0 / 100.0
44
+
45
+ episode_duration = 5.0 # seconds
46
+ self.episode_frames = int(episode_duration / self.frame_dt)
47
+
48
+ self.sim_substeps = 10
49
+ self.sim_dt = self.frame_dt / self.sim_substeps
50
+
51
+ for c, t in enumerate(self.chain_types):
52
+ # start a new articulation
53
+ builder.add_articulation()
54
+
55
+ for i in range(self.chain_length):
56
+ if i == 0:
57
+ parent = -1
58
+ parent_joint_xform = wp.transform([0.0, 0.0, c * 1.0], wp.quat_identity())
59
+ else:
60
+ parent = builder.joint_count - 1
61
+ parent_joint_xform = wp.transform([self.chain_width, 0.0, 0.0], wp.quat_identity())
62
+
63
+ # create body
64
+ b = builder.add_body(origin=wp.transform([i, 0.0, c * 1.0], wp.quat_identity()), armature=0.1)
65
+
66
+ # create shape
67
+ builder.add_shape_box(
68
+ pos=wp.vec3(self.chain_width * 0.5, 0.0, 0.0),
69
+ hx=self.chain_width * 0.5,
70
+ hy=0.1,
71
+ hz=0.1,
72
+ density=10.0,
73
+ body=b,
74
+ )
75
+
76
+ joint_type = t
77
+
78
+ if joint_type == wp.sim.JOINT_REVOLUTE:
79
+ joint_limit_lower = -np.deg2rad(60.0)
80
+ joint_limit_upper = np.deg2rad(60.0)
81
+ builder.add_joint_revolute(
82
+ parent=parent,
83
+ child=b,
84
+ axis=(0.0, 0.0, 1.0),
85
+ parent_xform=parent_joint_xform,
86
+ child_xform=wp.transform_identity(),
87
+ limit_lower=joint_limit_lower,
88
+ limit_upper=joint_limit_upper,
89
+ target_ke=0.0,
90
+ target_kd=0.0,
91
+ limit_ke=1e5,
92
+ limit_kd=1.0,
93
+ )
94
+
95
+ elif joint_type == wp.sim.JOINT_UNIVERSAL:
96
+ builder.add_joint_universal(
97
+ parent=parent,
98
+ child=b,
99
+ axis_0=wp.sim.JointAxis((1.0, 0.0, 0.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
100
+ axis_1=wp.sim.JointAxis((0.0, 0.0, 1.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
101
+ parent_xform=parent_joint_xform,
102
+ child_xform=wp.transform_identity(),
103
+ )
104
+
105
+ elif joint_type == wp.sim.JOINT_BALL:
106
+ builder.add_joint_ball(
107
+ parent=parent,
108
+ child=b,
109
+ parent_xform=parent_joint_xform,
110
+ child_xform=wp.transform_identity(),
111
+ )
112
+
113
+ elif joint_type == wp.sim.JOINT_FIXED:
114
+ builder.add_joint_fixed(
115
+ parent=parent,
116
+ child=b,
117
+ parent_xform=parent_joint_xform,
118
+ child_xform=wp.transform_identity(),
119
+ )
120
+
121
+ elif joint_type == wp.sim.JOINT_COMPOUND:
122
+ builder.add_joint_compound(
123
+ parent=parent,
124
+ child=b,
125
+ axis_0=wp.sim.JointAxis((1.0, 0.0, 0.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
126
+ axis_1=wp.sim.JointAxis((0.0, 1.0, 0.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
127
+ axis_2=wp.sim.JointAxis((0.0, 0.0, 1.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
128
+ parent_xform=parent_joint_xform,
129
+ child_xform=wp.transform_identity(),
130
+ )
131
+
132
+ self.model = builder.finalize()
133
+ self.model.ground = False
134
+
135
+ self.integrator = wp.sim.FeatherstoneIntegrator(self.model)
136
+
137
+ self.renderer = None
138
+ if stage:
139
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage, scaling=20.0)
140
+
141
+ self.state_0 = self.model.state()
142
+ self.state_1 = self.model.state()
143
+
144
+ wp.sim.eval_fk(self.model, self.model.joint_q, self.model.joint_qd, None, self.state_0)
145
+
146
+ self.use_graph = wp.get_device().is_cuda
147
+ if self.use_graph:
148
+ with wp.ScopedCapture() as capture:
149
+ self.simulate()
150
+ self.graph = capture.graph
151
+
152
+ def simulate(self):
153
+ for _ in range(self.sim_substeps):
154
+ self.state_0.clear_forces()
155
+ self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
156
+ self.state_0, self.state_1 = self.state_1, self.state_0
157
+
158
+ def step(self):
159
+ with wp.ScopedTimer("step", active=True):
160
+ if self.use_graph:
161
+ wp.capture_launch(self.graph)
162
+ else:
163
+ self.simulate()
164
+ self.sim_time += self.frame_dt
165
+
166
+ def render(self):
167
+ if self.renderer is None:
168
+ return
169
+
170
+ if self.renderer is None:
171
+ return
172
+
173
+ with wp.ScopedTimer("render", active=True):
174
+ self.renderer.begin_frame(self.sim_time)
175
+ self.renderer.render(self.state_0)
176
+ self.renderer.end_frame()
177
+
178
+
179
+ if __name__ == "__main__":
180
+ stage = os.path.join(os.path.dirname(__file__), "example_rigid_chain.usd")
181
+
182
+ example = Example(stage)
183
+
184
+ for _ in range(example.episode_frames):
185
+ example.step()
186
+ example.render()
187
+
188
+ if example.renderer:
189
+ example.renderer.save()
190
+ if example.renderer:
191
+ example.renderer.save()
@@ -0,0 +1,176 @@
1
+ # Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
2
+ # NVIDIA CORPORATION and its licensors retain all intellectual property
3
+ # and proprietary rights in and to this software, related documentation
4
+ # and any modifications thereto. Any use, reproduction, disclosure or
5
+ # distribution of this software and related documentation without an express
6
+ # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
+
8
+ ###########################################################################
9
+ # Example Sim Rigid Contact
10
+ #
11
+ # Shows how to set up free rigid bodies with different shape types falling
12
+ # and colliding against each other and the ground using wp.sim.ModelBuilder().
13
+ #
14
+ ###########################################################################
15
+
16
+ import math
17
+ import os
18
+
19
+ import numpy as np
20
+ from pxr import Usd, UsdGeom
21
+
22
+ import warp as wp
23
+ import warp.sim
24
+ import warp.sim.render
25
+
26
+ wp.init()
27
+
28
+
29
+ class Example:
30
+ def __init__(self, stage):
31
+ builder = wp.sim.ModelBuilder()
32
+
33
+ self.sim_time = 0.0
34
+ self.frame_dt = 1.0 / 60.0
35
+
36
+ episode_duration = 20.0 # seconds
37
+ self.episode_frames = int(episode_duration / self.frame_dt)
38
+
39
+ self.sim_substeps = 10
40
+ self.sim_dt = self.frame_dt / self.sim_substeps
41
+
42
+ self.num_bodies = 8
43
+ self.scale = 0.8
44
+ self.ke = 1.0e5
45
+ self.kd = 250.0
46
+ self.kf = 500.0
47
+
48
+ # boxes
49
+ for i in range(self.num_bodies):
50
+ b = builder.add_body(origin=wp.transform((i, 1.0, 0.0), wp.quat_identity()))
51
+
52
+ builder.add_shape_box(
53
+ pos=wp.vec3(0.0, 0.0, 0.0),
54
+ hx=0.5 * self.scale,
55
+ hy=0.2 * self.scale,
56
+ hz=0.2 * self.scale,
57
+ body=i,
58
+ ke=self.ke,
59
+ kd=self.kd,
60
+ kf=self.kf,
61
+ )
62
+
63
+ # spheres
64
+ for i in range(self.num_bodies):
65
+ b = builder.add_body(origin=wp.transform((i, 1.0, 2.0), wp.quat_identity()))
66
+
67
+ builder.add_shape_sphere(
68
+ 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
69
+ )
70
+
71
+ # capsules
72
+ for i in range(self.num_bodies):
73
+ b = builder.add_body(origin=wp.transform((i, 1.0, 6.0), wp.quat_identity()))
74
+
75
+ builder.add_shape_capsule(
76
+ pos=wp.vec3(0.0, 0.0, 0.0),
77
+ radius=0.25 * self.scale,
78
+ half_height=self.scale * 0.5,
79
+ up_axis=0,
80
+ body=b,
81
+ ke=self.ke,
82
+ kd=self.kd,
83
+ kf=self.kf,
84
+ )
85
+
86
+ # initial spin
87
+ for i in range(len(builder.body_qd)):
88
+ builder.body_qd[i] = (0.0, 2.0, 10.0, 0.0, 0.0, 0.0)
89
+
90
+ # meshes
91
+ bunny = self.load_mesh(os.path.join(os.path.dirname(__file__), "../assets/bunny.usd"), "/bunny/bunny")
92
+ for i in range(self.num_bodies):
93
+ b = builder.add_body(
94
+ origin=wp.transform(
95
+ (i * 0.5 * self.scale, 1.0 + i * 1.7 * self.scale, 4.0 + i * 0.5 * self.scale),
96
+ wp.quat_from_axis_angle(wp.vec3(0.0, 1.0, 0.0), math.pi * 0.1 * i),
97
+ )
98
+ )
99
+
100
+ builder.add_shape_mesh(
101
+ body=b,
102
+ mesh=bunny,
103
+ pos=wp.vec3(0.0, 0.0, 0.0),
104
+ scale=wp.vec3(self.scale, self.scale, self.scale),
105
+ ke=self.ke,
106
+ kd=self.kd,
107
+ kf=self.kf,
108
+ density=1e3,
109
+ )
110
+
111
+ # finalize model
112
+ self.model = builder.finalize()
113
+ self.model.ground = True
114
+
115
+ self.integrator = wp.sim.SemiImplicitIntegrator()
116
+
117
+ self.renderer = None
118
+ if stage:
119
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage, scaling=0.5)
120
+
121
+ self.state_0 = self.model.state()
122
+ self.state_1 = self.model.state()
123
+
124
+ wp.sim.eval_fk(self.model, self.model.joint_q, self.model.joint_qd, None, self.state_0)
125
+
126
+ self.use_graph = wp.get_device().is_cuda
127
+ if self.use_graph:
128
+ with wp.ScopedCapture() as capture:
129
+ self.simulate()
130
+ self.graph = capture.graph
131
+
132
+ def load_mesh(self, filename, path):
133
+ asset_stage = Usd.Stage.Open(filename)
134
+ mesh_geom = UsdGeom.Mesh(asset_stage.GetPrimAtPath(path))
135
+
136
+ points = np.array(mesh_geom.GetPointsAttr().Get())
137
+ indices = np.array(mesh_geom.GetFaceVertexIndicesAttr().Get()).flatten()
138
+
139
+ return wp.sim.Mesh(points, indices)
140
+
141
+ def simulate(self):
142
+ for _ in range(self.sim_substeps):
143
+ self.state_0.clear_forces()
144
+ wp.sim.collide(self.model, self.state_0)
145
+ self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
146
+ self.state_0, self.state_1 = self.state_1, self.state_0
147
+
148
+ def step(self):
149
+ with wp.ScopedTimer("step", active=True):
150
+ if self.use_graph:
151
+ wp.capture_launch(self.graph)
152
+ else:
153
+ self.simulate()
154
+ self.sim_time += self.frame_dt
155
+
156
+ def render(self):
157
+ if self.renderer is None:
158
+ return
159
+
160
+ with wp.ScopedTimer("render", active=True):
161
+ self.renderer.begin_frame(self.sim_time)
162
+ self.renderer.render(self.state_0)
163
+ self.renderer.end_frame()
164
+
165
+
166
+ if __name__ == "__main__":
167
+ stage = os.path.join(os.path.dirname(__file__), "example_rigid_contact.usd")
168
+
169
+ example = Example(stage)
170
+
171
+ for _ in range(example.episode_frames):
172
+ example.step()
173
+ example.render()
174
+
175
+ if example.renderer:
176
+ example.renderer.save()
@@ -0,0 +1,126 @@
1
+ # Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
2
+ # NVIDIA CORPORATION and its licensors retain all intellectual property
3
+ # and proprietary rights in and to this software, related documentation
4
+ # and any modifications thereto. Any use, reproduction, disclosure or
5
+ # distribution of this software and related documentation without an express
6
+ # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
+
8
+ ###########################################################################
9
+ # Example Sim Rigid Force
10
+ #
11
+ # Shows how to apply an external force (torque) to a rigid body causing
12
+ # it to roll.
13
+ #
14
+ ###########################################################################
15
+
16
+ import os
17
+ import argparse
18
+
19
+ import warp as wp
20
+ import warp.sim
21
+ import warp.sim.render
22
+
23
+ wp.init()
24
+
25
+
26
+ class Example:
27
+ parser = argparse.ArgumentParser()
28
+ parser.add_argument("--opengl", action="store_true")
29
+
30
+ def __init__(self, stage=None, args=None, **kwargs):
31
+ if args is None:
32
+ # Read args from kwargs, add default arg values from parser
33
+ args = argparse.Namespace(**kwargs)
34
+ args = Example.parser.parse_args(args=[], namespace=args)
35
+ self._args = args
36
+
37
+ self.sim_fps = 60.0
38
+ self.sim_substeps = 5
39
+ self.sim_duration = 5.0
40
+ self.frame_dt = 1.0 / self.sim_fps
41
+ self.sim_frames = int(self.sim_duration * self.sim_fps)
42
+ self.sim_dt = (1.0 / self.sim_fps) / self.sim_substeps
43
+ self.sim_time = 0.0
44
+
45
+ builder = wp.sim.ModelBuilder()
46
+
47
+ b = builder.add_body(origin=wp.transform((0.0, 10.0, 0.0), wp.quat_identity()))
48
+ builder.add_shape_box(body=b, hx=1.0, hy=1.0, hz=1.0, density=100.0)
49
+
50
+ self.model = builder.finalize()
51
+ self.model.ground = True
52
+
53
+ self.integrator = wp.sim.XPBDIntegrator()
54
+
55
+ self.state_0 = self.model.state()
56
+ self.state_1 = self.model.state()
57
+
58
+ self.renderer = None
59
+ if args.opengl:
60
+ self.renderer = wp.sim.render.SimRendererOpenGL(self.model, stage)
61
+ else:
62
+ if stage:
63
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage)
64
+
65
+ self.use_graph = wp.get_device().is_cuda
66
+ if self.use_graph:
67
+ with wp.ScopedCapture() as capture:
68
+ self.simulate()
69
+ self.graph = capture.graph
70
+
71
+ def simulate(self):
72
+ for _ in range(self.sim_substeps):
73
+ wp.sim.collide(self.model, self.state_0)
74
+
75
+ self.state_0.clear_forces()
76
+ self.state_1.clear_forces()
77
+
78
+ self.state_0.body_f.assign(
79
+ [
80
+ [0.0, 0.0, -7000.0, 0.0, 0.0, 0.0],
81
+ ]
82
+ )
83
+
84
+ self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
85
+
86
+ # swap states
87
+ (self.state_0, self.state_1) = (self.state_1, self.state_0)
88
+
89
+ def step(self):
90
+ with wp.ScopedTimer("step"):
91
+ if self.use_graph:
92
+ wp.capture_launch(self.graph)
93
+ else:
94
+ self.simulate()
95
+ self.sim_time += self.frame_dt
96
+
97
+ def render(self):
98
+ if self.renderer is None:
99
+ return
100
+
101
+ with wp.ScopedTimer("render"):
102
+ self.renderer.begin_frame(self.sim_time)
103
+ self.renderer.render(self.state_0)
104
+ self.renderer.end_frame()
105
+
106
+
107
+ if __name__ == "__main__":
108
+ stage_path = os.path.join(os.path.dirname(__file__), "example_rigid_force.usd")
109
+
110
+ args = Example.parser.parse_args()
111
+
112
+ example = Example(stage_path, args=args)
113
+
114
+ if args.opengl:
115
+ while example.renderer.is_running():
116
+ example.step()
117
+ example.render()
118
+ else:
119
+ for i in range(example.sim_frames):
120
+ example.step()
121
+ example.render()
122
+
123
+ if example.renderer:
124
+ example.renderer.save()
125
+
126
+ example.renderer = None
@@ -0,0 +1,97 @@
1
+ # Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
2
+ # NVIDIA CORPORATION and its licensors retain all intellectual property
3
+ # and proprietary rights in and to this software, related documentation
4
+ # and any modifications thereto. Any use, reproduction, disclosure or
5
+ # distribution of this software and related documentation without an express
6
+ # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
+
8
+ ###########################################################################
9
+ # Example Sim Rigid Gyroscopic
10
+ #
11
+ # Demonstrates the Dzhanibekov effect where rigid bodies will tumble in
12
+ # free space due to unstable axes of rotation.
13
+ #
14
+ ###########################################################################
15
+
16
+ import os
17
+
18
+ import warp as wp
19
+ import warp.sim
20
+ import warp.sim.render
21
+
22
+ wp.init()
23
+
24
+
25
+ class Example:
26
+ def __init__(self, stage):
27
+ self.sim_steps = 2000
28
+ self.sim_dt = 1.0 / 120.0
29
+ self.sim_time = 0.0
30
+
31
+ self.scale = 0.5
32
+
33
+ builder = wp.sim.ModelBuilder()
34
+
35
+ b = builder.add_body()
36
+
37
+ # axis shape
38
+ builder.add_shape_box(
39
+ pos=wp.vec3(0.3 * self.scale, 0.0, 0.0),
40
+ hx=0.25 * self.scale,
41
+ hy=0.1 * self.scale,
42
+ hz=0.1 * self.scale,
43
+ density=100.0,
44
+ body=b,
45
+ )
46
+
47
+ # tip shape
48
+ builder.add_shape_box(
49
+ pos=wp.vec3(0.0, 0.0, 0.0),
50
+ hx=0.05 * self.scale,
51
+ hy=0.2 * self.scale,
52
+ hz=1.0 * self.scale,
53
+ density=100.0,
54
+ body=b,
55
+ )
56
+
57
+ # initial spin
58
+ builder.body_qd[0] = (25.0, 0.01, 0.01, 0.0, 0.0, 0.0)
59
+
60
+ builder.gravity = 0.0
61
+ self.model = builder.finalize()
62
+ self.model.ground = False
63
+
64
+ self.integrator = wp.sim.SemiImplicitIntegrator()
65
+ self.state = self.model.state()
66
+
67
+ self.renderer = None
68
+ if stage:
69
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage, scaling=100.0)
70
+
71
+ def step(self):
72
+ with wp.ScopedTimer("step", active=True):
73
+ self.state.clear_forces()
74
+ self.state = self.integrator.simulate(self.model, self.state, self.state, self.sim_dt)
75
+ self.sim_time += self.sim_dt
76
+
77
+ def render(self):
78
+ if self.renderer is None:
79
+ return
80
+
81
+ with wp.ScopedTimer("render", active=True):
82
+ self.renderer.begin_frame(self.sim_time)
83
+ self.renderer.render(self.state)
84
+ self.renderer.end_frame()
85
+
86
+
87
+ if __name__ == "__main__":
88
+ stage_path = os.path.join(os.path.dirname(__file__), "example_rigid_gyroscopic.usd")
89
+
90
+ example = Example(stage_path)
91
+
92
+ for i in range(example.sim_steps):
93
+ example.step()
94
+ example.render()
95
+
96
+ if example.renderer:
97
+ example.renderer.save()