Mercurial > katka
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)
