Skip to content
Draft
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
b135f84
SAP-style IPC coupling: predicted-pose coupling + velocity output
ACMLCZH Mar 5, 2026
ad8cbca
Update two way
ACMLCZH Mar 5, 2026
b3cf8b8
Update unittest
ACMLCZH Mar 5, 2026
4936854
Update collider logic
ACMLCZH Mar 5, 2026
d95ba5c
Update set qpos
ACMLCZH Mar 6, 2026
67ce1bb
Merge upstream/main into feature/ipc-sap-style-coupling
ACMLCZH Mar 6, 2026
ed4dc07
Update review
ACMLCZH Mar 6, 2026
f4fa441
Update test_ipc.py
ACMLCZH Mar 6, 2026
d4757f2
Update coupler.py
ACMLCZH Mar 6, 2026
0b8fa5a
Update refactor
ACMLCZH Mar 7, 2026
58328f8
update review
ACMLCZH Mar 7, 2026
29b64d4
Update review
ACMLCZH Mar 7, 2026
78f9d37
Merge branch 'main' into feature/ipc-sap-style-coupling
ACMLCZH Mar 7, 2026
0508682
Update cloth
ACMLCZH Mar 7, 2026
4c1110a
Address PR review: restore set_qpos/set_dofs_position, shared utils, …
ACMLCZH Mar 8, 2026
5eb3b5b
Revert conftest.py changes
ACMLCZH Mar 8, 2026
2608dce
Move constraint_strength to per-entity coup_stiffness on RigidMaterial
ACMLCZH Mar 8, 2026
7a75fb1
Add set_qpos/set_dofs_position tests, fix CUDA device and overlap shr…
ACMLCZH Mar 8, 2026
0cea049
Use named friction constants and add force estimate FIXME in biaxial …
ACMLCZH Mar 8, 2026
5afdc45
Add traceability comments for test tolerance and parameter changes
ACMLCZH Mar 8, 2026
9afb8d0
Minor cleanup.
duburcqa Mar 9, 2026
a669b08
Add IPC restitution with one-shot impulse to fix per-frame compounding
ACMLCZH Mar 9, 2026
1a718d5
Per-frame restitution + per-link ABD dirty tracking
ACMLCZH Mar 10, 2026
d592bed
Update ipc_abd_momentum.py
ACMLCZH Mar 10, 2026
aa0ff0a
Update ipc_abd_momentum.py
ACMLCZH Mar 10, 2026
747c881
Update grasp abd
ACMLCZH Mar 11, 2026
9fbff06
primary fix
alanray-tech Mar 11, 2026
980430a
Merge branch 'feature/ipc-sap-style-coupling' of https://github.com/A…
alanray-tech Mar 11, 2026
a1749f9
fix format
alanray-tech Mar 11, 2026
06f2c66
Update init - build
ACMLCZH Mar 12, 2026
f6166f6
Merge remote-tracking branch 'upstream/main' into feature/ipc-sap-sty…
ACMLCZH Mar 12, 2026
deacd6d
Refactor: move heterogeneous variant tracking from Entity to Link
ACMLCZH Mar 12, 2026
e4b9340
Merge branch 'refactor/move-heterogeneous-variants-to-link' into feat…
ACMLCZH Mar 12, 2026
508afaf
Merge upstream/main: resolve collider and IPC coupler options conflicts
ACMLCZH Mar 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions examples/IPC_Solver/ipc_momentum.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ def main():
gravity=(0.0, 0.0, 0.0),
),
coupler_options=gs.options.IPCCouplerOptions(
constraint_strength_translation=1, # Translation strength ratio
constraint_strength_rotation=1, # Rotation strength ratio
enable_rigid_rigid_contact=False,
),
viewer_options=gs.options.ViewerOptions(
Expand Down Expand Up @@ -61,6 +59,7 @@ def main():
rho=1000,
friction=0.3,
coup_type="two_way_soft_constraint",
coup_stiffness=(1.0, 1.0),
),
surface=gs.surfaces.Plastic(
color=(0.8, 0.2, 0.2, 0.8),
Expand Down
8 changes: 6 additions & 2 deletions examples/IPC_Solver/ipc_objects_falling.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ def main():
),
coupler_options=gs.options.IPCCouplerOptions(
contact_d_hat=0.01, # Contact barrier distance (10mm) - must be appropriate for mesh resolution
two_way_coupling=True, # Enable two-way coupling (forces from IPC to Genesis rigid bodies)
),
viewer_options=gs.options.ViewerOptions(
camera_pos=(2.5, 2.5, 1.5),
Expand All @@ -36,7 +35,12 @@ def main():
)

