Untitled
unknown
python
2 years ago
7.5 kB
6
Indexable
# GENERAL PURPOSE ( Color Maze ) #!usr/bin/env pybricks-micropython from pybricks.hubs import EV3Brick from pybricks.ev3devices import (Motor, GyroSensor, ColorSensor) from pybricks.parameters import (Port, Color) from pybricks.robotics import DriveBase # OBJECTS robot = DriveBase(Motor(Port.A), Motor(Port.B), wheel_diameter = 142.24, axle_track = 152) left_wheel = Motor(Port.A) right_wheel = Motor(Port.B) color_sensor = ColorSensor(Port.S1) gyro_sensor = GyroSensor(Port.S3) ev3_brick = EV3Brick() # FUNCTIONS ## This function allows for a precise turn. def turn(turn_value): gyro_sensor.reset_angle(gyro_sensor.angle()) if turn_value > 0: while not gyro_sensor.angle() > (turn_value - 1): last_error = 0 kp = 2 kd = 0.5 error = turn_value - gyro_sensor.angle() derivative = error - last_error proportional_gain = error * kp derivative_gain = derivative * kd correction = proportional_gain + derivative_gain left_wheel.run(correction + 5) right_wheel.run(-correction - 5) right_wheel.hold() left_wheel.hold() robot.drive(0, 0) else: while not gyro_sensor.angle() < (turn_value + 1): last_error = 0 kp = -2 kd = -0.5 error = turn_value - gyro_sensor.angle() derivative = error - last_error proportional_gain = error * kp derivative_gain = derivative * kd correction = proportional_gain + derivative_gain left_wheel.run(-correction - 5) right_wheel.run(correction + 5) right_wheel.hold() left_wheel.hold() robot.drive(0, 0) ## This function allows a precise move forward and the brain of this program def gyrostraight(colors): gyro_sensor.reset_angle(gyro_sensor.angle()) angle_to_compare_to = gyro_sensor.angle() left_wheel.reset_angle() right_wheel.reset_angle() for color in colors: if color == Color.GREEN: integral = 0 last_error = 0 kp = 2 ki = 0.09 kd = 0.5 if color_sensor.color() == Color.GREEN: while color_sensor.color() == Color.GREEN: error = angle_to_compare_to - gyro_sensor.angle() integral += error derivative = error - last_error proportional_gain = error * kp integral_gain = integral * ki derivative_gain = derivative * kd correction = proportional_gain + integral_gain + derivative_gain robot.drive(100, correction) robot.drive(0, 0) left_wheel.hold() right_wheel.hold() else: while not robot.distance() >= 80: error = angle_to_compare_to - gyro_sensor.angle() integral += error derivative = error - last_error proportional_gain = error * kp integral_gain = integral * ki derivative_gain = derivative * kd correction = proportional_gain + integral_gain + derivative_gain robot.drive(100, correction) robot.drive(0, 0) left_wheel.hold() right_wheel.hold() # while color_sensor.color() == Color.GREEN: # error = angle_to_compare_to - gyro_sensor.angle() # integral += error # derivative = error - last_error # proportional_gain = error * kp # integral_gain = integral * ki # derivative_gain = derivative * kd # correction = proportional_gain + integral_gain + derivative_gain # robot.drive(100, correction) # error = last_error # if color_sensor.color() != Color.GREEN: # while not robot.distance() >= 40: # error = angle_to_compare_to - gyro_sensor.angle() # integral += error # derivative = error - last_error # proportional_gain = error * kp # integral_gain = integral * ki # derivative_gain = derivative * kd # correction = proportional_gain + integral_gain + derivative_gain # robot.drive(100, correction) # error - last_error # while not robot.distance() >= 40: # error = angle_to_compare_to - gyro_sensor.angle() # integral += error # derivative = error - last_error # proportional_gain = error * kp # integral_gain = integral * ki # derivative_gain = derivative * kd # correction = proportional_gain + integral_gain + derivative_gain # robot.drive(100, correction) # error = last_error robot.drive(0, 0) left_wheel.hold() right_wheel.hold() elif color == Color.RED: turn(-90) while not robot.distance() >= 80: error = angle_to_compare_to - gyro_sensor.angle() integral += error derivative = error - last_error proportional_gain = error * kp integral_gain = integral * ki derivative_gain = derivative * kd correction = proportional_gain + integral_gain + derivative_gain robot.drive(100, correction) error = last_error robot.drive(0, 0) left_wheel.hold() right_wheel.hold() elif color == Color.BLUE: turn(90) while not robot.distance() >= 80: error = angle_to_compare_to - gyro_sensor.angle() integral += error derivative = error - last_error proportional_gain = error * kp integral_gain = integral * ki derivative_gain = derivative * kd correction = proportional_gain + integral_gain + derivative_gain robot.drive(100, correction) error = last_error robot.drive(0, 0) left_wheel.hold() right_wheel.hold() # PROGRAM while True: gyrostraight((Color.GREEN, Color.RED, Color.BLUE))
Editor is loading...