Skip to content

Commit 75436f2

Browse files
LeonLiu4chris-la-humalab
authored andcommitted
[FEATURE] Environment-wise gravity (Genesis-Embodied-AI#1324)
1 parent c2c81f0 commit 75436f2

File tree

11 files changed

+65
-19
lines changed

11 files changed

+65
-19
lines changed

genesis/engine/coupler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ def mpm_grid_op(self, f: ti.i32, t: ti.f32):
200200
vel_mpm = (1 / self.mpm_solver.grid[f, I, i_b].mass) * self.mpm_solver.grid[f, I, i_b].vel_in
201201

202202
# gravity
203-
vel_mpm += self.mpm_solver.substep_dt * self.mpm_solver._gravity[None]
203+
vel_mpm += self.mpm_solver.substep_dt * self.mpm_solver._gravity[i_b]
204204

205205
pos = (I + self.mpm_solver.grid_offset) * self.mpm_solver.dx
206206
mass_mpm = self.mpm_solver.grid[f, I, i_b].mass / self.mpm_solver._p_vol_scale

genesis/engine/simulator.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,10 @@ def get_state(self):
395395

396396
return state
397397

398+
def set_gravity(self, gravity, envs_idx=None):
399+
for solver in self._solvers:
400+
solver.set_gravity(gravity, envs_idx)
401+
398402
# ------------------------------------------------------------------------------------
399403
# ----------------------------------- properties -------------------------------------
400404
# ------------------------------------------------------------------------------------

genesis/engine/solvers/base_solver.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,8 @@ def __init__(self, scene: "Scene", sim: "Simulator", options):
2121
self._scene = scene
2222
self._dt: float = options.dt
2323
self._substep_dt: float = options.dt / sim.substeps
24-
25-
if hasattr(options, "gravity"):
26-
self._gravity = ti.field(dtype=gs.ti_vec3, shape=())
27-
self._gravity.from_numpy(np.array(options.gravity, dtype=gs.np_float))
28-
else:
29-
self._gravity = None
30-
24+
self._init_gravity = getattr(options, "gravity", None)
25+
self._gravity = None
3126
self._entities: list[Entity] = gs.List()
3227

3328
# force fields
@@ -36,6 +31,26 @@ def __init__(self, scene: "Scene", sim: "Simulator", options):
3631
def _add_force_field(self, force_field):
3732
self._ffs.append(force_field)
3833

34+
def build(self):
35+
self._B = self._sim._B
36+
if self._init_gravity is not None:
37+
g_np = np.asarray(self._init_gravity, dtype=gs.np_float)
38+
g_np = np.repeat(g_np[None], self._B, axis=0)
39+
self._gravity = ti.Vector.field(3, dtype=gs.ti_float, shape=self._B)
40+
self._gravity.from_numpy(g_np)
41+
42+
@gs.assert_built
43+
def set_gravity(self, gravity, envs_idx=None):
44+
if self._gravity is None:
45+
return
46+
g = np.asarray(gravity, dtype=gs.np_float)
47+
if envs_idx is None:
48+
if g.ndim == 1:
49+
g = np.repeat(g[None], self._B, axis=0)
50+
self._gravity.from_numpy(g)
51+
else:
52+
self._gravity[envs_idx] = g
53+
3954
def dump_ckpt_to_numpy(self) -> dict[str, np.ndarray]:
4055
arrays: dict[str, np.ndarray] = {}
4156

genesis/engine/solvers/fem_solver.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ def reset_grad(self):
276276
entity.reset_grad()
277277

278278
def build(self):
279+
super().build()
279280
self.n_envs = self.sim.n_envs
280281
self._B = self.sim._B
281282

@@ -389,7 +390,7 @@ def apply_uniform_force(self, f: ti.i32):
389390
# however, this inevitably damp the gravity.
390391
self.elements_v[f + 1, i_v, i_b].vel *= ti.exp(-dt * self.damping)
391392
# Add gravity (avoiding damping on gravity)
392-
self.elements_v[f + 1, i_v, i_b].vel += dt * self._gravity[None]
393+
self.elements_v[f + 1, i_v, i_b].vel += dt * self._gravity[i_b]
393394

394395
@ti.kernel
395396
def compute_pos(self, f: ti.i32):
@@ -416,7 +417,7 @@ def init_pos_and_inertia(self, f: ti.i32):
416417
dt = self.substep_dt
417418
for i_v, i_b in ti.ndrange(self.n_vertices, self._B):
418419
self.elements_v_energy[i_b, i_v].inertia = (
419-
self.elements_v[f, i_v, i_b].pos + self.elements_v[f, i_v, i_b].vel * dt + self._gravity[None] * dt**2
420+
self.elements_v[f, i_v, i_b].pos + self.elements_v[f, i_v, i_b].vel * dt + self._gravity[i_b] * dt**2
420421
)
421422
self.elements_v[f + 1, i_v, i_b].pos = self.elements_v[f, i_v, i_b].pos
422423

genesis/engine/solvers/mpm_solver.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ def reset_grad(self):
196196
entity.reset_grad()
197197

198198
def build(self):
199+
super().build()
199200
# particles and entities
200201
self._B = self._sim._B
201202

genesis/engine/solvers/pbd_solver.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ def init_ckpt(self):
208208
self._ckpt = dict()
209209

210210
def build(self):
211+
super().build()
211212
self._B = self._sim._B
212213
self._n_particles = self.n_particles
213214
self._n_fluid_particles = self.n_fluid_particles
@@ -371,7 +372,7 @@ def _kernel_apply_external_force(self, f: ti.i32, t: ti.f32):
371372
for i_p, i_b in ti.ndrange(self._n_particles, self._B):
372373
if self.particles[i_p, i_b].free:
373374
# gravity
374-
self.particles[i_p, i_b].vel = self.particles[i_p, i_b].vel + self._gravity[None] * self._substep_dt
375+
self.particles[i_p, i_b].vel = self.particles[i_p, i_b].vel + self._gravity[i_b] * self._substep_dt
375376

376377
# external force fields
377378
acc = ti.Vector.zero(gs.ti_float, 3)

genesis/engine/solvers/rigid/rigid_solver_decomp.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ def add_entity(self, idx, material, morph, surface, visualize_contact) -> Entity
156156
return entity
157157

158158
def build(self):
159+
super().build()
159160
self.n_envs = self.sim.n_envs
160161
self._B = self.sim._B
161162
self._para_level = self.sim._para_level
@@ -2929,9 +2930,7 @@ def _func_update_acc(self, update_cacc: ti.template()):
29292930
i_p = self.links_info[I_l].parent_idx
29302931

29312932
if i_p == -1:
2932-
self.links_state[i_l, i_b].cdd_vel = -self._gravity[None] * (
2933-
1 - e_info.gravity_compensation
2934-
)
2933+
self.links_state[i_l, i_b].cdd_vel = -self._gravity[i_b] * (1 - e_info.gravity_compensation)
29352934
self.links_state[i_l, i_b].cdd_ang = ti.Vector.zero(gs.ti_float, 3)
29362935
if ti.static(update_cacc):
29372936
self.links_state[i_l, i_b].cacc_lin = ti.Vector.zero(gs.ti_float, 3)
@@ -2968,7 +2967,7 @@ def _func_update_acc(self, update_cacc: ti.template()):
29682967
i_p = self.links_info[I_l].parent_idx
29692968

29702969
if i_p == -1:
2971-
self.links_state[i_l, i_b].cdd_vel = -self._gravity[None] * (1 - e_info.gravity_compensation)
2970+
self.links_state[i_l, i_b].cdd_vel = -self._gravity[i_b] * (1 - e_info.gravity_compensation)
29722971
self.links_state[i_l, i_b].cdd_ang = ti.Vector.zero(gs.ti_float, 3)
29732972
if ti.static(update_cacc):
29742973
self.links_state[i_l, i_b].cacc_lin = ti.Vector.zero(gs.ti_float, 3)
@@ -4617,7 +4616,7 @@ def _kernel_get_links_acc(
46174616
# Mimick IMU accelerometer signal if requested
46184617
if mimick_imu:
46194618
# Subtract gravity
4620-
acc_classic_lin -= self._gravity[None]
4619+
acc_classic_lin -= self._gravity[i_b]
46214620

46224621
# Move the resulting linear acceleration in local links frame
46234622
acc_classic_lin = gu.ti_inv_transform_by_quat(acc_classic_lin, self.links_state[i_l, i_b].quat)

genesis/engine/solvers/sf_solver.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def set_jets(self, jets):
4141
self.jets = jets
4242

4343
def build(self):
44+
super().build()
4445
if self.is_active():
4546
self.t = 0.0
4647
self.setup_fields()

genesis/engine/solvers/sph_solver.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ def reset_grad(self):
128128
pass
129129

130130
def build(self):
131+
super().build()
131132
self._B = self._sim._B
132133

133134
# particles and entities
@@ -275,7 +276,7 @@ def _task_compute_non_pressure_forces(self, i, j, ret: ti.template(), i_b: ti.i3
275276
def _kernel_compute_non_pressure_forces(self, f: ti.i32, t: ti.f32):
276277
for i_p, i_b in ti.ndrange(self._n_particles, self._B):
277278
if self.particles_ng_reordered[i_p, i_b].active:
278-
acc = self._gravity[None]
279+
acc = self._gravity[i_b]
279280
self.sh.for_all_neighbors(
280281
i_p,
281282
self.particles_reordered.pos,

genesis/engine/solvers/tool_solver.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def __init__(self, scene, sim, options):
3232
self.setup_boundary()
3333

3434
def build(self):
35+
super().build()
3536
for entity in self._entities:
3637
entity.build()
3738

0 commit comments

Comments
 (0)