# Ground plane
scene.add_entity(gs.morphs.Plane())
scene.add_entity(
gs.morphs.Plane(),
material=gs.materials.Rigid(
coup_type="ipc_only",
),
)

# Cloth using Cloth material
# Note: Using coarse grid mesh to avoid IPC thickness violations
Expand Down
9 changes: 6 additions & 3 deletions examples/IPC_Solver/ipc_robot_cloth_teleop.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ def main():
dt=0.02,
),
coupler_options=gs.options.IPCCouplerOptions(
constraint_strength_translation=100.0,
constraint_strength_rotation=100.0,
n_linesearch_iterations=8,
linesearch_report_energy=False,
newton_tolerance=1e-1,
Expand All @@ -68,7 +66,12 @@ def main():
)

# Add flat floor
scene.add_entity(gs.morphs.Plane())
scene.add_entity(
gs.morphs.Plane(),
material=gs.materials.Rigid(
coup_type="ipc_only",
),
)

# Add Franka robot
franka_material_kwargs = dict(
Expand Down
21 changes: 11 additions & 10 deletions examples/IPC_Solver/ipc_robot_grasp_cube.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ def main():
coupler_options = None
if not args.no_ipc:
coupler_options = gs.options.IPCCouplerOptions(
constraint_strength_translation=10.0,
constraint_strength_rotation=10.0,
enable_rigid_rigid_contact=False,
enable_rigid_ground_contact=False,
newton_translation_tolerance=10.0,
Expand All @@ -40,11 +38,17 @@ def main():
show_viewer=args.vis,
)

scene.add_entity(gs.morphs.Plane())
scene.add_entity(
gs.morphs.Plane(),
material=gs.materials.Rigid(
coup_type="ipc_only",
),
)

franka_material_kwargs = dict(
coup_friction=0.8,
coup_type=args.coup_type,
coup_stiffness=(10.0, 10.0),
)
if args.coup_type == "two_way_soft_constraint":
franka_material_kwargs["coup_links"] = ("left_finger", "right_finger")
Expand Down Expand Up @@ -85,13 +89,10 @@ def main():
franka.set_dofs_kp([4500.0, 4500.0, 3500.0, 3500.0, 2000.0, 2000.0, 2000.0, 500.0, 500.0])

qpos = franka.inverse_kinematics(link=end_effector, pos=[0.65, 0.0, 0.4], quat=[0.0, 1.0, 0.0, 0.0])
if not args.no_ipc or args.coup_type == "external_articulation":
franka.control_dofs_position(qpos[motors_dof], dofs_idx_local=motors_dof)
franka.control_dofs_position(0.04, dofs_idx_local=fingers_dof)
for _ in range(200 if "PYTEST_VERSION" not in os.environ else 1):
scene.step()
else:
franka.set_dofs_position(qpos)
qpos[fingers_dof] = 0.04
franka.control_dofs_position(qpos)
for _ in range(200 if "PYTEST_VERSION" not in os.environ else 1):
scene.step()

# Lower the grapper half way to grasping position
qpos = franka.inverse_kinematics(link=end_effector, pos=[0.65, 0.0, 0.25], quat=[0.0, 1.0, 0.0, 0.0])
Expand Down
Loading
Loading