Skip to content

Commit 9618a6a

Browse files
committed
get_weld_contraints api and unit test
1 parent 72eed10 commit 9618a6a

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

genesis/engine/solvers/rigid/rigid_solver_decomp.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4966,6 +4966,19 @@ def _kernel_delete_weld_constraint(
49664966
]
49674967
self.constraint_solver.ti_n_equalities[i_b] = self.constraint_solver.ti_n_equalities[i_b] - 1
49684968

4969+
def get_weld_constraints(self, envs_idx=None):
4970+
if envs_idx is None:
4971+
envs_idx = np.arange(self.n_envs, dtype=np.int32)
4972+
4973+
rows = []
4974+
for env in np.atleast_1d(envs_idx):
4975+
n_eq = int(self.constraint_solver.ti_n_equalities[env])
4976+
for i in range(n_eq):
4977+
rec = self.equalities_info[i, env]
4978+
if rec.eq_type == gs.EQUALITY_TYPE.WELD:
4979+
rows.append((env, int(rec.eq_obj1id), int(rec.eq_obj2id)))
4980+
return np.asarray(rows, dtype=np.int32)
4981+
49694982
# ------------------------------------------------------------------------------------
49704983
# ----------------------------------- properties -------------------------------------
49714984
# ------------------------------------------------------------------------------------

tests/test_rigid_physics.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2166,6 +2166,27 @@ def test_terrain_size(show_viewer, tol):
21662166
assert_allclose((height_ref * 2.0), height_test, tol=tol)
21672167

21682168

2169+
@pytest.mark.required
2170+
@pytest.mark.parametrize("backend", [gs.cpu])
2171+
def test_get_weld_constraints_basic(show_viewer, tol):
2172+
scene = gs.Scene(show_viewer=show_viewer)
2173+
2174+
cube1 = scene.add_entity(gs.morphs.Box(size=(0.05,) * 3, pos=(0.0, 0.0, 0.05)))
2175+
cube2 = scene.add_entity(gs.morphs.Box(size=(0.05,) * 3, pos=(0.2, 0.0, 0.05)))
2176+
2177+
scene.build(n_envs=1)
2178+
2179+
rigid = scene.sim.rigid_solver
2180+
link1 = np.array([cube1.base_link.idx], dtype=gs.np_int)
2181+
link2 = np.array([cube2.base_link.idx], dtype=gs.np_int)
2182+
2183+
rigid.add_weld_constraint(link1, link2)
2184+
scene.step()
2185+
2186+
welds = rigid.get_weld_constraints()
2187+
assert_allclose(tuple(welds[0]), (0, link1[0], link2[0]), tol=tol)
2188+
2189+
21692190
@pytest.mark.required
21702191
@pytest.mark.parametrize("backend", [gs.cpu])
21712192
def test_urdf_parsing(show_viewer, tol):

0 commit comments

Comments
 (0)