ASR Model APIs

The Affine-Soft-Robot (ASR) Model includes the states for * Affine bodies * Soft bodies * Robots, with vision-based tactile sensors as soft bodies

class warp_ipc.sim_model.ASRModel(num_envs: int = 1, viz_envs: list[int] = [], device='cuda:0')

Bases: Model

ABD-IPC-Robots Model

ABD_centers: <warp.types.array object at 0x7f4c9a1be2f0>
class KinematicConstraintHelper(model: ASRModel, initial_stiffness: float = 10000.0)

Bases: object

increase_stiffness(factor: float = 2.0)
init() None
initialize_stiffness()
is_satisfied()
project_system(sm, sys_grad)
reset()
reset_dof_satisfied()
set_initial_stiffness(initial_stiffness: float = 10000.0)
update_satisfied(x, y, dt: float, tol: float)
class LinearConstraintHelper(model: ASRModel)

Bases: object

add_constraint(constraint_row: asarray)
add_constraints(constraint_rows: asarray)
finalize()
init()
project_system(hess: BsrMatrix, grad: array)
class SetStateHelper(model: ASRModel)

Bases: object

clear_mask()
init() None
X: <warp.types.array object at 0x7f4cac9233a0>
a_y: <warp.types.array object at 0x7f4c9a1bdff0>
add_affine_body(x, face, density, E, mu, mass_xi: None | float = None, env_id: int = 0, nu: float = 0.3) TriMeshBodyHandle
add_garment_stitch(stitches)
add_plane(n, o, mu) None
add_robot(urdf_path: str, env_id: int = 0, start_coll_layer: int = 2, coll_layers: list[int] = [], disable_coll_layers: list[int] = [], mu: float = 0.3, self_collision: bool = False, **kwargs)
add_soft_shell_body(mesh, edge_stretching_stiffness: float = 0, density: float = 1000, E: float = 0, nu: float = 0.3, compression_softening: float = 0, bending_stiffness: float = 0, mu: float = 0, xi: float = 0.001, mass_thickness: None | float = None, env_id: int = 0) TriMeshBodyHandle

Constitutive model: Baraff-Witkin and dihedral angle bendings NOTE: Since this repository is only for POC, interfaces functionality will be limited. This function must be called after all affine bodies are added. add_soft_vol_body must be called after all soft shell bodies are added.

add_soft_vol_body(mesh: UnstructuredGrid, density: float, E: float, nu: float, mu: float, env_id: int = 0, coll_layer: int = 0, self_coll: bool = True) TetMeshBodyHandle

Constitutive model: Neo-Hookean/StVK for now; TODO: Corotated Linear NOTE: Since this repository is only for POC, interfaces functionality will be limited. This function must be called after all affine bodies are added.

add_world_prismatic_joint(handle: TetMeshBodyHandle | TriMeshBodyHandle, axis: ndarray[Any, dtype[_ScalarType_co]]) WorldJointHandle
add_world_revolute_joint(handle: TetMeshBodyHandle | TriMeshBodyHandle, local_axis_position: ndarray[Any, dtype[_ScalarType_co]], axis_direction: ndarray[Any, dtype[_ScalarType_co]]) WorldJointHandle
property affine_body_num: int
affine_density: <warp.types.array object at 0x7f4c9a1be650>
affine_ext_force_field: <warp.types.array object at 0x7f4c9a1be290>
affine_ext_y_force: <warp.types.array object at 0x7f4c9a1be2c0>
affine_flipped: <warp.types.array object at 0x7f4c9a1be5f0>
affine_is_closed: <warp.types.array object at 0x7f4c9a1be5c0>
affine_mass_matrix: <warp.types.array object at 0x7f4c9a1be590>
affine_mass_xi: <warp.types.array object at 0x7f4c9a1be620>
allocate_sim_cache()
append_sim_data(attr: str, values: asarray, type) None
apply_set_state(x=None, y=None) None

call apply set state manually mainly for initial scene visualization purpose

