Skip to content

Commit 56ec324

Browse files
committed
Skip velocity update if not necessary.
1 parent 4a3e5b5 commit 56ec324

File tree

2 files changed

+75
-44
lines changed

2 files changed

+75
-44
lines changed

genesis/engine/entities/rigid_entity/rigid_entity.py

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1971,16 +1971,11 @@ def set_pos(self, pos, envs_idx=None, *, relative=False, zero_velocity=True, uns
19711971
if _pos is not pos:
19721972
gs.logger.debug(ALLOCATE_TENSOR_WARNING)
19731973
pos = _pos
1974+
if zero_velocity:
1975+
self._solver.set_dofs_velocity(None, None, envs_idx, skip_forward=True, unsafe=unsafe)
19741976
self._solver.set_base_links_pos(
1975-
pos.unsqueeze(-2),
1976-
self._base_links_idx_,
1977-
envs_idx,
1978-
relative=relative,
1979-
unsafe=unsafe,
1980-
skip_forward=zero_velocity,
1977+
pos.unsqueeze(-2), self._base_links_idx_, envs_idx, relative=relative, unsafe=unsafe
19811978
)
1982-
if zero_velocity:
1983-
self.zero_all_dofs_velocity(envs_idx, unsafe=unsafe)
19841979

19851980
@gs.assert_built
19861981
def set_quat(self, quat, envs_idx=None, *, relative=False, zero_velocity=True, unsafe=False):
@@ -2005,16 +2000,11 @@ def set_quat(self, quat, envs_idx=None, *, relative=False, zero_velocity=True, u
20052000
if _quat is not quat:
20062001
gs.logger.debug(ALLOCATE_TENSOR_WARNING)
20072002
quat = _quat
2003+
if zero_velocity:
2004+
self._solver.set_dofs_velocity(None, None, envs_idx, skip_forward=True, unsafe=unsafe)
20082005
self._solver.set_base_links_quat(
2009-
quat.unsqueeze(-2),
2010-
self._base_links_idx_,
2011-
envs_idx,
2012-
relative=relative,
2013-
unsafe=unsafe,
2014-
skip_forward=zero_velocity,
2006+
quat.unsqueeze(-2), self._base_links_idx_, envs_idx, relative=relative, unsafe=unsafe
20152007
)
2016-
if zero_velocity:
2017-
self.zero_all_dofs_velocity(envs_idx, unsafe=unsafe)
20182008

20192009
@gs.assert_built
20202010
def get_verts(self):
@@ -2122,9 +2112,9 @@ def set_qpos(self, qpos, qs_idx_local=None, envs_idx=None, *, zero_velocity=True
21222112
Whether to zero the velocity of all the entity's dofs. Defaults to True. This is a safety measure after a sudden change in entity pose.
21232113
"""
21242114
qs_idx = self._get_idx(qs_idx_local, self.n_qs, self._q_start, unsafe=True)
2125-
self._solver.set_qpos(qpos, qs_idx, envs_idx, unsafe=unsafe, skip_forward=zero_velocity)
21262115
if zero_velocity:
2127-
self.zero_all_dofs_velocity(envs_idx, unsafe=unsafe)
2116+
self._solver.set_dofs_velocity(None, None, envs_idx, skip_forward=True, unsafe=unsafe)
2117+
self._solver.set_qpos(qpos, qs_idx, envs_idx, unsafe=unsafe)
21282118

21292119
@gs.assert_built
21302120
def set_dofs_kp(self, kp, dofs_idx_local=None, envs_idx=None, *, unsafe=False):
@@ -2252,9 +2242,9 @@ def set_dofs_position(self, position, dofs_idx_local=None, envs_idx=None, *, zer
22522242
Whether to zero the velocity of all the entity's dofs. Defaults to True. This is a safety measure after a sudden change in entity pose.
22532243
"""
22542244
dofs_idx = self._get_idx(dofs_idx_local, self.n_dofs, self._dof_start, unsafe=True)
2255-
self._solver.set_dofs_position(position, dofs_idx, envs_idx, unsafe=unsafe, skip_forward=zero_velocity)
22562245
if zero_velocity:
2257-
self.zero_all_dofs_velocity(envs_idx, unsafe=unsafe)
2246+
self._solver.set_dofs_velocity(None, None, envs_idx, skip_forward=True, unsafe=unsafe)
2247+
self._solver.set_dofs_position(position, dofs_idx, envs_idx, unsafe=unsafe)
22582248

22592249
@gs.assert_built
22602250
def control_dofs_force(self, force, dofs_idx_local=None, envs_idx=None, *, unsafe=False):

genesis/engine/solvers/rigid/rigid_solver_decomp.py

Lines changed: 65 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1874,22 +1874,20 @@ def set_dofs_velocity(self, velocity, dofs_idx=None, envs_idx=None, *, skip_forw
18741874

18751875
self._links_state_cache.clear()
18761876
if not skip_forward:
1877-
kernel_forward_kinematics_links_geoms(
1877+
kernel_forward_velocity(
18781878
envs_idx,
18791879
links_state=self.links_state,
18801880
links_info=self.links_info,
1881-
joints_state=self.joints_state,
18821881
joints_info=self.joints_info,
18831882
dofs_state=self.dofs_state,
1884-
dofs_info=self.dofs_info,
1885-
geoms_state=self.geoms_state,
1886-
geoms_info=self.geoms_info,
18871883
entities_info=self.entities_info,
18881884
rigid_global_info=self._rigid_global_info,
18891885
static_rigid_sim_config=self._static_rigid_sim_config,
18901886
)
18911887

1892-
def set_dofs_position(self, position, dofs_idx=None, envs_idx=None, *, skip_forward=False, unsafe=False):
1888+
def set_dofs_position(
1889+
self, position, dofs_idx=None, envs_idx=None, *, skip_forward=False, skip_clear_collisions=False, unsafe=False
1890+
):
18931891
position, dofs_idx, envs_idx = self._sanitize_1D_io_variables(
18941892
position, dofs_idx, self.n_dofs, envs_idx, skip_allocation=True, unsafe=unsafe
18951893
)
@@ -1907,12 +1905,13 @@ def set_dofs_position(self, position, dofs_idx=None, envs_idx=None, *, skip_forw
19071905
self._static_rigid_sim_config,
19081906
)
19091907

1910-
self.collider.reset(envs_idx)
1911-
self.collider.clear(envs_idx)
1912-
if self.constraint_solver is not None:
1913-
self.constraint_solver.reset(envs_idx)
1914-
self.constraint_solver.clear(envs_idx)
19151908
self._links_state_cache.clear()
1909+
if not skip_clear_collisions:
1910+
self.collider.reset(envs_idx)
1911+
self.collider.clear(envs_idx)
1912+
if self.constraint_solver is not None:
1913+
self.constraint_solver.reset(envs_idx)
1914+
self.constraint_solver.clear(envs_idx)
19161915
if not skip_forward:
19171916
kernel_forward_kinematics_links_geoms(
19181917
envs_idx,
@@ -3708,17 +3707,6 @@ def func_update_cartesian_space(
37083707
rigid_global_info=rigid_global_info,
37093708
static_rigid_sim_config=static_rigid_sim_config,
37103709
)
3711-
func_forward_velocity(
3712-
i_b,
3713-
entities_info=entities_info,
3714-
links_info=links_info,
3715-
links_state=links_state,
3716-
joints_info=joints_info,
3717-
dofs_state=dofs_state,
3718-
rigid_global_info=rigid_global_info,
3719-
static_rigid_sim_config=static_rigid_sim_config,
3720-
)
3721-
37223710
func_update_geoms(
37233711
i_b=i_b,
37243712
entities_info=entities_info,
@@ -3766,6 +3754,16 @@ def kernel_step_1(
37663754
static_rigid_sim_config=static_rigid_sim_config,
37673755
force_update_fixed_geoms=False,
37683756
)
3757+
func_forward_velocity(
3758+
i_b=i_b,
3759+
entities_info=entities_info,
3760+
links_info=links_info,
3761+
links_state=links_state,
3762+
joints_info=joints_info,
3763+
dofs_state=dofs_state,
3764+
rigid_global_info=rigid_global_info,
3765+
static_rigid_sim_config=static_rigid_sim_config,
3766+
)
37693767

37703768
func_forward_dynamics(
37713769
links_state=links_state,
@@ -3932,6 +3930,16 @@ def kernel_step_2(
39323930
static_rigid_sim_config=static_rigid_sim_config,
39333931
force_update_fixed_geoms=False,
39343932
)
3933+
func_forward_velocity(
3934+
i_b=i_b,
3935+
entities_info=entities_info,
3936+
links_info=links_info,
3937+
links_state=links_state,
3938+
joints_info=joints_info,
3939+
dofs_state=dofs_state,
3940+
rigid_global_info=rigid_global_info,
3941+
static_rigid_sim_config=static_rigid_sim_config,
3942+
)
39353943

39363944

39373945
@ti.kernel(fastcache=gs.use_fastcache)
@@ -3967,6 +3975,41 @@ def kernel_forward_kinematics_links_geoms(
39673975
static_rigid_sim_config=static_rigid_sim_config,
39683976
force_update_fixed_geoms=True,
39693977
)
3978+
func_forward_velocity(
3979+
i_b=i_b,
3980+
entities_info=entities_info,
3981+
links_info=links_info,
3982+
links_state=links_state,
3983+
joints_info=joints_info,
3984+
dofs_state=dofs_state,
3985+
rigid_global_info=rigid_global_info,
3986+
static_rigid_sim_config=static_rigid_sim_config,
3987+
)
3988+
3989+
3990+
@ti.kernel(fastcache=gs.use_fastcache)
3991+
def kernel_forward_velocity(
3992+
envs_idx: ti.types.ndarray(),
3993+
links_state: array_class.LinksState,
3994+
links_info: array_class.LinksInfo,
3995+
joints_info: array_class.JointsInfo,
3996+
dofs_state: array_class.DofsState,
3997+
entities_info: array_class.EntitiesInfo,
3998+
rigid_global_info: array_class.RigidGlobalInfo,
3999+
static_rigid_sim_config: ti.template(),
4000+
):
4001+
for i_b_ in range(envs_idx.shape[0]):
4002+
i_b = envs_idx[i_b_]
4003+
func_forward_velocity(
4004+
i_b=i_b,
4005+
entities_info=entities_info,
4006+
links_info=links_info,
4007+
links_state=links_state,
4008+
joints_info=joints_info,
4009+
dofs_state=dofs_state,
4010+
rigid_global_info=rigid_global_info,
4011+
static_rigid_sim_config=static_rigid_sim_config,
4012+
)
39704013

39714014

39724015
@ti.func
@@ -5932,7 +5975,6 @@ def kernel_set_links_pos(
59325975
rigid_global_info: array_class.RigidGlobalInfo,
59335976
static_rigid_sim_config: ti.template(),
59345977
):
5935-
59365978
ti.loop_config(serialize=static_rigid_sim_config.para_level < gs.PARA_LEVEL.ALL)
59375979
for i_l_, i_b_ in ti.ndrange(links_idx.shape[0], envs_idx.shape[0]):
59385980
i_b = envs_idx[i_b_]
@@ -5967,7 +6009,6 @@ def kernel_set_links_quat(
59676009
rigid_global_info: array_class.RigidGlobalInfo,
59686010
static_rigid_sim_config: ti.template(),
59696011
):
5970-
59716012
ti.loop_config(serialize=static_rigid_sim_config.para_level < gs.PARA_LEVEL.ALL)
59726013
for i_l_, i_b_ in ti.ndrange(links_idx.shape[0], envs_idx.shape[0]):
59736014
i_b = envs_idx[i_b_]

0 commit comments

Comments
 (0)