changeset 131:6617b34e4047

robot.shift
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Wed, 09 Jul 2014 21:29:58 +0000
parents b10c6eaed9e2
children afaac497dfe7
files creep.py kubik.py rotate.py squats.py
diffstat 4 files changed, 68 insertions(+), 65 deletions(-) [+]
line wrap: on
line diff
--- a/creep.py	Wed Jul 09 19:10:11 2014 +0000
+++ b/creep.py	Wed Jul 09 21:29:58 2014 +0000
@@ -8,25 +8,23 @@
 HEIGHT = -35
 STEP = -5
 OVERLAP = 1
-FPS = 24
+FPS = 6
 
 
 def swing(robot):
+    for i in range(delay):
+        yield
     pause = STRIDE / SPEED + 3 - SWING * 2 / SWING_SPEED
     while True:
         for i in range(pause):
             yield
         for i in range(-SWING, SWING, SWING_SPEED):
-            for l1, l2 in zip(robot.legs[:2], robot.legs[2:]):
-                l1.move_to((SPREAD - i, None, None))
-                l2.move_to((SPREAD + i, None, None))
+            robot.shift = [-i, 0, 0]
             yield
         for i in range(pause):
             yield
         for i in range(SWING, -SWING, -SWING_SPEED):
-            for l1, l2 in zip(robot.legs[:2], robot.legs[2:]):
-                l1.move_to((SPREAD - i, None, None))
-                l2.move_to((SPREAD + i, None, None))
+            robot.shift = [-i, 0, 0]
             yield
 
 
--- a/kubik.py	Wed Jul 09 19:10:11 2014 +0000
+++ b/kubik.py	Wed Jul 09 21:29:58 2014 +0000
@@ -119,8 +119,10 @@
         ry = r * math.cos(a + radians) - self.base[1]
         self.move_to((rx, ry * self.y_direction, None))
 
-    def update(self):
-        hip, knee, ankle = self._inverse_kinematics(self.position)
+    def update(self, shift):
+        dx, dy, dz = shift
+        x, y, z = self.position
+        hip, knee, ankle = self._inverse_kinematics((x + dx, y + dy, z + dz))
         self.hip.move_degrees(hip)
         self.knee.move_degrees(knee)
         self.ankle.move_degrees(ankle)
@@ -150,29 +152,47 @@
                 AnkleServo2(m, 9, reverse=True, trim=100, center=1500 * 4),
                 False),
         ]
+        self.shift = [0.0, 0.0, 0.0]
+
+    def shift_by(self, (dx, dy, dz), reverse=False):
+        if reverse:
+            dx, dy, dz = -dx, -dy, -dz
+        self.shift[0] += dx
+        self.shift[1] += dy
+        self.shift[2] += dz
 
     def _home(self):
         """Move all legs to their initial position."""
-        for leg in self.legs:
+        shifts = [
+            (2, -2, 0),
+            (2, 2, 0),
+            (-2, 2, 0),
+            (-2, -2, 0),
+        ]
+        for leg, shift in zip(self.legs, shifts):
             x, y, z = leg.position
             if (x, y) != (30, 30 * leg.y_direction):
+                self.shift = shift
                 leg.move_to((None, None, 5))
-                for i in range(4):
+                for i in range(2):
                     yield
                 leg.move_to((30, 30 * leg.y_direction, None))
-                for i in range(4):
+                for i in range(2):
                     yield
                 leg.move_to((None, None, -34))
                 for i in range(4):
                     yield
             leg.move_to((None, None, -35))
+        self.shift = [0, 0, 0]
 
     def home(self):
-        self._run_animations([self._home()], 12)
+        self._run_animations([self._home()], 40)
 
     def update(self):
-        for leg in self.legs:
-            leg.update()
+        x, y, z = self.shift
+        for leg_left, leg_right in zip(self.legs[:2], self.legs[2:]):
+            leg_left.update((x, y, z))
+            leg_right.update((-x, y, z))
 
     def _run_animations(self, animations, fps=12):
         clock = pygame.time.Clock()
--- a/rotate.py	Wed Jul 09 19:10:11 2014 +0000
+++ b/rotate.py	Wed Jul 09 21:29:58 2014 +0000
@@ -1,41 +1,36 @@
 import kubik
 
 