arap_compression_k: <warp.types.array object at 0x7f4c9a1ad7b0>
arap_stretch_k: <warp.types.array object at 0x7f4c9a1ad780>
bending: <warp.types.array object at 0x7f4c9a1ad810>
bending_e: <warp.types.array object at 0x7f4c9a1bd930>
bending_h: <warp.types.array object at 0x7f4c9a1bd960>
bending_rest_angle: <warp.types.array object at 0x7f4c9a1bd900>
bending_stiffness: <warp.types.array object at 0x7f4c9a1bd990>
body_collision_layer: <warp.types.array object at 0x7f4c9a1be4d0>
body_enable_self_collision: <warp.types.array object at 0x7f4c9a1be470>
body_env_id: <warp.types.array object at 0x7f4c9a1be4a0>
body_is_affine: <warp.types.array object at 0x7f4c9a1be440>
body_q: <warp.types.array object at 0x7f4c9a1be770>
body_qd: <warp.types.array object at 0x7f4c9a1be7a0>
check_initial_state_valid(exclude_self_collision: bool = False) bool
clear_force()
clear_grad() None
collision_layer_filter: <warp.types.array object at 0x7f4c9a1be500>
property collision_map
dhat

IPC barrier active distance (m)

dim: int

Dimension of the space, defualt to be 3 for 3D

disable_affine_kinematic_constraint(handle: TetMeshBodyHandle | TriMeshBodyHandle) None
property dummy_robot: Robot | None
property dx_div_dv_scale
dx_div_dv_scale_list

for quasi-static, implicit Euler, BDF-2

edge: <warp.types.array object at 0x7f4c9a1acd60>
edge2body: <warp.types.array object at 0x7f4c9a1be410>
edge2env: <warp.types.array object at 0x7f4c9a1be350>
edge_area: <warp.types.array object at 0x7f4c9a1bdb70>
edge_stretching_stiffness: <warp.types.array object at 0x7f4c9a1ad7e0>
edge_xi: <warp.types.array object at 0x7f4c9a1bdbd0>
enable_affine_kinematic_constraint(handle: TetMeshBodyHandle | TriMeshBodyHandle) None
env_origins: <warp.types.array object at 0x7f4c9a1be740>
env_states: <warp.types.array object at 0x7f4c9a1be530>
epsv

Friction (m/s)

face: <warp.types.array object at 0x7f4c9a1ad5d0>
face2body: <warp.types.array object at 0x7f4c9a1be3e0>
face2env: <warp.types.array object at 0x7f4c9a1be380>
face_xi: <warp.types.array object at 0x7f4c9a1bdc00>
finalize() None
fn_x: <warp.types.array object at 0x7f4c9a1bdae0>
ft_x: <warp.types.array object at 0x7f4c9a1bdb10>
get_affine_body_mesh_from_handle(handle: TriMeshBodyHandle) Trimesh
get_affine_body_meshes_from_handle(handles: List[TriMeshBodyHandle], concat=True) list[Trimesh] | Trimesh
get_affine_body_state(body_handle: TetMeshBodyHandle | TriMeshBodyHandle, return_numpy: bool = True) Tuple[ndarray[Any, dtype[_ScalarType_co]], ndarray[Any, dtype[_ScalarType_co]]]
get_affine_body_state_matrix(body_handle: TetMeshBodyHandle | TriMeshBodyHandle, return_numpy: bool = True) ndarray[Any, dtype[_ScalarType_co]]
get_affine_body_velocity(body_handle: TetMeshBodyHandle | TriMeshBodyHandle, return_numpy: bool = True) Tuple[ndarray[Any, dtype[_ScalarType_co]], ndarray[Any, dtype[_ScalarType_co]]]
get_affine_body_velocity_matrix(body_handle: TetMeshBodyHandle | TriMeshBodyHandle, return_numpy: bool = True) ndarray[Any, dtype[_ScalarType_co]]
get_affine_body_wp_meshes_from_handle(handles: list[TriMeshBodyHandle]) list[Mesh]
get_body_env_id(handle: TetMeshBodyHandle | TriMeshBodyHandle) int
get_body_face(handle: TetMeshBodyHandle | TriMeshBodyHandle) Tensor
get_body_mesh(handle: TetMeshBodyHandle | TriMeshBodyHandle)
get_body_nodal_collision_force(handle: TetMeshBodyHandle | TriMeshBodyHandle, dt: float) Tensor
get_body_nodal_contact_force(handle: TetMeshBodyHandle | TriMeshBodyHandle, dt: float) Tensor
get_body_nodal_friction_force(handle: TetMeshBodyHandle | TriMeshBodyHandle, dt: float) Tensor
get_body_resultant_contact_force(handle: TetMeshBodyHandle | TriMeshBodyHandle, dt: float) Tensor
get_body_target_mesh(handle: TetMeshBodyHandle | TriMeshBodyHandle)
get_body_x(handle: TetMeshBodyHandle | TriMeshBodyHandle) Tensor
get_body_x_target(handle: TetMeshBodyHandle | TriMeshBodyHandle) Tensor
get_element_by_handle(handle: TetMeshBodyHandle, return_numpy=True) Tuple[ndarray[Any, dtype[_ScalarType_co]], ndarray[Any, dtype[_ScalarType_co]]]
static get_env_pos(num_envs: int, n_row: int, n_col: int, env_spacing: float, device: str = 'cuda:0') tensor
get_environment_states()
get_joint_value(joint_handle: WorldJointHandle) float
get_scene_mesh() Trimesh
get_soft_body_from_handle(handle: TetMeshBodyHandle) UnstructuredGrid
get_soft_body_mesh_from_handle(handle: TetMeshBodyHandle) Trimesh
get_soft_body_meshes_from_handle(handles: List[TetMeshBodyHandle], concat=True) list[Trimesh] | Trimesh
get_soft_body_pos(body_handle: TetMeshBodyHandle | TriMeshBodyHandle, return_numpy: bool = True) ndarray[Any, dtype[_ScalarType_co]]
get_soft_body_velocity(body_handle: TetMeshBodyHandle | TriMeshBodyHandle, return_numpy: bool = True) ndarray[Any, dtype[_ScalarType_co]]
get_soft_nodes_from_idxs(idxs: list[tuple[int, int]]) ndarray[Any, dtype[_ScalarType_co]]
get_soft_surf_verts_from_handle(handle: TetMeshBodyHandle | TriMeshBodyHandle) ndarray[Any, dtype[_ScalarType_co]]
get_soft_verts_from_handle(handle: TetMeshBodyHandle | TriMeshBodyHandle) ndarray[Any, dtype[_ScalarType_co]]
gravity

