changeset 3:8ed8f30b0568 draft

Update gaits
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 23 Jul 2017 20:23:29 +0200
parents 2f1609829f66
children 48cead9d49b5
files crab/gait.py crab/hardware.py crab/main.py crab/robot.py python/gait.py python/robot.py
diffstat 6 files changed, 103 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/crab/gait.py	Mon May 15 20:01:55 2017 +0200
+++ b/crab/gait.py	Sun Jul 23 20:23:29 2017 +0200
@@ -3,12 +3,14 @@
 
 
 class Creep:
-    speed = 0.5
-    stride = 15
-    shift = 8
-    shift_steps = 2
+    speed = 0.3
+    stride = 12
+    shift = 12
+    shift_steps = 3
     raise_leg = 10
     raise_steps = 2
+    spread = -10
+    height = 5
     next_leg = (
         (2, 0, 3, 1),   # forward
         (1, 3, 0, 2),   # backward
@@ -23,11 +25,9 @@
         self.shift_x = 0
         self.shift_y = 0
         self.on_ground = list(robot.legs)
-        self.dx = 1
+        self.dx = 0
         self.dy = 0
         self.rotation = 0
-        self.spread = -10
-        self.height = 5
         self.last_leg = 0
 
     def move(self):
@@ -35,7 +35,7 @@
             dx = self.dx * leg.x_dir * self.speed
             dy = self.dy * leg.y_dir * self.speed
             leg.move_to(leg.x - dx, leg.y - dy, self.height)
-            leg.rotate_by(-self.rotation * leg.x_dir * leg.y_dir * self.speed)
+            leg.rotate_by(-self.rotation * self.speed)
         time.sleep(0.001)
 
     def step(self, leg):
@@ -57,7 +57,7 @@
             (self.shift_y + self.dy * self.stride) * leg.y_dir + self.spread,
             self.raise_leg * self.raise_steps + self.height
         )
-        leg.rotate_by(self.rotation * leg.x_dir * leg.y_dir * self.stride / 10)
+        leg.rotate_by(self.rotation * self.stride / 10)
         self.move()
         self.move()
         for step in range(self.raise_steps - 1):
--- a/crab/hardware.py	Mon May 15 20:01:55 2017 +0200
+++ b/crab/hardware.py	Sun Jul 23 20:23:29 2017 +0200
@@ -13,6 +13,7 @@
         self._i2c_buffer = bytearray(2)
         self._init_servo()
         self._init_eyes()
+        self._init_sensor()
         #self._init_voice()
 
     def _i2c_reg(self, address, register, value=None):
@@ -54,6 +55,11 @@
         finally:
             self.i2c.unlock()
 
+    def _init_sensor(self):
+        self._i2c_reg(0x60, 0xee, 0x06)
+        #self._i2c_reg(0x60, 0x3f, 0x00)
+        #self._i2c_reg(0x60, 0xa8, 0x03)
+
     def sensor(self):
         self._i2c_buffer[0] = 0x5e
         self.i2c.try_lock()
@@ -64,13 +70,13 @@
             self.i2c.unlock()
         if self._i2c_buffer[0] == 0xff:
             return 0
-        return (self._i2c_buffer[0] << 4 | self._i2c_buffer[1]) / 3.2
+        return ((self._i2c_buffer[0] << 4) | self._i2c_buffer[1]) / 3.2
 
     def _init_eyes(self):
         self._eye_pins = (
             digitalio.DigitalInOut(board.D9),
+            digitalio.DigitalInOut(board.D11),
             digitalio.DigitalInOut(board.D10),
-            digitalio.DigitalInOut(board.D11),
         )
         for pin in self._eye_pins:
             pin.switch_to_output()
--- a/crab/main.py	Mon May 15 20:01:55 2017 +0200
+++ b/crab/main.py	Sun Jul 23 20:23:29 2017 +0200
@@ -1,5 +1,73 @@
+import math
+import time
 from hardware import Hardware
 from robot import Robot
+from gait import Creep
+import samd
+
+samd.disable_autoreload()
 
 robot = Robot(Hardware())
 robot.unfold()
+gait = Creep(robot)
+gait.dx = 0
+
+dr = math.pi / 80
+while 1:
+    try:
+        distance = robot.hardware.sensor()
+        if distance == 0:
+            robot.hardware.eye_color(4)
+            gait.dx = 0
+            i = 10
+            j = 0
+            while distance == 0:
+                robot.rotate_by(dr)
+                i += 1
+                if i > 20:
+                    i = 0
+                    dr = -dr
+                    j += 1
+                    if j > 4:
+                        j = 0
+                        robot.hardware.eye_color(0)
+                        robot.fold()
+                        while distance == 0:
+                            time.sleep(1)
+                            distance = robot.hardware.sensor()
+                        robot.unfold()
+                time.sleep(0.2)
+                distance = robot.hardware.sensor()
+        elif distance < 200:
+            robot.hardware.eye_color(1)
+            gait.dx = -1
+        elif distance < 250:
+            robot.hardware.eye_color(5)
+            gait.dx = 0
+            time.sleep(1)
+            distance2 = robot.hardware.sensor()
+            if abs(distance - distance2) < 5:
+                robot.rotate_by(dr)
+                time.sleep(0.1)
+                distance = robot.hardware.sensor()
+                robot.rotate_by(-dr)
+                time.sleep(0.1)
+                robot.rotate_by(-dr)
+                time.sleep(0.1)
+                distance2 = robot.hardware.sensor()
+                robot.rotate_by(dr)
+                time.sleep(0.1)
+                if distance2 > distance:
+                    dr = -dr
+                robot.hardware.eye_color(6)
+                gait.rotation = dr
+                gait.run(10)
+                gait.rotation = 0
+            else:
+                distance = distance2
+        else:
+            robot.hardware.eye_color(3)
+            gait.dx = 1
+        gait.run(1)
+    except ValueError:
+        robot.home()
--- a/crab/robot.py	Mon May 15 20:01:55 2017 +0200
+++ b/crab/robot.py	Sun Jul 23 20:23:29 2017 +0200
@@ -25,6 +25,7 @@
         self.move_to(self.x + dx, self.y + dy, self.z + dz)
 
     def rotate_by(self, radians):