+STRIDE = 10
+SPEED = 1
+SWING = 18
+SWING_SPEED = 3
 STEP = -10
-STRIDE = 20
-SWING = 12
-SWING_SPEED = 4
-SPEED = 1
 HEIGHT = -35
-OVERLAP = 2
+OVERLAP = 1
 FPS = 12
 
 
-def swing(robot):
+def swing(robot, (dx, dy), delay=0):
+    for i in range(delay):
+        yield
     pause = STRIDE / SPEED + 3 - SWING * 2 / SWING_SPEED
     first = True
     while True:
-        if first:
-            start = SWING_SPEED;
-            first = False
-            for i in range(0, SWING, SWING_SPEED):
-                yield
-        else:
-            start = -SWING
         for i in range(pause):
             yield
-        for i in range(start, SWING, SWING_SPEED):
-            for l1, l2 in zip(robot.legs[:2], robot.legs[2:]):
-                l1.move_by((-SWING_SPEED, 0, 0))
-                l2.move_by((SWING_SPEED, 0, 0))
+        for i in range(-SWING, SWING, SWING_SPEED):
+            if not first or i >= 0:
+                robot.shift_by((dx * SWING_SPEED, dy * SWING_SPEED, 0))
             yield
         for i in range(pause):
             yield
         for i in range(SWING, -SWING, -SWING_SPEED):
-            for l1, l2 in zip(robot.legs[:2], robot.legs[2:]):
-                l1.move_by((SWING_SPEED, 0, 0))
-                l2.move_by((-SWING_SPEED, 0, 0))
+            robot.shift_by((-dx * SWING_SPEED, -dy * SWING_SPEED, 0))
             yield
+        if first:
+            first = False
+
 
 
 def rotate(leg, side, delay):
@@ -65,7 +60,8 @@
     robot.home()
     delay = (2 * STRIDE / SPEED + 6) / 4
     animations = [
-        swing(robot),
+        swing(robot, (-1, 0), 0 * delay),
+#        swing(robot, (0, 1), 1 * delay),
         rotate(robot.legs[0], 1, 0 * delay + OVERLAP),
         rotate(robot.legs[1], -1, 1 * delay - OVERLAP),
         rotate(robot.legs[3], -1, 2 * delay + OVERLAP),
--- a/squats.py	Wed Jul 09 19:10:11 2014 +0000
+++ b/squats.py	Wed Jul 09 21:29:58 2014 +0000
@@ -9,35 +9,24 @@
 
 
 def squats(robot):
-    while True:
-        for i in range(-35, -25):
-            for leg in robot.legs:
-                leg.move_to((20, 0, i))
-                yield
-        for i in range(-25, -35, -1):
-            for leg in robot.legs:
-                leg.move_to((20, 0, i))
-                yield
-        for i in range(0, 20):
-            robot.legs[0].move_to((20 - i, 0, -35))
-            robot.legs[1].move_to((20 - i, 0, -35))
-            robot.legs[2].move_to((20 + i, 0, -35))
-            robot.legs[3].move_to((20 + i, 0, -35))
-            yield
-        for i in range(20, 0, -1):
-            robot.legs[0].move_to((20 - i, 0, -35))
-            robot.legs[1].move_to((20 - i, 0, -35))
-            robot.legs[2].move_to((20 + i, 0, -35))
-            robot.legs[3].move_to((20 + i, 0, -35))
-            yield
-        for i in range(0, 20):
-            for leg in robot.legs:
-                leg.move_to((20, i, -35))
-            yield
-        for i in range(20, 0, -1):
-            for leg in robot.legs:
-                leg.move_to((20, i, -35))
-            yield
+    for i in range(0, 10):
+        robot.shift[2] = i
+        yield
+    for i in range(10, 0, -1):
+        robot.shift[2] = i
+        yield
+    for i in range(0, 20):
+        robot.shift[0] = i
+        yield
+    for i in range(20, 0, -1):
+        robot.shift[0] = i
+        yield
+    for i in range(0, 20):
+        robot.shift[1] = i
+        yield
+    for i in range(20, 0, -1):
+        robot.shift[1] = i
+        yield
 
 
 if __name__ == '__main__':