Gravity vector (m/s^2)

half_space_mu: <warp.types.array object at 0x7f4c9a1be710>
half_space_n: <warp.types.array object at 0x7f4c9a1be6b0>
half_space_o: <warp.types.array object at 0x7f4c9a1be6e0>
handle_EE

Handling edge-edge interpenetration; disabling makes the simulation faster.

hat_x: <warp.types.array object at 0x7f4c9a1bda50>
hat_y: <warp.types.array object at 0x7f4c9a1bdcc0>
hess_affine_diag: COOMatrix3x3
hess_barrier: COOMatrix3x3
hess_friction: COOMatrix3x3
hess_soft_bending_elastic: COOMatrix3x3
hess_soft_diag: COOMatrix3x3
hess_soft_shell_elastic: COOMatrix3x3
hess_soft_vol_elastic: COOMatrix3x3
hess_stitch: COOMatrix3x3
init() None
initialize_hat_x_y() None
initialize_tilde_x_y(dt: float) None
initialize_tilde_x_y_adjoint(dt: float) None
k_elasticity_damping

Elasticity damping coefficient (Pa.s/m)

kappa

IPC barrier stiffness (Pa)

mass_body: <warp.types.array object at 0x7f4c9a1bdc60>
merge_sys_grad() None
property n_affine_dofs: int
property n_dofs: int
negate(gradient: array) None
negate_vec12d(gradient: array) None
negate_vec3d(gradient: array) None
node2body: <warp.types.array object at 0x7f4c9a1be3b0>
node2env: <warp.types.array object at 0x7f4c9a1be320>
node_area: <warp.types.array object at 0x7f4c9a1bdb40>
node_xi: <warp.types.array object at 0x7f4c9a1bdba0>
property num_HS
property num_body
property num_cloth_edges
property num_edge
property num_face
property num_surf_verts
property num_x
particle_q: <warp.types.array object at 0x7f4cac9233d0>

Node positions

particle_qd: <warp.types.array object at 0x7f4c9a1bda80>

Node velocities

particle_qdd: <warp.types.array object at 0x7f4c9a1bdab0>

Node accelerations

particle_radius

Ground plane parameters for warp.sim visualization

