changeset 112:aef5b9624f2e

creep
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Wed, 02 Jul 2014 21:16:46 +0000
parents 8a8aadd7fdad
children 5e4bc2c8fc59
files creep.py kubik.py
diffstat 2 files changed, 60 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creep.py	Wed Jul 02 21:16:46 2014 +0000
@@ -0,0 +1,43 @@
+import pygame
+import kubik
+
+
+def creep(leg, side, delay, robot):
+    for i in range(delay):
+        yield
+    while True:
+        for l1, l2 in zip(robot.legs[:2], robot.legs[2:]):
+            l1.move_to((30 + side * 15, None, None))
+            l2.move_to((30 - side * 15, None, None))
+        for i in range(4):
+            yield
+        leg.move_to((None, None, 10))
+        for i in range(4):
+            yield
+        leg.move_to((None, 40, None))
+        for i in range(4):
+            yield
+        leg.move_to((None, None, -30))
+        for y in range(40, -40, -2):
+            leg.move_to((None, y, None))
+            yield
+
+
+if __name__ == '__main__':
+    pygame.mixer.init()
+    clock = pygame.time.Clock()
+    robot = kubik.Robot()
+    animations = [
+        creep(robot.legs[0], 1, 0, robot),
+        creep(robot.legs[1], 1, 13, robot),
+        creep(robot.legs[2], -1, 39, robot),
+        creep(robot.legs[3], -1, 26, robot),
+    ]
+    robot.home()
+    try:
+        while True:
+            for animation in animations:
+                next(animation, None)
+            clock.tick(24)
+    finally:
+        robot.home()
--- a/kubik.py	Wed Jul 02 19:14:27 2014 +0000
+++ b/kubik.py	Wed Jul 02 21:16:46 2014 +0000
@@ -76,9 +76,20 @@
         return hip, knee, ankle
 
     def move_to(self, position):
-        """Move the foot to the specified point."""
+        """Move the foot to the specified point.
+
+        If any of the coordinates is None, no movement will be done in that
+        coordinate.
+        """
+        position = list(position)
+        for i, coord in enumerate(position):
+            if coord is None:
+                position[i] = self.position[i]
         self.position = position
-        hip, knee, ankle = self._inverse_kinematics(position)
+        self.update()
+
+    def update(self):
+        hip, knee, ankle = self._inverse_kinematics(self.position)
         self.hip.move_degrees(hip)
         self.knee.move_degrees(knee)
         self.ankle.move_degrees(ankle)
@@ -111,5 +122,7 @@
 
     def home(self):
         """Move all legs to their initial position."""
-        for leg in self.legs:
-            leg.move_to((30, 30, -35))
+        self.legs[0].move_to((30, -30, -35))
+        self.legs[1].move_to((30, 30, -35))
+        self.legs[2].move_to((30, 30, -35))
+        self.legs[3].move_to((30, -30, -35))