class Wheels(MoveSteering): def __init__(self, left_motor_port, right_motor_port, desc=None, motor_class=LargeMotor): super().__init__(left_motor_port, right_motor_port, desc, motor_class) self.diff = MoveDifferential(left_motor_port, right_motor_port, EV3EducationSetTire, 110, desc, motor_class) def get_rotations(self): return (self.diff.left_motor.rotations + self.diff.right_motor.rotations) / 2.0 def distance_remaining(self, total_distance, initial_rotations): return total_distance - ((self.get_rotations() - initial_rotations) * self.diff.circumference_mm) @staticmethod def __speed(speed): return speed if isinstance(speed, SpeedValue) else SpeedPercent(speed) def on_for_rotations(self, steering, speed, rotations, brake=True, block=True): super().on_for_rotations(steering, self.__speed(speed), rotations, brake, block) def on_for_degrees(self, steering, speed, degrees, brake=True, block=True): super().on_for_degrees(steering, self.__speed(speed), degrees, brake, block) def on_for_seconds(self, steering, speed, seconds, brake=True, block=True): super().on_for_seconds(steering, self.__speed(speed), seconds, brake, block) def on(self, steering, speed): super().on(steering, self.__speed(speed)) def get_speed_steering(self, steering, speed): return super().get_speed_steering(steering, self.__speed(speed)) def on_for_distance(self, speed, distance_mm, brake=True, block=True): self.diff.on_for_distance(self.__speed(speed), distance_mm, brake, block) def on_arc_right(self, speed, radius_mm, distance_mm, brake=True, block=True): self.diff.on_arc_right(self.__speed(speed), radius_mm, distance_mm, brake, block) def on_arc_left(self, speed, radius_mm, distance_mm, brake=True, block=True): self.diff.on_arc_left(self.__speed(speed), radius_mm, distance_mm, brake, block) def turn_right(self, speed, degrees, brake=True, block=True): self.diff.turn_right(self.__speed(speed), degrees, brake, block) def turn_left(self, speed, degrees, brake=True, block=True): self.diff.turn_left(self.__speed(speed), degrees, brake, block) def turn(self, speed, degrees, brake=True, block=True): (self.turn_left if degrees < 0 else self.turn_right)(speed, degrees, brake, block)
def test_MoveDifferential(self): tank_drive = MoveDifferential(OUTPUT_A, OUTPUT_D, EV3EducationSetTire, 15 * STUD_MM) tank_drive.turn_right(20, 90 - 34) self.assertEqual(tank_drive.is_running, False) tank_drive.odometry_start() tank_drive.on_to_coordinates(30, -50, 300) self.assertEqual(tank_drive.is_running, False) tank_drive.on_for_distance(30, 300) self.assertEqual(tank_drive.is_running, False) tank_drive.on_arc_right(30, 200, 600, block=True) self.assertEqual(tank_drive.is_running, False)
#!/usr/bin/env python3 from ev3dev2.motor import LargeMotor, OUTPUT_B, OUTPUT_C, MoveDifferential from ev3dev2.motor import SpeedDPS, SpeedRPM, SpeedRPS from ev3dev2.wheel import EV3Tire from time import sleep from ev3dev2.motor import MediumMotor, OUTPUT_A medium_motorA = MediumMotor(OUTPUT_A) large_motorB = LargeMotor(OUTPUT_B) large_motorC = LargeMotor(OUTPUT_C) STUD_MM = 8 mdiff = MoveDifferential(OUTPUT_B, OUTPUT_C, EV3Tire, 16 * STUD_MM) mdiff.on_for_distance(speed = 50, distance_mm = 690) sleep(5) mdiff.turn_left(speed = 50, degrees = 80) mdiff.on_arc_right(SpeedRPM(60), 150, 65) mdiff.on_for_distance(speed = 50, distance_mm = -145) sleep(5) medium_motorA.on_for_degrees(speed = 10, degrees = -110) mdiff.on_arc_left(SpeedRPM(60), 150,67) sleep(10) mdiff.on_for_distance(10,50) #sleep while picking up the first green piece #medium_motorA.on_for_degrees(speed = 10, degrees = -110) sleep(5) #mdiff.turn_left(speed = 35, degrees = 10) sleep(2) medium_motorA.on_for_degrees(speed = 10, degrees = 110) sleep(2) mdiff.on_arc_right(SpeedRPM(60), 5200, 400) sleep(5) medium_motorA.on_for_degrees(speed = 10, degrees = -110)
sleep(2) mdiff.on_for_distance(speed = 50, distance_mm = -50) sleep(2) #moving the arm up after disengaging with both samples medium_motorA.on_for_degrees(speed = 10, degrees = 110) sleep(2) mdiff.turn_left(speed = 50, degrees = 50) mdiff.on_for_distance(speed = 50, distance_mm = 250) mdiff.turn_right(speed = 50, degrees = 65) mdiff.on_for_distance(speed = 50, distance_mm = 900) mdiff.turn_left(speed = 50, degrees = 40) sleep(2) #moving the arm down for sample 4 medium_motorA.on_for_degrees(speed = 10, degrees = -110) sleep(2) mdiff.on_arc_right(SpeedRPM(50), 100, 175) sleep(2) mdiff.on_for_distance(speed = 50, distance_mm = 300) #moving the arm up with sample #4 medium_motorA.on_for_degrees(speed = 10, degrees = 110) sleep(2) #getting sample 3 def sample3(): mdiff.on_for_distance(speed = 50,distance_mm = 350) sleep(2) #putting arm down medium_motorA.on_for_degrees(speed = 10, degrees = -110) mdiff.on_arc_right(SpeedRPM(50), 70, 90) #putting arm back up medium_motorA.on_for_degrees(speed = 10, degrees = 110) sample3()
# go forward until nearest object is within 25 cm on() wait_until_distance(35) on(speed=15) wait_until_distance(20) # hard turn to get off wall wheels.turn_left(SpeedPercent(15), 45) # arc to the left to orient towards push object wheels.on_arc_left(SpeedPercent(30), 300, 230, brake=False) # move forward 430 mm forward_distance() # reverse at an arc wheels.on_arc_right(SpeedPercent(-50), 200, 225, brake=False) # reverse for 145 mm wheels.on_for_distance(SpeedPercent(-30), 155) # reverse at an arc, orient touch sensor towards wall wheels.on_arc_left(SpeedPercent(-50), 175, 115, brake=False) # move back at 50% speed until touch sensor is pressed on(speed=-50) while not touch.is_pressed: pass # rotate right 90 degrees wheels.turn_right(SpeedPercent(35), 90) # move forward 110 mm forward_distance(110)
#!/usr/bin/env python3 from ev3dev2.motor import LargeMotor, OUTPUT_B, OUTPUT_C, MoveDifferential from ev3dev2.motor import SpeedDPS, SpeedRPM, SpeedRPS from ev3dev2.wheel import EV3Tire from time import sleep from ev3dev2.motor import MediumMotor, OUTPUT_A medium_motorA = MediumMotor(OUTPUT_A) large_motorB = LargeMotor(OUTPUT_B) large_motorC = LargeMotor(OUTPUT_C) STUD_MM = 8 mdiff = MoveDifferential(OUTPUT_B, OUTPUT_C, EV3Tire, 16 * STUD_MM) mdiff.on_for_distance(speed=50, distance_mm=690) sleep(5) mdiff.turn_left(speed=50, degrees=70) mdiff.on_arc_right(SpeedRPM(60), 150, 65) mdiff.on_for_distance(speed=50, distance_mm=-145) sleep(5) medium_motorA.on_for_degrees(speed=10, degrees=-110) mdiff.on_arc_left(SpeedRPM(60), 135, 67) sleep(10) mdiff.on_for_distance(10, 50) #sleep while picking up the first green piece #medium_motorA.on_for_degrees(speed = 10, degrees = -110) sleep(5) #mdiff.turn_left(speed = 35, degrees = 10) sleep(2) medium_motorA.on_for_degrees(speed=10, degrees=110) sleep(2) medium_motorA.on_for_degrees(speed=10, degrees=-110) sleep(5) mdiff.on_arc_left(SpeedRPM(50), 1200, 400)
STUD_MM = 8 # test with a robot that: # - uses the standard wheels known as EV3Tire # - wheels are 16 studs apart mdiff = MoveDifferential(OUTPUT_B, OUTPUT_C, EV3Tire, 16 * STUD_MM) # Rotate 90 degrees clockwise mdiff.turn_right(SpeedRPM(40), 90) # Drive forward 500 mm mdiff.on_for_distance(SpeedRPM(40), 500) # Drive in arc to the right along an imaginary circle of radius 150 mm. # Drive for 700 mm around this imaginary circle. mdiff.on_arc_right(SpeedRPM(80), 150, 700) # Enable odometry mdiff.odometry_start() # Use odometry to drive to specific coordinates mdiff.on_to_coordinates(SpeedRPM(40), 300, 300) # Use odometry to go back to where we started mdiff.on_to_coordinates(SpeedRPM(40), 0, 0) # Use odometry to rotate in place to 90 degrees mdiff.turn_to_angle(SpeedRPM(40), 90) # Disable odometry mdiff.odometry_stop()