# Then measure their color with the hsv() method, # as shown in the previous example. Write them down # as shown below. The name is optional, but it is # useful when you print the color value. green = Color(h=132, s=94, v=26, name='GREEN_BRICK') magenta = Color(h=348, s=96, v=40, name='MAGENTA_BRICK') brown = Color(h=17, s=78, v=15, name='BROWN_BRICK') red = Color(h=359, s=97, v=39, name='RED_BRICK') # Put your colors in a list or tuple. # Including None is optional. Just omit it if # you always want to get one of your colors. my_colors = (green, magenta, brown, red, None) # Save your colors. sensor.detectable_colors(my_colors) # color() works as usual, but it only # returns one of your specified colors. while True: color = sensor.color() # Print the color. print(color) # Check which one it is. if color == magenta: print("It works!") # Wait so we can read it. wait(100)
"GREEN": 20, "BLUE": 110, "RED": 200, "YELLOW": 290, "BLACK": 250, "WHITE": 75, "NONE": 162, } # Verify saturated colors without calibration. for name in ("GREEN", "BLUE", "RED", "YELLOW"): motor.run_target(SPEED, angles[name]) detected = color_sensor.color() assert detected == Color[name], "Expected {0} but got {1}".format( Color[name], detected) # Update all colors. for name in angles.keys(): motor.run_target(SPEED, angles[name]) Color[name] = color_sensor.hsv() # Set new colors as detectable colors. color_sensor.detectable_colors([Color[key] for key in angles.keys()]) # Test all newly calibrated colors. for name in angles.keys(): motor.run_target(SPEED, angles[name]) detected = color_sensor.color() assert detected == Color[name], "Expected {0} but got {1}".format( Color[name], detected)
class ExplorationRover(): """Control the Mars Exploration Rover.""" # In this robot, we want to detect red and cyan/teal "mars rocks". ROCK_COLORS = (Color.RED, Color.CYAN) # These are the gears between the motor and the rear wheels. REAR_GEARS = (8, 24, 12, 20) # An animation of heart icons of varying brightness, giving a heart beat. HEART_BEAT = [ Icon.HEART * i / 100 for i in list(range(0, 100, 4)) + list(range(100, 0, -4)) ] def __init__(self): # Initialize each motor with the correct direction and gearing. self.left_rear_wheels = Motor(Port.E, Direction.CLOCKWISE, self.REAR_GEARS) self.right_rear_wheels = Motor(Port.F, Direction.COUNTERCLOCKWISE, self.REAR_GEARS) self.left_front_wheel = Motor(Port.C, Direction.COUNTERCLOCKWISE, None) self.right_front_wheel = Motor(Port.D, Direction.CLOCKWISE, None) # Initialize sensors, named after the Perseverance Mars Rover instruments. self.mast_cam = UltrasonicSensor(Port.B) self.sherloc = ColorSensor(Port.A) # Initialize the hub and start the animation self.hub = InventorHub() self.hub.display.animate(self.HEART_BEAT, 30) def calibrate(self): # First, measure the color of the floor. This makes it easy to explicitly # ignore the floor later. This is useful if your floor has a wood color, # which can appear red or yellow to the sensor. self.floor_color = self.sherloc.hsv() # Set up all the colors we want to distinguish, including no color at all. self.sherloc.detectable_colors(self.ROCK_COLORS + (self.floor_color, None)) def drive(self, speed, steering, time=None): # Drive the robot at a given speed and steering for a given amount of time. # Speed and steering is expressed as degrees per second of the wheels. self.left_rear_wheels.run(speed + steering) self.left_front_wheel.run(speed + steering) self.right_rear_wheels.run(speed - steering) self.right_front_wheel.run(speed - steering) # If the user specified a time, wait for this duration and then stop. if time is not None: wait(time) self.stop() def stop(self): # Stops all the wheels. self.left_rear_wheels.stop() self.left_front_wheel.stop() self.right_rear_wheels.stop() self.right_front_wheel.stop() def scan_rock(self, time): # Stops the robot and moves the scan arm. self.stop() self.left_front_wheel.run(100) # During the given duration, scan for rocks. watch = StopWatch() while watch.time() < time: # If a rock color is detected, display it and make a sound. if self.sherloc.color() in self.ROCK_COLORS: self.hub.display.image(Icon.CIRCLE) self.hub.speaker.beep() else: self.hub.display.off() wait(10) # Turn the arm motor and restore the heartbeat animation again. self.hub.display.animate(self.HEART_BEAT, 30) self.left_front_wheel.stop()