warp-lang 1.0.1__py3-none-manylinux2014_aarch64.whl → 1.1.0__py3-none-manylinux2014_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 +108 -97
- warp/__init__.pyi +1 -1
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/build.py +115 -113
- warp/build_dll.py +383 -375
- warp/builtins.py +3425 -3354
- warp/codegen.py +2878 -2792
- warp/config.py +40 -36
- warp/constants.py +45 -45
- warp/context.py +5194 -5102
- warp/dlpack.py +442 -442
- warp/examples/__init__.py +16 -16
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cartpole.urdf +110 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nv_ant.xml +92 -92
- warp/examples/assets/nv_humanoid.xml +183 -183
- warp/examples/assets/quadruped.urdf +267 -267
- warp/examples/assets/rocks.nvdb +0 -0
- warp/examples/assets/rocks.usd +0 -0
- warp/examples/assets/sphere.usd +0 -0
- warp/examples/benchmarks/benchmark_api.py +383 -383
- warp/examples/benchmarks/benchmark_cloth.py +278 -279
- warp/examples/benchmarks/benchmark_cloth_cupy.py +88 -88
- warp/examples/benchmarks/benchmark_cloth_jax.py +97 -100
- warp/examples/benchmarks/benchmark_cloth_numba.py +146 -142
- warp/examples/benchmarks/benchmark_cloth_numpy.py +77 -77
- warp/examples/benchmarks/benchmark_cloth_pytorch.py +86 -86
- warp/examples/benchmarks/benchmark_cloth_taichi.py +112 -112
- warp/examples/benchmarks/benchmark_cloth_warp.py +146 -146
- warp/examples/benchmarks/benchmark_launches.py +295 -295
- warp/examples/browse.py +29 -28
- warp/examples/core/example_dem.py +234 -221
- warp/examples/core/example_fluid.py +293 -267
- warp/examples/core/example_graph_capture.py +144 -129
- warp/examples/core/example_marching_cubes.py +188 -176
- warp/examples/core/example_mesh.py +174 -154
- warp/examples/core/example_mesh_intersect.py +205 -193
- warp/examples/core/example_nvdb.py +176 -169
- warp/examples/core/example_raycast.py +105 -89
- warp/examples/core/example_raymarch.py +199 -178
- warp/examples/core/example_render_opengl.py +185 -141
- warp/examples/core/example_sph.py +405 -389
- warp/examples/core/example_torch.py +222 -181
- warp/examples/core/example_wave.py +263 -249
- warp/examples/fem/bsr_utils.py +378 -380
- warp/examples/fem/example_apic_fluid.py +407 -391
- warp/examples/fem/example_convection_diffusion.py +182 -168
- warp/examples/fem/example_convection_diffusion_dg.py +219 -209
- warp/examples/fem/example_convection_diffusion_dg0.py +204 -194
- warp/examples/fem/example_deformed_geometry.py +177 -159
- warp/examples/fem/example_diffusion.py +201 -173
- warp/examples/fem/example_diffusion_3d.py +177 -152
- warp/examples/fem/example_diffusion_mgpu.py +221 -214
- warp/examples/fem/example_mixed_elasticity.py +244 -222
- warp/examples/fem/example_navier_stokes.py +259 -243
- warp/examples/fem/example_stokes.py +220 -192
- warp/examples/fem/example_stokes_transfer.py +265 -249
- warp/examples/fem/mesh_utils.py +133 -109
- warp/examples/fem/plot_utils.py +292 -287
- warp/examples/optim/example_bounce.py +260 -248
- warp/examples/optim/example_cloth_throw.py +222 -210
- warp/examples/optim/example_diffray.py +566 -535
- warp/examples/optim/example_drone.py +864 -835
- warp/examples/optim/example_inverse_kinematics.py +176 -169
- warp/examples/optim/example_inverse_kinematics_torch.py +185 -170
- warp/examples/optim/example_spring_cage.py +239 -234
- warp/examples/optim/example_trajectory.py +223 -201
- warp/examples/optim/example_walker.py +306 -292
- warp/examples/sim/example_cartpole.py +139 -128
- warp/examples/sim/example_cloth.py +196 -184
- warp/examples/sim/example_granular.py +124 -113
- warp/examples/sim/example_granular_collision_sdf.py +197 -185
- warp/examples/sim/example_jacobian_ik.py +236 -213
- warp/examples/sim/example_particle_chain.py +118 -106
- warp/examples/sim/example_quadruped.py +193 -179
- warp/examples/sim/example_rigid_chain.py +197 -189
- warp/examples/sim/example_rigid_contact.py +189 -176
- warp/examples/sim/example_rigid_force.py +127 -126
- warp/examples/sim/example_rigid_gyroscopic.py +109 -97
- warp/examples/sim/example_rigid_soft_contact.py +134 -124
- warp/examples/sim/example_soft_body.py +190 -178
- warp/fabric.py +337 -335
- warp/fem/__init__.py +60 -27
- warp/fem/cache.py +401 -388
- warp/fem/dirichlet.py +178 -179
- warp/fem/domain.py +262 -263
- warp/fem/field/__init__.py +100 -101
- warp/fem/field/field.py +148 -149
- warp/fem/field/nodal_field.py +298 -299
- warp/fem/field/restriction.py +22 -21
- warp/fem/field/test.py +180 -181
- warp/fem/field/trial.py +183 -183
- warp/fem/geometry/__init__.py +15 -19
- warp/fem/geometry/closest_point.py +69 -70
- warp/fem/geometry/deformed_geometry.py +270 -271
- warp/fem/geometry/element.py +744 -744
- warp/fem/geometry/geometry.py +184 -186
- warp/fem/geometry/grid_2d.py +380 -373
- warp/fem/geometry/grid_3d.py +441 -435
- warp/fem/geometry/hexmesh.py +953 -953
- warp/fem/geometry/partition.py +374 -376
- warp/fem/geometry/quadmesh_2d.py +532 -532
- warp/fem/geometry/tetmesh.py +840 -840
- warp/fem/geometry/trimesh_2d.py +577 -577
- warp/fem/integrate.py +1630 -1615
- warp/fem/operator.py +190 -191
- warp/fem/polynomial.py +214 -213
- warp/fem/quadrature/__init__.py +2 -2
- warp/fem/quadrature/pic_quadrature.py +243 -245
- warp/fem/quadrature/quadrature.py +295 -294
- warp/fem/space/__init__.py +294 -292
- warp/fem/space/basis_space.py +488 -489
- warp/fem/space/collocated_function_space.py +100 -105
- warp/fem/space/dof_mapper.py +236 -236
- warp/fem/space/function_space.py +148 -145
- warp/fem/space/grid_2d_function_space.py +267 -267
- warp/fem/space/grid_3d_function_space.py +305 -306
- warp/fem/space/hexmesh_function_space.py +350 -352
- warp/fem/space/partition.py +350 -350
- warp/fem/space/quadmesh_2d_function_space.py +368 -369
- warp/fem/space/restriction.py +158 -160
- warp/fem/space/shape/__init__.py +13 -15
- warp/fem/space/shape/cube_shape_function.py +738 -738
- warp/fem/space/shape/shape_function.py +102 -103
- warp/fem/space/shape/square_shape_function.py +611 -611
- warp/fem/space/shape/tet_shape_function.py +565 -567
- warp/fem/space/shape/triangle_shape_function.py +429 -429
- warp/fem/space/tetmesh_function_space.py +294 -292
- warp/fem/space/topology.py +297 -295
- warp/fem/space/trimesh_2d_function_space.py +223 -221
- warp/fem/types.py +77 -77
- warp/fem/utils.py +495 -495
- warp/jax.py +166 -141
- warp/jax_experimental.py +341 -339
- warp/native/array.h +1072 -1025
- warp/native/builtin.h +1560 -1560
- warp/native/bvh.cpp +398 -398
- warp/native/bvh.cu +525 -525
- warp/native/bvh.h +429 -429
- warp/native/clang/clang.cpp +495 -464
- warp/native/crt.cpp +31 -31
- warp/native/crt.h +334 -334
- warp/native/cuda_crt.h +1049 -1049
- warp/native/cuda_util.cpp +549 -540
- warp/native/cuda_util.h +288 -203
- warp/native/cutlass_gemm.cpp +34 -34
- warp/native/cutlass_gemm.cu +372 -372
- warp/native/error.cpp +66 -66
- warp/native/error.h +27 -27
- warp/native/fabric.h +228 -228
- warp/native/hashgrid.cpp +301 -278
- warp/native/hashgrid.cu +78 -77
- warp/native/hashgrid.h +227 -227
- warp/native/initializer_array.h +32 -32
- warp/native/intersect.h +1204 -1204
- warp/native/intersect_adj.h +365 -365
- warp/native/intersect_tri.h +322 -322
- warp/native/marching.cpp +2 -2
- warp/native/marching.cu +497 -497
- warp/native/marching.h +2 -2
- warp/native/mat.h +1498 -1498
- warp/native/matnn.h +333 -333
- warp/native/mesh.cpp +203 -203
- warp/native/mesh.cu +293 -293
- warp/native/mesh.h +1887 -1887
- warp/native/nanovdb/NanoVDB.h +4782 -4782
- warp/native/nanovdb/PNanoVDB.h +2553 -2553
- warp/native/nanovdb/PNanoVDBWrite.h +294 -294
- warp/native/noise.h +850 -850
- warp/native/quat.h +1084 -1084
- warp/native/rand.h +299 -299
- warp/native/range.h +108 -108
- warp/native/reduce.cpp +156 -156
- warp/native/reduce.cu +348 -348
- warp/native/runlength_encode.cpp +61 -61
- warp/native/runlength_encode.cu +46 -46
- warp/native/scan.cpp +30 -30
- warp/native/scan.cu +36 -36
- warp/native/scan.h +7 -7
- warp/native/solid_angle.h +442 -442
- warp/native/sort.cpp +94 -94
- warp/native/sort.cu +97 -97
- warp/native/sort.h +14 -14
- warp/native/sparse.cpp +337 -337
- warp/native/sparse.cu +544 -544
- warp/native/spatial.h +630 -630
- warp/native/svd.h +562 -562
- warp/native/temp_buffer.h +30 -30
- warp/native/vec.h +1132 -1132
- warp/native/volume.cpp +297 -297
- warp/native/volume.cu +32 -32
- warp/native/volume.h +538 -538
- warp/native/volume_builder.cu +425 -425
- warp/native/volume_builder.h +19 -19
- warp/native/warp.cpp +1057 -1052
- warp/native/warp.cu +2943 -2828
- warp/native/warp.h +313 -305
- warp/optim/__init__.py +9 -9
- warp/optim/adam.py +120 -120
- warp/optim/linear.py +1104 -939
- warp/optim/sgd.py +104 -92
- warp/render/__init__.py +10 -10
- warp/render/render_opengl.py +3217 -3204
- warp/render/render_usd.py +768 -749
- warp/render/utils.py +152 -150
- warp/sim/__init__.py +52 -59
- warp/sim/articulation.py +685 -685
- warp/sim/collide.py +1594 -1590
- warp/sim/import_mjcf.py +489 -481
- warp/sim/import_snu.py +220 -221
- warp/sim/import_urdf.py +536 -516
- warp/sim/import_usd.py +887 -881
- warp/sim/inertia.py +316 -317
- warp/sim/integrator.py +234 -233
- warp/sim/integrator_euler.py +1956 -1956
- warp/sim/integrator_featherstone.py +1910 -1991
- warp/sim/integrator_xpbd.py +3294 -3312
- warp/sim/model.py +4473 -4314
- warp/sim/particles.py +113 -112
- warp/sim/render.py +417 -403
- warp/sim/utils.py +413 -410
- warp/sparse.py +1227 -1227
- warp/stubs.py +2109 -2469
- warp/tape.py +1162 -225
- warp/tests/__init__.py +1 -1
- warp/tests/__main__.py +4 -4
- warp/tests/assets/torus.usda +105 -105
- warp/tests/aux_test_class_kernel.py +26 -26
- warp/tests/aux_test_compile_consts_dummy.py +10 -10
- warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -21
- warp/tests/aux_test_dependent.py +22 -22
- warp/tests/aux_test_grad_customs.py +23 -23
- warp/tests/aux_test_reference.py +11 -11
- warp/tests/aux_test_reference_reference.py +10 -10
- warp/tests/aux_test_square.py +17 -17
- warp/tests/aux_test_unresolved_func.py +14 -14
- warp/tests/aux_test_unresolved_symbol.py +14 -14
- warp/tests/disabled_kinematics.py +239 -239
- warp/tests/run_coverage_serial.py +31 -31
- warp/tests/test_adam.py +157 -157
- warp/tests/test_arithmetic.py +1124 -1124
- warp/tests/test_array.py +2417 -2326
- warp/tests/test_array_reduce.py +150 -150
- warp/tests/test_async.py +668 -656
- warp/tests/test_atomic.py +141 -141
- warp/tests/test_bool.py +204 -149
- warp/tests/test_builtins_resolution.py +1292 -1292
- warp/tests/test_bvh.py +164 -171
- warp/tests/test_closest_point_edge_edge.py +228 -228
- warp/tests/test_codegen.py +566 -553
- warp/tests/test_compile_consts.py +97 -101
- warp/tests/test_conditional.py +246 -246
- warp/tests/test_copy.py +232 -215
- warp/tests/test_ctypes.py +632 -632
- warp/tests/test_dense.py +67 -67
- warp/tests/test_devices.py +91 -98
- warp/tests/test_dlpack.py +530 -529
- warp/tests/test_examples.py +400 -378
- warp/tests/test_fabricarray.py +955 -955
- warp/tests/test_fast_math.py +62 -54
- warp/tests/test_fem.py +1277 -1278
- warp/tests/test_fp16.py +130 -130
- warp/tests/test_func.py +338 -337
- warp/tests/test_generics.py +571 -571
- warp/tests/test_grad.py +746 -640
- warp/tests/test_grad_customs.py +333 -336
- warp/tests/test_hash_grid.py +210 -164
- warp/tests/test_import.py +39 -39
- warp/tests/test_indexedarray.py +1134 -1134
- warp/tests/test_intersect.py +67 -67
- warp/tests/test_jax.py +307 -307
- warp/tests/test_large.py +167 -164
- warp/tests/test_launch.py +354 -354
- warp/tests/test_lerp.py +261 -261
- warp/tests/test_linear_solvers.py +191 -171
- warp/tests/test_lvalue.py +421 -493
- warp/tests/test_marching_cubes.py +65 -65
- warp/tests/test_mat.py +1801 -1827
- warp/tests/test_mat_lite.py +115 -115
- warp/tests/test_mat_scalar_ops.py +2907 -2889
- warp/tests/test_math.py +126 -193
- warp/tests/test_matmul.py +500 -499
- warp/tests/test_matmul_lite.py +410 -410
- warp/tests/test_mempool.py +188 -190
- warp/tests/test_mesh.py +284 -324
- warp/tests/test_mesh_query_aabb.py +228 -241
- warp/tests/test_mesh_query_point.py +692 -702
- warp/tests/test_mesh_query_ray.py +292 -303
- warp/tests/test_mlp.py +276 -276
- warp/tests/test_model.py +110 -110
- warp/tests/test_modules_lite.py +39 -39
- warp/tests/test_multigpu.py +163 -163
- warp/tests/test_noise.py +248 -248
- warp/tests/test_operators.py +250 -250
- warp/tests/test_options.py +123 -125
- warp/tests/test_peer.py +133 -137
- warp/tests/test_pinned.py +78 -78
- warp/tests/test_print.py +54 -54
- warp/tests/test_quat.py +2086 -2086
- warp/tests/test_rand.py +288 -288
- warp/tests/test_reload.py +217 -217
- warp/tests/test_rounding.py +179 -179
- warp/tests/test_runlength_encode.py +190 -190
- warp/tests/test_sim_grad.py +243 -0
- warp/tests/test_sim_kinematics.py +91 -97
- warp/tests/test_smoothstep.py +168 -168
- warp/tests/test_snippet.py +305 -266
- warp/tests/test_sparse.py +468 -460
- warp/tests/test_spatial.py +2148 -2148
- warp/tests/test_streams.py +486 -473
- warp/tests/test_struct.py +710 -675
- warp/tests/test_tape.py +173 -148
- warp/tests/test_torch.py +743 -743
- warp/tests/test_transient_module.py +87 -87
- warp/tests/test_types.py +556 -659
- warp/tests/test_utils.py +490 -499
- warp/tests/test_vec.py +1264 -1268
- warp/tests/test_vec_lite.py +73 -73
- warp/tests/test_vec_scalar_ops.py +2099 -2099
- warp/tests/test_verify_fp.py +94 -94
- warp/tests/test_volume.py +737 -736
- warp/tests/test_volume_write.py +255 -265
- warp/tests/unittest_serial.py +37 -37
- warp/tests/unittest_suites.py +363 -359
- warp/tests/unittest_utils.py +603 -578
- warp/tests/unused_test_misc.py +71 -71
- warp/tests/walkthrough_debug.py +85 -85
- warp/thirdparty/appdirs.py +598 -598
- warp/thirdparty/dlpack.py +143 -143
- warp/thirdparty/unittest_parallel.py +566 -561
- warp/torch.py +321 -295
- warp/types.py +4504 -4450
- warp/utils.py +1008 -821
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/LICENSE.md +126 -126
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/METADATA +338 -400
- warp_lang-1.1.0.dist-info/RECORD +352 -0
- warp/examples/assets/cube.usda +0 -42
- warp/examples/assets/sphere.usda +0 -56
- warp/examples/assets/torus.usda +0 -105
- warp_lang-1.0.1.dist-info/RECORD +0 -352
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/top_level.txt +0 -0
warp/native/spatial.h
CHANGED
|
@@ -1,631 +1,631 @@
|
|
|
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
|
-
#pragma once
|
|
10
|
-
|
|
11
|
-
namespace wp
|
|
12
|
-
{
|
|
13
|
-
|
|
14
|
-
//---------------------------------------------------------------------------------
|
|
15
|
-
// Represents a twist in se(3)
|
|
16
|
-
template <typename Type>
|
|
17
|
-
using spatial_vector_t = vec_t<6,Type>;
|
|
18
|
-
|
|
19
|
-
template<typename Type>
|
|
20
|
-
CUDA_CALLABLE inline Type spatial_dot(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b)
|
|
21
|
-
{
|
|
22
|
-
return dot(a, b);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
template<typename Type>
|
|
26
|
-
CUDA_CALLABLE inline vec_t<3,Type> &w_vec( spatial_vector_t<Type>& a )
|
|
27
|
-
{
|
|
28
|
-
return *(vec_t<3,Type>*)(&a);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
template<typename Type>
|
|
32
|
-
CUDA_CALLABLE inline vec_t<3,Type> &v_vec( spatial_vector_t<Type>& a )
|
|
33
|
-
{
|
|
34
|
-
return *(vec_t<3,Type>*)(&a.c[3]);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
template<typename Type>
|
|
38
|
-
CUDA_CALLABLE inline const vec_t<3,Type> &w_vec( const spatial_vector_t<Type>& a )
|
|
39
|
-
{
|
|
40
|
-
spatial_vector_t<Type> &non_const_vec = *(spatial_vector_t<Type>*)(const_cast<Type*>(&a.c[0]));
|
|
41
|
-
return w_vec(non_const_vec);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
template<typename Type>
|
|
45
|
-
CUDA_CALLABLE inline const vec_t<3,Type> &v_vec( const spatial_vector_t<Type>& a )
|
|
46
|
-
{
|
|
47
|
-
spatial_vector_t<Type> &non_const_vec = *(spatial_vector_t<Type>*)(const_cast<Type*>(&a.c[0]));
|
|
48
|
-
return v_vec(non_const_vec);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
template<typename Type>
|
|
52
|
-
CUDA_CALLABLE inline spatial_vector_t<Type> spatial_cross(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b)
|
|
53
|
-
{
|
|
54
|
-
vec_t<3,Type> w = cross(w_vec(a), w_vec(b));
|
|
55
|
-
vec_t<3,Type> v = cross(v_vec(a), w_vec(b)) + cross(w_vec(a), v_vec(b));
|
|
56
|
-
|
|
57
|
-
return spatial_vector_t<Type>({w[0], w[1], w[2], v[0], v[1], v[2]});
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
template<typename Type>
|
|
61
|
-
CUDA_CALLABLE inline spatial_vector_t<Type> spatial_cross_dual(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b)
|
|
62
|
-
{
|
|
63
|
-
vec_t<3,Type> w = cross(w_vec(a), w_vec(b)) + cross(v_vec(a), v_vec(b));
|
|
64
|
-
vec_t<3,Type> v = cross(w_vec(a), v_vec(b));
|
|
65
|
-
|
|
66
|
-
return spatial_vector_t<Type>({w[0], w[1], w[2], v[0], v[1], v[2]});
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
template<typename Type>
|
|
70
|
-
CUDA_CALLABLE inline vec_t<3,Type> spatial_top(const spatial_vector_t<Type>& a)
|
|
71
|
-
{
|
|
72
|
-
return w_vec(a);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
template<typename Type>
|
|
76
|
-
CUDA_CALLABLE inline vec_t<3,Type> spatial_bottom(const spatial_vector_t<Type>& a)
|
|
77
|
-
{
|
|
78
|
-
return v_vec(a);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
template<typename Type>
|
|
82
|
-
CUDA_CALLABLE inline void adj_spatial_dot(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b, spatial_vector_t<Type>& adj_a, spatial_vector_t<Type>& adj_b, const Type& adj_ret)
|
|
83
|
-
{
|
|
84
|
-
adj_dot(a, b, adj_a, adj_b, adj_ret);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
template<typename Type>
|
|
88
|
-
CUDA_CALLABLE inline void adj_spatial_cross(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b, spatial_vector_t<Type>& adj_a, spatial_vector_t<Type>& adj_b, const spatial_vector_t<Type>& adj_ret)
|
|
89
|
-
{
|
|
90
|
-
adj_cross(w_vec(a), w_vec(b), w_vec(adj_a), w_vec(adj_b), w_vec(adj_ret));
|
|
91
|
-
|
|
92
|
-
adj_cross(v_vec(a), w_vec(b), v_vec(adj_a), w_vec(adj_b), v_vec(adj_ret));
|
|
93
|
-
adj_cross(w_vec(a), v_vec(b), w_vec(adj_a), v_vec(adj_b), v_vec(adj_ret));
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
template<typename Type>
|
|
97
|
-
CUDA_CALLABLE inline void adj_spatial_cross_dual(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b, spatial_vector_t<Type>& adj_a, spatial_vector_t<Type>& adj_b, const spatial_vector_t<Type>& adj_ret)
|
|
98
|
-
{
|
|
99
|
-
adj_cross(w_vec(a), w_vec(b), w_vec(adj_a), w_vec(adj_b), w_vec(adj_ret));
|
|
100
|
-
adj_cross(v_vec(a), v_vec(b), v_vec(adj_a), v_vec(adj_b), w_vec(adj_ret));
|
|
101
|
-
|
|
102
|
-
adj_cross(w_vec(a), v_vec(b), w_vec(adj_a), v_vec(adj_b), v_vec(adj_ret));
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
template<typename Type>
|
|
106
|
-
CUDA_CALLABLE inline void adj_spatial_top(const spatial_vector_t<Type>& a, spatial_vector_t<Type>& adj_a, const vec_t<3,Type>& adj_ret)
|
|
107
|
-
{
|
|
108
|
-
w_vec(adj_a) += adj_ret;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
template<typename Type>
|
|
112
|
-
CUDA_CALLABLE inline void adj_spatial_bottom(const spatial_vector_t<Type>& a, spatial_vector_t<Type>& adj_a, const vec_t<3,Type>& adj_ret)
|
|
113
|
-
{
|
|
114
|
-
v_vec(adj_a) += adj_ret;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
//---------------------------------------------------------------------------------
|
|
119
|
-
// Represents a rigid body transform<Type>ation
|
|
120
|
-
|
|
121
|
-
template<typename Type>
|
|
122
|
-
struct transform_t
|
|
123
|
-
{
|
|
124
|
-
vec_t<3,Type> p;
|
|
125
|
-
quat_t<Type> q;
|
|
126
|
-
|
|
127
|
-
CUDA_CALLABLE inline transform_t(vec_t<3,Type> p=vec_t<3,Type>(), quat_t<Type> q=quat_t<Type>()) : p(p), q(q) {}
|
|
128
|
-
CUDA_CALLABLE inline transform_t(Type) {} // helps uniform initialization
|
|
129
|
-
|
|
130
|
-
CUDA_CALLABLE inline Type operator[](int index) const
|
|
131
|
-
{
|
|
132
|
-
assert(index < 7);
|
|
133
|
-
|
|
134
|
-
return p.c[index];
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
CUDA_CALLABLE inline Type& operator[](int index)
|
|
138
|
-
{
|
|
139
|
-
assert(index < 7);
|
|
140
|
-
|
|
141
|
-
return p.c[index];
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
template<typename Type=float32>
|
|
146
|
-
CUDA_CALLABLE inline transform_t<Type> transform_identity()
|
|
147
|
-
{
|
|
148
|
-
return transform_t<Type>(vec_t<3,Type>(), quat_identity<Type>());
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
template<typename Type>
|
|
152
|
-
inline CUDA_CALLABLE bool operator==(const transform_t<Type>& a, const transform_t<Type>& b)
|
|
153
|
-
{
|
|
154
|
-
return a.p == b.p && a.q == b.q;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
template<typename Type>
|
|
159
|
-
inline bool CUDA_CALLABLE isfinite(const transform_t<Type>& t)
|
|
160
|
-
{
|
|
161
|
-
return isfinite(t.p) && isfinite(t.q);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
template<typename Type>
|
|
165
|
-
CUDA_CALLABLE inline vec_t<3,Type> transform_get_translation(const transform_t<Type>& t)
|
|
166
|
-
{
|
|
167
|
-
return t.p;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
template<typename Type>
|
|
171
|
-
CUDA_CALLABLE inline quat_t<Type> transform_get_rotation(const transform_t<Type>& t)
|
|
172
|
-
{
|
|
173
|
-
return t.q;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
template<typename Type>
|
|
177
|
-
CUDA_CALLABLE inline transform_t<Type> transform_multiply(const transform_t<Type>& a, const transform_t<Type>& b)
|
|
178
|
-
{
|
|
179
|
-
return { quat_rotate(a.q, b.p) + a.p, mul(a.q, b.q) };
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
template<typename Type>
|
|
183
|
-
CUDA_CALLABLE inline void adj_transform_multiply(const transform_t<Type>& a, const transform_t<Type>& b, transform_t<Type>& adj_a, transform_t<Type>& adj_b, const transform_t<Type>& adj_ret)
|
|
184
|
-
{
|
|
185
|
-
// translational part
|
|
186
|
-
adj_quat_rotate(a.q, b.p, adj_a.q, adj_b.p, adj_ret.p);
|
|
187
|
-
adj_a.p += adj_ret.p;
|
|
188
|
-
|
|
189
|
-
// rotational part
|
|
190
|
-
adj_mul(a.q, b.q, adj_a.q, adj_b.q, adj_ret.q);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
template<typename Type>
|
|
195
|
-
CUDA_CALLABLE inline transform_t<Type> transform_inverse(const transform_t<Type>& t)
|
|
196
|
-
{
|
|
197
|
-
quat_t<Type> q_inv = quat_inverse(t.q);
|
|
198
|
-
return transform_t<Type>(-quat_rotate(q_inv, t.p), q_inv);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
template<typename Type>
|
|
203
|
-
CUDA_CALLABLE inline vec_t<3,Type> transform_vector(const transform_t<Type>& t, const vec_t<3,Type>& x)
|
|
204
|
-
{
|
|
205
|
-
return quat_rotate(t.q, x);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
template<typename Type>
|
|
209
|
-
CUDA_CALLABLE inline vec_t<3,Type> transform_point(const transform_t<Type>& t, const vec_t<3,Type>& x)
|
|
210
|
-
{
|
|
211
|
-
return t.p + quat_rotate(t.q, x);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// not totally sure why you'd want to do this seeing as adding/subtracting two rotation
|
|
215
|
-
// quats doesn't seem to do anything meaningful
|
|
216
|
-
template<typename Type>
|
|
217
|
-
CUDA_CALLABLE inline transform_t<Type> add(const transform_t<Type>& a, const transform_t<Type>& b)
|
|
218
|
-
{
|
|
219
|
-
return { a.p + b.p, a.q + b.q };
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
template<typename Type>
|
|
223
|
-
CUDA_CALLABLE inline transform_t<Type> sub(const transform_t<Type>& a, const transform_t<Type>& b)
|
|
224
|
-
{
|
|
225
|
-
return { a.p - b.p, a.q - b.q };
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// also not sure why you'd want to do this seeing as the quat would end up unnormalized
|
|
229
|
-
template<typename Type>
|
|
230
|
-
CUDA_CALLABLE inline transform_t<Type> mul(const transform_t<Type>& a, Type s)
|
|
231
|
-
{
|
|
232
|
-
return { a.p*s, a.q*s };
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
template<typename Type>
|
|
236
|
-
CUDA_CALLABLE inline transform_t<Type> mul(Type s, const transform_t<Type>& a)
|
|
237
|
-
{
|
|
238
|
-
return mul(a, s);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
template<typename Type>
|
|
242
|
-
CUDA_CALLABLE inline transform_t<Type> mul(const transform_t<Type>& a, const transform_t<Type>& b)
|
|
243
|
-
{
|
|
244
|
-
return transform_multiply(a, b);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
template<typename Type>
|
|
248
|
-
CUDA_CALLABLE inline transform_t<Type> operator*(const transform_t<Type>& a, Type s)
|
|
249
|
-
{
|
|
250
|
-
return mul(a, s);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
template<typename Type>
|
|
254
|
-
CUDA_CALLABLE inline transform_t<Type> operator*(Type s, const transform_t<Type>& a)
|
|
255
|
-
{
|
|
256
|
-
return mul(a, s);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
template<typename Type>
|
|
261
|
-
inline CUDA_CALLABLE Type tensordot(const transform_t<Type>& a, const transform_t<Type>& b)
|
|
262
|
-
{
|
|
263
|
-
// corresponds to `np.tensordot()` with all axes being contracted
|
|
264
|
-
return tensordot(a.p, b.p) + tensordot(a.q, b.q);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
template<typename Type>
|
|
268
|
-
inline CUDA_CALLABLE Type extract(const transform_t<Type>& t, int i)
|
|
269
|
-
{
|
|
270
|
-
return t[i];
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
template<typename Type>
|
|
274
|
-
inline void CUDA_CALLABLE adj_extract(const transform_t<Type>& t, int i, transform_t<Type>& adj_t, int& adj_i, Type adj_ret)
|
|
275
|
-
{
|
|
276
|
-
adj_t[i] += adj_ret;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
// adjoint methods
|
|
281
|
-
template<typename Type>
|
|
282
|
-
CUDA_CALLABLE inline void adj_add(const transform_t<Type>& a, const transform_t<Type>& b, transform_t<Type>& adj_a, transform_t<Type>& adj_b, const transform_t<Type>& adj_ret)
|
|
283
|
-
{
|
|
284
|
-
adj_add(a.p, b.p, adj_a.p, adj_b.p, adj_ret.p);
|
|
285
|
-
adj_add(a.q, b.q, adj_a.q, adj_b.q, adj_ret.q);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
template<typename Type>
|
|
289
|
-
CUDA_CALLABLE inline void adj_sub(const transform_t<Type>& a, const transform_t<Type>& b, transform_t<Type>& adj_a, transform_t<Type>& adj_b, const transform_t<Type>& adj_ret)
|
|
290
|
-
{
|
|
291
|
-
adj_sub(a.p, b.p, adj_a.p, adj_b.p, adj_ret.p);
|
|
292
|
-
adj_sub(a.q, b.q, adj_a.q, adj_b.q, adj_ret.q);
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
template<typename Type>
|
|
296
|
-
CUDA_CALLABLE inline void adj_mul(const transform_t<Type>& a, Type s, transform_t<Type>& adj_a, Type& adj_s, const transform_t<Type>& adj_ret)
|
|
297
|
-
{
|
|
298
|
-
adj_mul(a.p, s, adj_a.p, adj_s, adj_ret.p);
|
|
299
|
-
adj_mul(a.q, s, adj_a.q, adj_s, adj_ret.q);
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
template<typename Type>
|
|
303
|
-
CUDA_CALLABLE inline void adj_mul(Type s, const transform_t<Type>& a, Type& adj_s, transform_t<Type>& adj_a, const transform_t<Type>& adj_ret)
|
|
304
|
-
{
|
|
305
|
-
adj_mul(a, s, adj_a, adj_s, adj_ret);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
template<typename Type>
|
|
309
|
-
CUDA_CALLABLE inline void adj_mul(const transform_t<Type>& a, const transform_t<Type>& b, transform_t<Type>& adj_a, transform_t<Type>& adj_b, const transform_t<Type>& adj_ret)
|
|
310
|
-
{
|
|
311
|
-
adj_transform_multiply(a, b, adj_a, adj_b, adj_ret);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
template<typename Type>
|
|
316
|
-
inline CUDA_CALLABLE transform_t<Type> atomic_add(transform_t<Type>* addr, const transform_t<Type>& value)
|
|
317
|
-
{
|
|
318
|
-
vec_t<3,Type> p = atomic_add(&addr->p, value.p);
|
|
319
|
-
quat_t<Type> q = atomic_add(&addr->q, value.q);
|
|
320
|
-
|
|
321
|
-
return transform_t<Type>(p, q);
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
template<typename Type>
|
|
325
|
-
CUDA_CALLABLE inline void adj_transform_t(const vec_t<3,Type>& p, const quat_t<Type>& q, vec_t<3,Type>& adj_p, quat_t<Type>& adj_q, const transform_t<Type>& adj_ret)
|
|
326
|
-
{
|
|
327
|
-
adj_p += adj_ret.p;
|
|
328
|
-
adj_q += adj_ret.q;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
template<typename Type>
|
|
332
|
-
CUDA_CALLABLE inline void adj_transform_get_translation(const transform_t<Type>& t, transform_t<Type>& adj_t, const vec_t<3,Type>& adj_ret)
|
|
333
|
-
{
|
|
334
|
-
adj_t.p += adj_ret;
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
template<typename Type>
|
|
338
|
-
CUDA_CALLABLE inline void adj_transform_get_rotation(const transform_t<Type>& t, transform_t<Type>& adj_t, const quat_t<Type>& adj_ret)
|
|
339
|
-
{
|
|
340
|
-
adj_t.q += adj_ret;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
template<typename Type>
|
|
344
|
-
CUDA_CALLABLE inline void adj_transform_inverse(const transform_t<Type>& t, transform_t<Type>& adj_t, const transform_t<Type>& adj_ret)
|
|
345
|
-
{
|
|
346
|
-
|
|
347
|
-
// forward
|
|
348
|
-
quat_t<Type> q_inv = quat_inverse(t.q);
|
|
349
|
-
vec_t<3,Type> p = quat_rotate(q_inv, t.p);
|
|
350
|
-
vec_t<3,Type> np = -p;
|
|
351
|
-
// transform<Type> t = transform<Type>(np, q_inv)
|
|
352
|
-
|
|
353
|
-
// backward
|
|
354
|
-
quat_t<Type> adj_q_inv(0.0f);
|
|
355
|
-
quat_t<Type> adj_q(0.0f);
|
|
356
|
-
vec_t<3,Type> adj_p(0.0f);
|
|
357
|
-
vec_t<3,Type> adj_np(0.0f);
|
|
358
|
-
|
|
359
|
-
adj_transform_t(np, q_inv, adj_np, adj_q_inv, adj_ret);
|
|
360
|
-
adj_p = -adj_np;
|
|
361
|
-
adj_quat_rotate(q_inv, t.p, adj_q_inv, adj_t.p, adj_p);
|
|
362
|
-
adj_quat_inverse(t.q, adj_t.q, adj_q_inv);
|
|
363
|
-
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
template<typename Type>
|
|
367
|
-
CUDA_CALLABLE inline void adj_transform_vector(const transform_t<Type>& t, const vec_t<3,Type>& x, transform_t<Type>& adj_t, vec_t<3,Type>& adj_x, const vec_t<3,Type>& adj_ret)
|
|
368
|
-
{
|
|
369
|
-
adj_quat_rotate(t.q, x, adj_t.q, adj_x, adj_ret);
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
template<typename Type>
|
|
373
|
-
CUDA_CALLABLE inline void adj_transform_point(const transform_t<Type>& t, const vec_t<3,Type>& x, transform_t<Type>& adj_t, vec_t<3,Type>& adj_x, const vec_t<3,Type>& adj_ret)
|
|
374
|
-
{
|
|
375
|
-
adj_quat_rotate(t.q, x, adj_t.q, adj_x, adj_ret);
|
|
376
|
-
adj_t.p += adj_ret;
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
template<typename Type>
|
|
381
|
-
CUDA_CALLABLE void print(transform_t<Type> t);
|
|
382
|
-
|
|
383
|
-
template<typename Type>
|
|
384
|
-
CUDA_CALLABLE inline transform_t<Type> lerp(const transform_t<Type>& a, const transform_t<Type>& b, Type t)
|
|
385
|
-
{
|
|
386
|
-
return a*(Type(1)-t) + b*t;
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
template<typename Type>
|
|
390
|
-
CUDA_CALLABLE inline void adj_lerp(const transform_t<Type>& a, const transform_t<Type>& b, Type t, transform_t<Type>& adj_a, transform_t<Type>& adj_b, Type& adj_t, const transform_t<Type>& adj_ret)
|
|
391
|
-
{
|
|
392
|
-
adj_a += adj_ret*(Type(1)-t);
|
|
393
|
-
adj_b += adj_ret*t;
|
|
394
|
-
adj_t += tensordot(b, adj_ret) - tensordot(a, adj_ret);
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
template<typename Type>
|
|
398
|
-
using spatial_matrix_t = mat_t<6,6,Type>;
|
|
399
|
-
|
|
400
|
-
template<typename Type>
|
|
401
|
-
inline CUDA_CALLABLE spatial_matrix_t<Type> spatial_adjoint(const mat_t<3,3,Type>& R, const mat_t<3,3,Type>& S)
|
|
402
|
-
{
|
|
403
|
-
spatial_matrix_t<Type> adT;
|
|
404
|
-
|
|
405
|
-
// T = [Rah, 0]
|
|
406
|
-
// [S R]
|
|
407
|
-
|
|
408
|
-
// diagonal blocks
|
|
409
|
-
for (int i=0; i < 3; ++i)
|
|
410
|
-
{
|
|
411
|
-
for (int j=0; j < 3; ++j)
|
|
412
|
-
{
|
|
413
|
-
adT.data[i][j] = R.data[i][j];
|
|
414
|
-
adT.data[i+3][j+3] = R.data[i][j];
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
// lower off diagonal
|
|
419
|
-
for (int i=0; i < 3; ++i)
|
|
420
|
-
{
|
|
421
|
-
for (int j=0; j < 3; ++j)
|
|
422
|
-
{
|
|
423
|
-
adT.data[i+3][j] = S.data[i][j];
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
return adT;
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
template<typename Type>
|
|
431
|
-
inline CUDA_CALLABLE void adj_spatial_adjoint(const mat_t<3,3,Type>& R, const mat_t<3,3,Type>& S, mat_t<3,3,Type>& adj_R, mat_t<3,3,Type>& adj_S, const spatial_matrix_t<Type>& adj_ret)
|
|
432
|
-
{
|
|
433
|
-
// diagonal blocks
|
|
434
|
-
for (int i=0; i < 3; ++i)
|
|
435
|
-
{
|
|
436
|
-
for (int j=0; j < 3; ++j)
|
|
437
|
-
{
|
|
438
|
-
adj_R.data[i][j] += adj_ret.data[i][j];
|
|
439
|
-
adj_R.data[i][j] += adj_ret.data[i+3][j+3];
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
// lower off diagonal
|
|
444
|
-
for (int i=0; i < 3; ++i)
|
|
445
|
-
{
|
|
446
|
-
for (int j=0; j < 3; ++j)
|
|
447
|
-
{
|
|
448
|
-
adj_S.data[i][j] += adj_ret.data[i+3][j];
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
CUDA_CALLABLE inline int row_index(int stride, int i, int j)
|
|
455
|
-
{
|
|
456
|
-
return i*stride + j;
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
// builds spatial Jacobian J which is an (joint_count*6)x(dof_count) matrix
|
|
460
|
-
template<typename Type>
|
|
461
|
-
CUDA_CALLABLE inline void spatial_jacobian(
|
|
462
|
-
const spatial_vector_t<Type>* S,
|
|
463
|
-
const int* joint_parents,
|
|
464
|
-
const int* joint_qd_start,
|
|
465
|
-
int joint_start, // offset of the first joint for the articulation
|
|
466
|
-
int joint_count,
|
|
467
|
-
int J_start,
|
|
468
|
-
Type* J)
|
|
469
|
-
{
|
|
470
|
-
const int articulation_dof_start = joint_qd_start[joint_start];
|
|
471
|
-
const int articulation_dof_end = joint_qd_start[joint_start + joint_count];
|
|
472
|
-
const int articulation_dof_count = articulation_dof_end-articulation_dof_start;
|
|
473
|
-
|
|
474
|
-
// shift output pointers
|
|
475
|
-
const int S_start = articulation_dof_start;
|
|
476
|
-
|
|
477
|
-
S += S_start;
|
|
478
|
-
J += J_start;
|
|
479
|
-
|
|
480
|
-
for (int i=0; i < joint_count; ++i)
|
|
481
|
-
{
|
|
482
|
-
const int row_start = i * 6;
|
|
483
|
-
|
|
484
|
-
int j = joint_start + i;
|
|
485
|
-
while (j != -1)
|
|
486
|
-
{
|
|
487
|
-
const int joint_dof_start = joint_qd_start[j];
|
|
488
|
-
const int joint_dof_end = joint_qd_start[j+1];
|
|
489
|
-
const int joint_dof_count = joint_dof_end-joint_dof_start;
|
|
490
|
-
|
|
491
|
-
// fill out each row of the Jacobian walking up the tree
|
|
492
|
-
//for (int col=dof_start; col < dof_end; ++col)
|
|
493
|
-
for (int dof=0; dof < joint_dof_count; ++dof)
|
|
494
|
-
{
|
|
495
|
-
const int col = (joint_dof_start-articulation_dof_start) + dof;
|
|
496
|
-
|
|
497
|
-
J[row_index(articulation_dof_count, row_start+0, col)] = S[col].w[0];
|
|
498
|
-
J[row_index(articulation_dof_count, row_start+1, col)] = S[col].w[1];
|
|
499
|
-
J[row_index(articulation_dof_count, row_start+2, col)] = S[col].w[2];
|
|
500
|
-
J[row_index(articulation_dof_count, row_start+3, col)] = S[col].v[0];
|
|
501
|
-
J[row_index(articulation_dof_count, row_start+4, col)] = S[col].v[1];
|
|
502
|
-
J[row_index(articulation_dof_count, row_start+5, col)] = S[col].v[2];
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
j = joint_parents[j];
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
template<typename Type>
|
|
511
|
-
CUDA_CALLABLE inline void adj_spatial_jacobian(
|
|
512
|
-
const spatial_vector_t<Type>* S,
|
|
513
|
-
const int* joint_parents,
|
|
514
|
-
const int* joint_qd_start,
|
|
515
|
-
const int joint_start,
|
|
516
|
-
const int joint_count,
|
|
517
|
-
const int J_start,
|
|
518
|
-
const Type* J,
|
|
519
|
-
// adjs
|
|
520
|
-
spatial_vector_t<Type>* adj_S,
|
|
521
|
-
int* adj_joint_parents,
|
|
522
|
-
int* adj_joint_qd_start,
|
|
523
|
-
int& adj_joint_start,
|
|
524
|
-
int& adj_joint_count,
|
|
525
|
-
int& adj_J_start,
|
|
526
|
-
const Type* adj_J)
|
|
527
|
-
{
|
|
528
|
-
const int articulation_dof_start = joint_qd_start[joint_start];
|
|
529
|
-
const int articulation_dof_end = joint_qd_start[joint_start + joint_count];
|
|
530
|
-
const int articulation_dof_count = articulation_dof_end-articulation_dof_start;
|
|
531
|
-
|
|
532
|
-
// shift output pointers
|
|
533
|
-
const int S_start = articulation_dof_start;
|
|
534
|
-
|
|
535
|
-
S += S_start;
|
|
536
|
-
J += J_start;
|
|
537
|
-
|
|
538
|
-
adj_S += S_start;
|
|
539
|
-
adj_J += J_start;
|
|
540
|
-
|
|
541
|
-
for (int i=0; i < joint_count; ++i)
|
|
542
|
-
{
|
|
543
|
-
const int row_start = i * 6;
|
|
544
|
-
|
|
545
|
-
int j = joint_start + i;
|
|
546
|
-
while (j != -1)
|
|
547
|
-
{
|
|
548
|
-
const int joint_dof_start = joint_qd_start[j];
|
|
549
|
-
const int joint_dof_end = joint_qd_start[j+1];
|
|
550
|
-
const int joint_dof_count = joint_dof_end-joint_dof_start;
|
|
551
|
-
|
|
552
|
-
// fill out each row of the Jacobian walking up the tree
|
|
553
|
-
//for (int col=dof_start; col < dof_end; ++col)
|
|
554
|
-
for (int dof=0; dof < joint_dof_count; ++dof)
|
|
555
|
-
{
|
|
556
|
-
const int col = (joint_dof_start-articulation_dof_start) + dof;
|
|
557
|
-
|
|
558
|
-
adj_S[col].w[0] += adj_J[row_index(articulation_dof_count, row_start+0, col)];
|
|
559
|
-
adj_S[col].w[1] += adj_J[row_index(articulation_dof_count, row_start+1, col)];
|
|
560
|
-
adj_S[col].w[2] += adj_J[row_index(articulation_dof_count, row_start+2, col)];
|
|
561
|
-
adj_S[col].v[0] += adj_J[row_index(articulation_dof_count, row_start+3, col)];
|
|
562
|
-
adj_S[col].v[1] += adj_J[row_index(articulation_dof_count, row_start+4, col)];
|
|
563
|
-
adj_S[col].v[2] += adj_J[row_index(articulation_dof_count, row_start+5, col)];
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
j = joint_parents[j];
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
template<typename Type>
|
|
573
|
-
CUDA_CALLABLE inline void spatial_mass(const spatial_matrix_t<Type>* I_s, int joint_start, int joint_count, int M_start, Type* M)
|
|
574
|
-
{
|
|
575
|
-
const int stride = joint_count*6;
|
|
576
|
-
|
|
577
|
-
for (int l=0; l < joint_count; ++l)
|
|
578
|
-
{
|
|
579
|
-
for (int i=0; i < 6; ++i)
|
|
580
|
-
{
|
|
581
|
-
for (int j=0; j < 6; ++j)
|
|
582
|
-
{
|
|
583
|
-
M[M_start + row_index(stride, l*6 + i, l*6 + j)] = I_s[joint_start + l].data[i][j];
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
template<typename Type>
|
|
590
|
-
CUDA_CALLABLE inline void adj_spatial_mass(
|
|
591
|
-
const spatial_matrix_t<Type>* I_s,
|
|
592
|
-
const int joint_start,
|
|
593
|
-
const int joint_count,
|
|
594
|
-
const int M_start,
|
|
595
|
-
const Type* M,
|
|
596
|
-
spatial_matrix_t<Type>* adj_I_s,
|
|
597
|
-
int& adj_joint_start,
|
|
598
|
-
int& adj_joint_count,
|
|
599
|
-
int& adj_M_start,
|
|
600
|
-
const Type* adj_M)
|
|
601
|
-
{
|
|
602
|
-
const int stride = joint_count*6;
|
|
603
|
-
|
|
604
|
-
for (int l=0; l < joint_count; ++l)
|
|
605
|
-
{
|
|
606
|
-
for (int i=0; i < 6; ++i)
|
|
607
|
-
{
|
|
608
|
-
for (int j=0; j < 6; ++j)
|
|
609
|
-
{
|
|
610
|
-
adj_I_s[joint_start + l].data[i][j] += adj_M[M_start + row_index(stride, l*6 + i, l*6 + j)];
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
using transform = transform_t<float>;
|
|
617
|
-
using transformh = transform_t<half>;
|
|
618
|
-
using transformf = transform_t<float>;
|
|
619
|
-
using transformd = transform_t<double>;
|
|
620
|
-
|
|
621
|
-
using spatial_vector = spatial_vector_t<float>;
|
|
622
|
-
using spatial_vectorh = spatial_vector_t<half>;
|
|
623
|
-
using spatial_vectorf = spatial_vector_t<float>;
|
|
624
|
-
using spatial_vectord = spatial_vector_t<double>;
|
|
625
|
-
|
|
626
|
-
using spatial_matrix = spatial_matrix_t<float>;
|
|
627
|
-
using spatial_matrixh = spatial_matrix_t<half>;
|
|
628
|
-
using spatial_matrixf = spatial_matrix_t<float>;
|
|
629
|
-
using spatial_matrixd = spatial_matrix_t<double>;
|
|
630
|
-
|
|
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
|
+
#pragma once
|
|
10
|
+
|
|
11
|
+
namespace wp
|
|
12
|
+
{
|
|
13
|
+
|
|
14
|
+
//---------------------------------------------------------------------------------
|
|
15
|
+
// Represents a twist in se(3)
|
|
16
|
+
template <typename Type>
|
|
17
|
+
using spatial_vector_t = vec_t<6,Type>;
|
|
18
|
+
|
|
19
|
+
template<typename Type>
|
|
20
|
+
CUDA_CALLABLE inline Type spatial_dot(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b)
|
|
21
|
+
{
|
|
22
|
+
return dot(a, b);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
template<typename Type>
|
|
26
|
+
CUDA_CALLABLE inline vec_t<3,Type> &w_vec( spatial_vector_t<Type>& a )
|
|
27
|
+
{
|
|
28
|
+
return *(vec_t<3,Type>*)(&a);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
template<typename Type>
|
|
32
|
+
CUDA_CALLABLE inline vec_t<3,Type> &v_vec( spatial_vector_t<Type>& a )
|
|
33
|
+
{
|
|
34
|
+
return *(vec_t<3,Type>*)(&a.c[3]);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
template<typename Type>
|
|
38
|
+
CUDA_CALLABLE inline const vec_t<3,Type> &w_vec( const spatial_vector_t<Type>& a )
|
|
39
|
+
{
|
|
40
|
+
spatial_vector_t<Type> &non_const_vec = *(spatial_vector_t<Type>*)(const_cast<Type*>(&a.c[0]));
|
|
41
|
+
return w_vec(non_const_vec);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
template<typename Type>
|
|
45
|
+
CUDA_CALLABLE inline const vec_t<3,Type> &v_vec( const spatial_vector_t<Type>& a )
|
|
46
|
+
{
|
|
47
|
+
spatial_vector_t<Type> &non_const_vec = *(spatial_vector_t<Type>*)(const_cast<Type*>(&a.c[0]));
|
|
48
|
+
return v_vec(non_const_vec);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
template<typename Type>
|
|
52
|
+
CUDA_CALLABLE inline spatial_vector_t<Type> spatial_cross(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b)
|
|
53
|
+
{
|
|
54
|
+
vec_t<3,Type> w = cross(w_vec(a), w_vec(b));
|
|
55
|
+
vec_t<3,Type> v = cross(v_vec(a), w_vec(b)) + cross(w_vec(a), v_vec(b));
|
|
56
|
+
|
|
57
|
+
return spatial_vector_t<Type>({w[0], w[1], w[2], v[0], v[1], v[2]});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
template<typename Type>
|
|
61
|
+
CUDA_CALLABLE inline spatial_vector_t<Type> spatial_cross_dual(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b)
|
|
62
|
+
{
|
|
63
|
+
vec_t<3,Type> w = cross(w_vec(a), w_vec(b)) + cross(v_vec(a), v_vec(b));
|
|
64
|
+
vec_t<3,Type> v = cross(w_vec(a), v_vec(b));
|
|
65
|
+
|
|
66
|
+
return spatial_vector_t<Type>({w[0], w[1], w[2], v[0], v[1], v[2]});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
template<typename Type>
|
|
70
|
+
CUDA_CALLABLE inline vec_t<3,Type> spatial_top(const spatial_vector_t<Type>& a)
|
|
71
|
+
{
|
|
72
|
+
return w_vec(a);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
template<typename Type>
|
|
76
|
+
CUDA_CALLABLE inline vec_t<3,Type> spatial_bottom(const spatial_vector_t<Type>& a)
|
|
77
|
+
{
|
|
78
|
+
return v_vec(a);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
template<typename Type>
|
|
82
|
+
CUDA_CALLABLE inline void adj_spatial_dot(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b, spatial_vector_t<Type>& adj_a, spatial_vector_t<Type>& adj_b, const Type& adj_ret)
|
|
83
|
+
{
|
|
84
|
+
adj_dot(a, b, adj_a, adj_b, adj_ret);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
template<typename Type>
|
|
88
|
+
CUDA_CALLABLE inline void adj_spatial_cross(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b, spatial_vector_t<Type>& adj_a, spatial_vector_t<Type>& adj_b, const spatial_vector_t<Type>& adj_ret)
|
|
89
|
+
{
|
|
90
|
+
adj_cross(w_vec(a), w_vec(b), w_vec(adj_a), w_vec(adj_b), w_vec(adj_ret));
|
|
91
|
+
|
|
92
|
+
adj_cross(v_vec(a), w_vec(b), v_vec(adj_a), w_vec(adj_b), v_vec(adj_ret));
|
|
93
|
+
adj_cross(w_vec(a), v_vec(b), w_vec(adj_a), v_vec(adj_b), v_vec(adj_ret));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
template<typename Type>
|
|
97
|
+
CUDA_CALLABLE inline void adj_spatial_cross_dual(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b, spatial_vector_t<Type>& adj_a, spatial_vector_t<Type>& adj_b, const spatial_vector_t<Type>& adj_ret)
|
|
98
|
+
{
|
|
99
|
+
adj_cross(w_vec(a), w_vec(b), w_vec(adj_a), w_vec(adj_b), w_vec(adj_ret));
|
|
100
|
+
adj_cross(v_vec(a), v_vec(b), v_vec(adj_a), v_vec(adj_b), w_vec(adj_ret));
|
|
101
|
+
|
|
102
|
+
adj_cross(w_vec(a), v_vec(b), w_vec(adj_a), v_vec(adj_b), v_vec(adj_ret));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
template<typename Type>
|
|
106
|
+
CUDA_CALLABLE inline void adj_spatial_top(const spatial_vector_t<Type>& a, spatial_vector_t<Type>& adj_a, const vec_t<3,Type>& adj_ret)
|
|
107
|
+
{
|
|
108
|
+
w_vec(adj_a) += adj_ret;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
template<typename Type>
|
|
112
|
+
CUDA_CALLABLE inline void adj_spatial_bottom(const spatial_vector_t<Type>& a, spatial_vector_t<Type>& adj_a, const vec_t<3,Type>& adj_ret)
|
|
113
|
+
{
|
|
114
|
+
v_vec(adj_a) += adj_ret;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
//---------------------------------------------------------------------------------
|
|
119
|
+
// Represents a rigid body transform<Type>ation
|
|
120
|
+
|
|
121
|
+
template<typename Type>
|
|
122
|
+
struct transform_t
|
|
123
|
+
{
|
|
124
|
+
vec_t<3,Type> p;
|
|
125
|
+
quat_t<Type> q;
|
|
126
|
+
|
|
127
|
+
CUDA_CALLABLE inline transform_t(vec_t<3,Type> p=vec_t<3,Type>(), quat_t<Type> q=quat_t<Type>()) : p(p), q(q) {}
|
|
128
|
+
CUDA_CALLABLE inline transform_t(Type) {} // helps uniform initialization
|
|
129
|
+
|
|
130
|
+
CUDA_CALLABLE inline Type operator[](int index) const
|
|
131
|
+
{
|
|
132
|
+
assert(index < 7);
|
|
133
|
+
|
|
134
|
+
return p.c[index];
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
CUDA_CALLABLE inline Type& operator[](int index)
|
|
138
|
+
{
|
|
139
|
+
assert(index < 7);
|
|
140
|
+
|
|
141
|
+
return p.c[index];
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
template<typename Type=float32>
|
|
146
|
+
CUDA_CALLABLE inline transform_t<Type> transform_identity()
|
|
147
|
+
{
|
|
148
|
+
return transform_t<Type>(vec_t<3,Type>(), quat_identity<Type>());
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
template<typename Type>
|
|
152
|
+
inline CUDA_CALLABLE bool operator==(const transform_t<Type>& a, const transform_t<Type>& b)
|
|
153
|
+
{
|
|
154
|
+
return a.p == b.p && a.q == b.q;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
template<typename Type>
|
|
159
|
+
inline bool CUDA_CALLABLE isfinite(const transform_t<Type>& t)
|
|
160
|
+
{
|
|
161
|
+
return isfinite(t.p) && isfinite(t.q);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
template<typename Type>
|
|
165
|
+
CUDA_CALLABLE inline vec_t<3,Type> transform_get_translation(const transform_t<Type>& t)
|
|
166
|
+
{
|
|
167
|
+
return t.p;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
template<typename Type>
|
|
171
|
+
CUDA_CALLABLE inline quat_t<Type> transform_get_rotation(const transform_t<Type>& t)
|
|
172
|
+
{
|
|
173
|
+
return t.q;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
template<typename Type>
|
|
177
|
+
CUDA_CALLABLE inline transform_t<Type> transform_multiply(const transform_t<Type>& a, const transform_t<Type>& b)
|
|
178
|
+
{
|
|
179
|
+
return { quat_rotate(a.q, b.p) + a.p, mul(a.q, b.q) };
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
template<typename Type>
|
|
183
|
+
CUDA_CALLABLE inline void adj_transform_multiply(const transform_t<Type>& a, const transform_t<Type>& b, transform_t<Type>& adj_a, transform_t<Type>& adj_b, const transform_t<Type>& adj_ret)
|
|
184
|
+
{
|
|
185
|
+
// translational part
|
|
186
|
+
adj_quat_rotate(a.q, b.p, adj_a.q, adj_b.p, adj_ret.p);
|
|
187
|
+
adj_a.p += adj_ret.p;
|
|
188
|
+
|
|
189
|
+
// rotational part
|
|
190
|
+
adj_mul(a.q, b.q, adj_a.q, adj_b.q, adj_ret.q);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
template<typename Type>
|
|
195
|
+
CUDA_CALLABLE inline transform_t<Type> transform_inverse(const transform_t<Type>& t)
|
|
196
|
+
{
|
|
197
|
+
quat_t<Type> q_inv = quat_inverse(t.q);
|
|
198
|
+
return transform_t<Type>(-quat_rotate(q_inv, t.p), q_inv);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
template<typename Type>
|
|
203
|
+
CUDA_CALLABLE inline vec_t<3,Type> transform_vector(const transform_t<Type>& t, const vec_t<3,Type>& x)
|
|
204
|
+
{
|
|
205
|
+
return quat_rotate(t.q, x);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
template<typename Type>
|
|
209
|
+
CUDA_CALLABLE inline vec_t<3,Type> transform_point(const transform_t<Type>& t, const vec_t<3,Type>& x)
|
|
210
|
+
{
|
|
211
|
+
return t.p + quat_rotate(t.q, x);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// not totally sure why you'd want to do this seeing as adding/subtracting two rotation
|
|
215
|
+
// quats doesn't seem to do anything meaningful
|
|
216
|
+
template<typename Type>
|
|
217
|
+
CUDA_CALLABLE inline transform_t<Type> add(const transform_t<Type>& a, const transform_t<Type>& b)
|
|
218
|
+
{
|
|
219
|
+
return { a.p + b.p, a.q + b.q };
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
template<typename Type>
|
|
223
|
+
CUDA_CALLABLE inline transform_t<Type> sub(const transform_t<Type>& a, const transform_t<Type>& b)
|
|
224
|
+
{
|
|
225
|
+
return { a.p - b.p, a.q - b.q };
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// also not sure why you'd want to do this seeing as the quat would end up unnormalized
|
|
229
|
+
template<typename Type>
|
|
230
|
+
CUDA_CALLABLE inline transform_t<Type> mul(const transform_t<Type>& a, Type s)
|
|
231
|
+
{
|
|
232
|
+
return { a.p*s, a.q*s };
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
template<typename Type>
|
|
236
|
+
CUDA_CALLABLE inline transform_t<Type> mul(Type s, const transform_t<Type>& a)
|
|
237
|
+
{
|
|
238
|
+
return mul(a, s);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
template<typename Type>
|
|
242
|
+
CUDA_CALLABLE inline transform_t<Type> mul(const transform_t<Type>& a, const transform_t<Type>& b)
|
|
243
|
+
{
|
|
244
|
+
return transform_multiply(a, b);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
template<typename Type>
|
|
248
|
+
CUDA_CALLABLE inline transform_t<Type> operator*(const transform_t<Type>& a, Type s)
|
|
249
|
+
{
|
|
250
|
+
return mul(a, s);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
template<typename Type>
|
|
254
|
+
CUDA_CALLABLE inline transform_t<Type> operator*(Type s, const transform_t<Type>& a)
|
|
255
|
+
{
|
|
256
|
+
return mul(a, s);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
template<typename Type>
|
|
261
|
+
inline CUDA_CALLABLE Type tensordot(const transform_t<Type>& a, const transform_t<Type>& b)
|
|
262
|
+
{
|
|
263
|
+
// corresponds to `np.tensordot()` with all axes being contracted
|
|
264
|
+
return tensordot(a.p, b.p) + tensordot(a.q, b.q);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
template<typename Type>
|
|
268
|
+
inline CUDA_CALLABLE Type extract(const transform_t<Type>& t, int i)
|
|
269
|
+
{
|
|
270
|
+
return t[i];
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
template<typename Type>
|
|
274
|
+
inline void CUDA_CALLABLE adj_extract(const transform_t<Type>& t, int i, transform_t<Type>& adj_t, int& adj_i, Type adj_ret)
|
|
275
|
+
{
|
|
276
|
+
adj_t[i] += adj_ret;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
// adjoint methods
|
|
281
|
+
template<typename Type>
|
|
282
|
+
CUDA_CALLABLE inline void adj_add(const transform_t<Type>& a, const transform_t<Type>& b, transform_t<Type>& adj_a, transform_t<Type>& adj_b, const transform_t<Type>& adj_ret)
|
|
283
|
+
{
|
|
284
|
+
adj_add(a.p, b.p, adj_a.p, adj_b.p, adj_ret.p);
|
|
285
|
+
adj_add(a.q, b.q, adj_a.q, adj_b.q, adj_ret.q);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
template<typename Type>
|
|
289
|
+
CUDA_CALLABLE inline void adj_sub(const transform_t<Type>& a, const transform_t<Type>& b, transform_t<Type>& adj_a, transform_t<Type>& adj_b, const transform_t<Type>& adj_ret)
|
|
290
|
+
{
|
|
291
|
+
adj_sub(a.p, b.p, adj_a.p, adj_b.p, adj_ret.p);
|
|
292
|
+
adj_sub(a.q, b.q, adj_a.q, adj_b.q, adj_ret.q);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
template<typename Type>
|
|
296
|
+
CUDA_CALLABLE inline void adj_mul(const transform_t<Type>& a, Type s, transform_t<Type>& adj_a, Type& adj_s, const transform_t<Type>& adj_ret)
|
|
297
|
+
{
|
|
298
|
+
adj_mul(a.p, s, adj_a.p, adj_s, adj_ret.p);
|
|
299
|
+
adj_mul(a.q, s, adj_a.q, adj_s, adj_ret.q);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
template<typename Type>
|
|
303
|
+
CUDA_CALLABLE inline void adj_mul(Type s, const transform_t<Type>& a, Type& adj_s, transform_t<Type>& adj_a, const transform_t<Type>& adj_ret)
|
|
304
|
+
{
|
|
305
|
+
adj_mul(a, s, adj_a, adj_s, adj_ret);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
template<typename Type>
|
|
309
|
+
CUDA_CALLABLE inline void adj_mul(const transform_t<Type>& a, const transform_t<Type>& b, transform_t<Type>& adj_a, transform_t<Type>& adj_b, const transform_t<Type>& adj_ret)
|
|
310
|
+
{
|
|
311
|
+
adj_transform_multiply(a, b, adj_a, adj_b, adj_ret);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
template<typename Type>
|
|
316
|
+
inline CUDA_CALLABLE transform_t<Type> atomic_add(transform_t<Type>* addr, const transform_t<Type>& value)
|
|
317
|
+
{
|
|
318
|
+
vec_t<3,Type> p = atomic_add(&addr->p, value.p);
|
|
319
|
+
quat_t<Type> q = atomic_add(&addr->q, value.q);
|
|
320
|
+
|
|
321
|
+
return transform_t<Type>(p, q);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
template<typename Type>
|
|
325
|
+
CUDA_CALLABLE inline void adj_transform_t(const vec_t<3,Type>& p, const quat_t<Type>& q, vec_t<3,Type>& adj_p, quat_t<Type>& adj_q, const transform_t<Type>& adj_ret)
|
|
326
|
+
{
|
|
327
|
+
adj_p += adj_ret.p;
|
|
328
|
+
adj_q += adj_ret.q;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
template<typename Type>
|
|
332
|
+
CUDA_CALLABLE inline void adj_transform_get_translation(const transform_t<Type>& t, transform_t<Type>& adj_t, const vec_t<3,Type>& adj_ret)
|
|
333
|
+
{
|
|
334
|
+
adj_t.p += adj_ret;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
template<typename Type>
|
|
338
|
+
CUDA_CALLABLE inline void adj_transform_get_rotation(const transform_t<Type>& t, transform_t<Type>& adj_t, const quat_t<Type>& adj_ret)
|
|
339
|
+
{
|
|
340
|
+
adj_t.q += adj_ret;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
template<typename Type>
|
|
344
|
+
CUDA_CALLABLE inline void adj_transform_inverse(const transform_t<Type>& t, transform_t<Type>& adj_t, const transform_t<Type>& adj_ret)
|
|
345
|
+
{
|
|
346
|
+
|
|
347
|
+
// forward
|
|
348
|
+
quat_t<Type> q_inv = quat_inverse(t.q);
|
|
349
|
+
vec_t<3,Type> p = quat_rotate(q_inv, t.p);
|
|
350
|
+
vec_t<3,Type> np = -p;
|
|
351
|
+
// transform<Type> t = transform<Type>(np, q_inv)
|
|
352
|
+
|
|
353
|
+
// backward
|
|
354
|
+
quat_t<Type> adj_q_inv(0.0f);
|
|
355
|
+
quat_t<Type> adj_q(0.0f);
|
|
356
|
+
vec_t<3,Type> adj_p(0.0f);
|
|
357
|
+
vec_t<3,Type> adj_np(0.0f);
|
|
358
|
+
|
|
359
|
+
adj_transform_t(np, q_inv, adj_np, adj_q_inv, adj_ret);
|
|
360
|
+
adj_p = -adj_np;
|
|
361
|
+
adj_quat_rotate(q_inv, t.p, adj_q_inv, adj_t.p, adj_p);
|
|
362
|
+
adj_quat_inverse(t.q, adj_t.q, adj_q_inv);
|
|
363
|
+
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
template<typename Type>
|
|
367
|
+
CUDA_CALLABLE inline void adj_transform_vector(const transform_t<Type>& t, const vec_t<3,Type>& x, transform_t<Type>& adj_t, vec_t<3,Type>& adj_x, const vec_t<3,Type>& adj_ret)
|
|
368
|
+
{
|
|
369
|
+
adj_quat_rotate(t.q, x, adj_t.q, adj_x, adj_ret);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
template<typename Type>
|
|
373
|
+
CUDA_CALLABLE inline void adj_transform_point(const transform_t<Type>& t, const vec_t<3,Type>& x, transform_t<Type>& adj_t, vec_t<3,Type>& adj_x, const vec_t<3,Type>& adj_ret)
|
|
374
|
+
{
|
|
375
|
+
adj_quat_rotate(t.q, x, adj_t.q, adj_x, adj_ret);
|
|
376
|
+
adj_t.p += adj_ret;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
template<typename Type>
|
|
381
|
+
CUDA_CALLABLE void print(transform_t<Type> t);
|
|
382
|
+
|
|
383
|
+
template<typename Type>
|
|
384
|
+
CUDA_CALLABLE inline transform_t<Type> lerp(const transform_t<Type>& a, const transform_t<Type>& b, Type t)
|
|
385
|
+
{
|
|
386
|
+
return a*(Type(1)-t) + b*t;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
template<typename Type>
|
|
390
|
+
CUDA_CALLABLE inline void adj_lerp(const transform_t<Type>& a, const transform_t<Type>& b, Type t, transform_t<Type>& adj_a, transform_t<Type>& adj_b, Type& adj_t, const transform_t<Type>& adj_ret)
|
|
391
|
+
{
|
|
392
|
+
adj_a += adj_ret*(Type(1)-t);
|
|
393
|
+
adj_b += adj_ret*t;
|
|
394
|
+
adj_t += tensordot(b, adj_ret) - tensordot(a, adj_ret);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
template<typename Type>
|
|
398
|
+
using spatial_matrix_t = mat_t<6,6,Type>;
|
|
399
|
+
|
|
400
|
+
template<typename Type>
|
|
401
|
+
inline CUDA_CALLABLE spatial_matrix_t<Type> spatial_adjoint(const mat_t<3,3,Type>& R, const mat_t<3,3,Type>& S)
|
|
402
|
+
{
|
|
403
|
+
spatial_matrix_t<Type> adT;
|
|
404
|
+
|
|
405
|
+
// T = [Rah, 0]
|
|
406
|
+
// [S R]
|
|
407
|
+
|
|
408
|
+
// diagonal blocks
|
|
409
|
+
for (int i=0; i < 3; ++i)
|
|
410
|
+
{
|
|
411
|
+
for (int j=0; j < 3; ++j)
|
|
412
|
+
{
|
|
413
|
+
adT.data[i][j] = R.data[i][j];
|
|
414
|
+
adT.data[i+3][j+3] = R.data[i][j];
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// lower off diagonal
|
|
419
|
+
for (int i=0; i < 3; ++i)
|
|
420
|
+
{
|
|
421
|
+
for (int j=0; j < 3; ++j)
|
|
422
|
+
{
|
|
423
|
+
adT.data[i+3][j] = S.data[i][j];
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
return adT;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
template<typename Type>
|
|
431
|
+
inline CUDA_CALLABLE void adj_spatial_adjoint(const mat_t<3,3,Type>& R, const mat_t<3,3,Type>& S, mat_t<3,3,Type>& adj_R, mat_t<3,3,Type>& adj_S, const spatial_matrix_t<Type>& adj_ret)
|
|
432
|
+
{
|
|
433
|
+
// diagonal blocks
|
|
434
|
+
for (int i=0; i < 3; ++i)
|
|
435
|
+
{
|
|
436
|
+
for (int j=0; j < 3; ++j)
|
|
437
|
+
{
|
|
438
|
+
adj_R.data[i][j] += adj_ret.data[i][j];
|
|
439
|
+
adj_R.data[i][j] += adj_ret.data[i+3][j+3];
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// lower off diagonal
|
|
444
|
+
for (int i=0; i < 3; ++i)
|
|
445
|
+
{
|
|
446
|
+
for (int j=0; j < 3; ++j)
|
|
447
|
+
{
|
|
448
|
+
adj_S.data[i][j] += adj_ret.data[i+3][j];
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
CUDA_CALLABLE inline int row_index(int stride, int i, int j)
|
|
455
|
+
{
|
|
456
|
+
return i*stride + j;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// builds spatial Jacobian J which is an (joint_count*6)x(dof_count) matrix
|
|
460
|
+
template<typename Type>
|
|
461
|
+
CUDA_CALLABLE inline void spatial_jacobian(
|
|
462
|
+
const spatial_vector_t<Type>* S,
|
|
463
|
+
const int* joint_parents,
|
|
464
|
+
const int* joint_qd_start,
|
|
465
|
+
int joint_start, // offset of the first joint for the articulation
|
|
466
|
+
int joint_count,
|
|
467
|
+
int J_start,
|
|
468
|
+
Type* J)
|
|
469
|
+
{
|
|
470
|
+
const int articulation_dof_start = joint_qd_start[joint_start];
|
|
471
|
+
const int articulation_dof_end = joint_qd_start[joint_start + joint_count];
|
|
472
|
+
const int articulation_dof_count = articulation_dof_end-articulation_dof_start;
|
|
473
|
+
|
|
474
|
+
// shift output pointers
|
|
475
|
+
const int S_start = articulation_dof_start;
|
|
476
|
+
|
|
477
|
+
S += S_start;
|
|
478
|
+
J += J_start;
|
|
479
|
+
|
|
480
|
+
for (int i=0; i < joint_count; ++i)
|
|
481
|
+
{
|
|
482
|
+
const int row_start = i * 6;
|
|
483
|
+
|
|
484
|
+
int j = joint_start + i;
|
|
485
|
+
while (j != -1)
|
|
486
|
+
{
|
|
487
|
+
const int joint_dof_start = joint_qd_start[j];
|
|
488
|
+
const int joint_dof_end = joint_qd_start[j+1];
|
|
489
|
+
const int joint_dof_count = joint_dof_end-joint_dof_start;
|
|
490
|
+
|
|
491
|
+
// fill out each row of the Jacobian walking up the tree
|
|
492
|
+
//for (int col=dof_start; col < dof_end; ++col)
|
|
493
|
+
for (int dof=0; dof < joint_dof_count; ++dof)
|
|
494
|
+
{
|
|
495
|
+
const int col = (joint_dof_start-articulation_dof_start) + dof;
|
|
496
|
+
|
|
497
|
+
J[row_index(articulation_dof_count, row_start+0, col)] = S[col].w[0];
|
|
498
|
+
J[row_index(articulation_dof_count, row_start+1, col)] = S[col].w[1];
|
|
499
|
+
J[row_index(articulation_dof_count, row_start+2, col)] = S[col].w[2];
|
|
500
|
+
J[row_index(articulation_dof_count, row_start+3, col)] = S[col].v[0];
|
|
501
|
+
J[row_index(articulation_dof_count, row_start+4, col)] = S[col].v[1];
|
|
502
|
+
J[row_index(articulation_dof_count, row_start+5, col)] = S[col].v[2];
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
j = joint_parents[j];
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
template<typename Type>
|
|
511
|
+
CUDA_CALLABLE inline void adj_spatial_jacobian(
|
|
512
|
+
const spatial_vector_t<Type>* S,
|
|
513
|
+
const int* joint_parents,
|
|
514
|
+
const int* joint_qd_start,
|
|
515
|
+
const int joint_start,
|
|
516
|
+
const int joint_count,
|
|
517
|
+
const int J_start,
|
|
518
|
+
const Type* J,
|
|
519
|
+
// adjs
|
|
520
|
+
spatial_vector_t<Type>* adj_S,
|
|
521
|
+
int* adj_joint_parents,
|
|
522
|
+
int* adj_joint_qd_start,
|
|
523
|
+
int& adj_joint_start,
|
|
524
|
+
int& adj_joint_count,
|
|
525
|
+
int& adj_J_start,
|
|
526
|
+
const Type* adj_J)
|
|
527
|
+
{
|
|
528
|
+
const int articulation_dof_start = joint_qd_start[joint_start];
|
|
529
|
+
const int articulation_dof_end = joint_qd_start[joint_start + joint_count];
|
|
530
|
+
const int articulation_dof_count = articulation_dof_end-articulation_dof_start;
|
|
531
|
+
|
|
532
|
+
// shift output pointers
|
|
533
|
+
const int S_start = articulation_dof_start;
|
|
534
|
+
|
|
535
|
+
S += S_start;
|
|
536
|
+
J += J_start;
|
|
537
|
+
|
|
538
|
+
adj_S += S_start;
|
|
539
|
+
adj_J += J_start;
|
|
540
|
+
|
|
541
|
+
for (int i=0; i < joint_count; ++i)
|
|
542
|
+
{
|
|
543
|
+
const int row_start = i * 6;
|
|
544
|
+
|
|
545
|
+
int j = joint_start + i;
|
|
546
|
+
while (j != -1)
|
|
547
|
+
{
|
|
548
|
+
const int joint_dof_start = joint_qd_start[j];
|
|
549
|
+
const int joint_dof_end = joint_qd_start[j+1];
|
|
550
|
+
const int joint_dof_count = joint_dof_end-joint_dof_start;
|
|
551
|
+
|
|
552
|
+
// fill out each row of the Jacobian walking up the tree
|
|
553
|
+
//for (int col=dof_start; col < dof_end; ++col)
|
|
554
|
+
for (int dof=0; dof < joint_dof_count; ++dof)
|
|
555
|
+
{
|
|
556
|
+
const int col = (joint_dof_start-articulation_dof_start) + dof;
|
|
557
|
+
|
|
558
|
+
adj_S[col].w[0] += adj_J[row_index(articulation_dof_count, row_start+0, col)];
|
|
559
|
+
adj_S[col].w[1] += adj_J[row_index(articulation_dof_count, row_start+1, col)];
|
|
560
|
+
adj_S[col].w[2] += adj_J[row_index(articulation_dof_count, row_start+2, col)];
|
|
561
|
+
adj_S[col].v[0] += adj_J[row_index(articulation_dof_count, row_start+3, col)];
|
|
562
|
+
adj_S[col].v[1] += adj_J[row_index(articulation_dof_count, row_start+4, col)];
|
|
563
|
+
adj_S[col].v[2] += adj_J[row_index(articulation_dof_count, row_start+5, col)];
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
j = joint_parents[j];
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
template<typename Type>
|
|
573
|
+
CUDA_CALLABLE inline void spatial_mass(const spatial_matrix_t<Type>* I_s, int joint_start, int joint_count, int M_start, Type* M)
|
|
574
|
+
{
|
|
575
|
+
const int stride = joint_count*6;
|
|
576
|
+
|
|
577
|
+
for (int l=0; l < joint_count; ++l)
|
|
578
|
+
{
|
|
579
|
+
for (int i=0; i < 6; ++i)
|
|
580
|
+
{
|
|
581
|
+
for (int j=0; j < 6; ++j)
|
|
582
|
+
{
|
|
583
|
+
M[M_start + row_index(stride, l*6 + i, l*6 + j)] = I_s[joint_start + l].data[i][j];
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
template<typename Type>
|
|
590
|
+
CUDA_CALLABLE inline void adj_spatial_mass(
|
|
591
|
+
const spatial_matrix_t<Type>* I_s,
|
|
592
|
+
const int joint_start,
|
|
593
|
+
const int joint_count,
|
|
594
|
+
const int M_start,
|
|
595
|
+
const Type* M,
|
|
596
|
+
spatial_matrix_t<Type>* adj_I_s,
|
|
597
|
+
int& adj_joint_start,
|
|
598
|
+
int& adj_joint_count,
|
|
599
|
+
int& adj_M_start,
|
|
600
|
+
const Type* adj_M)
|
|
601
|
+
{
|
|
602
|
+
const int stride = joint_count*6;
|
|
603
|
+
|
|
604
|
+
for (int l=0; l < joint_count; ++l)
|
|
605
|
+
{
|
|
606
|
+
for (int i=0; i < 6; ++i)
|
|
607
|
+
{
|
|
608
|
+
for (int j=0; j < 6; ++j)
|
|
609
|
+
{
|
|
610
|
+
adj_I_s[joint_start + l].data[i][j] += adj_M[M_start + row_index(stride, l*6 + i, l*6 + j)];
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
using transform = transform_t<float>;
|
|
617
|
+
using transformh = transform_t<half>;
|
|
618
|
+
using transformf = transform_t<float>;
|
|
619
|
+
using transformd = transform_t<double>;
|
|
620
|
+
|
|
621
|
+
using spatial_vector = spatial_vector_t<float>;
|
|
622
|
+
using spatial_vectorh = spatial_vector_t<half>;
|
|
623
|
+
using spatial_vectorf = spatial_vector_t<float>;
|
|
624
|
+
using spatial_vectord = spatial_vector_t<double>;
|
|
625
|
+
|
|
626
|
+
using spatial_matrix = spatial_matrix_t<float>;
|
|
627
|
+
using spatial_matrixh = spatial_matrix_t<half>;
|
|
628
|
+
using spatial_matrixf = spatial_matrix_t<float>;
|
|
629
|
+
using spatial_matrixd = spatial_matrix_t<double>;
|
|
630
|
+
|
|
631
631
|
} // namespace wp
|