Skip to content

Commit e931bb4

Browse files
authored
[Migration] Rigid init and forward kinematics (#1401)
1 parent 32904b3 commit e931bb4

File tree

4 files changed

+901
-543
lines changed

4 files changed

+901
-543
lines changed

genesis/engine/entities/rigid_entity/rigid_entity.py

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,8 +1300,19 @@ def _kernel_inverse_kinematics(
13001300
for i_sample in range(max_samples):
13011301
for _ in range(max_solver_iters):
13021302
# run FK to update link states using current q
1303-
self._solver._func_forward_kinematics_entity(self._idx_in_solver, i_b)
1304-
1303+
self._solver._func_forward_kinematics_entity(
1304+
self._idx_in_solver,
1305+
i_b,
1306+
self._solver.links_state,
1307+
self._solver.links_info,
1308+
self._solver.joints_state,
1309+
self._solver.joints_info,
1310+
self._solver.dofs_state,
1311+
self._solver.dofs_info,
1312+
self._solver.entities_info,
1313+
self._solver._rigid_global_info,
1314+
self._solver._static_rigid_sim_config,
1315+
)
13051316
# compute error
13061317
solved = True
13071318
for i_ee in range(n_links):
@@ -1386,7 +1397,19 @@ def _kernel_inverse_kinematics(
13861397

13871398
if not solved:
13881399
# re-compute final error if exited not due to solved
1389-
self._solver._func_forward_kinematics_entity(self._idx_in_solver, i_b)
1400+
self._solver._func_forward_kinematics_entity(
1401+
self._idx_in_solver,
1402+
i_b,
1403+
self._solver.links_state,
1404+
self._solver.links_info,
1405+
self._solver.joints_state,
1406+
self._solver.joints_info,
1407+
self._solver.dofs_state,
1408+
self._solver.dofs_info,
1409+
self._solver.entities_info,
1410+
self._solver._rigid_global_info,
1411+
self._solver._static_rigid_sim_config,
1412+
)
13901413
solved = True
13911414
for i_ee in range(n_links):
13921415
i_l_ee = links_idx[i_ee]
@@ -1480,7 +1503,19 @@ def _kernel_inverse_kinematics(
14801503
# restore original qpos and link state
14811504
for i_q in range(self.n_qs):
14821505
self._solver.qpos[i_q + self._q_start, i_b] = self._IK_qpos_orig[i_q, i_b]
1483-
self._solver._func_forward_kinematics_entity(self._idx_in_solver, i_b)
1506+
self._solver._func_forward_kinematics_entity(
1507+
self._idx_in_solver,
1508+
i_b,
1509+
self._solver.links_state,
1510+
self._solver.links_info,
1511+
self._solver.joints_state,
1512+
self._solver.joints_info,
1513+
self._solver.dofs_state,
1514+
self._solver.dofs_info,
1515+
self._solver.entities_info,
1516+
self._solver._rigid_global_info,
1517+
self._solver._static_rigid_sim_config,
1518+
)
14841519

14851520
@gs.assert_built
14861521
def forward_kinematics(self, qpos, qs_idx_local=None, links_idx_local=None, envs_idx=None):
@@ -1549,7 +1584,19 @@ def _kernel_forward_kinematics(
15491584
# set new qpos
15501585
self._solver.qpos[qs_idx[i_q_], envs_idx[i_b_]] = qpos[i_b_, i_q_]
15511586
# run FK
1552-
self._solver._func_forward_kinematics_entity(self._idx_in_solver, envs_idx[i_b_])
1587+
self._solver._func_forward_kinematics_entity(
1588+
self._idx_in_solver,
1589+
envs_idx[i_b_],
1590+
self._solver.links_state,
1591+
self._solver.links_info,
1592+
self._solver.joints_state,
1593+
self._solver.joints_info,
1594+
self._solver.dofs_state,
1595+
self._solver.dofs_info,
1596+
self._solver.entities_info,
1597+
self._solver._rigid_global_info,
1598+
self._solver._static_rigid_sim_config,
1599+
)
15531600

15541601
ti.loop_config(serialize=self._solver._para_level < gs.PARA_LEVEL.PARTIAL)
15551602
for i_l_, i_b_ in ti.ndrange(links_idx.shape[0], envs_idx.shape[0]):
@@ -1563,7 +1610,19 @@ def _kernel_forward_kinematics(
15631610
# restore original qpos
15641611
self._solver.qpos[qs_idx[i_q_], envs_idx[i_b_]] = self._IK_qpos_orig[qs_idx[i_q_], envs_idx[i_b_]]
15651612
# run FK
1566-
self._solver._func_forward_kinematics_entity(self._idx_in_solver, envs_idx[i_b_])
1613+
self._solver._func_forward_kinematics_entity(
1614+
self._idx_in_solver,
1615+
envs_idx[i_b_],
1616+
self._solver.links_state,
1617+
self._solver.links_info,
1618+
self._solver.joints_state,
1619+
self._solver.joints_info,
1620+
self._solver.dofs_state,
1621+
self._solver.dofs_info,
1622+
self._solver.entities_info,
1623+
self._solver._rigid_global_info,
1624+
self._solver._static_rigid_sim_config,
1625+
)
15671626

15681627
# ------------------------------------------------------------------------------------
15691628
# --------------------------------- motion planing -----------------------------------

genesis/engine/solvers/avatar_solver.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,30 @@ def _kernel_step(self):
5858
@ti.kernel
5959
def _kernel_forward_kinematics_links_geoms(self, envs_idx: ti.types.ndarray()):
6060
for i_b in envs_idx:
61-
self._func_forward_kinematics(i_b)
62-
self._func_update_geoms(i_b)
61+
self._func_forward_kinematics(
62+
i_b,
63+
self.links_state,
64+
self.links_info,
65+
self.joints_state,
66+
self.joints_info,
67+
self.dofs_state,
68+
self.dofs_info,
69+
self.entities_info,
70+
self._rigid_global_info,
71+
self._static_rigid_sim_config,
72+
)
73+
self._func_update_geoms(
74+
i_b,
75+
self.links_state,
76+
self.links_info,
77+
self.joints_state,
78+
self.joints_info,
79+
self.dofs_state,
80+
self.dofs_info,
81+
self.entities_info,
82+
self._rigid_global_info,
83+
self._static_rigid_sim_config,
84+
)
6385

6486
@ti.func
6587
def _func_detect_collision(self):

genesis/engine/solvers/rigid/array_class.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,34 @@
1111
DofsInfo = ti.template()
1212
GeomsState = ti.template()
1313
GeomsInfo = ti.template()
14-
GeomsInitAABB = ti.template()
14+
GeomsInitAABB = ti.template() # TODO: move to rigid global info
1515
LinksState = ti.template()
1616
LinksInfo = ti.template()
17+
JointsInfo = ti.template()
18+
JointsState = ti.template()
19+
VertsState = ti.template()
1720
VertsInfo = ti.template()
1821
EdgesInfo = ti.template()
22+
FacesInfo = ti.template()
23+
VVertsInfo = ti.template()
24+
VFacesInfo = ti.template()
25+
VGeomsInfo = ti.template()
26+
EntitiesState = ti.template()
27+
EntitiesInfo = ti.template()
28+
EqualitiesInfo = ti.template()
1929

2030

2131
@ti.data_oriented
2232
class RigidGlobalInfo:
23-
def __init__(self, n_dofs: int, n_entities: int, n_geoms: int, _B: int, f_batch: Callable):
33+
def __init__(self, solver, n_dofs: int, n_entities: int, n_geoms: int, _B: int, f_batch: Callable):
2434
self.n_awake_dofs = ti.field(dtype=gs.ti_int, shape=f_batch())
2535
self.awake_dofs = ti.field(dtype=gs.ti_int, shape=f_batch(n_dofs))
2636

37+
self.qpos0 = ti.field(dtype=gs.ti_float, shape=solver._batch_shape(solver.n_qs_))
38+
self.qpos = ti.field(dtype=gs.ti_float, shape=solver._batch_shape(solver.n_qs_))
39+
40+
# self.links_T = ti.Matrix.field(n=4, m=4, dtype=gs.ti_float, shape=solver.n_links)
41+
2742

2843
# =========================================== Collider ===========================================
2944

0 commit comments

Comments
 (0)