changeset 123:241c09fc1364

Make home animation more elaborate. Add Leg.move_by.
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Tue, 08 Jul 2014 23:37:23 +0200
parents 7261169ff322
children 4aa7616a630e
files creep.py kubik.py rotate.py squats.py wave.py
diffstat 5 files changed, 67 insertions(+), 59 deletions(-) [+]
line wrap: on
line diff
--- a/creep.py	Tue Jul 08 20:52:32 2014 +0000
+++ b/creep.py	Tue Jul 08 23:37:23 2014 +0200
@@ -48,6 +48,7 @@
 
 if __name__ == '__main__':
     robot = kubik.Robot()
+    robot.home()
     delay = (2 * STRIDE / SPEED + 6) / 4
     animations = [
         swing(robot),
@@ -56,5 +57,4 @@
         creep(robot.legs[3], -1, delay * 2 + OVERLAP, robot),
         creep(robot.legs[2], -1, delay * 3 - OVERLAP, robot),
     ]
-    robot.home()
     robot.run_animations(animations, FPS)
--- a/kubik.py	Tue Jul 08 20:52:32 2014 +0000
+++ b/kubik.py	Tue Jul 08 23:37:23 2014 +0200
@@ -94,7 +94,7 @@
         """Move the foot to the specified point.
 
         If any of the coordinates is None, no movement will be done in that
-        coordinate.
+        axis.
         """
         position = list(position)
         for i, coord in enumerate(position):
@@ -102,6 +102,12 @@
                 position[i] = self.position[i]
         self.position = position
 
+    def move_by(self, delta):
+        """Move the foot by the specified amount."""
+        x, y, z = self.position
+        dx, dy, dz = delta
+        self.position = x + dx, y + dy, z + dz
+
     def rotate(self, degrees):
         """Rotate the leg around the center of the body horizontally."""
         radians = math.radians(degrees)
@@ -149,26 +155,42 @@
                 False),
         ]
 
-    def home(self):
+    def _home(self):
         """Move all legs to their initial position."""
         for leg in self.legs:
-            leg.move_to((30, -30 * leg.y_direction, -35))
+            leg.move_to((None, None, 5))
+            for i in range(4):
+                yield
+            leg.move_to((30, -30 * leg.y_direction, None))
+            for i in range(4):
+                yield
+            leg.move_to((None, None, -34))
+            for i in range(4):
+                yield
+            leg.move_to((None, None, -35))
+
+    def home(self):
+        self._run_animations([self._home()], 12)
 
     def update(self):
         for leg in self.legs:
             leg.update()
 
+    def _run_animations(self, animations, fps=12):
+        clock = pygame.time.Clock()
+        while animations:
+            for animation in list(animations):
+                try:
+                    new = next(animation)
+                    if new:
+                        animations.extend(new)
+                except StopIteration:
+                    animations.remove(animation)
+            self.update()
+            clock.tick(fps)
+
     def run_animations(self, animations, fps=12):
-        clock = pygame.time.Clock()
         try:
-            while animations:
-                for animation in list(animations):
-                    try:
-                        next(animation)
-                    except StopIteration:
-                        animations.remove(animation)
-                self.update()
-                clock.tick(fps)
+            self._run_animations(animations, fps)
         finally:
             self.home()
-            self.update()
--- a/rotate.py	Tue Jul 08 20:52:32 2014 +0000
+++ b/rotate.py	Tue Jul 08 23:37:23 2014 +0200
@@ -1,5 +1,6 @@
 import kubik
 
+
 FPS = 12
 
 
@@ -12,14 +13,13 @@
         yield
 
 
-
 if __name__ == '__main__':
     robot = kubik.Robot()
+    robot.home()
     animations = [
         rotate(robot.legs[0], 1),
         rotate(robot.legs[1], -1),
         rotate(robot.legs[2], 1),
         rotate(robot.legs[3], -1),
     ]
-    robot.home()
     robot.run_animations(animations, FPS)
--- a/squats.py	Tue Jul 08 20:52:32 2014 +0000
+++ b/squats.py	Tue Jul 08 23:37:23 2014 +0200
@@ -5,56 +5,42 @@
    kinematics.
 """
 
-import time
-
 import kubik
 
 
-robot = kubik.Robot()
-try:
+def squats(robot):
     while True:
         for i in range(-35, -25):
-            time.sleep(0.0125)
-            robot.legs[0].move_to((20, 0, i))
-            robot.legs[1].move_to((20, 0, i))
-            robot.legs[2].move_to((20, 0, i))
-            robot.legs[3].move_to((20, 0, i))
-            robot.update()
+            for leg in robot.legs:
+                leg.move_to((20, 0, i))
+                yield
         for i in range(-25, -35, -1):
-            time.sleep(0.0125)
-            robot.legs[0].move_to((20, 0, i))
-            robot.legs[1].move_to((20, 0, i))
-            robot.legs[2].move_to((20, 0, i))
-            robot.legs[3].move_to((20, 0, i))
-            robot.update()
+            for leg in robot.legs:
+                leg[0].move_to((20, 0, i))
+                yield
         for i in range(0, 20):
-            time.sleep(0.0125)
-            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))
-            robot.update()
+            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):
-            time.sleep(0.0125)
-            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))
-            robot.update()
+            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):
-            time.sleep(0.0125)
-            robot.legs[0].move_to((20, i, -35))
-            robot.legs[1].move_to((20, i, -35))
-            robot.legs[2].move_to((20, i, -35))
-            robot.legs[3].move_to((20, i, -35))
-            robot.update()
+            for leg in robot.legs:
+                leg.move_to((20, i, -35))
+            yield
         for i in range(20, 0, -1):
-            time.sleep(0.0125)
-            robot.legs[0].move_to((20, i, -35))
-            robot.legs[1].move_to((20, i, -35))
-            robot.legs[2].move_to((20, i, -35))
-            robot.legs[3].move_to((20, i, -35))
-            robot.update()
-finally:
+            for leg in robot.legs:
+                leg.move_to((20, i, -35))
+            yield
+
+
+if __name__ == '__main__':
+    robot = kubik.Robot()
     robot.home()
-
+    robot.run_animations([squats(robot)])
--- a/wave.py	Tue Jul 08 20:52:32 2014 +0000
+++ b/wave.py	Tue Jul 08 23:37:23 2014 +0200
@@ -19,6 +19,6 @@
 
 if __name__ == '__main__':
     robot = kubik.Robot()
+    robot.home()
     animations = [wave(robot)]
-    robot.home()
     robot.run_animations(animations)