requires_grad(flag=True) None
reset_environement(env_id)
safeguard_direction_x(direction_x: array) None
save_sim_x_to_xt() None
set_affine_external_force_field(handle: TetMeshBodyHandle | TriMeshBodyHandle, target_force_acceleration: ndarray[Any, dtype[_ScalarType_co]] | Tensor) None
set_affine_external_torque(handle: TetMeshBodyHandle | TriMeshBodyHandle, torque: ndarray[Any, dtype[_ScalarType_co]] | Tensor = tensor([0., 0., 0.], dtype=torch.float64)) None
set_affine_external_wrench(handle: TetMeshBodyHandle | TriMeshBodyHandle, target_force_acceleration: ndarray[Any, dtype[_ScalarType_co]] | Tensor, torque: ndarray[Any, dtype[_ScalarType_co]] | Tensor = tensor([0., 0., 0.], dtype=torch.float64)) None
set_affine_kinematic_target(handle: TetMeshBodyHandle | TriMeshBodyHandle, target_rot_mat: ndarray[Any, dtype[_ScalarType_co]] | Tensor, target_translation: ndarray[Any, dtype[_ScalarType_co]] | Tensor) None
set_affine_state(handle: TetMeshBodyHandle | TriMeshBodyHandle, rotation: ndarray[Any, dtype[_ScalarType_co]] | Tensor, translation: ndarray[Any, dtype[_ScalarType_co]] | Tensor) None
set_body_collision_layer(handle: TetMeshBodyHandle | TriMeshBodyHandle, layer_index: int) None
set_body_env_id(handle: TetMeshBodyHandle | TriMeshBodyHandle, env_id: int) None
set_body_self_collision(handle: TetMeshBodyHandle | TriMeshBodyHandle, to_enable: bool) None
set_collision_layer_filter(layer_i: int, layer_j: int, to_enable_collision: bool) None
set_kinematic_stiffness(weight) None
set_robot_state(joint_params: dict[str, float], root_tf: ndarray[Any, dtype[_ScalarType_co]] = array([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]]), env_ids: list[int] = [])
set_soft_kinematic_constraint(handle: TetMeshBodyHandle | TriMeshBodyHandle, verts_mask: ndarray[Any, dtype[_ScalarType_co]] | Tensor) None
set_soft_kinematic_target(handle: TetMeshBodyHandle | TriMeshBodyHandle, target_verts: ndarray[Any, dtype[_ScalarType_co]] | Tensor) None
set_soft_state(handle: TetMeshBodyHandle | TriMeshBodyHandle, positions: ndarray[Any, dtype[_ScalarType_co]] | Tensor) None
property shape_count_sim: int
property soft_bending_connectivity_num: int
property soft_kinematic_constraint: Tensor
property soft_kinematic_target: Tensor
soft_shell_E: <warp.types.array object at 0x7f4c9a1ad630>
soft_shell_IB: <warp.types.array object at 0x7f4c9a1ad600>
property soft_shell_elastic_connectivity_num: int
property soft_shell_elastic_connectivity_offset: int
soft_shell_elem_vol: <warp.types.array object at 0x7f4c9a1ad690>
soft_shell_nu: <warp.types.array object at 0x7f4c9a1ad660>
property soft_shell_tris_num
soft_tet_E: <warp.types.array object at 0x7f4c9a1ad6c0>
soft_tet_IB: <warp.types.array object at 0x7f4c9a1ad720>
soft_tet_elem_vol: <warp.types.array object at 0x7f4c9a1ad750>
soft_tet_nu: <warp.types.array object at 0x7f4c9a1ad6f0>
soft_tilde_x: <warp.types.array object at 0x7f4c9a1bdc90>
soft_verts_mass: <warp.types.array object at 0x7f4c9a1be680>
property soft_verts_num
property soft_vol_body_offset: int
property soft_vol_elastic_connectivity_num: int
property soft_vol_tets_num
state(requires_grad=None) State

Returns a state object for the model

The returned state will be initialized with the initial configuration given in the model description.

Parameters:

requires_grad (bool) – Manual overwrite whether the state variables should have requires_grad enabled (defaults to None to use the model’s setting requires_grad)

Returns:

The state object

Return type:

State

step(dt)
stitch: <warp.types.array object at 0x7f4c9a1bd9c0>
stitch_map: <warp.types.array object at 0x7f4c9a1bd9f0>
stitch_num_per_x: <warp.types.array object at 0x7f4c9a1bda20>
surf_vi: <warp.types.array object at 0x7f4c9a1957e0>
sys_to_x(sys_direction: array, direction_x: array) None
property tac_handles: list[list[TetMeshBodyHandle]]
tet_envs: <warp.types.array object at 0x7f4c9a1be560>
tets: <warp.types.array object at 0x7f4c9a1ad5a0>
tilde_y: <warp.types.array object at 0x7f4c9a1be140>
update_contact_force(dt: float) Tensor
v_y: <warp.types.array object at 0x7f4c9a1bdea0>
vol_body: <warp.types.array object at 0x7f4c9a1bdc30>
write_scene(filename: str, divide: bool = False, double_face: bool = False) None
write_target_scene(filename: str) None
property x_target: Tensor

update rigid targets

Type:

TODO

xt: <warp.types.array object at 0x7f4c9a1acd30>
y: <warp.types.array object at 0x7f4c9a1bdcf0>
y_to_x(direction: array, direction_x: array) None