changeset 139:03e30dd7c34e

joy
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sat, 19 Jul 2014 12:19:03 +0200
parents 49d2e68a50b3
children e7adf29e5d6d
files control.py kubik.py rotate.py
diffstat 3 files changed, 60 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/control.py	Fri Jul 18 08:34:27 2014 +0200
+++ b/control.py	Sat Jul 19 12:19:03 2014 +0200
@@ -3,7 +3,7 @@
 import kubik
 
 
-FPS = 12
+FPS = 24
 
 
 class Walk(object):
@@ -13,9 +13,11 @@
         self.rotation = 0.0
         self.stride = 35
         self.shift_speed = 3
-        self.shift_steps = 4
-        self.down = -55
-        self.up = -20
+        self.shift_steps = 0
+        self.down = -35
+        self.up = 10
+        self.shifted = 0, 0
+        self.posture = 20
         self.legs = [
             (self.robot.legs[0], (1, -1), 1, (55, -55)),
             (self.robot.legs[1], (1, 1), 1, (55, 55)),
@@ -25,6 +27,8 @@
         self.on_floor = set((leg, side)
                             for leg, shift, side, home in self.legs)
         self.blip = pygame.mixer.Sound('sound/blip.wav')
+        self.blop = pygame.mixer.Sound('sound/blop.wav')
+        self.boop = pygame.mixer.Sound('sound/boop.wav')
 
     def _retract_leg(self, step):
         dx, dy = self.speed
@@ -41,14 +45,22 @@
     def _raise_leg(self, leg, side):
         leg.move_to((None, None, self.up))
         self.on_floor.remove((leg, side))
-        self.blip.play()
+        if self.rotation:
+            self.blop.play()
+        elif self.speed != [0, 0]:
+            self.blip.play()
+        else:
+            self.boop.play()
 
     def _advance_leg(self, leg, side, home):
         dx, dy = self.speed
+        posture = (
+            (abs(dx) - abs(dy)) * self.posture,
+            (abs(dy) - abs(dx)) * self.posture * leg.y_direction,
+        )
         leg.move_to((
-            home[0] + dx * self.stride * side - (abs(dx) + abs(dy)) * 15,
-            home[1] + dy * self.stride - (
-                abs(dy) + abs(dx)) * 15 * leg.y_direction,
+            home[0] + dx * self.stride * side - posture[0],
+            home[1] + dy * self.stride - posture[1],
             None,
         ))
         leg.rotate(-self.rotation * self.stride * side / 3)
@@ -61,32 +73,38 @@
         self.on_floor.add((leg, side))
 
     def _stomp(self):
-        shifted = 0, 0
         while True:
-            for leg, shift, side, home in self.legs:
-                for frame in range(self.shift_steps):
-                    if shift[0] != shifted[0]:
-                        self.robot.shift[0] += shift[0] * self.shift_speed
-                    if shift[1] != shifted[1]:
-                        self.robot.shift[1] += shift[1] * self.shift_speed
-                    yield
-                self._raise_leg(leg, side)
-                for frame in range(2):
-                    yield
-                self._advance_leg(leg, side, home)
-                for frame in range(2):
-                    yield
-                self._lower_leg(leg)
-                for frame in range(2):
-                    yield
-                self._ground_leg(leg, side)
-                for frame in range(self.shift_steps):
-                    if shift[0] != shifted[0]:
-                        self.robot.shift[0] -= shift[0] * self.shift_speed
-                    if shift[1] != shifted[1]:
-                        self.robot.shift[1] -= shift[1] * self.shift_speed
-                    yield
-                shifted = shift
+            if self.speed != [0, 0] or self.rotation:
+                for step in self._stomp_once():
+                    yield step
+            else:
+                yield
+
+    def _stomp_once(self):
+        for leg, shift, side, home in self.legs:
+            for frame in range(self.shift_steps):
+                if shift[0] != self.shifted[0]:
+                    self.robot.shift[0] += shift[0] * self.shift_speed
+                if shift[1] != self.shifted[1]:
+                    self.robot.shift[1] += shift[1] * self.shift_speed
+                yield
+            self._raise_leg(leg, side)
+            for frame in range(4):
+                yield
+            self._advance_leg(leg, side, home)
+            for frame in range(2):
+                yield
+            self._lower_leg(leg)
+            for frame in range(4):
+                yield
+            self._ground_leg(leg, side)
+            for frame in range(self.shift_steps):
+                if shift[0] != self.shifted[0]:
+                    self.robot.shift[0] -= shift[0] * self.shift_speed
+                if shift[1] != self.shifted[1]:
+                    self.robot.shift[1] -= shift[1] * self.shift_speed
+                yield
+            self.shifted = shift
 
     def run(self):
         clock = pygame.time.Clock()
@@ -102,11 +120,11 @@
                             self.blip.play()
                     elif event.type == pygame.JOYAXISMOTION:
                         if event.axis == 0:
-                            event.speed[1] = event.value
+                            self.speed[0] = event.value
                         elif event.axis == 1:
-                            event.speed[0] = event.value
+                            self.speed[1] = -event.value
                         elif event.axis == 3:
-                            event.rotation = event.value
+                            self.rotation = event.value
                 stomp.next()
                 retract.next()
                 robot.update()
@@ -116,7 +134,8 @@
 
 
 if __name__ == '__main__':
-    pygame.jostick.init()
+    pygame.display.init()
+    pygame.joystick.init()
     pygame.mixer.init()
     for joy in range(pygame.joystick.get_count()):
         pygame.joystick.Joystick(joy).init()
--- a/kubik.py	Fri Jul 18 08:34:27 2014 +0200
+++ b/kubik.py	Sat Jul 19 12:19:03 2014 +0200
@@ -58,8 +58,8 @@
 
     # Lengths of leg segments, in mm
     coxa = 40.0  # between the hip and the knee
-    femur = 30.0  # between the knee and the ankle
-    tibia = 36.5  # between the ankle and the foot
+    femur = 32.0  # between the knee and the ankle
+    tibia = 35.0  # between the ankle and the foot
     base = 45.0, 45.0  # from the center of body
     home = 45.0, 45.0, -35.0
 
--- a/rotate.py	Fri Jul 18 08:34:27 2014 +0200
+++ b/rotate.py	Sat Jul 19 12:19:03 2014 +0200
@@ -1,7 +1,7 @@
 import kubik
 
 
-STRIDE = -20
+STRIDE = 10
 SPEED = -1
 SWING = 18
 SWING_SPEED = 3
@@ -41,7 +41,7 @@
         leg.move_to((None, None, STEP))
         for i in range(4):
             yield
-        leg.rotate(STRIDE * side)
+        leg.rotate(STRIDE)
         if not first:
             leg.rotate(STRIDE * side)
             pass