warp-lang 1.9.1__py3-none-manylinux_2_34_aarch64.whl → 1.10.0rc2__py3-none-manylinux_2_34_aarch64.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.
- warp/__init__.py +301 -287
- warp/__init__.pyi +794 -305
- warp/_src/__init__.py +14 -0
- warp/_src/autograd.py +1075 -0
- warp/_src/build.py +618 -0
- warp/_src/build_dll.py +640 -0
- warp/{builtins.py → _src/builtins.py} +1382 -377
- warp/_src/codegen.py +4359 -0
- warp/{config.py → _src/config.py} +178 -169
- warp/_src/constants.py +57 -0
- warp/_src/context.py +8294 -0
- warp/_src/dlpack.py +462 -0
- warp/_src/fabric.py +355 -0
- warp/_src/fem/__init__.py +14 -0
- warp/_src/fem/adaptivity.py +508 -0
- warp/_src/fem/cache.py +687 -0
- warp/_src/fem/dirichlet.py +188 -0
- warp/{fem → _src/fem}/domain.py +40 -30
- warp/_src/fem/field/__init__.py +131 -0
- warp/_src/fem/field/field.py +701 -0
- warp/{fem → _src/fem}/field/nodal_field.py +30 -15
- warp/{fem → _src/fem}/field/restriction.py +1 -1
- warp/{fem → _src/fem}/field/virtual.py +53 -27
- warp/_src/fem/geometry/__init__.py +32 -0
- warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +77 -163
- warp/_src/fem/geometry/closest_point.py +97 -0
- warp/{fem → _src/fem}/geometry/deformed_geometry.py +14 -22
- warp/{fem → _src/fem}/geometry/element.py +32 -10
- warp/{fem → _src/fem}/geometry/geometry.py +48 -20
- warp/{fem → _src/fem}/geometry/grid_2d.py +12 -23
- warp/{fem → _src/fem}/geometry/grid_3d.py +12 -23
- warp/{fem → _src/fem}/geometry/hexmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/nanogrid.py +255 -248
- warp/{fem → _src/fem}/geometry/partition.py +121 -63
- warp/{fem → _src/fem}/geometry/quadmesh.py +26 -45
- warp/{fem → _src/fem}/geometry/tetmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/trimesh.py +26 -45
- warp/{fem → _src/fem}/integrate.py +164 -158
- warp/_src/fem/linalg.py +383 -0
- warp/_src/fem/operator.py +396 -0
- warp/_src/fem/polynomial.py +229 -0
- warp/{fem → _src/fem}/quadrature/pic_quadrature.py +15 -20
- warp/{fem → _src/fem}/quadrature/quadrature.py +95 -47
- warp/_src/fem/space/__init__.py +248 -0
- warp/{fem → _src/fem}/space/basis_function_space.py +20 -11
- warp/_src/fem/space/basis_space.py +679 -0
- warp/{fem → _src/fem}/space/dof_mapper.py +3 -3
- warp/{fem → _src/fem}/space/function_space.py +14 -13
- warp/{fem → _src/fem}/space/grid_2d_function_space.py +4 -7
- warp/{fem → _src/fem}/space/grid_3d_function_space.py +4 -4
- warp/{fem → _src/fem}/space/hexmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/nanogrid_function_space.py +3 -9
- warp/{fem → _src/fem}/space/partition.py +117 -60
- warp/{fem → _src/fem}/space/quadmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/restriction.py +66 -33
- warp/_src/fem/space/shape/__init__.py +152 -0
- warp/{fem → _src/fem}/space/shape/cube_shape_function.py +9 -9
- warp/{fem → _src/fem}/space/shape/shape_function.py +8 -9
- warp/{fem → _src/fem}/space/shape/square_shape_function.py +6 -6
- warp/{fem → _src/fem}/space/shape/tet_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/tetmesh_function_space.py +3 -9
- warp/_src/fem/space/topology.py +459 -0
- warp/{fem → _src/fem}/space/trimesh_function_space.py +3 -9
- warp/_src/fem/types.py +112 -0
- warp/_src/fem/utils.py +486 -0
- warp/_src/jax.py +186 -0
- warp/_src/jax_experimental/__init__.py +14 -0
- warp/_src/jax_experimental/custom_call.py +387 -0
- warp/_src/jax_experimental/ffi.py +1284 -0
- warp/_src/jax_experimental/xla_ffi.py +656 -0
- warp/_src/marching_cubes.py +708 -0
- warp/_src/math.py +414 -0
- warp/_src/optim/__init__.py +14 -0
- warp/_src/optim/adam.py +163 -0
- warp/_src/optim/linear.py +1606 -0
- warp/_src/optim/sgd.py +112 -0
- warp/_src/paddle.py +406 -0
- warp/_src/render/__init__.py +14 -0
- warp/_src/render/imgui_manager.py +289 -0
- warp/_src/render/render_opengl.py +3636 -0
- warp/_src/render/render_usd.py +937 -0
- warp/_src/render/utils.py +160 -0
- warp/_src/sparse.py +2716 -0
- warp/_src/tape.py +1206 -0
- warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
- warp/_src/torch.py +391 -0
- warp/_src/types.py +5870 -0
- warp/_src/utils.py +1693 -0
- warp/autograd.py +12 -1054
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/build.py +8 -588
- warp/build_dll.py +6 -721
- warp/codegen.py +6 -4251
- warp/constants.py +6 -39
- warp/context.py +12 -8062
- warp/dlpack.py +6 -444
- warp/examples/distributed/example_jacobi_mpi.py +4 -5
- warp/examples/fem/example_adaptive_grid.py +1 -1
- warp/examples/fem/example_apic_fluid.py +1 -1
- warp/examples/fem/example_burgers.py +8 -8
- warp/examples/fem/example_diffusion.py +1 -1
- warp/examples/fem/example_distortion_energy.py +1 -1
- warp/examples/fem/example_mixed_elasticity.py +2 -2
- warp/examples/fem/example_navier_stokes.py +1 -1
- warp/examples/fem/example_nonconforming_contact.py +7 -7
- warp/examples/fem/example_stokes.py +1 -1
- warp/examples/fem/example_stokes_transfer.py +1 -1
- warp/examples/fem/utils.py +2 -2
- warp/examples/interop/example_jax_callable.py +1 -1
- warp/examples/interop/example_jax_ffi_callback.py +1 -1
- warp/examples/interop/example_jax_kernel.py +1 -1
- warp/examples/tile/example_tile_mcgp.py +191 -0
- warp/fabric.py +6 -337
- warp/fem/__init__.py +159 -97
- warp/fem/adaptivity.py +7 -489
- warp/fem/cache.py +9 -648
- warp/fem/dirichlet.py +6 -184
- warp/fem/field/__init__.py +8 -109
- warp/fem/field/field.py +7 -652
- warp/fem/geometry/__init__.py +7 -18
- warp/fem/geometry/closest_point.py +11 -77
- warp/fem/linalg.py +18 -366
- warp/fem/operator.py +11 -369
- warp/fem/polynomial.py +9 -209
- warp/fem/space/__init__.py +5 -211
- warp/fem/space/basis_space.py +6 -662
- warp/fem/space/shape/__init__.py +41 -118
- warp/fem/space/topology.py +6 -437
- warp/fem/types.py +6 -81
- warp/fem/utils.py +11 -444
- warp/jax.py +8 -165
- warp/jax_experimental/__init__.py +14 -1
- warp/jax_experimental/custom_call.py +8 -365
- warp/jax_experimental/ffi.py +17 -873
- warp/jax_experimental/xla_ffi.py +5 -605
- warp/marching_cubes.py +5 -689
- warp/math.py +16 -393
- warp/native/array.h +385 -37
- warp/native/builtin.h +314 -37
- warp/native/bvh.cpp +43 -9
- warp/native/bvh.cu +62 -27
- warp/native/bvh.h +310 -309
- warp/native/clang/clang.cpp +102 -97
- warp/native/coloring.cpp +0 -1
- warp/native/crt.h +208 -0
- warp/native/exports.h +156 -0
- warp/native/hashgrid.cu +2 -0
- warp/native/intersect.h +24 -1
- warp/native/intersect_tri.h +44 -35
- warp/native/mat.h +1456 -276
- warp/native/mesh.cpp +4 -4
- warp/native/mesh.cu +4 -2
- warp/native/mesh.h +176 -61
- warp/native/quat.h +0 -52
- warp/native/scan.cu +2 -0
- warp/native/sparse.cu +7 -3
- warp/native/spatial.h +12 -0
- warp/native/tile.h +681 -89
- warp/native/tile_radix_sort.h +1 -1
- warp/native/tile_reduce.h +394 -46
- warp/native/tile_scan.h +4 -4
- warp/native/vec.h +469 -0
- warp/native/version.h +23 -0
- warp/native/volume.cpp +1 -1
- warp/native/volume.cu +1 -0
- warp/native/volume.h +1 -1
- warp/native/volume_builder.cu +2 -0
- warp/native/warp.cpp +57 -29
- warp/native/warp.cu +253 -171
- warp/native/warp.h +11 -8
- warp/optim/__init__.py +6 -3
- warp/optim/adam.py +6 -145
- warp/optim/linear.py +14 -1585
- warp/optim/sgd.py +6 -94
- warp/paddle.py +6 -388
- warp/render/__init__.py +8 -4
- warp/render/imgui_manager.py +7 -267
- warp/render/render_opengl.py +6 -3618
- warp/render/render_usd.py +6 -919
- warp/render/utils.py +6 -142
- warp/sparse.py +37 -2563
- warp/tape.py +6 -1188
- warp/tests/__main__.py +1 -1
- warp/tests/cuda/test_async.py +4 -4
- warp/tests/cuda/test_conditional_captures.py +1 -1
- warp/tests/cuda/test_multigpu.py +1 -1
- warp/tests/cuda/test_streams.py +58 -1
- warp/tests/geometry/test_bvh.py +157 -22
- warp/tests/geometry/test_marching_cubes.py +0 -1
- warp/tests/geometry/test_mesh.py +5 -3
- warp/tests/geometry/test_mesh_query_aabb.py +5 -12
- warp/tests/geometry/test_mesh_query_point.py +5 -2
- warp/tests/geometry/test_mesh_query_ray.py +15 -3
- warp/tests/geometry/test_volume_write.py +5 -5
- warp/tests/interop/test_dlpack.py +14 -14
- warp/tests/interop/test_jax.py +772 -49
- warp/tests/interop/test_paddle.py +1 -1
- warp/tests/test_adam.py +0 -1
- warp/tests/test_arithmetic.py +9 -9
- warp/tests/test_array.py +527 -100
- warp/tests/test_array_reduce.py +3 -3
- warp/tests/test_atomic.py +12 -8
- warp/tests/test_atomic_bitwise.py +209 -0
- warp/tests/test_atomic_cas.py +4 -4
- warp/tests/test_bool.py +2 -2
- warp/tests/test_builtins_resolution.py +5 -571
- warp/tests/test_codegen.py +33 -14
- warp/tests/test_conditional.py +1 -1
- warp/tests/test_context.py +6 -6
- warp/tests/test_copy.py +242 -161
- warp/tests/test_ctypes.py +3 -3
- warp/tests/test_devices.py +24 -2
- warp/tests/test_examples.py +16 -84
- warp/tests/test_fabricarray.py +35 -35
- warp/tests/test_fast_math.py +0 -2
- warp/tests/test_fem.py +56 -10
- warp/tests/test_fixedarray.py +3 -3
- warp/tests/test_func.py +8 -5
- warp/tests/test_generics.py +1 -1
- warp/tests/test_indexedarray.py +24 -24
- warp/tests/test_intersect.py +39 -9
- warp/tests/test_large.py +1 -1
- warp/tests/test_lerp.py +3 -1
- warp/tests/test_linear_solvers.py +1 -1
- warp/tests/test_map.py +35 -4
- warp/tests/test_mat.py +52 -62
- warp/tests/test_mat_constructors.py +4 -5
- warp/tests/test_mat_lite.py +1 -1
- warp/tests/test_mat_scalar_ops.py +121 -121
- warp/tests/test_math.py +34 -0
- warp/tests/test_module_aot.py +4 -4
- warp/tests/test_modules_lite.py +28 -2
- warp/tests/test_print.py +11 -11
- warp/tests/test_quat.py +93 -58
- warp/tests/test_runlength_encode.py +1 -1
- warp/tests/test_scalar_ops.py +38 -10
- warp/tests/test_smoothstep.py +1 -1
- warp/tests/test_sparse.py +126 -15
- warp/tests/test_spatial.py +105 -87
- warp/tests/test_special_values.py +6 -6
- warp/tests/test_static.py +7 -7
- warp/tests/test_struct.py +13 -2
- warp/tests/test_triangle_closest_point.py +48 -1
- warp/tests/test_types.py +27 -15
- warp/tests/test_utils.py +52 -52
- warp/tests/test_vec.py +29 -29
- warp/tests/test_vec_constructors.py +5 -5
- warp/tests/test_vec_scalar_ops.py +97 -97
- warp/tests/test_version.py +75 -0
- warp/tests/tile/test_tile.py +178 -0
- warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
- warp/tests/tile/test_tile_cholesky.py +7 -4
- warp/tests/tile/test_tile_load.py +26 -2
- warp/tests/tile/test_tile_mathdx.py +3 -3
- warp/tests/tile/test_tile_matmul.py +1 -1
- warp/tests/tile/test_tile_mlp.py +2 -4
- warp/tests/tile/test_tile_reduce.py +214 -13
- warp/tests/unittest_suites.py +6 -14
- warp/tests/unittest_utils.py +10 -9
- warp/tests/walkthrough_debug.py +3 -1
- warp/torch.py +6 -373
- warp/types.py +29 -5764
- warp/utils.py +10 -1659
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/METADATA +46 -99
- warp_lang-1.10.0rc2.dist-info/RECORD +468 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
- warp/examples/assets/cartpole.urdf +0 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/nv_ant.xml +0 -92
- warp/examples/assets/nv_humanoid.xml +0 -183
- warp/examples/assets/quadruped.urdf +0 -268
- warp/examples/optim/example_bounce.py +0 -266
- warp/examples/optim/example_cloth_throw.py +0 -228
- warp/examples/optim/example_drone.py +0 -870
- warp/examples/optim/example_inverse_kinematics.py +0 -182
- warp/examples/optim/example_inverse_kinematics_torch.py +0 -191
- warp/examples/optim/example_softbody_properties.py +0 -400
- warp/examples/optim/example_spring_cage.py +0 -245
- warp/examples/optim/example_trajectory.py +0 -227
- warp/examples/sim/example_cartpole.py +0 -143
- warp/examples/sim/example_cloth.py +0 -225
- warp/examples/sim/example_cloth_self_contact.py +0 -316
- warp/examples/sim/example_granular.py +0 -130
- warp/examples/sim/example_granular_collision_sdf.py +0 -202
- warp/examples/sim/example_jacobian_ik.py +0 -244
- warp/examples/sim/example_particle_chain.py +0 -124
- warp/examples/sim/example_quadruped.py +0 -203
- warp/examples/sim/example_rigid_chain.py +0 -203
- warp/examples/sim/example_rigid_contact.py +0 -195
- warp/examples/sim/example_rigid_force.py +0 -133
- warp/examples/sim/example_rigid_gyroscopic.py +0 -115
- warp/examples/sim/example_rigid_soft_contact.py +0 -140
- warp/examples/sim/example_soft_body.py +0 -196
- warp/examples/tile/example_tile_walker.py +0 -327
- warp/sim/__init__.py +0 -74
- warp/sim/articulation.py +0 -793
- warp/sim/collide.py +0 -2570
- warp/sim/graph_coloring.py +0 -307
- warp/sim/import_mjcf.py +0 -791
- warp/sim/import_snu.py +0 -227
- warp/sim/import_urdf.py +0 -579
- warp/sim/import_usd.py +0 -898
- warp/sim/inertia.py +0 -357
- warp/sim/integrator.py +0 -245
- warp/sim/integrator_euler.py +0 -2000
- warp/sim/integrator_featherstone.py +0 -2101
- warp/sim/integrator_vbd.py +0 -2487
- warp/sim/integrator_xpbd.py +0 -3295
- warp/sim/model.py +0 -4821
- warp/sim/particles.py +0 -121
- warp/sim/render.py +0 -431
- warp/sim/utils.py +0 -431
- warp/tests/sim/disabled_kinematics.py +0 -244
- warp/tests/sim/test_cloth.py +0 -863
- warp/tests/sim/test_collision.py +0 -743
- warp/tests/sim/test_coloring.py +0 -347
- warp/tests/sim/test_inertia.py +0 -161
- warp/tests/sim/test_model.py +0 -226
- warp/tests/sim/test_sim_grad.py +0 -287
- warp/tests/sim/test_sim_grad_bounce_linear.py +0 -212
- warp/tests/sim/test_sim_kinematics.py +0 -98
- warp/thirdparty/__init__.py +0 -0
- warp_lang-1.9.1.dist-info/RECORD +0 -456
- /warp/{fem → _src/fem}/quadrature/__init__.py +0 -0
- /warp/{tests/sim → _src/thirdparty}/__init__.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/appdirs.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/dlpack.py +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/WHEEL +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/licenses/LICENSE.md +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/top_level.txt +0 -0
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
#
|
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
# you may not use this file except in compliance with the License.
|
|
6
|
-
# You may obtain a copy of the License at
|
|
7
|
-
#
|
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
#
|
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
# See the License for the specific language governing permissions and
|
|
14
|
-
# limitations under the License.
|
|
15
|
-
|
|
16
|
-
###########################################################################
|
|
17
|
-
# Example Sim Rigid Chain
|
|
18
|
-
#
|
|
19
|
-
# Shows how to set up a chain of rigid bodies connected by different joint
|
|
20
|
-
# types using wp.sim.ModelBuilder(). There is one chain for each joint
|
|
21
|
-
# type, including fixed joints which act as a flexible beam.
|
|
22
|
-
#
|
|
23
|
-
###########################################################################
|
|
24
|
-
|
|
25
|
-
import numpy as np
|
|
26
|
-
|
|
27
|
-
import warp as wp
|
|
28
|
-
import warp.sim
|
|
29
|
-
import warp.sim.render
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class Example:
|
|
33
|
-
def __init__(self, stage_path="example_rigid_chain.usd"):
|
|
34
|
-
self.chain_length = 8
|
|
35
|
-
self.chain_width = 1.0
|
|
36
|
-
self.chain_types = [
|
|
37
|
-
wp.sim.JOINT_REVOLUTE,
|
|
38
|
-
wp.sim.JOINT_FIXED,
|
|
39
|
-
wp.sim.JOINT_BALL,
|
|
40
|
-
wp.sim.JOINT_UNIVERSAL,
|
|
41
|
-
wp.sim.JOINT_COMPOUND,
|
|
42
|
-
]
|
|
43
|
-
|
|
44
|
-
builder = wp.sim.ModelBuilder()
|
|
45
|
-
|
|
46
|
-
self.sim_time = 0.0
|
|
47
|
-
fps = 100
|
|
48
|
-
self.frame_dt = 1.0 / fps
|
|
49
|
-
|
|
50
|
-
self.sim_substeps = 10
|
|
51
|
-
self.sim_dt = self.frame_dt / self.sim_substeps
|
|
52
|
-
|
|
53
|
-
for c, t in enumerate(self.chain_types):
|
|
54
|
-
# start a new articulation
|
|
55
|
-
builder.add_articulation()
|
|
56
|
-
|
|
57
|
-
for i in range(self.chain_length):
|
|
58
|
-
if i == 0:
|
|
59
|
-
parent = -1
|
|
60
|
-
parent_joint_xform = wp.transform([0.0, 0.0, c * 1.0], wp.quat_identity())
|
|
61
|
-
else:
|
|
62
|
-
parent = builder.joint_count - 1
|
|
63
|
-
parent_joint_xform = wp.transform([self.chain_width, 0.0, 0.0], wp.quat_identity())
|
|
64
|
-
|
|
65
|
-
# create body
|
|
66
|
-
b = builder.add_body(origin=wp.transform([i, 0.0, c * 1.0], wp.quat_identity()), armature=0.1)
|
|
67
|
-
|
|
68
|
-
# create shape
|
|
69
|
-
builder.add_shape_box(
|
|
70
|
-
pos=wp.vec3(self.chain_width * 0.5, 0.0, 0.0),
|
|
71
|
-
hx=self.chain_width * 0.5,
|
|
72
|
-
hy=0.1,
|
|
73
|
-
hz=0.1,
|
|
74
|
-
density=10.0,
|
|
75
|
-
body=b,
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
joint_type = t
|
|
79
|
-
|
|
80
|
-
if joint_type == wp.sim.JOINT_REVOLUTE:
|
|
81
|
-
joint_limit_lower = -np.deg2rad(60.0)
|
|
82
|
-
joint_limit_upper = np.deg2rad(60.0)
|
|
83
|
-
builder.add_joint_revolute(
|
|
84
|
-
parent=parent,
|
|
85
|
-
child=b,
|
|
86
|
-
axis=(0.0, 0.0, 1.0),
|
|
87
|
-
parent_xform=parent_joint_xform,
|
|
88
|
-
child_xform=wp.transform_identity(),
|
|
89
|
-
limit_lower=joint_limit_lower,
|
|
90
|
-
limit_upper=joint_limit_upper,
|
|
91
|
-
target_ke=0.0,
|
|
92
|
-
target_kd=0.0,
|
|
93
|
-
limit_ke=1e5,
|
|
94
|
-
limit_kd=1.0,
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
elif joint_type == wp.sim.JOINT_UNIVERSAL:
|
|
98
|
-
builder.add_joint_universal(
|
|
99
|
-
parent=parent,
|
|
100
|
-
child=b,
|
|
101
|
-
axis_0=wp.sim.JointAxis((1.0, 0.0, 0.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
|
|
102
|
-
axis_1=wp.sim.JointAxis((0.0, 0.0, 1.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
|
|
103
|
-
parent_xform=parent_joint_xform,
|
|
104
|
-
child_xform=wp.transform_identity(),
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
elif joint_type == wp.sim.JOINT_BALL:
|
|
108
|
-
builder.add_joint_ball(
|
|
109
|
-
parent=parent,
|
|
110
|
-
child=b,
|
|
111
|
-
parent_xform=parent_joint_xform,
|
|
112
|
-
child_xform=wp.transform_identity(),
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
elif joint_type == wp.sim.JOINT_FIXED:
|
|
116
|
-
builder.add_joint_fixed(
|
|
117
|
-
parent=parent,
|
|
118
|
-
child=b,
|
|
119
|
-
parent_xform=parent_joint_xform,
|
|
120
|
-
child_xform=wp.transform_identity(),
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
elif joint_type == wp.sim.JOINT_COMPOUND:
|
|
124
|
-
builder.add_joint_compound(
|
|
125
|
-
parent=parent,
|
|
126
|
-
child=b,
|
|
127
|
-
axis_0=wp.sim.JointAxis((1.0, 0.0, 0.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
|
|
128
|
-
axis_1=wp.sim.JointAxis((0.0, 1.0, 0.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
|
|
129
|
-
axis_2=wp.sim.JointAxis((0.0, 0.0, 1.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
|
|
130
|
-
parent_xform=parent_joint_xform,
|
|
131
|
-
child_xform=wp.transform_identity(),
|
|
132
|
-
)
|
|
133
|
-
|
|
134
|
-
self.model = builder.finalize()
|
|
135
|
-
self.model.ground = False
|
|
136
|
-
|
|
137
|
-
self.integrator = wp.sim.FeatherstoneIntegrator(self.model)
|
|
138
|
-
|
|
139
|
-
if stage_path:
|
|
140
|
-
self.renderer = wp.sim.render.SimRenderer(self.model, stage_path, scaling=20.0)
|
|
141
|
-
else:
|
|
142
|
-
self.renderer = None
|
|
143
|
-
|
|
144
|
-
self.state_0 = self.model.state()
|
|
145
|
-
self.state_1 = self.model.state()
|
|
146
|
-
|
|
147
|
-
wp.sim.eval_fk(self.model, self.model.joint_q, self.model.joint_qd, None, self.state_0)
|
|
148
|
-
|
|
149
|
-
# simulate() allocates memory via a clone, so we can't use graph capture if the device does not support mempools
|
|
150
|
-
self.use_cuda_graph = wp.get_device().is_cuda and wp.is_mempool_enabled(wp.get_device())
|
|
151
|
-
if self.use_cuda_graph:
|
|
152
|
-
with wp.ScopedCapture() as capture:
|
|
153
|
-
self.simulate()
|
|
154
|
-
self.graph = capture.graph
|
|
155
|
-
|
|
156
|
-
def simulate(self):
|
|
157
|
-
for _ in range(self.sim_substeps):
|
|
158
|
-
self.state_0.clear_forces()
|
|
159
|
-
self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
|
|
160
|
-
self.state_0, self.state_1 = self.state_1, self.state_0
|
|
161
|
-
|
|
162
|
-
def step(self):
|
|
163
|
-
with wp.ScopedTimer("step"):
|
|
164
|
-
if self.use_cuda_graph:
|
|
165
|
-
wp.capture_launch(self.graph)
|
|
166
|
-
else:
|
|
167
|
-
self.simulate()
|
|
168
|
-
self.sim_time += self.frame_dt
|
|
169
|
-
|
|
170
|
-
def render(self):
|
|
171
|
-
if self.renderer is None:
|
|
172
|
-
return
|
|
173
|
-
|
|
174
|
-
with wp.ScopedTimer("render"):
|
|
175
|
-
self.renderer.begin_frame(self.sim_time)
|
|
176
|
-
self.renderer.render(self.state_0)
|
|
177
|
-
self.renderer.end_frame()
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
if __name__ == "__main__":
|
|
181
|
-
import argparse
|
|
182
|
-
|
|
183
|
-
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
184
|
-
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
185
|
-
parser.add_argument(
|
|
186
|
-
"--stage_path",
|
|
187
|
-
type=lambda x: None if x == "None" else str(x),
|
|
188
|
-
default="example_rigid_chain.usd",
|
|
189
|
-
help="Path to the output USD file.",
|
|
190
|
-
)
|
|
191
|
-
parser.add_argument("--num_frames", type=int, default=500, help="Total number of frames.")
|
|
192
|
-
|
|
193
|
-
args = parser.parse_known_args()[0]
|
|
194
|
-
|
|
195
|
-
with wp.ScopedDevice(args.device):
|
|
196
|
-
example = Example(stage_path=args.stage_path)
|
|
197
|
-
|
|
198
|
-
for _ in range(args.num_frames):
|
|
199
|
-
example.step()
|
|
200
|
-
example.render()
|
|
201
|
-
|
|
202
|
-
if example.renderer:
|
|
203
|
-
example.renderer.save()
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
#
|
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
# you may not use this file except in compliance with the License.
|
|
6
|
-
# You may obtain a copy of the License at
|
|
7
|
-
#
|
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
#
|
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
# See the License for the specific language governing permissions and
|
|
14
|
-
# limitations under the License.
|
|
15
|
-
|
|
16
|
-
###########################################################################
|
|
17
|
-
# Example Sim Rigid Contact
|
|
18
|
-
#
|
|
19
|
-
# Shows how to set up free rigid bodies with different shape types falling
|
|
20
|
-
# and colliding against each other and the ground using wp.sim.ModelBuilder().
|
|
21
|
-
#
|
|
22
|
-
###########################################################################
|
|
23
|
-
|
|
24
|
-
import math
|
|
25
|
-
import os
|
|
26
|
-
|
|
27
|
-
import numpy as np
|
|
28
|
-
from pxr import Usd, UsdGeom
|
|
29
|
-
|
|
30
|
-
import warp as wp
|
|
31
|
-
import warp.examples
|
|
32
|
-
import warp.sim
|
|
33
|
-
import warp.sim.render
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class Example:
|
|
37
|
-
def __init__(self, stage_path="example_rigid_contact.usd"):
|
|
38
|
-
builder = wp.sim.ModelBuilder()
|
|
39
|
-
|
|
40
|
-
self.sim_time = 0.0
|
|
41
|
-
fps = 60
|
|
42
|
-
self.frame_dt = 1.0 / fps
|
|
43
|
-
|
|
44
|
-
self.sim_substeps = 10
|
|
45
|
-
self.sim_dt = self.frame_dt / self.sim_substeps
|
|
46
|
-
|
|
47
|
-
self.num_bodies = 8
|
|
48
|
-
self.scale = 0.8
|
|
49
|
-
self.ke = 1.0e5
|
|
50
|
-
self.kd = 250.0
|
|
51
|
-
self.kf = 500.0
|
|
52
|
-
|
|
53
|
-
# boxes
|
|
54
|
-
for i in range(self.num_bodies):
|
|
55
|
-
b = builder.add_body(origin=wp.transform((i, 1.0, 0.0), wp.quat_identity()))
|
|
56
|
-
|
|
57
|
-
builder.add_shape_box(
|
|
58
|
-
pos=wp.vec3(0.0, 0.0, 0.0),
|
|
59
|
-
hx=0.5 * self.scale,
|
|
60
|
-
hy=0.2 * self.scale,
|
|
61
|
-
hz=0.2 * self.scale,
|
|
62
|
-
body=i,
|
|
63
|
-
ke=self.ke,
|
|
64
|
-
kd=self.kd,
|
|
65
|
-
kf=self.kf,
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
# spheres
|
|
69
|
-
for i in range(self.num_bodies):
|
|
70
|
-
b = builder.add_body(origin=wp.transform((i, 1.0, 2.0), wp.quat_identity()))
|
|
71
|
-
|
|
72
|
-
builder.add_shape_sphere(
|
|
73
|
-
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
|
-
)
|
|
75
|
-
|
|
76
|
-
# capsules
|
|
77
|
-
for i in range(self.num_bodies):
|
|
78
|
-
b = builder.add_body(origin=wp.transform((i, 1.0, 6.0), wp.quat_identity()))
|
|
79
|
-
|
|
80
|
-
builder.add_shape_capsule(
|
|
81
|
-
pos=wp.vec3(0.0, 0.0, 0.0),
|
|
82
|
-
radius=0.25 * self.scale,
|
|
83
|
-
half_height=self.scale * 0.5,
|
|
84
|
-
up_axis=0,
|
|
85
|
-
body=b,
|
|
86
|
-
ke=self.ke,
|
|
87
|
-
kd=self.kd,
|
|
88
|
-
kf=self.kf,
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
# initial spin
|
|
92
|
-
for i in range(len(builder.body_qd)):
|
|
93
|
-
builder.body_qd[i] = (0.0, 2.0, 10.0, 0.0, 0.0, 0.0)
|
|
94
|
-
|
|
95
|
-
# meshes
|
|
96
|
-
bunny = self.load_mesh(os.path.join(warp.examples.get_asset_directory(), "bunny.usd"), "/root/bunny")
|
|
97
|
-
for i in range(self.num_bodies):
|
|
98
|
-
b = builder.add_body(
|
|
99
|
-
origin=wp.transform(
|
|
100
|
-
(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(wp.vec3(0.0, 1.0, 0.0), math.pi * 0.1 * i),
|
|
102
|
-
)
|
|
103
|
-
)
|
|
104
|
-
|
|
105
|
-
builder.add_shape_mesh(
|
|
106
|
-
body=b,
|
|
107
|
-
mesh=bunny,
|
|
108
|
-
pos=wp.vec3(0.0, 0.0, 0.0),
|
|
109
|
-
scale=wp.vec3(self.scale, self.scale, self.scale),
|
|
110
|
-
ke=self.ke,
|
|
111
|
-
kd=self.kd,
|
|
112
|
-
kf=self.kf,
|
|
113
|
-
density=1e3,
|
|
114
|
-
)
|
|
115
|
-
|
|
116
|
-
# finalize model
|
|
117
|
-
self.model = builder.finalize()
|
|
118
|
-
self.model.ground = True
|
|
119
|
-
|
|
120
|
-
self.integrator = wp.sim.SemiImplicitIntegrator()
|
|
121
|
-
|
|
122
|
-
if stage_path:
|
|
123
|
-
self.renderer = wp.sim.render.SimRenderer(self.model, stage_path, scaling=0.5)
|
|
124
|
-
else:
|
|
125
|
-
self.renderer = None
|
|
126
|
-
|
|
127
|
-
self.state_0 = self.model.state()
|
|
128
|
-
self.state_1 = self.model.state()
|
|
129
|
-
|
|
130
|
-
wp.sim.eval_fk(self.model, self.model.joint_q, self.model.joint_qd, None, self.state_0)
|
|
131
|
-
|
|
132
|
-
self.use_cuda_graph = wp.get_device().is_cuda
|
|
133
|
-
if self.use_cuda_graph:
|
|
134
|
-
with wp.ScopedCapture() as capture:
|
|
135
|
-
self.simulate()
|
|
136
|
-
self.graph = capture.graph
|
|
137
|
-
|
|
138
|
-
def load_mesh(self, filename, path):
|
|
139
|
-
asset_stage = Usd.Stage.Open(filename)
|
|
140
|
-
mesh_geom = UsdGeom.Mesh(asset_stage.GetPrimAtPath(path))
|
|
141
|
-
|
|
142
|
-
points = np.array(mesh_geom.GetPointsAttr().Get())
|
|
143
|
-
indices = np.array(mesh_geom.GetFaceVertexIndicesAttr().Get()).flatten()
|
|
144
|
-
|
|
145
|
-
return wp.sim.Mesh(points, indices)
|
|
146
|
-
|
|
147
|
-
def simulate(self):
|
|
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
|
-
|
|
154
|
-
def step(self):
|
|
155
|
-
with wp.ScopedTimer("step", active=True):
|
|
156
|
-
if self.use_cuda_graph:
|
|
157
|
-
wp.capture_launch(self.graph)
|
|
158
|
-
else:
|
|
159
|
-
self.simulate()
|
|
160
|
-
self.sim_time += self.frame_dt
|
|
161
|
-
|
|
162
|
-
def render(self):
|
|
163
|
-
if self.renderer is None:
|
|
164
|
-
return
|
|
165
|
-
|
|
166
|
-
with wp.ScopedTimer("render", active=True):
|
|
167
|
-
self.renderer.begin_frame(self.sim_time)
|
|
168
|
-
self.renderer.render(self.state_0)
|
|
169
|
-
self.renderer.end_frame()
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if __name__ == "__main__":
|
|
173
|
-
import argparse
|
|
174
|
-
|
|
175
|
-
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
176
|
-
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
177
|
-
parser.add_argument(
|
|
178
|
-
"--stage_path",
|
|
179
|
-
type=lambda x: None if x == "None" else str(x),
|
|
180
|
-
default="example_rigid_contact.usd",
|
|
181
|
-
help="Path to the output USD file.",
|
|
182
|
-
)
|
|
183
|
-
parser.add_argument("--num_frames", type=int, default=300, help="Total number of frames.")
|
|
184
|
-
|
|
185
|
-
args = parser.parse_known_args()[0]
|
|
186
|
-
|
|
187
|
-
with wp.ScopedDevice(args.device):
|
|
188
|
-
example = Example(stage_path=args.stage_path)
|
|
189
|
-
|
|
190
|
-
for _ in range(args.num_frames):
|
|
191
|
-
example.step()
|
|
192
|
-
example.render()
|
|
193
|
-
|
|
194
|
-
if example.renderer:
|
|
195
|
-
example.renderer.save()
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
#
|
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
# you may not use this file except in compliance with the License.
|
|
6
|
-
# You may obtain a copy of the License at
|
|
7
|
-
#
|
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
#
|
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
# See the License for the specific language governing permissions and
|
|
14
|
-
# limitations under the License.
|
|
15
|
-
|
|
16
|
-
###########################################################################
|
|
17
|
-
# Example Sim Rigid Force
|
|
18
|
-
#
|
|
19
|
-
# Shows how to apply an external force (torque) to a rigid body causing
|
|
20
|
-
# it to roll.
|
|
21
|
-
#
|
|
22
|
-
###########################################################################
|
|
23
|
-
|
|
24
|
-
import warp as wp
|
|
25
|
-
import warp.sim
|
|
26
|
-
import warp.sim.render
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class Example:
|
|
30
|
-
def __init__(self, stage_path="example_rigid_force.usd", use_opengl=False):
|
|
31
|
-
fps = 60
|
|
32
|
-
self.frame_dt = 1.0 / fps
|
|
33
|
-
self.sim_substeps = 5
|
|
34
|
-
self.sim_dt = self.frame_dt / self.sim_substeps
|
|
35
|
-
self.sim_time = 0.0
|
|
36
|
-
|
|
37
|
-
builder = wp.sim.ModelBuilder()
|
|
38
|
-
|
|
39
|
-
b = builder.add_body(origin=wp.transform((0.0, 10.0, 0.0), wp.quat_identity()))
|
|
40
|
-
builder.add_shape_box(body=b, hx=1.0, hy=1.0, hz=1.0, density=100.0)
|
|
41
|
-
|
|
42
|
-
self.model = builder.finalize()
|
|
43
|
-
self.model.ground = True
|
|
44
|
-
|
|
45
|
-
self.integrator = wp.sim.XPBDIntegrator()
|
|
46
|
-
|
|
47
|
-
self.state_0 = self.model.state()
|
|
48
|
-
self.state_1 = self.model.state()
|
|
49
|
-
|
|
50
|
-
if use_opengl:
|
|
51
|
-
self.renderer = wp.sim.render.SimRendererOpenGL(self.model, stage_path)
|
|
52
|
-
elif stage_path:
|
|
53
|
-
self.renderer = wp.sim.render.SimRenderer(self.model, stage_path)
|
|
54
|
-
else:
|
|
55
|
-
self.renderer = None
|
|
56
|
-
|
|
57
|
-
# simulate() allocates memory via a clone, so we can't use graph capture if the device does not support mempools
|
|
58
|
-
self.use_cuda_graph = wp.get_device().is_cuda and wp.is_mempool_enabled(wp.get_device())
|
|
59
|
-
if self.use_cuda_graph:
|
|
60
|
-
with wp.ScopedCapture() as capture:
|
|
61
|
-
self.simulate()
|
|
62
|
-
self.graph = capture.graph
|
|
63
|
-
|
|
64
|
-
def simulate(self):
|
|
65
|
-
for _ in range(self.sim_substeps):
|
|
66
|
-
wp.sim.collide(self.model, self.state_0)
|
|
67
|
-
|
|
68
|
-
self.state_0.clear_forces()
|
|
69
|
-
self.state_1.clear_forces()
|
|
70
|
-
|
|
71
|
-
self.state_0.body_f.assign(
|
|
72
|
-
[
|
|
73
|
-
[0.0, 0.0, -7000.0, 0.0, 0.0, 0.0],
|
|
74
|
-
]
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
|
|
78
|
-
|
|
79
|
-
# swap states
|
|
80
|
-
(self.state_0, self.state_1) = (self.state_1, self.state_0)
|
|
81
|
-
|
|
82
|
-
def step(self):
|
|
83
|
-
with wp.ScopedTimer("step"):
|
|
84
|
-
if self.use_cuda_graph:
|
|
85
|
-
wp.capture_launch(self.graph)
|
|
86
|
-
else:
|
|
87
|
-
self.simulate()
|
|
88
|
-
self.sim_time += self.frame_dt
|
|
89
|
-
|
|
90
|
-
def render(self):
|
|
91
|
-
if self.renderer is None:
|
|
92
|
-
return
|
|
93
|
-
|
|
94
|
-
with wp.ScopedTimer("render"):
|
|
95
|
-
self.renderer.begin_frame(self.sim_time)
|
|
96
|
-
self.renderer.render(self.state_0)
|
|
97
|
-
self.renderer.end_frame()
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if __name__ == "__main__":
|
|
101
|
-
import argparse
|
|
102
|
-
|
|
103
|
-
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
104
|
-
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
105
|
-
parser.add_argument(
|
|
106
|
-
"--stage_path",
|
|
107
|
-
type=lambda x: None if x == "None" else str(x),
|
|
108
|
-
default="example_rigid_force.usd",
|
|
109
|
-
help="Path to the output USD file.",
|
|
110
|
-
)
|
|
111
|
-
parser.add_argument("--num_frames", type=int, default=300, help="Total number of frames.")
|
|
112
|
-
parser.add_argument(
|
|
113
|
-
"--opengl",
|
|
114
|
-
action="store_true",
|
|
115
|
-
help="Open an interactive window to play back animations in real time. Ignores --num_frames if used.",
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
args = parser.parse_known_args()[0]
|
|
119
|
-
|
|
120
|
-
with wp.ScopedDevice(args.device):
|
|
121
|
-
example = Example(stage_path=args.stage_path, use_opengl=args.opengl)
|
|
122
|
-
|
|
123
|
-
if args.opengl:
|
|
124
|
-
while example.renderer.is_running():
|
|
125
|
-
example.step()
|
|
126
|
-
example.render()
|
|
127
|
-
else:
|
|
128
|
-
for _ in range(args.num_frames):
|
|
129
|
-
example.step()
|
|
130
|
-
example.render()
|
|
131
|
-
|
|
132
|
-
if example.renderer:
|
|
133
|
-
example.renderer.save()
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
#
|
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
# you may not use this file except in compliance with the License.
|
|
6
|
-
# You may obtain a copy of the License at
|
|
7
|
-
#
|
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
#
|
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
# See the License for the specific language governing permissions and
|
|
14
|
-
# limitations under the License.
|
|
15
|
-
|
|
16
|
-
###########################################################################
|
|
17
|
-
# Example Sim Rigid Gyroscopic
|
|
18
|
-
#
|
|
19
|
-
# Demonstrates the Dzhanibekov effect where rigid bodies will tumble in
|
|
20
|
-
# free space due to unstable axes of rotation.
|
|
21
|
-
#
|
|
22
|
-
###########################################################################
|
|
23
|
-
|
|
24
|
-
import warp as wp
|
|
25
|
-
import warp.sim
|
|
26
|
-
import warp.sim.render
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class Example:
|
|
30
|
-
def __init__(self, stage_path="example_rigid_gyroscopic.usd"):
|
|
31
|
-
fps = 120
|
|
32
|
-
self.sim_dt = 1.0 / fps
|
|
33
|
-
self.sim_time = 0.0
|
|
34
|
-
|
|
35
|
-
self.scale = 0.5
|
|
36
|
-
|
|
37
|
-
builder = wp.sim.ModelBuilder()
|
|
38
|
-
|
|
39
|
-
b = builder.add_body()
|
|
40
|
-
|
|
41
|
-
# axis shape
|
|
42
|
-
builder.add_shape_box(
|
|
43
|
-
pos=wp.vec3(0.3 * self.scale, 0.0, 0.0),
|
|
44
|
-
hx=0.25 * self.scale,
|
|
45
|
-
hy=0.1 * self.scale,
|
|
46
|
-
hz=0.1 * self.scale,
|
|
47
|
-
density=100.0,
|
|
48
|
-
body=b,
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
# tip shape
|
|
52
|
-
builder.add_shape_box(
|
|
53
|
-
pos=wp.vec3(0.0, 0.0, 0.0),
|
|
54
|
-
hx=0.05 * self.scale,
|
|
55
|
-
hy=0.2 * self.scale,
|
|
56
|
-
hz=1.0 * self.scale,
|
|
57
|
-
density=100.0,
|
|
58
|
-
body=b,
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
# initial spin
|
|
62
|
-
builder.body_qd[0] = (25.0, 0.01, 0.01, 0.0, 0.0, 0.0)
|
|
63
|
-
|
|
64
|
-
builder.gravity = 0.0
|
|
65
|
-
self.model = builder.finalize()
|
|
66
|
-
self.model.ground = False
|
|
67
|
-
|
|
68
|
-
self.integrator = wp.sim.SemiImplicitIntegrator()
|
|
69
|
-
self.state = self.model.state()
|
|
70
|
-
|
|
71
|
-
if stage_path:
|
|
72
|
-
self.renderer = wp.sim.render.SimRenderer(self.model, stage_path, scaling=100.0)
|
|
73
|
-
else:
|
|
74
|
-
self.renderer = None
|
|
75
|
-
|
|
76
|
-
def step(self):
|
|
77
|
-
with wp.ScopedTimer("step"):
|
|
78
|
-
self.state.clear_forces()
|
|
79
|
-
self.state = self.integrator.simulate(self.model, self.state, self.state, self.sim_dt)
|
|
80
|
-
self.sim_time += self.sim_dt
|
|
81
|
-
|
|
82
|
-
def render(self):
|
|
83
|
-
if self.renderer is None:
|
|
84
|
-
return
|
|
85
|
-
|
|
86
|
-
with wp.ScopedTimer("render"):
|
|
87
|
-
self.renderer.begin_frame(self.sim_time)
|
|
88
|
-
self.renderer.render(self.state)
|
|
89
|
-
self.renderer.end_frame()
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if __name__ == "__main__":
|
|
93
|
-
import argparse
|
|
94
|
-
|
|
95
|
-
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
96
|
-
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
97
|
-
parser.add_argument(
|
|
98
|
-
"--stage_path",
|
|
99
|
-
type=lambda x: None if x == "None" else str(x),
|
|
100
|
-
default="example_rigid_gyroscopic.usd",
|
|
101
|
-
help="Path to the output USD file.",
|
|
102
|
-
)
|
|
103
|
-
parser.add_argument("--num_frames", type=int, default=2000, help="Total number of frames.")
|
|
104
|
-
|
|
105
|
-
args = parser.parse_known_args()[0]
|
|
106
|
-
|
|
107
|
-
with wp.ScopedDevice(args.device):
|
|
108
|
-
example = Example(stage_path=args.stage_path)
|
|
109
|
-
|
|
110
|
-
for _ in range(args.num_frames):
|
|
111
|
-
example.step()
|
|
112
|
-
example.render()
|
|
113
|
-
|
|
114
|
-
if example.renderer:
|
|
115
|
-
example.renderer.save()
|