changeset 138:49d2e68a50b3

control.py
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Fri, 18 Jul 2014 08:34:27 +0200
parents 62af0b5c0e8e
children 03e30dd7c34e
files control.py kubik.py walk.py wave.py
diffstat 4 files changed, 145 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/control.py	Fri Jul 18 08:34:27 2014 +0200
@@ -0,0 +1,126 @@
+import pygame
+
+import kubik
+
+
+FPS = 12
+
+
+class Walk(object):
+    def __init__(self, robot):
+        self.robot = robot
+        self.speed = [0, 0]
+        self.rotation = 0.0
+        self.stride = 35
+        self.shift_speed = 3
+        self.shift_steps = 4
+        self.down = -55
+        self.up = -20
+        self.legs = [
+            (self.robot.legs[0], (1, -1), 1, (55, -55)),
+            (self.robot.legs[1], (1, 1), 1, (55, 55)),
+            (self.robot.legs[3], (-1, -1), -1, (55, -55)),
+            (self.robot.legs[2], (-1, 1), -1, (55, 55)),
+        ]
+        self.on_floor = set((leg, side)
+                            for leg, shift, side, home in self.legs)
+        self.blip = pygame.mixer.Sound('sound/blip.wav')
+
+    def _retract_leg(self, step):
+        dx, dy = self.speed
+        leg, side = step
+        leg.move_by((-dx * side, -dy, 0))
+        leg.rotate(self.rotation * side / 3)
+
+    def _retract(self):
+        while True:
+            for step in self.on_floor:
+                self._retract_leg(step)
+            yield
+
+    def _raise_leg(self, leg, side):
+        leg.move_to((None, None, self.up))
+        self.on_floor.remove((leg, side))
+        self.blip.play()
+
+    def _advance_leg(self, leg, side, home):
+        dx, dy = self.speed
+        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,
+            None,
+        ))
+        leg.rotate(-self.rotation * self.stride * side / 3)
+
+    def _lower_leg(self, leg):
+        leg.move_to((None, None, self.down + 1))
+
+    def _ground_leg(self, leg, side):
+        leg.move_to((None, None, self.down))
+        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
+
+    def run(self):
+        clock = pygame.time.Clock()
+        stomp = self._stomp()
+        retract = self._retract()
+        try:
+            while True:
+                for event in pygame.event.get():
+                    if event.type == pygame.QUIT:
+                        raise SystemExit()
+                    elif event.type == pygame.JOYBUTTONDOWN:
+                        if event.button == 1:
+                            self.blip.play()
+                    elif event.type == pygame.JOYAXISMOTION:
+                        if event.axis == 0:
+                            event.speed[1] = event.value
+                        elif event.axis == 1:
+                            event.speed[0] = event.value
+                        elif event.axis == 3:
+                            event.rotation = event.value
+                stomp.next()
+                retract.next()
+                robot.update()
+                clock.tick(FPS)
+        finally:
+            self.robot.home()
+
+
+if __name__ == '__main__':
+    pygame.jostick.init()
+    pygame.mixer.init()
+    for joy in range(pygame.joystick.get_count()):
+        pygame.joystick.Joystick(joy).init()
+    robot = kubik.Robot()
+    robot.home()
+    walk = Walk(robot)
+    walk.run()
--- a/kubik.py	Tue Jul 15 22:56:33 2014 +0200
+++ b/kubik.py	Fri Jul 18 08:34:27 2014 +0200
@@ -149,11 +149,11 @@
                 KneeServo(m, 2, trim=-200),
                 AnkleServo1(m, 0, trim=0, center=1500 * 4),
                 False),
-            Leg(HipServo(m, 4, reverse=True, trim=-100),
+            Leg(HipServo(m, 4, trim=-100),
                 KneeServo(m, 5, reverse=True, trim=-200),
-                AnkleServo2(m, 3, reverse=True, trim=-400, center=1500 * 4),
+                AnkleServo2(m, 3, reverse=True, trim=-240, center=1500 * 4),
                 True),
-            Leg(HipServo(m, 7, reverse=False, trim=-150),
+            Leg(HipServo(m, 7, reverse=True, trim=-150),
                 KneeServo(m, 8, trim=100),
                 AnkleServo1(m, 6, trim=0, center=1500 * 4),
                 True),
--- a/walk.py	Tue Jul 15 22:56:33 2014 +0200
+++ b/walk.py	Fri Jul 18 08:34:27 2014 +0200
@@ -9,21 +9,22 @@
 class Walk(object):
     def __init__(self, robot):
         self.robot = robot
-        self.speed = [0, 0]
-        self.rotation = 1.0
+        self.speed = [0, 1]
+        self.rotation = 0.0
         self.stride = 35
         self.shift_speed = 3
         self.shift_steps = 4
-        self.down = -40
+        self.down = -55
         self.up = -20
         self.legs = [
-            (self.robot.legs[0], (1, -1), 1, (35, -35)),
-            (self.robot.legs[1], (1, 1), 1, (35, 35)),
-            (self.robot.legs[3], (-1, -1), -1, (35, -35)),
-            (self.robot.legs[2], (-1, 1), -1, (35, 35)),
+            (self.robot.legs[0], (1, -1), 1, (55, -55)),
+            (self.robot.legs[1], (1, 1), 1, (55, 55)),
+            (self.robot.legs[3], (-1, -1), -1, (55, -55)),
+            (self.robot.legs[2], (-1, 1), -1, (55, 55)),
         ]
         self.on_floor = set((leg, side)
                             for leg, shift, side, home in self.legs)
+        self.blip = pygame.mixer.Sound('sound/blip.wav')
 
     def _retract_leg(self, step):
         dx, dy = self.speed
@@ -40,6 +41,7 @@
     def _raise_leg(self, leg, side):
         leg.move_to((None, None, self.up))
         self.on_floor.remove((leg, side))
+        self.blip.play()
 
     def _advance_leg(self, leg, side, home):
         dx, dy = self.speed
@@ -72,8 +74,10 @@
                 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(4):
+                for frame in range(2):
                     yield
                 self._ground_leg(leg, side)
                 for frame in range(self.shift_steps):
@@ -99,6 +103,8 @@
 
 
 if __name__ == '__main__':
+    # pygame.jostick.init()
+    pygame.mixer.init()
     robot = kubik.Robot()
     walk = Walk(robot)
     walk.run()
--- a/wave.py	Tue Jul 15 22:56:33 2014 +0200
+++ b/wave.py	Fri Jul 18 08:34:27 2014 +0200
@@ -10,10 +10,10 @@
 
     robot.legs[2].move_to((30, 55, 20))
     for i in range(5):
-        for y in range(20, 40, 3):
+        for y in range(40, 60, 3):
             robot.legs[2].move_to((None, None, y))
             yield
-        for y in range(40, 20, -3):
+        for y in range(60, 40, -3):
             robot.legs[2].move_to((None, None, y))
             yield