Import google-deepmind/mujoco_warp from GitHub.

PiperOrigin-RevId: 835230315
Change-Id: Ifa4f8f66c4e3de1a3074f0897daf93f88e469f06
This commit is contained in:
Taylor Howell
2025-11-21 08:15:42 -08:00
committed by Copybara-Service
parent bb488fec29
commit a359780ca1
20 changed files with 1578 additions and 2004 deletions
@@ -32,17 +32,18 @@ from mujoco.mjx.third_party.mujoco_warp._src.types import MJ_MAXVAL
from mujoco.mjx.third_party.mujoco_warp._src.types import Data
from mujoco.mjx.third_party.mujoco_warp._src.types import GeomType
from mujoco.mjx.third_party.mujoco_warp._src.types import Model
from mujoco.mjx.third_party.mujoco_warp._src.types import mat43
from mujoco.mjx.third_party.mujoco_warp._src.types import mat63
from mujoco.mjx.third_party.mujoco_warp._src.types import vec5
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import cache_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import event_scope
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import kernel as nested_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import nested_kernel
# TODO(team): improve compile time to enable backward pass
wp.set_module_options({"enable_backward": False})
MULTI_CONTACT_COUNT = 8
mat3c = wp.types.matrix(shape=(MULTI_CONTACT_COUNT, 3), dtype=float)
mat63 = wp.types.matrix(shape=(6, 3), dtype=float)
vec_maxconpair = wp.types.vector(length=MJ_MAXCONPAIR, dtype=float)
mat_maxconpair = wp.types.matrix(shape=(MJ_MAXCONPAIR, 3), dtype=float)
_CONVEX_COLLISION_PAIRS = [
(GeomType.HFIELD, GeomType.SPHERE),
@@ -260,9 +261,9 @@ def ccd_kernel_builder(
contact_geomcollisionid_out: wp.array(dtype=int),
nacon_out: wp.array(dtype=int),
) -> int:
points = mat3c()
witness1 = mat3c()
witness2 = mat3c()
points = mat43()
witness1 = mat43()
witness2 = mat43()
geom1.margin = margin
geom2.margin = margin
if pairid[1] >= 0:
@@ -566,6 +567,33 @@ def ccd_kernel_builder(
adr = hfield_adr[geom1_dataid]
hfield_contact_dist = vec_maxconpair()
hfield_contact_pos = mat_maxconpair()
hfield_contact_normal = mat_maxconpair()
min_dist = float(wp.inf)
min_normal = wp.vec3(wp.inf, wp.inf, wp.inf)
min_pos = wp.vec3(wp.inf, wp.inf, wp.inf)
min_id = int(-1)
# TODO(team): height field margin?
geom1.margin = margin
geom2.margin = margin
# EPA memory
epa_vert = epa_vert_in[tid]
epa_vert1 = epa_vert1_in[tid]
epa_vert2 = epa_vert2_in[tid]
epa_vert_index1 = epa_vert_index1_in[tid]
epa_vert_index2 = epa_vert_index2_in[tid]
epa_face = epa_face_in[tid]
epa_pr = epa_pr_in[tid]
epa_norm2 = epa_norm2_in[tid]
epa_index = epa_index_in[tid]
epa_map = epa_map_in[tid]
epa_horizon = epa_horizon_in[tid]
collision_pairid = collision_pairid_in[tid]
# process all prisms in subgrid
count = int(0)
for r in range(rmin, rmax):
@@ -573,6 +601,13 @@ def ccd_kernel_builder(
for c in range(cmin, cmax + 1):
# add both triangles from this cell
for i in range(2):
if count >= MJ_MAXCONPAIR:
wp.printf(
"height field collision overflow, number of collisions >= %u - please adjust resolution: \n decrease the number of hfield rows/cols or modify size of colliding geom\n",
MJ_MAXCONPAIR,
)
continue
# add vert
x = dx * float(c) - size[0]
y = dy * float(r + dr[i]) - size[1]
@@ -607,66 +642,253 @@ def ccd_kernel_builder(
x1_ += prism[i]
x1 += geom1.rot @ (x1_ / 6.0)
ncontact = eval_ccd_write_contact(
opt_ccd_tolerance,
geom_type,
naconmax_in,
epa_vert_in,
epa_vert1_in,
epa_vert2_in,
epa_vert_index1_in,
epa_vert_index2_in,
epa_face_in,
epa_pr_in,
epa_norm2_in,
epa_index_in,
epa_map_in,
epa_horizon_in,
multiccd_polygon_in,
multiccd_clipped_in,
multiccd_pnormal_in,
multiccd_pdist_in,
multiccd_idx1_in,
multiccd_idx2_in,
multiccd_n1_in,
multiccd_n2_in,
multiccd_endvert_in,
multiccd_face1_in,
multiccd_face2_in,
dist, ncontact, w1, w2, idx = ccd(
opt_ccd_tolerance[worldid % opt_ccd_tolerance.shape[0]],
0.0,
ccd_iterations,
geom1,
geom2,
geoms,
worldid,
tid,
margin,
gap,
condim,
friction,
solref,
solreffriction,
solimp,
geomtype1,
geomtype2,
x1,
geom2.pos,
count,
collision_pairid_in[tid],
contact_dist_out,
contact_pos_out,
contact_frame_out,
contact_includemargin_out,
contact_friction_out,
contact_solref_out,
contact_solreffriction_out,
contact_solimp_out,
contact_dim_out,
contact_geom_out,
contact_worldid_out,
contact_type_out,
contact_geomcollisionid_out,
nacon_out,
epa_vert,
epa_vert1,
epa_vert2,
epa_vert_index1,
epa_vert_index2,
epa_face,
epa_pr,
epa_norm2,
epa_index,
epa_map,
epa_horizon,
)
count += ncontact
if count >= MJ_MAXCONPAIR:
return
if ncontact == 0:
continue
# cache contact information
hfield_contact_dist[count] = dist
pos = 0.5 * (w1 + w2)
hfield_contact_pos[count, 0] = pos[0]
hfield_contact_pos[count, 1] = pos[1]
hfield_contact_pos[count, 2] = pos[2]
frame = make_frame(w1 - w2)
normal = wp.vec3(frame[0, 0], frame[0, 1], frame[0, 2])
hfield_contact_normal[count, 0] = normal[0]
hfield_contact_normal[count, 1] = normal[1]
hfield_contact_normal[count, 2] = normal[2]
# contact with minimum distance
if dist < min_dist:
min_dist = dist
min_normal = normal
min_pos = pos
min_id = count
count += 1
# contact 0: minimum distance
write_contact(
naconmax_in,
0,
min_dist,
min_pos,
make_frame(min_normal),
margin,
gap,
condim,
friction,
solref,
solreffriction,
solimp,
geoms,
collision_pairid,
worldid,
contact_dist_out,
contact_pos_out,
contact_frame_out,
contact_includemargin_out,
contact_friction_out,
contact_solref_out,
contact_solreffriction_out,
contact_solimp_out,
contact_dim_out,
contact_geom_out,
contact_worldid_out,
contact_type_out,
contact_geomcollisionid_out,
nacon_out,
)
# TODO(team): routine for select subset of contacts
# TODO(team): if use_multiccd?
if wp.static(True):
MIN_DIST_TO_NEXT_CONTACT = 1.0e-3
# contact 1: furthest from minimum distance contact
id1 = int(-1)
dist1 = float(-wp.inf)
for i in range(count):
if i == min_id:
continue
hf_pos = wp.vec3(hfield_contact_pos[i, 0], hfield_contact_pos[i, 1], hfield_contact_pos[i, 2])
dist = wp.norm_l2(hf_pos - min_pos)
if dist > dist1:
id1 = i
dist1 = dist
if id1 == -1 or (0.0 < dist1 and dist1 < MIN_DIST_TO_NEXT_CONTACT):
return
pos1 = wp.vec3(hfield_contact_pos[id1, 0], hfield_contact_pos[id1, 1], hfield_contact_pos[id1, 2])
normal1 = wp.vec3(hfield_contact_normal[id1, 0], hfield_contact_normal[id1, 1], hfield_contact_normal[id1, 2])
write_contact(
naconmax_in,
1,
hfield_contact_dist[id1],
pos1,
make_frame(normal1),
margin,
gap,
condim,
friction,
solref,
solreffriction,
solimp,
geoms,
collision_pairid,
worldid,
contact_dist_out,
contact_pos_out,
contact_frame_out,
contact_includemargin_out,
contact_friction_out,
contact_solref_out,
contact_solreffriction_out,
contact_solimp_out,
contact_dim_out,
contact_geom_out,
contact_worldid_out,
contact_type_out,
contact_geomcollisionid_out,
nacon_out,
)
# contact 2: point furthest from min_pos - pos1 line
dist_min1 = wp.cross(min_normal, min_pos - pos1)
id2 = int(-1)
dist_12 = float(-wp.inf)
for i in range(count):
if i == min_id or i == id1:
continue
hf_pos = wp.vec3(hfield_contact_pos[i, 0], hfield_contact_pos[i, 1], hfield_contact_pos[i, 2])
dist = wp.abs(wp.dot(hf_pos - min_pos, dist_min1))
if dist > dist_12:
id2 = i
dist_12 = dist
if id2 == -1 or (0.0 < dist_12 and dist_12 < MIN_DIST_TO_NEXT_CONTACT):
return
pos2 = wp.vec3(hfield_contact_pos[id2, 0], hfield_contact_pos[id2, 1], hfield_contact_pos[id2, 2])
normal2 = wp.vec3(hfield_contact_normal[id2, 0], hfield_contact_normal[id2, 1], hfield_contact_normal[id2, 2])
write_contact(
naconmax_in,
2,
hfield_contact_dist[id2],
pos2,
make_frame(normal2),
margin,
gap,
condim,
friction,
solref,
solreffriction,
solimp,
geoms,
collision_pairid,
worldid,
contact_dist_out,
contact_pos_out,
contact_frame_out,
contact_includemargin_out,
contact_friction_out,
contact_solref_out,
contact_solreffriction_out,
contact_solimp_out,
contact_dim_out,
contact_geom_out,
contact_worldid_out,
contact_type_out,
contact_geomcollisionid_out,
nacon_out,
)
# contact 3: point furthest from other triangle edge
vec_min2 = wp.cross(min_normal, min_pos - pos2)
vec_12 = wp.cross(min_normal, pos1 - pos2)
id3 = int(-1)
dist3 = float(-wp.inf)
for i in range(count):
if i == min_id or i == id1 or i == id2:
continue
hf_pos = wp.vec3(hfield_contact_pos[i, 0], hfield_contact_pos[i, 1], hfield_contact_pos[i, 2])
dist = wp.abs(wp.dot(hf_pos - min_pos, vec_min2)) + wp.abs(wp.dot(pos1 - hf_pos, vec_12))
if dist > dist3:
id3 = i
dist3 = dist
if id3 == -1 or (0.0 < dist3 and dist3 < MIN_DIST_TO_NEXT_CONTACT):
return
pos3 = wp.vec3(hfield_contact_pos[id3, 0], hfield_contact_pos[id3, 1], hfield_contact_pos[id3, 2])
normal3 = wp.vec3(hfield_contact_normal[id3, 0], hfield_contact_normal[id3, 1], hfield_contact_normal[id3, 2])
write_contact(
naconmax_in,
3,
hfield_contact_dist[id3],
pos3,
make_frame(normal3),
margin,
gap,
condim,
friction,
solref,
solreffriction,
solimp,
geoms,
collision_pairid,
worldid,
contact_dist_out,
contact_pos_out,
contact_frame_out,
contact_includemargin_out,
contact_friction_out,
contact_solref_out,
contact_solreffriction_out,
contact_solimp_out,
contact_dim_out,
contact_geom_out,
contact_worldid_out,
contact_type_out,
contact_geomcollisionid_out,
nacon_out,
)
else:
eval_ccd_write_contact(
opt_ccd_tolerance,
@@ -27,9 +27,11 @@ from mujoco.mjx.third_party.mujoco_warp._src.types import BroadphaseType
from mujoco.mjx.third_party.mujoco_warp._src.types import Data
from mujoco.mjx.third_party.mujoco_warp._src.types import DisableBit
from mujoco.mjx.third_party.mujoco_warp._src.types import Model
from mujoco.mjx.third_party.mujoco_warp._src.types import mat23
from mujoco.mjx.third_party.mujoco_warp._src.types import mat63
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import cache_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import event_scope
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import kernel as nested_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import nested_kernel
wp.set_module_options({"enable_backward": False})
@@ -170,10 +172,6 @@ def _aabb_filter(
return True
mat23 = wp.types.matrix(shape=(2, 3), dtype=float)
mat63 = wp.types.matrix(shape=(6, 3), dtype=float)
# TODO(team): improve performance by precomputing bounding box
@wp.func
def _obb_filter(
@@ -232,7 +230,7 @@ def _obb_filter(
return True
def _broadphase_filter(m: Model):
def _broadphase_filter(opt_broadphase_filter: int, ngeom_aabb: int, ngeom_rbound: int, ngeom_margin: int):
@wp.func
def func(
# Model:
@@ -252,28 +250,28 @@ def _broadphase_filter(m: Model):
# 4: aabb
# 8: obb
aabb_id = worldid % geom_aabb.shape[0] if wp.static(m.geom_aabb.shape[0] > 1) else 0
aabb_id = worldid % ngeom_aabb if wp.static(ngeom_aabb > 1) else 0
center1, center2 = geom_aabb[aabb_id, geom1, 0], geom_aabb[aabb_id, geom2, 0]
size1, size2 = geom_aabb[aabb_id, geom1, 1], geom_aabb[aabb_id, geom2, 1]
rbound_id = worldid % geom_rbound.shape[0] if wp.static(m.geom_rbound.shape[0] > 1) else 0
rbound_id = worldid % ngeom_rbound if wp.static(ngeom_rbound > 1) else 0
rbound1, rbound2 = geom_rbound[rbound_id, geom1], geom_rbound[rbound_id, geom2]
margin_id = worldid % geom_margin.shape[0] if wp.static(m.geom_margin.shape[0] > 1) else 0
margin_id = worldid % ngeom_margin if wp.static(ngeom_margin > 1) else 0
margin1, margin2 = geom_margin[margin_id, geom1], geom_margin[margin_id, geom2]
xpos1, xpos2 = geom_xpos_in[worldid, geom1], geom_xpos_in[worldid, geom2]
xmat1, xmat2 = geom_xmat_in[worldid, geom1], geom_xmat_in[worldid, geom2]
if rbound1 == 0.0 or rbound2 == 0.0:
if wp.static(m.opt.broadphase_filter & BroadphaseFilter.PLANE):
if wp.static(opt_broadphase_filter & BroadphaseFilter.PLANE):
return _plane_filter(rbound1, rbound2, margin1, margin2, xpos1, xpos2, xmat1, xmat2)
else:
if wp.static(m.opt.broadphase_filter & BroadphaseFilter.SPHERE):
if wp.static(opt_broadphase_filter & BroadphaseFilter.SPHERE):
if not _sphere_filter(rbound1, rbound2, margin1, margin2, xpos1, xpos2):
return False
if wp.static(m.opt.broadphase_filter & BroadphaseFilter.AABB):
if wp.static(opt_broadphase_filter & BroadphaseFilter.AABB):
if not _aabb_filter(center1, center2, size1, size2, margin1, margin2, xpos1, xpos2, xmat1, xmat2):
return False
if wp.static(m.opt.broadphase_filter & BroadphaseFilter.OBB):
if wp.static(opt_broadphase_filter & BroadphaseFilter.OBB):
if not _obb_filter(center1, center2, size1, size2, margin1, margin2, xpos1, xpos2, xmat1, xmat2):
return False
@@ -403,7 +401,7 @@ def _sap_range(
@cache_kernel
def _sap_broadphase(broadphase_filter):
def _sap_broadphase(opt_broadphase_filter: int, ngeom_aabb: int, ngeom_rbound: int, ngeom_margin: int):
@nested_kernel(module="unique", enable_backward=False)
def kernel(
# Model:
@@ -461,7 +459,9 @@ def _sap_broadphase(broadphase_filter):
continue
if (
broadphase_filter(geom_aabb, geom_rbound, geom_margin, geom_xpos_in, geom_xmat_in, geom1, geom2, worldid)
wp.static(_broadphase_filter(opt_broadphase_filter, ngeom_aabb, ngeom_rbound, ngeom_margin))(
geom_aabb, geom_rbound, geom_margin, geom_xpos_in, geom_xmat_in, geom1, geom2, worldid
)
or pairid[1] >= 0
):
_add_geom_pair(
@@ -578,9 +578,8 @@ def sap_broadphase(m: Model, d: Data):
# estimate number of overlap checks
# assumes each geom has 5 other geoms (batched over all worlds)
nsweep = 5 * nworldgeom
broadphase_filter = _broadphase_filter(m)
wp.launch(
kernel=_sap_broadphase(broadphase_filter),
kernel=_sap_broadphase(m.opt.broadphase_filter, m.geom_aabb.shape[0], m.geom_rbound.shape[0], m.geom_margin.shape[0]),
dim=nsweep,
inputs=[
m.ngeom,
@@ -602,7 +601,7 @@ def sap_broadphase(m: Model, d: Data):
@cache_kernel
def _nxn_broadphase(broadphase_filter):
def _nxn_broadphase(opt_broadphase_filter: int, ngeom_aabb: int, ngeom_rbound: int, ngeom_margin: int):
@nested_kernel(module="unique", enable_backward=False)
def kernel(
# Model:
@@ -629,7 +628,9 @@ def _nxn_broadphase(broadphase_filter):
geom2 = geom[1]
if (
broadphase_filter(geom_aabb, geom_rbound, geom_margin, geom_xpos_in, geom_xmat_in, geom1, geom2, worldid)
wp.static(_broadphase_filter(opt_broadphase_filter, ngeom_aabb, ngeom_rbound, ngeom_margin))(
geom_aabb, geom_rbound, geom_margin, geom_xpos_in, geom_xmat_in, geom1, geom2, worldid
)
or nxn_pairid[elementid][1] >= 0
):
_add_geom_pair(
@@ -663,9 +664,8 @@ def nxn_broadphase(m: Model, d: Data):
The initial list of pairs is filtered at model creation time to exclude pairs based on
`contype`/`conaffinity`, parent-child relationships, and explicit `<exclude>` tags.
"""
broadphase_filter = _broadphase_filter(m)
wp.launch(
_nxn_broadphase(broadphase_filter),
_nxn_broadphase(m.opt.broadphase_filter, m.geom_aabb.shape[0], m.geom_rbound.shape[0], m.geom_margin.shape[0]),
dim=(d.nworld, m.nxn_geom_pair_filtered.shape[0]),
inputs=[
m.geom_type,
+22 -32
View File
@@ -20,6 +20,8 @@ import warp as wp
from mujoco.mjx.third_party.mujoco_warp._src.collision_primitive import Geom
from mujoco.mjx.third_party.mujoco_warp._src.types import MJ_MINVAL
from mujoco.mjx.third_party.mujoco_warp._src.types import GeomType
from mujoco.mjx.third_party.mujoco_warp._src.types import mat43
from mujoco.mjx.third_party.mujoco_warp._src.types import mat63
# TODO(team): improve compile time to enable backward pass
wp.set_module_options({"enable_backward": False})
@@ -32,13 +34,6 @@ MJ_MINVAL2 = MJ_MINVAL * MJ_MINVAL
FACE_TOL = 0.99999872
EDGE_TOL = 0.00159999931
mat43 = wp.types.matrix(shape=(4, 3), dtype=float)
mat63 = wp.types.matrix(shape=(6, 3), dtype=float)
# box-box currently supports up to 8 contacts
MULTI_CONTACT_COUNT = 8
mat3c = wp.types.matrix(shape=(MULTI_CONTACT_COUNT, 3), dtype=float)
@wp.struct
class GJKResult:
@@ -155,30 +150,25 @@ def _support(geom: Geom, geomtype: int, dir: wp.vec3) -> SupportPoint:
vert_edgeadr = geom.graphadr + 2
vert_globalid = geom.graphadr + 2 + numvert
edge_localid = geom.graphadr + 2 + 2 * numvert
# hillclimb until no change
prev = int(-1)
imax = int(0)
if geom.index > -1:
imax = geom.index
sp.cached_index = geom.index
imax = wp.where(geom.index > -1, geom.index, 0)
while True:
prev = int(imax)
i = int(geom.graph[vert_edgeadr + imax])
while geom.graph[edge_localid + i] >= 0:
subidx = geom.graph[edge_localid + i]
# hillclimb until no change
while imax != prev:
prev = imax
i = geom.graph[vert_edgeadr + imax]
subidx = geom.graph[edge_localid + i]
while subidx >= 0:
idx = geom.graph[vert_globalid + subidx]
dist = wp.dot(local_dir, geom.vert[geom.vertadr + idx])
if dist > max_dist:
max_dist = dist
imax = int(subidx)
i += int(1)
if imax == prev:
break
imax = wp.where(dist > max_dist, subidx, imax)
max_dist = wp.where(dist > max_dist, dist, max_dist)
i += 1
subidx = geom.graph[edge_localid + i]
sp.cached_index = imax
imax = geom.graph[vert_globalid + imax]
sp.vertex_index = imax
sp.point = geom.vert[geom.vertadr + imax]
sp.vertex_index = geom.graph[vert_globalid + imax]
sp.point = geom.vert[geom.vertadr + sp.vertex_index]
sp.point = geom.rot @ sp.point + geom.pos
elif geomtype == GeomType.HFIELD:
@@ -1813,9 +1803,9 @@ def _polygon_clip(
# Out:
polygon_out: wp.array(dtype=wp.vec3),
clipped_out: wp.array(dtype=wp.vec3),
) -> Tuple[int, mat3c, mat3c]:
witness1 = mat3c()
witness2 = mat3c()
) -> Tuple[int, mat43, mat43]:
witness1 = mat43()
witness2 = mat43()
# clipping face needs to be at least a triangle
if nface1 < 3:
@@ -1930,9 +1920,9 @@ def multicontact(
geom2: Geom,
geomtype1: int,
geomtype2: int,
) -> Tuple[int, mat3c, mat3c]:
witness1 = mat3c()
witness2 = mat3c()
) -> Tuple[int, mat43, mat43]:
witness1 = mat43()
witness2 = mat43()
witness1[0] = x1
witness2[0] = x2
@@ -38,21 +38,16 @@ from mujoco.mjx.third_party.mujoco_warp._src.types import ContactType
from mujoco.mjx.third_party.mujoco_warp._src.types import Data
from mujoco.mjx.third_party.mujoco_warp._src.types import GeomType
from mujoco.mjx.third_party.mujoco_warp._src.types import Model
from mujoco.mjx.third_party.mujoco_warp._src.types import mat43
from mujoco.mjx.third_party.mujoco_warp._src.types import mat63
from mujoco.mjx.third_party.mujoco_warp._src.types import vec5
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import cache_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import event_scope
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import kernel as nested_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import nested_kernel
wp.set_module_options({"enable_backward": False})
class mat43f(wp.types.matrix(shape=(4, 3), dtype=wp.float32)):
pass
mat63 = wp.types.matrix(shape=(6, 3), dtype=float)
@wp.struct
class Geom:
pos: wp.vec3
@@ -169,7 +164,7 @@ def geom_collision_pair(
@wp.func
def plane_convex(plane_normal: wp.vec3, plane_pos: wp.vec3, convex: Geom) -> Tuple[wp.vec4, mat43f, wp.vec3]:
def plane_convex(plane_normal: wp.vec3, plane_pos: wp.vec3, convex: Geom) -> Tuple[wp.vec4, mat43, wp.vec3]:
"""Core contact geometry calculation for plane-convex collision.
Args:
@@ -185,7 +180,7 @@ def plane_convex(plane_normal: wp.vec3, plane_pos: wp.vec3, convex: Geom) -> Tup
_HUGE_VAL = 1e6
contact_dist = wp.vec4(wp.inf)
contact_pos = mat43f()
contact_pos = mat43()
contact_count = int(0)
# get points in the convex frame
@@ -26,7 +26,7 @@ from mujoco.mjx.third_party.mujoco_warp._src.types import Data
from mujoco.mjx.third_party.mujoco_warp._src.types import GeomType
from mujoco.mjx.third_party.mujoco_warp._src.types import Model
from mujoco.mjx.third_party.mujoco_warp._src.types import vec5
from mujoco.mjx.third_party.mujoco_warp._src.types import vec8f
from mujoco.mjx.third_party.mujoco_warp._src.types import vec8
from mujoco.mjx.third_party.mujoco_warp._src.types import vec8i
from mujoco.mjx.third_party.mujoco_warp._src.util_misc import halton
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import event_scope
@@ -54,7 +54,7 @@ class VolumeData:
half_size: wp.vec3
oct_aabb: wp.array2d(dtype=wp.vec3)
oct_child: wp.array(dtype=vec8i)
oct_coeff: wp.array(dtype=vec8f)
oct_coeff: wp.array(dtype=vec8)
valid: bool = False
@@ -79,7 +79,7 @@ def get_sdf_params(
# Model:
oct_child: wp.array(dtype=vec8i),
oct_aabb: wp.array2d(dtype=wp.vec3),
oct_coeff: wp.array(dtype=vec8f),
oct_coeff: wp.array(dtype=vec8),
plugin: wp.array(dtype=int),
plugin_attr: wp.array(dtype=wp.vec3f),
# In:
@@ -225,12 +225,12 @@ def user_sdf_grad(p: wp.vec3, attr: wp.vec3, sdf_type: int) -> wp.vec3:
@wp.func
def find_oct(
oct_child: wp.array(dtype=vec8i), oct_aabb: wp.array2d(dtype=wp.vec3), p: wp.vec3, grad: bool
) -> Tuple[int, Tuple[vec8f, vec8f, vec8f]]:
) -> Tuple[int, Tuple[vec8, vec8, vec8]]:
stack = int(0)
niter = int(100)
rx = vec8f(0.0)
ry = vec8f(0.0)
rz = vec8f(0.0)
rx = vec8(0.0)
ry = vec8(0.0)
rz = vec8(0.0)
eps = 1e-6
while niter > 0:
@@ -621,7 +621,7 @@ def _sdf_narrowphase(
nmeshface: int,
oct_child: wp.array(dtype=vec8i),
oct_aabb: wp.array2d(dtype=wp.vec3),
oct_coeff: wp.array(dtype=vec8f),
oct_coeff: wp.array(dtype=vec8),
geom_type: wp.array(dtype=int),
geom_condim: wp.array(dtype=int),
geom_dataid: wp.array(dtype=int),
+2 -2
View File
@@ -1843,7 +1843,7 @@ def make_constraint(m: types.Model, d: types.Data):
if m.opt.cone == types.ConeType.PYRAMIDAL:
wp.launch(
_efc_contact_pyramidal,
dim=(d.naconmax, 2 * (m.condim_max - 1) if m.condim_max > 1 else 1),
dim=(d.naconmax, m.nmaxpyramid),
inputs=[
m.nv,
m.opt.timestep,
@@ -1888,7 +1888,7 @@ def make_constraint(m: types.Model, d: types.Data):
elif m.opt.cone == types.ConeType.ELLIPTIC:
wp.launch(
_efc_contact_elliptic,
dim=(d.naconmax, m.condim_max),
dim=(d.naconmax, m.nmaxcondim),
inputs=[
m.nv,
m.opt.timestep,
+14 -7
View File
@@ -75,14 +75,21 @@ def _qderiv_actuator_passive(
else:
bias = 0.0
if actuator_dyntype[actid] != DynType.NONE:
act_first = actuator_actadr[actid]
act_last = act_first + actuator_actnum[actid] - 1
vel = bias + gain * act_in[worldid, act_last]
else:
vel = bias + gain * ctrl_in[worldid, actid]
if bias == 0.0 and gain == 0.0:
continue
qderiv += actuator_moment_in[worldid, actid, dofiid] * actuator_moment_in[worldid, actid, dofjid] * vel
vel = bias
if actuator_dyntype[actid] != DynType.NONE:
if gain != 0.0:
act_first = actuator_actadr[actid]
act_last = act_first + actuator_actnum[actid] - 1
vel += gain * act_in[worldid, act_last]
else:
if gain != 0.0:
vel += gain * ctrl_in[worldid, actid]
if vel != 0.0:
qderiv += actuator_moment_in[worldid, actid, dofiid] * actuator_moment_in[worldid, actid, dofjid] * vel
# TODO(team): fluid model derivative
+26 -25
View File
@@ -42,7 +42,7 @@ from mujoco.mjx.third_party.mujoco_warp._src.types import TrnType
from mujoco.mjx.third_party.mujoco_warp._src.types import vec10f
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import cache_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import event_scope
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import kernel as nested_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import nested_kernel
wp.set_module_options({"enable_backward": False})
@@ -521,7 +521,8 @@ def fwd_position(m: Model, d: Data, factorize: bool = True):
# TODO(team): sparse actuator_moment version
def _actuator_velocity(m: Model, d: Data):
@cache_kernel
def _actuator_velocity(nv: int):
@nested_kernel(module="unique", enable_backward=False)
def actuator_velocity(
# Data in:
@@ -531,22 +532,17 @@ def _actuator_velocity(m: Model, d: Data):
actuator_velocity_out: wp.array2d(dtype=float),
):
worldid, actid = wp.tid()
moment_tile = wp.tile_load(actuator_moment_in[worldid, actid], shape=wp.static(m.nv))
qvel_tile = wp.tile_load(qvel_in[worldid], shape=wp.static(m.nv))
moment_tile = wp.tile_load(actuator_moment_in[worldid, actid], shape=wp.static(nv))
qvel_tile = wp.tile_load(qvel_in[worldid], shape=wp.static(nv))
moment_qvel_tile = wp.tile_map(wp.mul, moment_tile, qvel_tile)
actuator_velocity_tile = wp.tile_reduce(wp.add, moment_qvel_tile)
actuator_velocity_out[worldid, actid] = actuator_velocity_tile[0]
wp.launch_tiled(
actuator_velocity,
dim=(d.nworld, m.nu),
inputs=[d.qvel, d.actuator_moment],
outputs=[d.actuator_velocity],
block_dim=m.block_dim.actuator_velocity,
)
return actuator_velocity
def _tendon_velocity(m: Model, d: Data):
@cache_kernel
def _tendon_velocity(nv: int):
@nested_kernel(module="unique", enable_backward=False)
def tendon_velocity(
# Data in:
@@ -556,29 +552,34 @@ def _tendon_velocity(m: Model, d: Data):
ten_velocity_out: wp.array2d(dtype=float),
):
worldid, tenid = wp.tid()
ten_J_tile = wp.tile_load(ten_J_in[worldid, tenid], shape=wp.static(m.nv))
qvel_tile = wp.tile_load(qvel_in[worldid], shape=wp.static(m.nv))
ten_J_tile = wp.tile_load(ten_J_in[worldid, tenid], shape=wp.static(nv))
qvel_tile = wp.tile_load(qvel_in[worldid], shape=wp.static(nv))
ten_J_qvel_tile = wp.tile_map(wp.mul, ten_J_tile, qvel_tile)
ten_velocity_tile = wp.tile_reduce(wp.add, ten_J_qvel_tile)
ten_velocity_out[worldid, tenid] = ten_velocity_tile[0]
wp.launch_tiled(
tendon_velocity,
dim=(d.nworld, m.ntendon),
inputs=[d.qvel, d.ten_J],
outputs=[d.ten_velocity],
block_dim=m.block_dim.tendon_velocity,
)
return tendon_velocity
@event_scope
def fwd_velocity(m: Model, d: Data):
"""Velocity-dependent computations."""
_actuator_velocity(m, d)
wp.launch_tiled(
_actuator_velocity(m.nv),
dim=(d.nworld, m.nu),
inputs=[d.qvel, d.actuator_moment],
outputs=[d.actuator_velocity],
block_dim=m.block_dim.actuator_velocity,
)
if m.ntendon > 0:
# TODO(team): sparse version
_tendon_velocity(m, d)
# TODO(team): sparse version
wp.launch_tiled(
_tendon_velocity(m.nv),
dim=(d.nworld, m.ntendon),
inputs=[d.qvel, d.ten_J],
outputs=[d.ten_velocity],
block_dim=m.block_dim.tendon_velocity,
)
smooth.com_vel(m, d)
passive.passive(m, d)
File diff suppressed because it is too large Load Diff
+7 -7
View File
@@ -561,7 +561,7 @@ def _flex_elasticity(
flex_elem: wp.array(dtype=int),
flex_elemedge: wp.array(dtype=int),
flexedge_length0: wp.array(dtype=float),
flex_stiffness: wp.array(dtype=float),
flex_stiffness: wp.array2d(dtype=float),
flex_damping: wp.array(dtype=float),
# Data in:
flexvert_xpos_in: wp.array2d(dtype=wp.vec3),
@@ -612,8 +612,8 @@ def _flex_elasticity(
id = int(0)
for ed1 in range(nedge):
for ed2 in range(ed1, nedge):
metric[ed1, ed2] = flex_stiffness[21 * elemid + id]
metric[ed2, ed1] = flex_stiffness[21 * elemid + id]
metric[ed1, ed2] = flex_stiffness[elemid, id]
metric[ed2, ed1] = flex_stiffness[elemid, id]
id += 1
force = wp.mat(0.0, shape=(6, 3))
@@ -640,7 +640,7 @@ def _flex_bending(
flex_vertbodyid: wp.array(dtype=int),
flex_edge: wp.array(dtype=wp.vec2i),
flex_edgeflap: wp.array(dtype=wp.vec2i),
flex_bending: wp.array(dtype=float),
flex_bending: wp.array2d(dtype=float),
# Data in:
flexvert_xpos_in: wp.array2d(dtype=wp.vec3),
# Data out:
@@ -664,7 +664,7 @@ def _flex_bending(
return
frc = wp.mat(0.0, shape=(4, 3))
if flex_bending[17 * edgeid + 16]:
if flex_bending[edgeid, 16]:
v0 = flexvert_xpos_in[worldid, v[0]]
v1 = flexvert_xpos_in[worldid, v[1]]
v2 = flexvert_xpos_in[worldid, v[2]]
@@ -678,8 +678,8 @@ def _flex_bending(
for i in range(nvert):
for x in range(3):
for j in range(nvert):
force[i, x] -= flex_bending[17 * edgeid + 4 * i + j] * flexvert_xpos_in[worldid, v[j]][x]
force[i, x] -= flex_bending[17 * edgeid + 16] * frc[i, x]
force[i, x] -= flex_bending[edgeid, 4 * i + j] * flexvert_xpos_in[worldid, v[j]][x]
force[i, x] -= flex_bending[edgeid, 16] * frc[i, x]
for i in range(nvert):
bodyid = flex_vertbodyid[flex_vertadr[f] + v[i]]
+5 -5
View File
@@ -37,12 +37,12 @@ from mujoco.mjx.third_party.mujoco_warp._src.types import SensorType
from mujoco.mjx.third_party.mujoco_warp._src.types import TrnType
from mujoco.mjx.third_party.mujoco_warp._src.types import vec5
from mujoco.mjx.third_party.mujoco_warp._src.types import vec6
from mujoco.mjx.third_party.mujoco_warp._src.types import vec8f
from mujoco.mjx.third_party.mujoco_warp._src.types import vec8
from mujoco.mjx.third_party.mujoco_warp._src.types import vec8i
from mujoco.mjx.third_party.mujoco_warp._src.util_misc import inside_geom
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import cache_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import event_scope
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import kernel as nested_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import nested_kernel
wp.set_module_options({"enable_backward": False})
@@ -482,8 +482,8 @@ def _sensor_pos(
sensor_adr: wp.array(dtype=int),
sensor_cutoff: wp.array(dtype=float),
sensor_pos_adr: wp.array(dtype=int),
sensor_collision_start_adr: wp.array(dtype=int),
rangefinder_sensor_adr: wp.array(dtype=int),
sensor_collision_start_adr: wp.array(dtype=int),
collision_sensor_adr: wp.array(dtype=int),
# Data in:
time_in: wp.array(dtype=float),
@@ -844,8 +844,8 @@ def sensor_pos(m: Model, d: Data):
m.sensor_adr,
m.sensor_cutoff,
m.sensor_pos_adr,
m.sensor_collision_start_adr,
m.rangefinder_sensor_adr,
m.sensor_collision_start_adr,
m.collision_sensor_adr,
d.time,
d.energy,
@@ -2089,7 +2089,7 @@ def _sensor_tactile(
body_weldid: wp.array(dtype=int),
oct_child: wp.array(dtype=vec8i),
oct_aabb: wp.array2d(dtype=wp.vec3),
oct_coeff: wp.array(dtype=vec8f),
oct_coeff: wp.array(dtype=vec8),
geom_type: wp.array(dtype=int),
geom_bodyid: wp.array(dtype=int),
geom_size: wp.array2d(dtype=wp.vec3),
+1 -1
View File
@@ -35,7 +35,7 @@ from mujoco.mjx.third_party.mujoco_warp._src.types import vec10
from mujoco.mjx.third_party.mujoco_warp._src.types import vec11
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import cache_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import event_scope
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import kernel as nested_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import nested_kernel
wp.set_module_options({"enable_backward": False})
+7 -6
View File
@@ -27,7 +27,7 @@ from mujoco.mjx.third_party.mujoco_warp._src.block_cholesky import create_blocke
from mujoco.mjx.third_party.mujoco_warp._src.block_cholesky import create_blocked_cholesky_solve_func
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import cache_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import event_scope
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import kernel as nested_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import nested_kernel
wp.set_module_options({"enable_backward": False})
@@ -1448,7 +1448,7 @@ def update_gradient_JTDAJ_sparse_tiled(tile_size: int, njmax: int):
@cache_kernel
def update_gradient_JTDAJ_dense_tiled(nv: int, tile_size: int, njmax: int):
def update_gradient_JTDAJ_dense_tiled(nv_padded: int, tile_size: int, njmax: int):
if njmax < tile_size:
tile_size = njmax
@@ -1473,7 +1473,7 @@ def update_gradient_JTDAJ_dense_tiled(nv: int, tile_size: int, njmax: int):
nefc = nefc_in[worldid]
sum_val = wp.tile_load(qM_in[worldid], shape=(nv, nv), bounds_check=False)
sum_val = wp.tile_load(qM_in[worldid], shape=(nv_padded, nv_padded), bounds_check=True)
# Each tile processes one output tile by looping over all constraints
for k in range(0, njmax, TILE_SIZE_K):
@@ -1483,7 +1483,7 @@ def update_gradient_JTDAJ_dense_tiled(nv: int, tile_size: int, njmax: int):
# AD: leaving bounds-check disabled here because I'm not entirely sure that
# everything always hits the fast path. The padding takes care of any
# potential OOB accesses.
J_ki = wp.tile_load(efc_J_in[worldid], shape=(TILE_SIZE_K, nv), offset=(k, 0), bounds_check=False)
J_ki = wp.tile_load(efc_J_in[worldid], shape=(TILE_SIZE_K, nv_padded), offset=(k, 0), bounds_check=False)
J_kj = J_ki
# state check
@@ -1499,7 +1499,7 @@ def update_gradient_JTDAJ_dense_tiled(nv: int, tile_size: int, njmax: int):
active_tile = wp.tile_map(active_check, tid_tile, threshold_tile)
D_k = wp.tile_map(wp.mul, active_tile, D_k)
J_ki = wp.tile_map(wp.mul, wp.tile_transpose(J_ki), wp.tile_broadcast(D_k, shape=(nv, TILE_SIZE_K)))
J_ki = wp.tile_map(wp.mul, wp.tile_transpose(J_ki), wp.tile_broadcast(D_k, shape=(nv_padded, TILE_SIZE_K)))
sum_val += wp.tile_matmul(J_ki, J_kj)
@@ -1742,8 +1742,9 @@ def _update_gradient(m: types.Model, d: types.Data):
outputs=[d.efc.h],
)
else:
nv_padded = d.efc.J.shape[2]
wp.launch_tiled(
update_gradient_JTDAJ_dense_tiled(m.nv, types.TILE_SIZE_JTDAJ_DENSE, d.njmax),
update_gradient_JTDAJ_dense_tiled(nv_padded, types.TILE_SIZE_JTDAJ_DENSE, d.njmax),
dim=d.nworld,
inputs=[
d.nefc,
+1 -1
View File
@@ -27,7 +27,7 @@ from mujoco.mjx.third_party.mujoco_warp._src.types import TileSet
from mujoco.mjx.third_party.mujoco_warp._src.types import vec5
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import cache_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import event_scope
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import kernel as nested_kernel
from mujoco.mjx.third_party.mujoco_warp._src.warp_util import nested_kernel
wp.set_module_options({"enable_backward": False})
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -121,9 +121,9 @@ def event_scope(fn, name: str = ""):
return wrapper
# @kernel decorator to automatically set up modules based on nested
# @nested_kernel decorator to automatically set up modules based on nested
# function names
def kernel(
def nested_kernel(
f: Optional[Callable] = None,
*,
enable_backward: Optional[bool] = None,
@@ -136,20 +136,20 @@ def kernel(
Example::
@kernel
@nested_kernel
def my_kernel(a: wp.array(dtype=float), b: wp.array(dtype=float)):
tid = wp.tid()
b[tid] = a[tid] + 1.0
@kernel(enable_backward=False)
@nested_kernel(enable_backward=False)
def my_kernel_no_backward(a: wp.array(dtype=float, ndim=2), x: float):
# the backward pass will not be generated
i, j = wp.tid()
a[i, j] = x
@kernel(module="unique")
@nested_kernel(module="unique")
def my_kernel_unique_module(a: wp.array(dtype=float), b: wp.array(dtype=float)):
# the kernel will be registered in new unique module created just for this
# kernel and its dependent functions and structs
@@ -157,7 +157,7 @@ def kernel(
b[tid] = a[tid] + 1.0
@kernel(enable_backward=False, module=None)
@neste_kernel(enable_backward=False, module=None)
def my_kernel_with_args(a: wp.array(dtype=float), b: wp.array(dtype=float)):
# can now use arguments even when module=None
tid = wp.tid()
+1 -1
View File
@@ -94,7 +94,7 @@ def _collision_shim(
nxn_pairid_filtered: wp.array(dtype=wp.vec2i),
oct_aabb: wp.array2d(dtype=wp.vec3),
oct_child: wp.array(dtype=mjwp_types.vec8i),
oct_coeff: wp.array(dtype=mjwp_types.vec8f),
oct_coeff: wp.array(dtype=mjwp_types.vec8),
pair_dim: wp.array(dtype=int),
pair_friction: wp.array2d(dtype=mjwp_types.vec5),
pair_gap: wp.array2d(dtype=float),
+18 -12
View File
@@ -106,7 +106,6 @@ def _forward_shim(
cam_sensorsize: wp.array(dtype=wp.vec2),
cam_targetbodyid: wp.array(dtype=int),
collision_sensor_adr: wp.array(dtype=int),
condim_max: int,
dof_Madr: wp.array(dtype=int),
dof_armature: wp.array2d(dtype=float),
dof_bodyid: wp.array(dtype=int),
@@ -129,7 +128,7 @@ def _forward_shim(
eq_solref: wp.array2d(dtype=wp.vec2),
eq_ten_adr: wp.array(dtype=int),
eq_wld_adr: wp.array(dtype=int),
flex_bending: wp.array(dtype=float),
flex_bending: wp.array2d(dtype=float),
flex_damping: wp.array(dtype=float),
flex_dim: wp.array(dtype=int),
flex_edge: wp.array(dtype=wp.vec2i),
@@ -138,7 +137,7 @@ def _forward_shim(
flex_elem: wp.array(dtype=int),
flex_elemedge: wp.array(dtype=int),
flex_elemedgeadr: wp.array(dtype=int),
flex_stiffness: wp.array(dtype=float),
flex_stiffness: wp.array2d(dtype=float),
flex_vertadr: wp.array(dtype=int),
flex_vertbodyid: wp.array(dtype=int),
flexedge_length0: wp.array(dtype=float),
@@ -229,8 +228,10 @@ def _forward_shim(
ngravcomp: int,
njnt: int,
nlight: int,
nmaxcondim: int,
nmaxmeshdeg: int,
nmaxpolygon: int,
nmaxpyramid: int,
nmeshface: int,
nmocap: int,
nrangefinder: int,
@@ -247,7 +248,7 @@ def _forward_shim(
nxn_pairid_filtered: wp.array(dtype=wp.vec2i),
oct_aabb: wp.array2d(dtype=wp.vec3),
oct_child: wp.array(dtype=mjwp_types.vec8i),
oct_coeff: wp.array(dtype=mjwp_types.vec8f),
oct_coeff: wp.array(dtype=mjwp_types.vec8),
pair_dim: wp.array(dtype=int),
pair_friction: wp.array2d(dtype=mjwp_types.vec5),
pair_gap: wp.array2d(dtype=float),
@@ -556,7 +557,6 @@ def _forward_shim(
_m.cam_sensorsize = cam_sensorsize
_m.cam_targetbodyid = cam_targetbodyid
_m.collision_sensor_adr = collision_sensor_adr
_m.condim_max = condim_max
_m.dof_Madr = dof_Madr
_m.dof_armature = dof_armature
_m.dof_bodyid = dof_bodyid
@@ -679,8 +679,10 @@ def _forward_shim(
_m.ngravcomp = ngravcomp
_m.njnt = njnt
_m.nlight = nlight
_m.nmaxcondim = nmaxcondim
_m.nmaxmeshdeg = nmaxmeshdeg
_m.nmaxpolygon = nmaxpolygon
_m.nmaxpyramid = nmaxpyramid
_m.nmeshface = nmeshface
_m.nmocap = nmocap
_m.nrangefinder = nrangefinder
@@ -1279,7 +1281,6 @@ def _forward_jax_impl(m: types.Model, d: types.Data):
m.cam_sensorsize,
m.cam_targetbodyid,
m._impl.collision_sensor_adr,
m._impl.condim_max,
m.dof_Madr,
m.dof_armature,
m.dof_bodyid,
@@ -1402,8 +1403,10 @@ def _forward_jax_impl(m: types.Model, d: types.Data):
m.ngravcomp,
m.njnt,
m.nlight,
m._impl.nmaxcondim,
m._impl.nmaxmeshdeg,
m._impl.nmaxpolygon,
m._impl.nmaxpyramid,
m.nmeshface,
m.nmocap,
m._impl.nrangefinder,
@@ -1895,7 +1898,6 @@ def _step_shim(
cam_sensorsize: wp.array(dtype=wp.vec2),
cam_targetbodyid: wp.array(dtype=int),
collision_sensor_adr: wp.array(dtype=int),
condim_max: int,
dof_Madr: wp.array(dtype=int),
dof_armature: wp.array2d(dtype=float),
dof_bodyid: wp.array(dtype=int),
@@ -1918,7 +1920,7 @@ def _step_shim(
eq_solref: wp.array2d(dtype=wp.vec2),
eq_ten_adr: wp.array(dtype=int),
eq_wld_adr: wp.array(dtype=int),
flex_bending: wp.array(dtype=float),
flex_bending: wp.array2d(dtype=float),
flex_damping: wp.array(dtype=float),
flex_dim: wp.array(dtype=int),
flex_edge: wp.array(dtype=wp.vec2i),
@@ -1927,7 +1929,7 @@ def _step_shim(
flex_elem: wp.array(dtype=int),
flex_elemedge: wp.array(dtype=int),
flex_elemedgeadr: wp.array(dtype=int),
flex_stiffness: wp.array(dtype=float),
flex_stiffness: wp.array2d(dtype=float),
flex_vertadr: wp.array(dtype=int),
flex_vertbodyid: wp.array(dtype=int),
flexedge_length0: wp.array(dtype=float),
@@ -2019,8 +2021,10 @@ def _step_shim(
ngravcomp: int,
njnt: int,
nlight: int,
nmaxcondim: int,
nmaxmeshdeg: int,
nmaxpolygon: int,
nmaxpyramid: int,
nmeshface: int,
nmocap: int,
nrangefinder: int,
@@ -2037,7 +2041,7 @@ def _step_shim(
nxn_pairid_filtered: wp.array(dtype=wp.vec2i),
oct_aabb: wp.array2d(dtype=wp.vec3),
oct_child: wp.array(dtype=mjwp_types.vec8i),
oct_coeff: wp.array(dtype=mjwp_types.vec8f),
oct_coeff: wp.array(dtype=mjwp_types.vec8),
pair_dim: wp.array(dtype=int),
pair_friction: wp.array2d(dtype=mjwp_types.vec5),
pair_gap: wp.array2d(dtype=float),
@@ -2347,7 +2351,6 @@ def _step_shim(
_m.cam_sensorsize = cam_sensorsize
_m.cam_targetbodyid = cam_targetbodyid
_m.collision_sensor_adr = collision_sensor_adr
_m.condim_max = condim_max
_m.dof_Madr = dof_Madr
_m.dof_armature = dof_armature
_m.dof_bodyid = dof_bodyid
@@ -2471,8 +2474,10 @@ def _step_shim(
_m.ngravcomp = ngravcomp
_m.njnt = njnt
_m.nlight = nlight
_m.nmaxcondim = nmaxcondim
_m.nmaxmeshdeg = nmaxmeshdeg
_m.nmaxpolygon = nmaxpolygon
_m.nmaxpyramid = nmaxpyramid
_m.nmeshface = nmeshface
_m.nmocap = nmocap
_m.nrangefinder = nrangefinder
@@ -3072,7 +3077,6 @@ def _step_jax_impl(m: types.Model, d: types.Data):
m.cam_sensorsize,
m.cam_targetbodyid,
m._impl.collision_sensor_adr,
m._impl.condim_max,
m.dof_Madr,
m.dof_armature,
m.dof_bodyid,
@@ -3196,8 +3200,10 @@ def _step_jax_impl(m: types.Model, d: types.Data):
m.ngravcomp,
m.njnt,
m.nlight,
m._impl.nmaxcondim,
m._impl.nmaxmeshdeg,
m._impl.nmaxpolygon,
m._impl.nmaxpyramid,
m.nmeshface,
m.nmocap,
m._impl.nrangefinder,
+2 -1
View File
@@ -155,7 +155,8 @@ class ForwardTest(parameterized.TestCase):
mujoco.mj_fullM(m, qm, d.qM)
else:
qm = d.qM
tu.assert_eq(qm, dx._impl.qM, 'qM')
# mjwarp adds padding to qM
tu.assert_eq(qm, dx._impl.qM[: m.nv, : m.nv], 'qM')
# qLD is fused in a cholesky factorize and solve, and not written to.
tu.assert_contact_eq(d, dx, worldid=i)
+23 -21
View File
@@ -105,14 +105,11 @@ class ModelWarp(PyTreeNode):
M_colind: np.ndarray
M_rowadr: np.ndarray
M_rownnz: np.ndarray
actuator_moment_tiles_nu: Tuple[TileSet, ...]
actuator_moment_tiles_nv: Tuple[TileSet, ...]
actuator_trntype_body_adr: np.ndarray
block_dim: BlockDim
body_fluid_ellipsoid: np.ndarray
body_tree: Tuple[np.ndarray, ...]
collision_sensor_adr: np.ndarray
condim_max: int
dof_tri_col: np.ndarray
dof_tri_row: np.ndarray
eq_connect_adr: np.ndarray
@@ -158,9 +155,14 @@ class ModelWarp(PyTreeNode):
nflexedge: int
nflexelem: int
nflexelemdata: int
nflexelemedge: int
nflexvert: int
nmaxcondim: int
nmaxmeshdeg: int
nmaxpolygon: int
nmaxpyramid: int
noct: int
nplugin: int
nrangefinder: int
nsensorcollision: int
nsensorcontact: int
@@ -522,8 +524,6 @@ _NDIM = {
'actuator_gaintype': 1,
'actuator_gear': 3,
'actuator_lengthrange': 2,
'actuator_moment_tiles_nu': -1,
'actuator_moment_tiles_nv': -1,
'actuator_trnid': 2,
'actuator_trntype': 1,
'actuator_trntype_body_adr': 1,
@@ -577,7 +577,6 @@ _NDIM = {
'cam_sensorsize': 2,
'cam_targetbodyid': 1,
'collision_sensor_adr': 1,
'condim_max': 0,
'dof_Madr': 1,
'dof_armature': 2,
'dof_bodyid': 1,
@@ -603,7 +602,7 @@ _NDIM = {
'eq_type': 1,
'eq_wld_adr': 1,
'exclude_signature': 1,
'flex_bending': 1,
'flex_bending': 2,
'flex_damping': 1,
'flex_dim': 1,
'flex_edge': 2,
@@ -612,7 +611,7 @@ _NDIM = {
'flex_elem': 1,
'flex_elemedge': 1,
'flex_elemedgeadr': 1,
'flex_stiffness': 1,
'flex_stiffness': 2,
'flex_vertadr': 1,
'flex_vertbodyid': 1,
'flex_vertnum': 1,
@@ -677,7 +676,7 @@ _NDIM = {
'light_type': 2,
'mapM2M': 1,
'mat_rgba': 3,
'mat_texid': 3,
'mat_texid': 2,
'mat_texrepeat': 3,
'mesh_face': 2,
'mesh_faceadr': 1,
@@ -711,6 +710,7 @@ _NDIM = {
'nflexedge': 0,
'nflexelem': 0,
'nflexelemdata': 0,
'nflexelemedge': 0,
'nflexvert': 0,
'ngeom': 0,
'ngravcomp': 0,
@@ -719,16 +719,22 @@ _NDIM = {
'njnt': 0,
'nlight': 0,
'nmat': 0,
'nmaxcondim': 0,
'nmaxmeshdeg': 0,
'nmaxpolygon': 0,
'nmaxpyramid': 0,
'nmesh': 0,
'nmeshface': 0,
'nmeshgraph': 0,
'nmeshnormal': 0,
'nmeshpoly': 0,
'nmeshpolymap': 0,
'nmeshpolyvert': 0,
'nmeshvert': 0,
'nmocap': 0,
'noct': 0,
'npair': 0,
'nplugin': 0,
'nq': 0,
'nrangefinder': 0,
'nsensor': 0,
@@ -748,8 +754,6 @@ _NDIM = {
'oct_aabb': 3,
'oct_child': 2,
'oct_coeff': 2,
'opt__broadphase': 0,
'opt__broadphase_filter': 0,
'opt__ccd_iterations': 0,
'opt__ccd_tolerance': 1,
'opt__cone': 0,
@@ -867,8 +871,6 @@ _NDIM = {
'wrap_type': 1,
},
'Option': {
'broadphase': 0,
'broadphase_filter': 0,
'ccd_iterations': 0,
'ccd_tolerance': 1,
'cone': 0,
@@ -1060,8 +1062,6 @@ _BATCH_DIM = {
'actuator_gaintype': False,
'actuator_gear': True,
'actuator_lengthrange': False,
'actuator_moment_tiles_nu': False,
'actuator_moment_tiles_nv': False,
'actuator_trnid': False,
'actuator_trntype': False,
'actuator_trntype_body_adr': False,
@@ -1115,7 +1115,6 @@ _BATCH_DIM = {
'cam_sensorsize': False,
'cam_targetbodyid': False,
'collision_sensor_adr': False,
'condim_max': False,
'dof_Madr': False,
'dof_armature': True,
'dof_bodyid': False,
@@ -1215,7 +1214,7 @@ _BATCH_DIM = {
'light_type': True,
'mapM2M': False,
'mat_rgba': True,
'mat_texid': True,
'mat_texid': False,
'mat_texrepeat': True,
'mesh_face': False,
'mesh_faceadr': False,
@@ -1249,6 +1248,7 @@ _BATCH_DIM = {
'nflexedge': False,
'nflexelem': False,
'nflexelemdata': False,
'nflexelemedge': False,
'nflexvert': False,
'ngeom': False,
'ngravcomp': False,
@@ -1257,16 +1257,22 @@ _BATCH_DIM = {
'njnt': False,
'nlight': False,
'nmat': False,
'nmaxcondim': False,
'nmaxmeshdeg': False,
'nmaxpolygon': False,
'nmaxpyramid': False,
'nmesh': False,
'nmeshface': False,
'nmeshgraph': False,
'nmeshnormal': False,
'nmeshpoly': False,
'nmeshpolymap': False,
'nmeshpolyvert': False,
'nmeshvert': False,
'nmocap': False,
'noct': False,
'npair': False,
'nplugin': False,
'nq': False,
'nrangefinder': False,
'nsensor': False,
@@ -1286,8 +1292,6 @@ _BATCH_DIM = {
'oct_aabb': False,
'oct_child': False,
'oct_coeff': False,
'opt__broadphase': False,
'opt__broadphase_filter': False,
'opt__ccd_iterations': False,
'opt__ccd_tolerance': True,
'opt__cone': False,
@@ -1405,8 +1409,6 @@ _BATCH_DIM = {
'wrap_type': False,
},
'Option': {
'broadphase': False,
'broadphase_filter': False,
'ccd_iterations': False,
'ccd_tolerance': True,
'cone': False,