+        radians *= self.x_dir * self.y_dir
         x = self.x + ik.BASE + ik.HOME
         y = self.y + ik.BASE + ik.HOME
         nx = x * math.cos(radians) - y * math.sin(radians) - ik.BASE - ik.HOME
@@ -48,7 +49,7 @@
 
     def rotate_by(self, radians):
         for leg in self.legs:
-            leg.rotate_by(radians * leg.x_dir * leg.y_dir)
+            leg.rotate_by(radians)
 
     def home(self):
         for leg in self.legs:
--- a/python/gait.py	Mon May 15 20:01:55 2017 +0200
+++ b/python/gait.py	Sun Jul 23 20:23:29 2017 +0200
@@ -2,12 +2,12 @@
 
 
 class Creep:
-    speed = 2
+    speed = 2.3
     stride = 36
-    shift = 12
-    shift_steps = 2
-    raise_leg = 10
-    raise_steps = 2
+    shift = 8
+    shift_steps = 1
+    raise_leg = 30
+    raise_steps = 1
     next_leg = (
         (2, 0, 3, 1),   # forward
         (1, 3, 0, 2),   # backward
@@ -25,35 +25,31 @@
         self.dx = 1
         self.dy = 0
         self.rotation = 0
-        self.spread = 20
-        leg = robot.legs[0]
-        self.height = 20
+        self.spread = 0
+        self.raise_spread = 10
+        self.height = 30
         self.last_leg = 0
 
     def move(self):
-        print("Moving legs backwards")
         for leg in self.on_ground:
             dx = self.dx * leg.x_dir * self.speed
             dy = self.dy * leg.y_dir * self.speed
             leg.move_to(leg.x - dx, leg.y - dy, self.height)
-            #leg.rotate_by(-self.rotation * leg.x_dir * leg.y_dir / 2)
+            leg.rotate_by(-self.rotation * leg.x_dir * leg.y_dir / 2)
         utime.sleep_ms(10)
 
     def step(self, leg):
         dx = (leg.x_dir * self.shift - self.shift_x) / self.shift_steps
         dy = (leg.y_dir * self.shift - self.shift_y) / self.shift_steps
-        print("Shifting body by (%d, %d) %d times" % (dx, dy, self.shift_steps))
         for step in range(self.shift_steps):
             self.robot.move_by(dx, dy, 0)
             self.shift_x += dx
             self.shift_y += dy
             self.move()
         self.on_ground.remove(leg)
-        print("Raising leg by %d %d times" % (self.raise_leg, self.raise_steps))
         for step in range(self.raise_steps):
-            leg.move_by(0, 0, self.raise_leg)
+            leg.move_by(self.raise_spread, self.raise_spread, self.raise_leg)
             self.move()
-        print("Moving leg forward")
         leg.move_to(
             (self.shift_x + self.dx * self.stride) * leg.x_dir + self.spread,
             (self.shift_y + self.dy * self.stride) * leg.y_dir + self.spread,
@@ -61,17 +57,14 @@
         )
         self.move()
         self.move()
-        print("Lowering leg")
         for step in range(self.raise_steps - 1):
             leg.move_by(0, 0, -self.raise_leg)
             self.move()
         self.on_ground.append(leg)
         self.move()
-        print("Leg done")
 
     def run(self, steps):
         for step in range(steps):
-            print("Moving leg %d" % self.last_leg)
             leg = self.robot.legs[self.last_leg]
             self.step(leg)
             self.last_leg = self.next_leg[0][self.last_leg]
--- a/python/robot.py	Mon May 15 20:01:55 2017 +0200
+++ b/python/robot.py	Sun Jul 23 20:23:29 2017 +0200
@@ -25,10 +25,10 @@
 
 class Leg:
     # Lengths of leg segments, in mm
-    coxa =  36    # between the hip and the knee
-    femur = 39    # between the knee and the ankle
-    tibia = 55    # between the ankle and the foot
-    base =  21    # from the center of body
+    coxa = 12.3     # between the hip and the knee
+    femur = 39.0    # between the knee and the ankle
+    tibia = 55.0    # between the ankle and the foot
+    base = 21.0     # from the center of body
 
     def __init__(self, joints, direction, servos):
         self.servos = servos
@@ -40,8 +40,8 @@
         self.z = 0
 
     def move_to(self, x, y, z):
-        print("Moving leg %d, %d to %d, %d, %d" % (self.x_dir, self.y_dir,
-            x, y, z))
+        print("Moving leg %d, %d to %d, %d, %d" %
+              (self.x_dir, self.y_dir, x, y, z))
         x += self.home
         y += self.home
         z -= self.tibia