Mercurial > tote-had
changeset 13:94feb678de75
Adjust step order to walking direction
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Thu, 07 Apr 2016 09:40:26 +0200 |
| parents | 1298204d2f3d |
| children | 3b9ed9cd63ef |
| files | python/gait.py |
| diffstat | 1 files changed, 35 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/python/gait.py Thu Apr 07 09:15:45 2016 +0200 +++ b/python/gait.py Thu Apr 07 09:40:26 2016 +0200 @@ -2,26 +2,18 @@ class Creep: - speed = 0.75 + speed = 1 stride = 14 shift = 8 shift_steps = 2 raise_leg = 10 - raise_steps = 2 - next_leg = ( - (2, 0, 3, 1), # forward - (1, 3, 0, 2), # backward - (1, 2, 3, 0), # clockwise - (3, 0, 1, 2), # counter-clockwise - (2, 3, 1, 0), # left - (3, 2, 0, 1), # right - ) + raise_steps = 3 def __init__(self, robot): self.robot = robot self.shift_x = 0 self.shift_y = 0 - self.on_ground = list(robot.legs) + self.on_ground = set(robot.legs) self.dx = 0 self.dy = 1 self.rotation = 0 @@ -34,9 +26,7 @@ dx = self.dx * leg.x_dir * self.speed dy = self.dy * leg.y_dir * self.speed leg.move_to(leg.x - dx, leg.y - dy, -self.height) - #leg.rotate_by(-self.rotation * leg.x_dir * leg.y_dir / 2) - self.robot.update() - delay(250) + leg.rotate_by(-self.rotation * leg.x_dir * leg.y_dir / 2) def step(self, leg): dx = (leg.x_dir * self.shift - self.shift_x) / self.shift_steps @@ -45,26 +35,48 @@ self.robot.move_by(dx, dy, 0) self.shift_x += dx self.shift_y += dy - self.move() + yield self.on_ground.remove(leg) for step in range(self.raise_steps): leg.move_by(0, 0, self.raise_leg) - self.move() + yield leg.move_to( (self.shift_x + self.dx * self.stride) * leg.x_dir + self.spread, (self.shift_y + self.dy * self.stride) * leg.y_dir + self.spread, self.raise_leg * self.raise_steps - self.height ) - self.move() - self.move() + yield + yield for step in range(self.raise_steps - 1): leg.move_by(0, 0, -self.raise_leg) - self.move() - self.on_ground.append(leg) - self.move() + yield + self.on_ground.add(leg) + yield + + def step_order(self): + if abs(self.dy) > abs(self.dx): + if self.dy > 0: + return (2, 0, 3, 1) # forward + else: + return (1, 3, 0, 2) # backward + elif abs(self.dx) > abs(self.dy): + if self.dx < 0: + return (2, 3, 1, 0) # left + else: + return (3, 2, 0, 1) # right + elif abs(self.rotation) > 0.001: + if self.rotation > 0: + return (1, 2, 3, 0) # clockwise + else: + return (3, 0, 1, 2) # counter-clockwise + return (2, 0, 3, 1) # forward + def run(self, steps): for step in range(steps): leg = self.robot.legs[self.last_leg] - self.step(leg) - self.last_leg = self.next_leg[0][self.last_leg] + for frame in self.step(leg): + self.move() + self.robot.update() + delay(40) # 25 FPS + self.last_leg = self.step_order()[self.last_leg]
