Sheep training flock _ improver
This commit is contained in:
+19
-1
@@ -335,7 +335,8 @@ class HerdingEnv(gym.Env):
|
|||||||
|
|
||||||
def _step_sheep(self, i: int) -> np.ndarray:
|
def _step_sheep(self, i: int) -> np.ndarray:
|
||||||
"""Apply one timestep of boid dynamics to sheep i (mirrors sheep.py)."""
|
"""Apply one timestep of boid dynamics to sheep i (mirrors sheep.py)."""
|
||||||
pos = self.sheep_pos[i].copy()
|
old_pos = self.sheep_pos[i].copy() # saved for pen wall collision check
|
||||||
|
pos = old_pos.copy()
|
||||||
fx, fy = 0.0, 0.0
|
fx, fy = 0.0, 0.0
|
||||||
fleeing = False
|
fleeing = False
|
||||||
|
|
||||||
@@ -401,4 +402,21 @@ class HerdingEnv(gym.Env):
|
|||||||
pos = np.clip(pos + (force / mag) * speed * self.DT,
|
pos = np.clip(pos + (force / mag) * speed * self.DT,
|
||||||
-self.FIELD, self.FIELD)
|
-self.FIELD, self.FIELD)
|
||||||
|
|
||||||
|
# Pen solid wall collision — mirrors Webots geometry.
|
||||||
|
# The pen has THREE solid walls: west (x=PEN_X[0]), east (x=PEN_X[1]),
|
||||||
|
# south (y=PEN_Y[0]). The NORTH face (y=PEN_Y[1]=-8) is the open entrance.
|
||||||
|
# Sheep may only enter through the north face; crossing a solid wall is blocked.
|
||||||
|
px0, px1 = self.PEN_X[0], self.PEN_X[1]
|
||||||
|
py0, py1 = self.PEN_Y[0], self.PEN_Y[1]
|
||||||
|
entered_from_north = (
|
||||||
|
old_pos[1] >= py1 and pos[1] < py1 and px0 < pos[0] < px1
|
||||||
|
)
|
||||||
|
if not entered_from_north:
|
||||||
|
# Block crossing through west wall from outside
|
||||||
|
if old_pos[0] < px0 <= pos[0] and py0 < pos[1] < py1:
|
||||||
|
pos = np.array([px0 - 1e-3, pos[1]], dtype=np.float32)
|
||||||
|
# Block crossing through east wall from outside
|
||||||
|
if old_pos[0] > px1 >= pos[0] and py0 < pos[1] < py1:
|
||||||
|
pos = np.array([px1 + 1e-3, pos[1]], dtype=np.float32)
|
||||||
|
|
||||||
return pos.astype(np.float32)
|
return pos.astype(np.float32)
|
||||||
|
|||||||
Reference in New Issue
Block a user