changeset 2:10ddd812378b

Basic creeping
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Thu, 11 Sep 2014 22:47:53 +0200
parents 568e7573fa8c
children 52e98bf3d1a4
files katka.py leg.py robot.py
diffstat 3 files changed, 19 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/katka.py	Thu Sep 11 21:41:08 2014 +0200
+++ b/katka.py	Thu Sep 11 22:47:53 2014 +0200
@@ -26,15 +26,15 @@
         self.legs = (
             # front left
             Leg(Servo(s, 1, reverse=False, trim=5),
-                Servo(s, 0, reverse=False, trim=5), -1),
+                Servo(s, 0, reverse=False, trim=5), (-1, 1)),
             # front right
-            Leg(Servo(s, 6, reverse=False),
-                Servo(s, 7, reverse=False, trim=-5), -1),
+            Leg(Servo(s, 6, reverse=False, trim=0),
+                Servo(s, 7, reverse=False, trim=-5), (-1, -1)),
             # hind left
-            Leg(Servo(s, 3, reverse=True),
-                Servo(s, 2, reverse=True, trim=5), 1),
+            Leg(Servo(s, 3, reverse=True, trim=-5),
+                Servo(s, 2, reverse=True, trim=5), (1, 1)),
             # hind right
             Leg(Servo(s, 4, reverse=True),
-                Servo(s, 5, reverse=True, trim=-5), 1),
+                Servo(s, 5, reverse=True, trim=-5), (1, -1)),
         )
         super(Robot, self).__init__()
--- a/leg.py	Thu Sep 11 21:41:08 2014 +0200
+++ b/leg.py	Thu Sep 11 22:47:53 2014 +0200
@@ -31,15 +31,17 @@
     tibia = 30.0  # between the ankle and the foot
     base = 15.0, 15.0  # from the center of body
 
-    def __init__(self, knee, ankle, x_dir):
+    def __init__(self, knee, ankle, (x_dir, y_dir)):
         self.knee = knee
         self.ankle = ankle
         self.x_dir = x_dir
+        self.y_dir = y_dir
         self.home = [
             self.tibia / SQRT2,
             self.femur + self.tibia / SQRT2,
         ]
         self.position = self.home
+        self.angles = self._inverse_kinematics(self.position)
 
     def __iter__(self):
         """Iterate over all joints."""
@@ -55,7 +57,7 @@
         ankle = math.degrees(ankle) - 180 + 45
         return knee, ankle
 
-    def move_to(self, position):
+    def move_to(self, position, tilt=0):
         """Move the foot to the specified point.
 
         If any of the coordinates is None, no movement will be done in that
@@ -66,19 +68,18 @@
             if coord is None:
                 position[i] = self.position[i]
         self.position = position
+        x, y = self.position
+        position = x, y + tilt * self.y_dir
+        self.angles = self._inverse_kinematics(position)
 
-    def move_by(self, (dx, dy)):
+    def move_by(self, (dx, dy), tilt=0):
         """Move the foot by the specified amount."""
         x, y = self.position
-        self.move_to((x + dx, y + dy))
+        self.move_to((x + dx, y + dy), tilt)
 
-    def update(self, shift=(0, 0), send=True):
+    def update(self, shift=(0, 0), tilt=0, send=True):
         """Send the positions to the servos."""
-        dx, dy = shift
-        x, y = self.position
-        position = x + dx * self.x_dir, y + dy
-        angles = self._inverse_kinematics(position)
-        for joint, angle in zip(self, angles):
+        for joint, angle in zip(self, self.angles):
             joint.move_degrees(angle)
             if send:
                 joint.update()
--- a/robot.py	Thu Sep 11 21:41:08 2014 +0200
+++ b/robot.py	Thu Sep 11 22:47:53 2014 +0200
@@ -9,12 +9,13 @@
 
     def __init__(self):
         self.shift = [0.0, 0.0]
+        self.tilt = 0
         self.clock = pygame.time.Clock()
 
     def update(self, fps=12, at_once=True):
         servos = []
         for leg in self.legs:
-            leg.update(self.shift, send=not at_once)
+            leg.update(self.shift, self.tilt, send=not at_once)
             servos.extend(leg)
         if at_once:
             self.legs[0].ankle.update_all(servos)